sysvinit/sysvinit-2.82-startstop.patch

162 lines
4.0 KiB
Diff

--- contrib/start-stop-daemon.c
+++ contrib/start-stop-daemon.c Wed Feb 14 13:38:07 2001
@@ -3,6 +3,7 @@
* in C (faster - it is executed many times during system startup).
*
* Written by Marek Michalkiewicz <marekm@i17linuxb.ists.pwr.wroc.pl>,
+ * modified by Raymund Will <ray@lst.de>,
* public domain.
*/
@@ -13,12 +14,13 @@
#include <signal.h>
#include <errno.h>
#include <sys/stat.h>
+#include <fcntl.h>
#include <dirent.h>
#include <unistd.h>
#include <getopt.h>
#include <pwd.h>
-#define VERSION "version 0.3, 1996-06-05"
+#define VERSION "version 0.3.1, 1996-07-19"
static int testmode = 0;
static int quietmode = 0;
@@ -28,9 +30,8 @@
static int signal_nr = 15;
static int user_id = -1;
static const char *userspec = NULL;
-static const char *cmdname = NULL;
+static char *cmdname = NULL;
static char *execname = NULL;
-static char *startas = NULL;
static const char *pidfile = NULL;
static const char *progname = "";
@@ -122,9 +123,8 @@
-x|--exec <executable> program to start/check if it is running\n\
-p|--pidfile <pid-file> pid file to check\n\
-u|--user <username>|<uid> stop this user's processes\n\
- -n|--name <process-name> stop processes with this name\n\
+ -n|--name <process-name> start/stop processes with this name\n\
-s|--signal <signal> signal to send (default 15)\n\
- -a|--startas <pathname> program to start (default <executable>)\n\
-t|--test test mode, don't do anything\n\
-o|--oknodo exit status 0 (not 1) if nothing done\n\
-q|--quiet | -v, --verbose\n\
@@ -183,9 +183,7 @@
case 'V': /* --version */
printf("start-stop-daemon " VERSION "\n");
exit(0);
- case 'a': /* --startas <pathname> */
- startas = optarg;
- break;
+ case 'a': /* --startas <pathname>: OBSOLETE */
case 'n': /* --name <process-name> */
cmdname = optarg;
break;
@@ -225,11 +223,11 @@
if (!execname && !pidfile && !userspec)
badusage("need at least one of --exec, --pidfile or --user");
- if (!startas)
- startas = execname;
+ if (!cmdname)
+ cmdname = execname;
- if (start && !startas)
- badusage("--start needs --exec or --startas");
+ if (start && !cmdname)
+ badusage("--start needs --exec or --cmdname");
}
@@ -262,25 +260,18 @@
static int
pid_is_cmd(int pid, const char *name)
{
- char buf[32];
- FILE *f;
- int c;
+ char buf[1024];
+ int h, c;
- sprintf(buf, "/proc/%d/stat", pid);
- f = fopen(buf, "r");
- if (!f)
- return 0;
- while ((c = getc(f)) != EOF && c != '(')
- ;
- if (c != '(') {
- fclose(f);
+ sprintf(buf, "/proc/%d/cmdline", pid);
+ if ( (h=open(buf, O_RDONLY)) < 0 ||
+ (c=read( h, buf, 1023)) <= 0 ) {
return 0;
}
- /* this hopefully handles command names containing ')' */
- while ((c = getc(f)) != EOF && c == *name)
- name++;
- fclose(f);
- return (c == ')' && *name == '\0');
+ close( h);
+ buf[ c] = '\0';
+
+ return ( !strcmp( name, buf) );
}
@@ -354,7 +345,7 @@
fatal("internal error, please report");
if (!found) {
- if (quietmode <= 0)
+ if (quietmode < 0)
printf("no %s found; none killed.\n", what);
exit(exitnodo);
}
@@ -373,6 +364,9 @@
for (p = killed; p; p = p->next)
printf(" %d", p->pid);
printf(").\n");
+ } else if (quietmode == 0) {
+ printf(" %s", what);
+ fflush( stdout);
}
}
@@ -410,21 +404,25 @@
}
if (found) {
- if (quietmode <= 0)
+ if (quietmode < 0)
printf("%s already running.\n", execname);
exit(exitnodo);
}
if (testmode) {
- printf("would start %s ", startas);
+ printf("would start %s ", cmdname);
while (argc-- > 0)
printf("%s ", *argv++);
printf(".\n");
exit(0);
}
- if (quietmode < 0)
- printf("starting %s ...\n", startas);
- *--argv = startas;
- execv(startas, argv);
- fatal("unable to start %s: %s", startas, strerror(errno));
+ if (quietmode < 0) {
+ printf("starting %s ...\n", cmdname);
+ } else if (quietmode == 0) {
+ printf(" %s", cmdname);
+ fflush( stdout);
+ }
+ *--argv = cmdname;
+ execv(execname, argv);
+ fatal("%s: %s", execname, strerror(errno));
}