1*7dd7cddfSDavid du Colombier #include <u.h> 2*7dd7cddfSDavid du Colombier #include <libc.h> 3*7dd7cddfSDavid du Colombier #include <bio.h> 4*7dd7cddfSDavid du Colombier #include "snap.h" 5*7dd7cddfSDavid du Colombier 6*7dd7cddfSDavid du Colombier void 7*7dd7cddfSDavid du Colombier usage(void) 8*7dd7cddfSDavid du Colombier { 9*7dd7cddfSDavid du Colombier fprint(2, "usage: %s [-o snapfile] pid...\n", argv0); 10*7dd7cddfSDavid du Colombier exits("usage"); 11*7dd7cddfSDavid du Colombier } 12*7dd7cddfSDavid du Colombier 13*7dd7cddfSDavid du Colombier void 14*7dd7cddfSDavid du Colombier main(int argc, char **argv) 15*7dd7cddfSDavid du Colombier { 16*7dd7cddfSDavid du Colombier char *user, *sys, *arch, *term, *ofile; 17*7dd7cddfSDavid du Colombier int i; 18*7dd7cddfSDavid du Colombier long pid, me; 19*7dd7cddfSDavid du Colombier Biobuf *b; 20*7dd7cddfSDavid du Colombier Dir d; 21*7dd7cddfSDavid du Colombier Proc *p; 22*7dd7cddfSDavid du Colombier 23*7dd7cddfSDavid du Colombier ofile = "/fd/1"; 24*7dd7cddfSDavid du Colombier ARGBEGIN{ 25*7dd7cddfSDavid du Colombier case 'o': 26*7dd7cddfSDavid du Colombier ofile = ARGF(); 27*7dd7cddfSDavid du Colombier break; 28*7dd7cddfSDavid du Colombier default: 29*7dd7cddfSDavid du Colombier usage(); 30*7dd7cddfSDavid du Colombier }ARGEND; 31*7dd7cddfSDavid du Colombier 32*7dd7cddfSDavid du Colombier if(argc < 1) 33*7dd7cddfSDavid du Colombier usage(); 34*7dd7cddfSDavid du Colombier 35*7dd7cddfSDavid du Colombier /* get kernel compilation time */ 36*7dd7cddfSDavid du Colombier if(dirstat("#/", &d) < 0) { 37*7dd7cddfSDavid du Colombier fprint(2, "cannot stat #/ ???\n"); 38*7dd7cddfSDavid du Colombier exits("stat"); 39*7dd7cddfSDavid du Colombier } 40*7dd7cddfSDavid du Colombier 41*7dd7cddfSDavid du Colombier if((b = Bopen(ofile, OWRITE)) == nil) { 42*7dd7cddfSDavid du Colombier fprint(2, "cannot write to \"%s\"\n", ofile); 43*7dd7cddfSDavid du Colombier exits("Bopen"); 44*7dd7cddfSDavid du Colombier } 45*7dd7cddfSDavid du Colombier 46*7dd7cddfSDavid du Colombier if((user = getuser()) == nil) 47*7dd7cddfSDavid du Colombier user = "gre"; 48*7dd7cddfSDavid du Colombier if((sys = sysname()) == nil) 49*7dd7cddfSDavid du Colombier sys = "gnot"; 50*7dd7cddfSDavid du Colombier if((arch = getenv("cputype")) == nil) 51*7dd7cddfSDavid du Colombier arch = "unknown"; 52*7dd7cddfSDavid du Colombier if((term = getenv("terminal")) == nil) 53*7dd7cddfSDavid du Colombier term = "unknown terminal type"; 54*7dd7cddfSDavid du Colombier 55*7dd7cddfSDavid du Colombier Bprint(b, "process snapshot %ld %s@%s %s %ld \"%s\"\n", 56*7dd7cddfSDavid du Colombier time(0), user, sys, arch, d.mtime, term); 57*7dd7cddfSDavid du Colombier me = getpid(); 58*7dd7cddfSDavid du Colombier for(i=0; i<argc; i++) { 59*7dd7cddfSDavid du Colombier if((pid = atol(argv[i])) == me) 60*7dd7cddfSDavid du Colombier fprint(2, "warning: will not snapshot self\n"); 61*7dd7cddfSDavid du Colombier else if(p = snap(pid, 1)) 62*7dd7cddfSDavid du Colombier writesnap(b, p); 63*7dd7cddfSDavid du Colombier } 64*7dd7cddfSDavid du Colombier exits(0); 65*7dd7cddfSDavid du Colombier } 66