1 #include <unistd.h>
2 #include "ndelay.h"
3 #include "strerr.h"
4 #include "error.h"
5 #include "open.h"
6 #include "sgetopt.h"
7 #include "buffer.h"
8 #include "byte.h"
9 #include "sig.h"
10
11 #define FATAL "svc: fatal: "
12 #define WARNING "svc: warning: "
13
14 int datalen = 0;
15 char data[20];
16
17 buffer b;
18 char bspace[1];
19
20 int fdorigdir;
21
main(int argc,const char * const * argv)22 int main(int argc,const char *const *argv)
23 {
24 int opt;
25 int fd;
26 const char *dir;
27
28 sig_ignore(sig_pipe);
29
30 while ((opt = getopt(argc,argv,"udopchaitkx")) != opteof)
31 if (opt == '?')
32 strerr_die1x(100,"svc options: u up, d down, o once, x exit, p pause, c continue, h hup, a alarm, i interrupt, t term, k kill");
33 else
34 if (datalen < sizeof data)
35 if (byte_chr(data,datalen,opt) == datalen)
36 data[datalen++] = opt;
37 argv += optind;
38
39 fdorigdir = open_read(".");
40 if (fdorigdir == -1)
41 strerr_die2sys(111,FATAL,"unable to open current directory: ");
42
43 while (dir = *argv++) {
44 if (chdir(dir) == -1)
45 strerr_warn4(WARNING,"unable to chdir to ",dir,": ",&strerr_sys);
46 else {
47 fd = open_write("supervise/control");
48 if (fd == -1)
49 if (errno == error_nodevice)
50 strerr_warn4(WARNING,"unable to control ",dir,": supervise not running",0);
51 else
52 strerr_warn4(WARNING,"unable to control ",dir,": ",&strerr_sys);
53 else {
54 ndelay_off(fd);
55 buffer_init(&b,buffer_unixwrite,fd,bspace,sizeof bspace);
56 if (buffer_putflush(&b,data,datalen) == -1)
57 strerr_warn4(WARNING,"error writing commands to ",dir,": ",&strerr_sys);
58 close(fd);
59 }
60 }
61 if (fchdir(fdorigdir) == -1)
62 strerr_die2sys(111,FATAL,"unable to set directory: ");
63 }
64
65 _exit(0);
66 }
67