git: 9front

Download patch

ref: ae5f5b0007d2e72ce5c76a1264200726d1413102
parent: 2e8be05b9ec8b135068c50faa70266ea3e04963e
author: stanley lieber <stanley.lieber@gmail.com>
date: Sun Nov 13 11:23:37 EST 2011

add alarm

--- /dev/null
+++ b/sys/src/cmd/alarm.c
@@ -1,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();
+}
+
--