1 #include <unistd.h>
2 #include "strerr.h"
3 #include "error.h"
4 #include "open.h"
5
6 #define USAGE " u|d|o|p|c|h|a|i|q|1|2|t|k|x|e service ..."
7
8
9 #define FATAL "runsvctrl: fatal: "
10 #define WARNING "runsvctrl: warning: "
11
12 char *progname;
13 unsigned int rc =0;
14
usage()15 void usage() { strerr_die4x(1, "usage: ", progname, USAGE, "\n"); }
16
fatal(char * m1)17 void fatal(char *m1) { strerr_die3sys(111, FATAL, m1, ": "); }
warn(char * m1,char * m2)18 void warn(char *m1, char *m2) {
19 rc++;
20 strerr_warn5(WARNING, m1, ": ", m2, ": ", &strerr_sys);
21 }
warnx(char * m1,char * m2)22 void warnx(char *m1, char *m2) {
23 rc++;
24 strerr_warn4(WARNING, m1, ": ", m2, 0);
25 }
26
ctrl(char * name,char c)27 int ctrl(char *name, char c) {
28 int fd;
29
30 if ((fd =open_write("supervise/control")) == -1) {
31 if (errno == error_nodevice)
32 warnx(name, "runsv not running.");
33 else
34 warn(name, "unable to open supervise/control");
35 return(-1);
36 }
37 if (write(fd, &c, 1) != 1) {
38 warn(name, "unable to write to supervise/control");
39 return(-1);
40 }
41 return(1);
42 }
43
main(int argc,char ** argv)44 int main(int argc, char **argv) {
45 char **dir;
46 int curdir;
47 char c;
48
49 progname =*argv++;
50
51 if (! argv || ! *argv) usage();
52
53 switch ((c =**argv)) {
54 case 'e': c ='x';
55 case 'u': case 'd': case 'o': case 'x': case 'p': case 'c': case 'h':
56 case 'a': case 'i': case 't': case 'k': case 'q': case '1': case '2':
57 break;
58 default:
59 usage();
60 }
61 dir =++argv;
62 if (! dir || ! *dir) usage();
63
64 if ((curdir =open_read(".")) == -1) {
65 rc =100;
66 fatal("unable to open current directory");
67 }
68 for (; dir && *dir; dir++) {
69 if (chdir(*dir) == -1) {
70 warn(*dir, "unable to change directory");
71 continue;
72 }
73 ctrl(*dir, c);
74 if (fchdir(curdir) == -1) {
75 rc =100;
76 fatal("unable to change directory");
77 }
78 }
79 if (rc > 100) rc =100;
80 _exit(rc);
81 }
82