henesyinit from lsubb0c8bdb6 years agoHistory
121 lines · 1.8 KB · C
RawDownload
#include <u.h>#include <libc.h> #define NFD 40 ulong	ival;char*	cmd;char**	cmdp;char**	files;int	nfiles;int	once; static voidusage(void){	fprint(2, "usage: %s [-1] [-i ival] cmd file...\n", argv0);	exits("usage");} static voidcmdf(char* prog){	char	file[50]; 	switch(fork()){	case 0:		cmdp[0] = prog; // kludge: args processing		seprint(file, file+sizeof(file), "/bin/%s", prog);		exec(file, cmdp);		exits("exec failed");		break;	case -1:		sysfatal("cant fork");		break;	default:		waitpid();	}} static voidpoll(ulong ival, char* files[], int nfiles, void (*cmdf)(char*), char* arg){	int	fds[NFD];	int	i;	Qid	qids[NFD];	Dir*	d;	int	changed; 	if (nfiles > nelem(fds))		sysfatal("bug: poll: overflow");	for (i = 0; i < nfiles; i++){		fds[i] = open(files[i], OREAD|OCEXEC);		if (fds[i] < 0)			fprint(2, "can't poll %s: %r\n", files[i]);	}	for (i = 0; i < nfiles; i++){		if (fds[i] < 0)			continue;		d = dirfstat(fds[i]);		if (d == nil){			close(fds[i]);			fds[i] = -1;			continue;		}		qids[i] = d->qid;		free(d);	}	for(;;){		sleep(ival * 1000);		changed = 0;		for (i = 0; i < nfiles; i++){			if (fds[i] < 0)				continue;			d = dirfstat(fds[i]);			if (d == nil){				close(fds[i]);				fds[i] = -1;				continue;			}			if (d->qid.path != qids[i].path ||			    d->qid.vers != qids[i].vers){				qids[i] = d->qid;				changed++;			}			free(d);		}		if (changed){			cmdf(arg);			if (once)				exits(nil);		}	}		} voidmain(int argc, char* argv[]){	ival = 1;	ARGBEGIN{	case 'i':		ival = atoi(EARGF(usage()));		break;	case '1':		once++;		break;	default:		usage();	}ARGEND;	if (argc < 2)		usage();	if (ival < 1)		usage();	cmd = argv[0];	cmdp= argv;	// kludge	argv++; argc--;	files = argv;	nfiles= argc; 	poll(ival, files, nfiles, cmdf, cmd);}