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>
|
|
|
|
|
|
|
|
int cpid;
|
|
|
|
|
|
|
|
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, cpid, 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;
|
2012-02-15 18:04:38 +00:00
|
|
|
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);
|
2012-02-15 18:04:38 +00:00
|
|
|
if(n < 0)
|
2011-11-13 22:23:37 +00:00
|
|
|
usage();
|
2012-02-15 18:04:38 +00:00
|
|
|
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;
|
|
|
|
}
|
2011-11-13 22:23:37 +00:00
|
|
|
switch((cpid = rfork(RFFDG|RFREND|RFPROC|RFMEM|RFNOTEG))){
|
|
|
|
case -1:
|
2012-02-15 18:04:38 +00:00
|
|
|
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);
|
2012-02-15 18:04:38 +00:00
|
|
|
alarm(t);
|
|
|
|
if(w = wait())
|
|
|
|
exits(w->msg);
|
|
|
|
exits("alarm");
|
2011-11-13 22:23:37 +00:00
|
|
|
}
|