xref: /plan9/sys/src/cmd/snap/snap.c (revision 9a747e4fd48b9f4522c70c07e8f882a15030f964)
17dd7cddfSDavid du Colombier #include <u.h>
27dd7cddfSDavid du Colombier #include <libc.h>
37dd7cddfSDavid du Colombier #include <bio.h>
47dd7cddfSDavid du Colombier #include "snap.h"
57dd7cddfSDavid du Colombier 
67dd7cddfSDavid du Colombier void
usage(void)77dd7cddfSDavid du Colombier usage(void)
87dd7cddfSDavid du Colombier {
97dd7cddfSDavid du Colombier 	fprint(2, "usage: %s [-o snapfile] pid...\n", argv0);
107dd7cddfSDavid du Colombier 	exits("usage");
117dd7cddfSDavid du Colombier }
127dd7cddfSDavid du Colombier 
137dd7cddfSDavid du Colombier void
main(int argc,char ** argv)147dd7cddfSDavid du Colombier main(int argc, char **argv)
157dd7cddfSDavid du Colombier {
167dd7cddfSDavid du Colombier 	char *user, *sys, *arch, *term, *ofile;
177dd7cddfSDavid du Colombier 	int i;
187dd7cddfSDavid du Colombier 	long pid, me;
197dd7cddfSDavid du Colombier 	Biobuf *b;
20*9a747e4fSDavid du Colombier 	Dir *d;
217dd7cddfSDavid du Colombier 	Proc *p;
227dd7cddfSDavid du Colombier 
237dd7cddfSDavid du Colombier 	ofile = "/fd/1";
247dd7cddfSDavid du Colombier 	ARGBEGIN{
257dd7cddfSDavid du Colombier 	case 'o':
267dd7cddfSDavid du Colombier 		ofile = ARGF();
277dd7cddfSDavid du Colombier 		break;
287dd7cddfSDavid du Colombier 	default:
297dd7cddfSDavid du Colombier 		usage();
307dd7cddfSDavid du Colombier 	}ARGEND;
317dd7cddfSDavid du Colombier 
327dd7cddfSDavid du Colombier 	if(argc < 1)
337dd7cddfSDavid du Colombier 		usage();
347dd7cddfSDavid du Colombier 
357dd7cddfSDavid du Colombier 	/* get kernel compilation time */
36*9a747e4fSDavid du Colombier 	if((d = dirstat("#/")) == nil) {
377dd7cddfSDavid du Colombier 		fprint(2, "cannot stat #/ ???\n");
387dd7cddfSDavid du Colombier 		exits("stat");
397dd7cddfSDavid du Colombier 	}
407dd7cddfSDavid du Colombier 
417dd7cddfSDavid du Colombier 	if((b = Bopen(ofile, OWRITE)) == nil) {
427dd7cddfSDavid du Colombier 		fprint(2, "cannot write to \"%s\"\n", ofile);
437dd7cddfSDavid du Colombier 		exits("Bopen");
447dd7cddfSDavid du Colombier 	}
457dd7cddfSDavid du Colombier 
467dd7cddfSDavid du Colombier 	if((user = getuser()) == nil)
477dd7cddfSDavid du Colombier 		user = "gre";
487dd7cddfSDavid du Colombier 	if((sys = sysname()) == nil)
497dd7cddfSDavid du Colombier 		sys = "gnot";
507dd7cddfSDavid du Colombier 	if((arch = getenv("cputype")) == nil)
517dd7cddfSDavid du Colombier 		arch = "unknown";
527dd7cddfSDavid du Colombier 	if((term = getenv("terminal")) == nil)
537dd7cddfSDavid du Colombier 		term = "unknown terminal type";
547dd7cddfSDavid du Colombier 
557dd7cddfSDavid du Colombier 	Bprint(b, "process snapshot %ld %s@%s %s %ld \"%s\"\n",
56*9a747e4fSDavid du Colombier 		time(0), user, sys, arch, d->mtime, term);
577dd7cddfSDavid du Colombier 	me = getpid();
587dd7cddfSDavid du Colombier 	for(i=0; i<argc; i++) {
597dd7cddfSDavid du Colombier 		if((pid = atol(argv[i])) == me)
607dd7cddfSDavid du Colombier 			fprint(2, "warning: will not snapshot self\n");
617dd7cddfSDavid du Colombier 		else if(p = snap(pid, 1))
627dd7cddfSDavid du Colombier 			writesnap(b, p);
637dd7cddfSDavid du Colombier 	}
647dd7cddfSDavid du Colombier 	exits(0);
657dd7cddfSDavid du Colombier }
66