#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);}
#include <u.h>
#include <libc.h>
#define NFD 40
ulong ival;
char* cmd;
char** cmdp;
char** files;
int nfiles;
int once;
static void
usage(void)
{
fprint(2, "usage: %s [-1] [-i ival] cmd file...\n", argv0);
exits("usage");
}
static void
cmdf(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 void
poll(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);
}
}
}
void
main(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);
}