plan9fox/sys/src/cmd/alarm.c

91 lines
1.4 KiB
C
Raw Normal View History

2011-11-13 22:23:37 +00:00
/*
* 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>
void
usage(void)
{
2012-02-15 18:40:08 +00:00
fprint(2,"usage: %s time command [ arg ... ]\n", argv0);
2011-11-13 22:23:37 +00:00
exits("usage");
}
2012-02-15 18:24:58 +00:00
static void
catch(void *, char *msg)
2011-11-13 22:23:37 +00:00
{
postnote(PNGROUP, getpid(), msg);
2012-02-15 18:24:58 +00:00
noted(NDFLT);
2011-11-13 22:23:37 +00:00
}
void
main(int argc, char *argv[])
{
2012-02-15 18:24:58 +00:00
char buf[1024], *p, *q;
Waitmsg *w;
long n, t;
2012-02-15 18:40:08 +00:00
argv0 = argv[0];
2012-02-15 18:24:58 +00:00
if(argc < 3)
2011-11-13 22:23:37 +00:00
usage();
2012-02-15 18:24:58 +00:00
n = strtol(argv[1], &p, 10);
if(n < 0)
2011-11-13 22:23:37 +00:00
usage();
t = n * 1000;
if(*p++ == '.' && (n = strtol(p, &q, 10)) > 0){
switch(q - p){
case 0:
break;
case 1:
n *= 100;
break;
case 2:
n *= 10;
break;
default:
p[3] = 0;
n = strtol(p, 0, 10);
break;
}
t += n;
}
rfork(RFNOTEG);
switch(rfork(RFFDG|RFREND|RFPROC|RFMEM)){
2011-11-13 22:23:37 +00:00
case -1:
sysfatal("%r");
2011-11-13 22:23:37 +00:00
case 0: /* child */
2012-02-15 18:24:58 +00:00
exec(argv[2], &argv[2]);
if(argv[2][0] != '/' && strncmp(argv[2], "./", 2) &&
strncmp(argv[2], "../", 3)){
snprint(buf, sizeof(buf), "/bin/%s", argv[2]);
exec(argv[2] = buf, &argv[2]);
}
sysfatal("%s: %r", argv[2]);
2011-11-13 22:23:37 +00:00
}
2012-02-15 18:24:58 +00:00
notify(catch);
alarm(t);
if(w = wait())
exits(w->msg);
exits("alarm");
2011-11-13 22:23:37 +00:00
}