xref: /plan9/sys/src/cmd/snap/snap.c (revision 7dd7cddf99dd7472612f1413b4da293630e6b1bc)
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