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