]> git.lizzy.rs Git - plan9front.git/blob - sys/src/cmd/alarm.c
kernel: keep segment locked for data2txt
[plan9front.git] / sys / src / cmd / alarm.c
1 /*
2 *       alarm
3 *
4 *       you may think some rc script can be same effect
5 *       I did but I realized rc script does not work cleanly.
6 *       The bellowing has a problem. so I wrote in C
7 *       -Kenar-
8 *       
9 *       #!/bin/rc
10 *       if(~ $* 0 1)
11 *               echo usage: alarm time command arg ...
12 *       rfork e
13 *       t=$1
14 *       shift
15 *       c=$*
16 *       {       sleep $t;
17 *               if(test -e /proc/$pid)
18 *                       echo alarm >/proc/$pid/note
19 *       }&
20 *       exec $c
21 *
22 */
23
24 #include <u.h>
25 #include <libc.h>
26
27 int cpid;
28
29 void
30 usage(void)
31 {
32         fprint(2,"usage: alarm time path arg ...\n");
33         exits("usage");
34 }
35
36 static int
37 notefun(void *a, char *msg)
38 {
39         USED(a);
40         postnote(PNGROUP, cpid, msg);
41         if(strcmp(msg, "alarm") == 0){
42                 return 1;
43         }
44         return 0;
45 }
46
47 void
48 main(int argc, char *argv[])
49 {
50         char *cmd;
51         int t;
52         ARGBEGIN{
53         default: usage();
54         }ARGEND
55
56         if(*argv == nil)
57                 usage();
58
59         t = atoi(argv[0]);
60         argv++;
61         if(*argv ==nil)
62                 usage();
63         cmd = argv[0];
64         /* cmd must be a path, absolute or relative */
65         if(*cmd != '/' && strcmp(cmd, "./") != 0 && strcmp(cmd, "../") != 0)
66                 usage();
67         argv[0] = strrchr(cmd,'/');
68         atnotify(notefun,1);
69         alarm(t*1000);
70
71         switch((cpid = rfork(RFFDG|RFREND|RFPROC|RFMEM|RFNOTEG))){
72         case -1:
73                 sysfatal("rfork: %r");
74         case 0: /* child */
75                 exec(cmd,argv);
76         default: /* parent */
77                 break;
78         }
79         waitpid();
80 }
81