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