diff options
author | Eric Andersen <andersen@codepoet.org> | 2004-03-13 08:33:10 +0000 |
---|---|---|
committer | Eric Andersen <andersen@codepoet.org> | 2004-03-13 08:33:10 +0000 |
commit | 63a1a7aaa520d84bcf37b7351e3923bd308ab8ea (patch) | |
tree | e64462d91b1b7edb0030cde420c4a7e2c8759264 /debianutils | |
parent | 55c704c119c871e25253d8dc3582f623d7d47708 (diff) | |
download | busybox-w32-63a1a7aaa520d84bcf37b7351e3923bd308ab8ea.tar.gz busybox-w32-63a1a7aaa520d84bcf37b7351e3923bd308ab8ea.tar.bz2 busybox-w32-63a1a7aaa520d84bcf37b7351e3923bd308ab8ea.zip |
Update docs for start_stop_daemon to match reality. Update
the reality a bit to better match debian behavior.
Diffstat (limited to 'debianutils')
-rw-r--r-- | debianutils/start_stop_daemon.c | 82 |
1 files changed, 53 insertions, 29 deletions
diff --git a/debianutils/start_stop_daemon.c b/debianutils/start_stop_daemon.c index dfa33e1f9..6bc259fb3 100644 --- a/debianutils/start_stop_daemon.c +++ b/debianutils/start_stop_daemon.c | |||
@@ -23,21 +23,23 @@ | |||
23 | 23 | ||
24 | static int signal_nr = 15; | 24 | static int signal_nr = 15; |
25 | static int user_id = -1; | 25 | static int user_id = -1; |
26 | static int quiet = 0; | ||
26 | static char *userspec = NULL; | 27 | static char *userspec = NULL; |
27 | static char *cmdname = NULL; | 28 | static char *cmdname = NULL; |
28 | static char *execname = NULL; | 29 | static char *execname = NULL; |
30 | static char *pidfile = NULL; | ||
29 | 31 | ||
30 | typedef struct pid_list { | 32 | struct pid_list { |
31 | struct pid_list *next; | 33 | struct pid_list *next; |
32 | int pid; | 34 | pid_t pid; |
33 | } pid_list; | 35 | }; |
34 | 36 | ||
35 | static pid_list *found = NULL; | 37 | static struct pid_list *found = NULL; |
36 | 38 | ||
37 | static inline void | 39 | static inline void |
38 | push(int pid) | 40 | push(pid_t pid) |
39 | { | 41 | { |
40 | pid_list *p; | 42 | struct pid_list *p; |
41 | 43 | ||
42 | p = xmalloc(sizeof(*p)); | 44 | p = xmalloc(sizeof(*p)); |
43 | p->next = found; | 45 | p->next = found; |
@@ -46,21 +48,19 @@ push(int pid) | |||
46 | } | 48 | } |
47 | 49 | ||
48 | static int | 50 | static int |
49 | pid_is_exec(int pid, const char *exec) | 51 | pid_is_exec(pid_t pid, const char *name) |
50 | { | 52 | { |
51 | char buf[PATH_MAX]; | 53 | char buf[32]; |
52 | FILE *fp; | 54 | struct stat sb, exec_stat; |
53 | |||
54 | sprintf(buf, "/proc/%d/cmdline", pid); | ||
55 | fp = fopen(buf, "r"); | ||
56 | if (fp && fgets (buf, sizeof (buf), fp) ) { | ||
57 | fclose(fp); | ||
58 | if (strncmp (buf, exec, strlen(exec)) == 0) | ||
59 | return 1; | ||
60 | } | ||
61 | return 0; | ||
62 | } | ||
63 | 55 | ||
56 | if (name && stat(name, &exec_stat)) | ||
57 | bb_perror_msg_and_die("stat %s", name); | ||
58 | |||
59 | sprintf(buf, "/proc/%d/exe", pid); | ||
60 | if (stat(buf, &sb) != 0) | ||
61 | return 0; | ||
62 | return (sb.st_dev == exec_stat.st_dev && sb.st_ino == exec_stat.st_ino); | ||
63 | } | ||
64 | 64 | ||
65 | static int | 65 | static int |
66 | pid_is_user(int pid, int uid) | 66 | pid_is_user(int pid, int uid) |
@@ -74,9 +74,8 @@ pid_is_user(int pid, int uid) | |||
74 | return (sb.st_uid == uid); | 74 | return (sb.st_uid == uid); |
75 | } | 75 | } |
76 | 76 | ||
77 | |||
78 | static int | 77 | static int |
79 | pid_is_cmd(int pid, const char *name) | 78 | pid_is_cmd(pid_t pid, const char *name) |
80 | { | 79 | { |
81 | char buf[32]; | 80 | char buf[32]; |
82 | FILE *f; | 81 | FILE *f; |
@@ -116,9 +115,24 @@ check(int pid) | |||
116 | } | 115 | } |
117 | 116 | ||
118 | 117 | ||
118 | static void | ||
119 | do_pidfile(const char *name) | ||
120 | { | ||
121 | FILE *f; | ||
122 | pid_t pid; | ||
123 | |||
124 | f = fopen(name, "r"); | ||
125 | if (f) { | ||
126 | if (fscanf(f, "%d", &pid) == 1) | ||
127 | check(pid); | ||
128 | fclose(f); | ||
129 | } else if (errno != ENOENT) | ||
130 | bb_perror_msg_and_die("open pidfile %s", name); | ||
131 | |||
132 | } | ||
119 | 133 | ||
120 | static void | 134 | static void |
121 | do_procfs(void) | 135 | do_procinit(void) |
122 | { | 136 | { |
123 | DIR *procdir; | 137 | DIR *procdir; |
124 | struct dirent *entry; | 138 | struct dirent *entry; |
@@ -145,9 +159,14 @@ static void | |||
145 | do_stop(void) | 159 | do_stop(void) |
146 | { | 160 | { |
147 | char what[1024]; | 161 | char what[1024]; |
148 | pid_list *p; | 162 | struct pid_list *p; |
149 | int killed = 0; | 163 | int killed = 0; |
150 | 164 | ||
165 | if (pidfile) | ||
166 | do_pidfile(pidfile); | ||
167 | else | ||
168 | do_procinit(); | ||
169 | |||
151 | if (cmdname) | 170 | if (cmdname) |
152 | strcpy(what, cmdname); | 171 | strcpy(what, cmdname); |
153 | else if (execname) | 172 | else if (execname) |
@@ -158,7 +177,8 @@ do_stop(void) | |||
158 | bb_error_msg_and_die ("internal error, please report"); | 177 | bb_error_msg_and_die ("internal error, please report"); |
159 | 178 | ||
160 | if (!found) { | 179 | if (!found) { |
161 | printf("no %s found; none killed.\n", what); | 180 | if (!quiet) |
181 | printf("no %s found; none killed.\n", what); | ||
162 | return; | 182 | return; |
163 | } | 183 | } |
164 | for (p = found; p; p = p->next) { | 184 | for (p = found; p; p = p->next) { |
@@ -169,7 +189,7 @@ do_stop(void) | |||
169 | bb_perror_msg("warning: failed to kill %d:", p->pid); | 189 | bb_perror_msg("warning: failed to kill %d:", p->pid); |
170 | } | 190 | } |
171 | } | 191 | } |
172 | if (killed) { | 192 | if (!quiet && killed) { |
173 | printf("stopped %s (pid", what); | 193 | printf("stopped %s (pid", what); |
174 | for (p = found; p; p = p->next) | 194 | for (p = found; p; p = p->next) |
175 | if(p->pid < 0) | 195 | if(p->pid < 0) |
@@ -183,17 +203,20 @@ static const struct option ssd_long_options[] = { | |||
183 | { "stop", 0, NULL, 'K' }, | 203 | { "stop", 0, NULL, 'K' }, |
184 | { "start", 0, NULL, 'S' }, | 204 | { "start", 0, NULL, 'S' }, |
185 | { "background", 0, NULL, 'b' }, | 205 | { "background", 0, NULL, 'b' }, |
206 | { "quiet", 0, NULL, 'q' }, | ||
186 | { "startas", 1, NULL, 'a' }, | 207 | { "startas", 1, NULL, 'a' }, |
187 | { "name", 1, NULL, 'n' }, | 208 | { "name", 1, NULL, 'n' }, |
188 | { "signal", 1, NULL, 's' }, | 209 | { "signal", 1, NULL, 's' }, |
189 | { "user", 1, NULL, 'u' }, | 210 | { "user", 1, NULL, 'u' }, |
190 | { "exec", 1, NULL, 'x' }, | 211 | { "exec", 1, NULL, 'x' }, |
212 | { "pidfile", 1, NULL, 'p' }, | ||
191 | { 0, 0, 0, 0 } | 213 | { 0, 0, 0, 0 } |
192 | }; | 214 | }; |
193 | 215 | ||
194 | #define SSD_CTX_STOP 1 | 216 | #define SSD_CTX_STOP 1 |
195 | #define SSD_CTX_START 2 | 217 | #define SSD_CTX_START 2 |
196 | #define SSD_OPT_BACKGROUND 4 | 218 | #define SSD_OPT_BACKGROUND 4 |
219 | #define SSD_OPT_QUIET 8 | ||
197 | 220 | ||
198 | int | 221 | int |
199 | start_stop_daemon_main(int argc, char **argv) | 222 | start_stop_daemon_main(int argc, char **argv) |
@@ -205,8 +228,8 @@ start_stop_daemon_main(int argc, char **argv) | |||
205 | bb_applet_long_options = ssd_long_options; | 228 | bb_applet_long_options = ssd_long_options; |
206 | 229 | ||
207 | bb_opt_complementaly = "K~S:S~K"; | 230 | bb_opt_complementaly = "K~S:S~K"; |
208 | opt = bb_getopt_ulflags(argc, argv, "KSba:n:s:u:x:", | 231 | opt = bb_getopt_ulflags(argc, argv, "KSbqa:n:s:u:x:p:", |
209 | &startas, &cmdname, &signame, &userspec, &execname); | 232 | &startas, &cmdname, &signame, &userspec, &execname, &pidfile); |
210 | 233 | ||
211 | /* Check one and only one context option was given */ | 234 | /* Check one and only one context option was given */ |
212 | if ((opt & 0x80000000UL) || (opt & (SSD_CTX_STOP | SSD_CTX_START)) == 0) { | 235 | if ((opt & 0x80000000UL) || (opt & (SSD_CTX_STOP | SSD_CTX_START)) == 0) { |
@@ -232,7 +255,7 @@ start_stop_daemon_main(int argc, char **argv) | |||
232 | if (userspec && sscanf(userspec, "%d", &user_id) != 1) | 255 | if (userspec && sscanf(userspec, "%d", &user_id) != 1) |
233 | user_id = my_getpwnam(userspec); | 256 | user_id = my_getpwnam(userspec); |
234 | 257 | ||
235 | do_procfs(); | 258 | do_procinit(); |
236 | 259 | ||
237 | if (opt & SSD_CTX_STOP) { | 260 | if (opt & SSD_CTX_STOP) { |
238 | do_stop(); | 261 | do_stop(); |
@@ -240,7 +263,8 @@ start_stop_daemon_main(int argc, char **argv) | |||
240 | } | 263 | } |
241 | 264 | ||
242 | if (found) { | 265 | if (found) { |
243 | printf("%s already running.\n%d\n", execname ,found->pid); | 266 | if (!quiet) |
267 | printf("%s already running.\n%d\n", execname ,found->pid); | ||
244 | return EXIT_SUCCESS; | 268 | return EXIT_SUCCESS; |
245 | } | 269 | } |
246 | *--argv = startas; | 270 | *--argv = startas; |