summaryrefslogtreecommitdiff
path: root/sys/src
diff options
context:
space:
mode:
authorstanley lieber <stanley.lieber@gmail.com>2011-11-13 16:23:37 -0600
committerstanley lieber <stanley.lieber@gmail.com>2011-11-13 16:23:37 -0600
commit9dd1c2c371b75688dfcf46e52d0ac1a750610a87 (patch)
tree31a4c76a84926af774f02e58c695d4cebd03e943 /sys/src
parentc0b983d85ca15da4f85522346ce4986750b59ad5 (diff)
add alarm
Diffstat (limited to 'sys/src')
-rw-r--r--sys/src/cmd/alarm.c81
1 files changed, 81 insertions, 0 deletions
diff --git a/sys/src/cmd/alarm.c b/sys/src/cmd/alarm.c
new file mode 100644
index 000000000..fa132ba3b
--- /dev/null
+++ b/sys/src/cmd/alarm.c
@@ -0,0 +1,81 @@
+/*
+* alarm
+*
+* you may think some rc script can be same effect
+* I did but I realized rc script does not work cleanly.
+* The bellowing has a problem. so I wrote in C
+* -Kenar-
+*
+* #!/bin/rc
+* if(~ $* 0 1)
+* echo usage: alarm time command arg ...
+* rfork e
+* t=$1
+* shift
+* c=$*
+* { sleep $t;
+* if(test -e /proc/$pid)
+* echo alarm >/proc/$pid/note
+* }&
+* exec $c
+*
+*/
+
+#include <u.h>
+#include <libc.h>
+
+int cpid;
+
+void
+usage(void)
+{
+ fprint(2,"usage: alarm time path arg ...\n");
+ exits("usage");
+}
+
+static int
+notefun(void *a, char *msg)
+{
+ USED(a);
+ postnote(PNGROUP, cpid, msg);
+ if(strcmp(msg, "alarm") == 0){
+ return 1;
+ }
+ return 0;
+}
+
+void
+main(int argc, char *argv[])
+{
+ char *cmd;
+ int t;
+ ARGBEGIN{
+ default: usage();
+ }ARGEND
+
+ if(*argv == nil)
+ usage();
+
+ t = atoi(argv[0]);
+ argv++;
+ if(*argv ==nil)
+ usage();
+ cmd = argv[0];
+ /* cmd must be a path, absolute or relative */
+ if(*cmd != '/' && strcmp(cmd, "./") != 0 && strcmp(cmd, "../") != 0)
+ usage();
+ argv[0] = strrchr(cmd,'/');
+ atnotify(notefun,1);
+ alarm(t*1000);
+
+ switch((cpid = rfork(RFFDG|RFREND|RFPROC|RFMEM|RFNOTEG))){
+ case -1:
+ sysfatal("rfork: %r");
+ case 0: /* child */
+ exec(cmd,argv);
+ default: /* parent */
+ break;
+ }
+ waitpid();
+}
+