sysvinit/killproc-2.16.dif

535 lines
15 KiB
Plaintext

--- .dummy
+++ .dummy 2009-08-19 10:18:39.181901099 +0000
@@ -0,0 +1 @@
+this is a dummy, remove if real changes are required
--- checkproc.8
+++ checkproc.8 2010-10-04 14:31:15.675926381 +0000
@@ -278,6 +278,8 @@ Program is running
No process but pid file found
.IP 3 5
No process and no pid file found
+.IP 4 5
+Program is not installed
.RE
.RS 5
.IP 101 7
--- checkproc.c
+++ checkproc.c 2010-10-04 14:44:56.355926370 +0000
@@ -92,7 +92,6 @@ int main(int argc, char **argv)
/* Allocate here: address optarg (current *argv) isn't freeable */
if (optarg && !pid_file) {
pid_file = xstrdup(optarg);
- pid_forced = true;
} else
error(WRGSYNTAX, "Option -p requires pid file to read pid from\n");
break;
@@ -148,7 +147,8 @@ int main(int argc, char **argv)
pid_file = (char*) xmalloc(DEFPIDLEN+strlen(basename)+1);
pid_file = strcat(strcat(strcpy(pid_file,DEFPIDDIR),basename),DEFPIDEXT);
}
- }
+ } else
+ pid_forced = true;
/* Check and verify the pid file */
errno = 0;
@@ -163,22 +163,27 @@ int main(int argc, char **argv)
* the proc is dead if the specified pid can not be veryfied.
*/
if (remember_pids(pid_file,fullname,root,flags) < 0)
- exit(LSB_PROOFX);
+ exit(LSB_STATUS_PROOFX);
if (!remember)
exit(LSB_STATUS_NOPROC); /* New LSB: no pid file is no job */
}
- /* No pid file means that we have to search in /proc/ */
free(pid_file);
pid_file = NULL;
+
+ /* No pid file means that we have to search in /proc/ */
}
if (pid_file && !st.st_size) {
warn("Empty pid file %s for %s\n", pid_file, fullname);
- /* No pid file means that we have to search in /proc/ */
free(pid_file);
pid_file = NULL;
+
+ if (pid_forced)
+ exit(LSB_STATUS_NOPROC);
+
+ /* No pid file means that we have to search in /proc/ */
}
/* Check and verify the ignore file */
@@ -205,6 +210,8 @@ int main(int argc, char **argv)
exit(LSB_STATUS_PROOFX);
}
if (!remember) { /* No process found with pid file */
+ if (pid_forced)
+ exit(LSB_STATUS_PROOFX);
if (pidof(fullname,root,flags) < 0)
exit(LSB_STATUS_PROOFX);
}
--- killproc.8
+++ killproc.8 2010-07-20 09:30:00.775424897 +0000
@@ -57,9 +57,11 @@ is sent. If this program is not called w
.B killproc
then
.B SIGHUP
-is used. Note that if
+is used. Note that if no signal is specified on the command line and the program
+.B killproc
+can not terminate a process with the default
.B SIGTERM
-is used and does not terminate a process the signal
+the signal
.B SIGKILL
is send after a few seconds (default is 5 seconds, see option
.BR \-t ).
@@ -240,16 +242,21 @@ or by number
.B \-t\fI<sec>\fP
The number
.I <sec>
-specifies the seconds to wait between the sent signal
+specifies the seconds to wait between the default signal
.B SIGTERM
and the subsequentially signal
.B SIGKILL
if the first
.B SIGTERM
does not show any result within the
-first few milli seconds. This defaults to
+first few milli seconds. This timeout defaults to
.B 5
-seconds.
+seconds. On the other hand if the signal
+.B SIGTERM
+was explicitly used on the command line, the signal
+.B SIGKILL
+will be omitted, even if the process was not terminated
+after the timeout has expired.
.TP
.B \-q
This option is ignored.
@@ -278,7 +285,7 @@ then the pid from this file is being use
terminate the sendmail process. Other running processes are
ignored.
.TP
-.B killproc -p /var/myrun/lpd.pid -TERM /usr/sbin/lpd
+.B killproc -p /var/myrun/lpd.pid /usr/sbin/lpd
.IP
sends the signal
.B SIGTERM
@@ -293,7 +300,7 @@ does not exist,
assumes that the daemon of
.B /usr/sbin/lpd
is not running. The exit status
-is set to 0 for successfully delivering the given signals
+is set to 0 for successfully delivering the default signals
.BR SIGTERM " and " SIGKILL
otherwise to 7 if the program was not running. It is also
successful if
--- killproc.c
+++ killproc.c 2010-07-20 09:35:09.234925068 +0000
@@ -48,6 +48,7 @@ int main(int argc, char **argv)
int process_group = 0, group_leader = 0, wait = 5, iargc = 0;
unsigned short flags = (KILL|PIDOF|KSTOP);
boolean pid_forced = false;
+ boolean sig_forced = true;
we_are = base_name(argv[0]);
openlog (we_are, LOG_OPTIONS, LOG_FACILITY);
@@ -79,11 +80,13 @@ int main(int argc, char **argv)
memset(sig, 0, len);
*sig = 'q'; /* set dummy option -q */
snum = tmp;
+ sig_forced = false;
break;
} else if ( (tmp = signame_to_signum(sig)) > 0 ) {
memset(sig, 0, len);
*sig = 'q'; /* set dummy option -q */
snum = tmp;
+ sig_forced = false;
break;
}
}
@@ -135,7 +138,6 @@ int main(int argc, char **argv)
/* Allocate here: address optarg (current *argv) isn't freeable */
if (optarg && !pid_file) {
pid_file = xstrdup(optarg);
- pid_forced = true;
} else
error(LSB_WRGSYN,"Option -p requires pid file to read pid from\n");
break;
@@ -195,7 +197,8 @@ int main(int argc, char **argv)
pid_file = (char*) xmalloc(DEFPIDLEN+strlen(basename)+1);
pid_file = strcat(strcat(strcpy(pid_file,DEFPIDDIR),basename),DEFPIDEXT);
}
- }
+ } else
+ pid_forced = true;
/* Check and verify the pid file */
errno = 0;
@@ -215,17 +218,22 @@ int main(int argc, char **argv)
if (!remember)
exit(LSB_NOPROC); /* New LSB: no pid file is no job */
}
- /* No pid file means that we have to search in /proc/ */
free(pid_file);
pid_file = NULL;
+
+ /* No pid file means that we have to search in /proc/ */
}
if (pid_file && !st.st_size) {
warn("Empty pid file %s for %s\n", pid_file, fullname);
- /* No pid file means that we have to search in /proc/ */
free(pid_file);
pid_file = NULL;
+
+ if (pid_forced)
+ exit(LSB_STATUS_NOPROC);
+
+ /* No pid file means that we have to search in /proc/ */
}
if (pid_file) { /* The case of having a pid file */
@@ -291,7 +299,10 @@ again:
goto again;
}
- if (snum == SIGKILL)
+ if (snum == SIGKILL) /* SIGKILL was specified on the command line */
+ goto badterm;
+
+ if (!sig_forced) /* SIGTERM was specified on the command line */
goto badterm;
if (check_pids(fullname,root,flags) < 0)
--- libinit.c
+++ libinit.c 2010-07-27 08:56:18.146924383 +0000
@@ -320,13 +320,15 @@ static ssize_t xread(int fd, void *inbuf
while (1) {
errno = 0;
bytes = read(fd, inbuf, count);
- if (bytes < 0 && (errno == EINTR || errno == EAGAIN))
- continue;
- if (bytes < 0)
+ if (bytes < 0) {
+ if (errno == EINTR || errno == EAGAIN)
+ continue;
+ if (errno == ESRCH)
+ goto out;
break;
+ }
goto out;
}
-
warn("xread error: %s\n", strerror(errno));
out:
errno = olderr;
@@ -446,9 +448,9 @@ static pid_t getpppid(const pid_t ppid)
goto out;
if ((fp = open(proc(pid, "stat"), O_PROCMODE)) != -1) {
- xread(fp, buf, BUFSIZ);
+ ssize_t len = xread(fp, buf, BUFSIZ);
close(fp);
- if (sscanf(buf,"%*d %*s %*c %d %*d %*d", &pppid) != 1)
+ if (len <= 0 || sscanf(buf,"%*d %*s %*c %d %*d %*d", &pppid) != 1)
warn("can not read ppid for process %d!\n", ppid);
}
out:
@@ -591,10 +593,11 @@ int pidof (const char * inname, const ch
char ent[3];
boolean thread;
ssize_t len;
+
len = xread(fp,ent,3);
close(fp);
- if (!len)
+ if (len <= 0)
continue;
thread = (strncmp(ent, "0 ", 2) == 0);
@@ -673,7 +676,7 @@ int pidof (const char * inname, const ch
* do not hold a file descriptor opened on the script file.
*/
if (!(flags & (KTHREAD|KSHORT)) && isscrpt &&
- (fp = openat(dfd, here(d->d_name, "cmd"), O_PROCMODE)) != -1) {
+ (fp = openat(dfd, here(d->d_name, "cmdline"), O_PROCMODE)) != -1) {
char entry[PATH_MAX+1];
const char *scrpt = NULL;
@@ -682,6 +685,9 @@ int pidof (const char * inname, const ch
len = xread(fp, entry, PATH_MAX);
close(fp);
+ if (len <= 0)
+ continue;
+
/* Seek for a script not for a binary */
if (!(scrpt = checkscripts(entry, root, len, d->d_name)))
continue;
@@ -713,7 +719,7 @@ int pidof (const char * inname, const ch
len = xread(fp, entry, PATH_MAX);
close(fp);
- if (!len)
+ if (len <= 0)
continue;
comm = index(entry, ' ');
@@ -764,7 +770,8 @@ int verify_pidfile (const char * pid_fil
const char * root, unsigned short flags,
const boolean ignore)
{
- int fp, cnt;
+ int fp;
+ ssize_t cnt;
boolean isscrpt = false;
pid_t pid;
char *swapname = NULL, *bufp;
@@ -789,11 +796,12 @@ int verify_pidfile (const char * pid_fil
}
errno = 0;
- if ((cnt = xread (fp, buf, BUFSIZ)) < 0) {
+ cnt = xread(fp, buf, BUFSIZ);
+ close(fp);
+ if (cnt < 0) {
warn("Can not read pid file %s: %s\n", pid_file, strerror(errno));
return -1;
}
- close(fp);
buf[cnt] = '\0';
bufp = buf;
@@ -847,10 +855,11 @@ int verify_pidfile (const char * pid_fil
char ent[3];
boolean thread;
ssize_t len;
+
len = xread(fp, ent, sizeof(ent));
close(fp);
- if (!len)
+ if (len <= 0)
goto out;
thread = (strncmp(ent, "0 ", 2) == 0);
@@ -923,7 +932,7 @@ int verify_pidfile (const char * pid_fil
}
if (!(flags & (KTHREAD|KSHORT))&& isscrpt &&
- (fp = open(proc(buf, "cmd"), O_PROCMODE)) != -1) {
+ (fp = open(proc(buf, "cmdline"), O_PROCMODE)) != -1) {
char entry[PATH_MAX+1];
const char *scrpt = NULL;
@@ -932,6 +941,9 @@ int verify_pidfile (const char * pid_fil
len = xread(fp, entry, PATH_MAX);
close(fp);
+ if (len <= 0)
+ goto out;
+
/* Seek for a script not for a binary */
if (!(scrpt = checkscripts(entry, root, len, buf)))
goto out; /* Nothing found */
@@ -951,7 +963,7 @@ int verify_pidfile (const char * pid_fil
len = xread(fp, entry, PATH_MAX);
close(fp);
- if (!len)
+ if (len <= 0)
goto out;
comm = index(entry, ' ');
@@ -1040,7 +1052,7 @@ int check_pids (const char * inname, con
len = xread(fp, ent, sizeof(ent));
close(fp);
- if (!len)
+ if (len <= 0)
goto ignore; /* Bogus */
thread = (strncmp(ent, "0 ", 2) == 0);
@@ -1102,7 +1114,7 @@ int check_pids (const char * inname, con
}
if (!(flags & (KTHREAD|KSHORT)) && isscrpt &&
- (fp = open(proc(pid, "cmd"), O_PROCMODE)) != -1) {
+ (fp = open(proc(pid, "cmdline"), O_PROCMODE)) != -1) {
char entry[PATH_MAX+1];
const char *scrpt;
@@ -1111,7 +1123,7 @@ int check_pids (const char * inname, con
len = xread(fp, entry, PATH_MAX);
close(fp);
- if (!len)
+ if (len <= 0)
goto ignore; /* Bogus */
/* Seek for a script not for a binary */
@@ -1131,7 +1143,7 @@ int check_pids (const char * inname, con
len = xread(fp, entry, PATH_MAX);
close(fp);
- if (!len)
+ if (len <= 0)
goto ignore; /* Bogus */
comm = index(entry, ' ');
--- libinit.h
+++ libinit.h 2010-10-04 14:43:56.099926049 +0000
@@ -93,7 +93,7 @@
#define NOPIDREAD 101 /* trouble */
#define LSB_STATUS_PROOF ((errno == EPERM) ? LSB_NOPERM : NOPIDREAD )
-#define LSB_STATUS_PROOFX ((errno == ENOENT) ? LSB_NOENTR : LSB_STATUS_PROOF )
+#define LSB_STATUS_PROOFX ((errno == ENOENT) ? (flags & KILL) ? LSB_NOENTR : 4 : LSB_STATUS_PROOF )
#define LOG_OPTIONS (LOG_ODELAY|LOG_CONS)
#define LOG_FACILITY LOG_LOCAL7
--- startproc.8
+++ startproc.8 2009-12-03 17:00:05.739929445 +0000
@@ -59,9 +59,15 @@ processes are found. Note that
is designed to start a daemon but not a kernel thread or
a program which enables a kernel thread.
.PP
+Without any option
.B startproc
-does not use the pid to search for a process but the full
-path of the corresponding program which is used to identify the executable
+does search for a process by using the full
+path of the corresponding program and a default pid file
+.RB (/var/run/ <basename> .pid)
+which are used together to identify the executable
+out from the
+.I /proc
+file system
.RB (see " proc" (5)).
Only if the inode number
.RB (/proc/ <pid> /exe)
@@ -81,7 +87,7 @@ changed due to the LSB specification).
If this option is specified,
.B startproc
tries to check against the pid read from this file
-instead of the default
+instead of the default pid file
.RB (/var/run/ <basename> .pid).
The pid read from this file is compared against the pids of possible
running processes that use the specified executable. In order to avoid
--- startproc.c
+++ startproc.c 2009-12-07 14:15:44.487929547 +0000
@@ -41,7 +41,8 @@ static int do_start(const char *name, ch
static void closefds(FILE *not);
static void waiton(const char *list);
-static int quiet = 1, supprmsg = 0, sess = 0, seconds = 0, sigchld = 0, force = 0, dialog = 0;
+static int quiet = true, supprmsg = false, sess = false, seconds = false;
+static int sigchld = false, force = false, dialog = false;
static struct passwd *user = NULL;
static struct group *grp = NULL;
static int syslogd = 0;
@@ -54,7 +55,7 @@ static void (*save_sigquit) = SIG_DFL;
static void sig_quit(int nsig)
{
(void)signal(nsig, save_sigquit);
- signaled = 1;
+ signaled = true;
}
static void sig_chld(int nsig)
@@ -113,10 +114,10 @@ int main(int argc, char **argv)
error(LSB_WRGSYN,"Option -c requires special root directory\n");
break;
case 'e':
- env = 1;
+ env = true;
break;
case 'd':
- dialog = 1;
+ dialog = true;
seconds = 15;
break;
case 'p': /* Former option -f */
@@ -129,7 +130,7 @@ int main(int argc, char **argv)
error(LSB_WRGSYN,"Option -p requires pid file to read pid from\n");
break;
case 'f': /* Newer option -f for force start (LSB specs!) */
- force++;
+ force = true;
break;
case 'l':
if (optarg && optarg[0] != '-' && !log_file) {
@@ -158,11 +159,11 @@ int main(int argc, char **argv)
error(LSB_WRGSYN,"Option -n requires nice level\n");
break;
case 'q':
- supprmsg = 1;
+ supprmsg = true;
break;
case 's':
if (sdaemon) goto fail;
- sess = 1;
+ sess = true;
break;
case 'u':
if (optarg && optarg[0] != '/' && optarg[0] != '-') {
@@ -288,7 +289,8 @@ int main(int argc, char **argv)
pid_file = (char*) xmalloc(DEFPIDLEN+strlen(basename)+1);
pid_file = strcat(strcat(strcpy(pid_file,DEFPIDDIR),basename),DEFPIDEXT);
}
- }
+ } else
+ force = true;
/* Check and verify the pid file */
errno = 0;
@@ -296,17 +298,25 @@ int main(int argc, char **argv)
if (errno != ENOENT)
warn("Can not stat %s: %s\n", pid_file, strerror(errno));
- /* No pid file means that we have to search in /proc/ */
free(pid_file);
pid_file = NULL;
+
+ if (force && errno == ENOENT)
+ goto force;
+
+ /* No pid file means that we have to search in /proc/ */
}
if (pid_file && !st.st_size) {
warn("Empty pid file %s for %s\n", pid_file, fullname);
- /* No pid file means that we have to search in /proc/ */
free(pid_file);
pid_file = NULL;
+
+ if (force)
+ goto force;
+
+ /* No pid file means that we have to search in /proc/ */
}
if (pid_file) { /* The case of having a pid file */
@@ -336,6 +346,8 @@ int main(int argc, char **argv)
/* Do main work */
if (!remember) { /* No process found with pid file */
+ if (force)
+ goto force;
if (pidof(fullname,root,flags) < 0)
exit(LSB_PROOFX);
clear_pids(); /* Remove all pids which should be ignored */