aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorErik Andersen <andersen@codepoet.org>2000-04-07 06:00:07 +0000
committerErik Andersen <andersen@codepoet.org>2000-04-07 06:00:07 +0000
commit825aead68b26a5857330972bd1c6adb9f78047ab (patch)
tree41cb71183c7a9bc0812a51f4a16714e400f63170
parent93d6513d9315fa72d7af4ac2435f8c1e243273cb (diff)
downloadbusybox-825aead68b26a5857330972bd1c6adb9f78047ab.tar.gz
Patch to make killall actually kill all PIDs with the specified name,
rather then busylooping trying to kill the first one until it dies. Should be more efficient now, and will only send one signal to each specified process. -Erik
-rw-r--r--archival/gzip.c2
-rw-r--r--gzip.c2
-rw-r--r--halt.c2
-rw-r--r--init/halt.c2
-rw-r--r--init/poweroff.c2
-rw-r--r--init/reboot.c2
-rw-r--r--internal.h2
-rw-r--r--kill.c16
-rw-r--r--poweroff.c2
-rw-r--r--procps/kill.c16
-rw-r--r--reboot.c2
-rw-r--r--utility.c39
12 files changed, 53 insertions, 36 deletions
diff --git a/archival/gzip.c b/archival/gzip.c
index e275fa274..0a969d8db 100644
--- a/archival/gzip.c
+++ b/archival/gzip.c
@@ -3097,7 +3097,7 @@ local void set_file_type()
bin_freq += dyn_ltree[n++].Freq;
*file_type = bin_freq > (ascii_freq >> 2) ? BINARY : ASCII;
if (*file_type == BINARY && translate_eol) {
- errorMsg("-l used on binary file", "");
+ errorMsg("-l used on binary file");
}
}
diff --git a/gzip.c b/gzip.c
index e275fa274..0a969d8db 100644
--- a/gzip.c
+++ b/gzip.c
@@ -3097,7 +3097,7 @@ local void set_file_type()
bin_freq += dyn_ltree[n++].Freq;
*file_type = bin_freq > (ascii_freq >> 2) ? BINARY : ASCII;
if (*file_type == BINARY && translate_eol) {
- errorMsg("-l used on binary file", "");
+ errorMsg("-l used on binary file");
}
}
diff --git a/halt.c b/halt.c
index 81d24cf2d..bcd69b952 100644
--- a/halt.c
+++ b/halt.c
@@ -28,7 +28,7 @@ extern int halt_main(int argc, char **argv)
{
#ifdef BB_FEATURE_LINUXRC
/* don't assume init's pid == 1 */
- exit(kill(findPidByName("init"), SIGUSR1));
+ exit(kill(*(findPidByName("init")), SIGUSR1));
#else
exit(kill(1, SIGUSR1));
#endif
diff --git a/init/halt.c b/init/halt.c
index 81d24cf2d..bcd69b952 100644
--- a/init/halt.c
+++ b/init/halt.c
@@ -28,7 +28,7 @@ extern int halt_main(int argc, char **argv)
{
#ifdef BB_FEATURE_LINUXRC
/* don't assume init's pid == 1 */
- exit(kill(findPidByName("init"), SIGUSR1));
+ exit(kill(*(findPidByName("init")), SIGUSR1));
#else
exit(kill(1, SIGUSR1));
#endif
diff --git a/init/poweroff.c b/init/poweroff.c
index 0f23b9562..bc8e67716 100644
--- a/init/poweroff.c
+++ b/init/poweroff.c
@@ -28,7 +28,7 @@ extern int poweroff_main(int argc, char **argv)
{
#ifdef BB_FEATURE_LINUXRC
/* don't assume init's pid == 1 */
- exit(kill(findPidByName("init"), SIGUSR2));
+ exit(kill(*(findPidByName("init")), SIGUSR2));
#else
exit(kill(1, SIGUSR2));
#endif
diff --git a/init/reboot.c b/init/reboot.c
index 2f8b2b4a5..6e1f3d53b 100644
--- a/init/reboot.c
+++ b/init/reboot.c
@@ -28,7 +28,7 @@ extern int reboot_main(int argc, char **argv)
{
#ifdef BB_FEATURE_LINUXRC
/* don't assume init's pid == 1 */
- exit(kill(findPidByName("init"), SIGINT));
+ exit(kill(*(findPidByName("init")), SIGINT));
#else
exit(kill(1, SIGINT));
#endif
diff --git a/internal.h b/internal.h
index c8c813640..1313f3644 100644
--- a/internal.h
+++ b/internal.h
@@ -216,7 +216,7 @@ extern char *mtab_next(void **iter);
extern char *mtab_getinfo(const char *match, const char which);
extern int check_wildcard_match(const char* text, const char* pattern);
extern long getNum (const char *cp);
-extern pid_t findPidByName( char* pidName);
+extern pid_t* findPidByName( char* pidName);
extern void *xmalloc (size_t size);
extern int find_real_root_device_name(char* name);
diff --git a/kill.c b/kill.c
index 260f4a074..c6dc79f65 100644
--- a/kill.c
+++ b/kill.c
@@ -224,12 +224,18 @@ extern int kill_main(int argc, char **argv)
else {
/* Looks like they want to do a killall. Do that */
while (--argc >= 0) {
- int pid;
-
- while((pid = findPidByName( *argv))) {
- if (kill(pid, sig) != 0)
- fatalError( "Could not kill pid '%d': %s\n", pid, strerror(errno));
+ pid_t* pidList;
+
+ pidList = findPidByName( *argv);
+ for(; pidList && pidList!=0; pidList++) {
+ if (kill(*pidList, sig) != 0)
+ fatalError( "Could not kill pid '%d': %s\n", *pidList, strerror(errno));
+ else
+ errorMsg( "killed pid '%d'\n", *pidList);
}
+ /* Note that we don't bother to free the memory
+ * allocated in findPidByName(). It will be freed
+ * upon exit, so we can save a byte or two */
argv++;
}
}
diff --git a/poweroff.c b/poweroff.c
index 0f23b9562..bc8e67716 100644
--- a/poweroff.c
+++ b/poweroff.c
@@ -28,7 +28,7 @@ extern int poweroff_main(int argc, char **argv)
{
#ifdef BB_FEATURE_LINUXRC
/* don't assume init's pid == 1 */
- exit(kill(findPidByName("init"), SIGUSR2));
+ exit(kill(*(findPidByName("init")), SIGUSR2));
#else
exit(kill(1, SIGUSR2));
#endif
diff --git a/procps/kill.c b/procps/kill.c
index 260f4a074..c6dc79f65 100644
--- a/procps/kill.c
+++ b/procps/kill.c
@@ -224,12 +224,18 @@ extern int kill_main(int argc, char **argv)
else {
/* Looks like they want to do a killall. Do that */
while (--argc >= 0) {
- int pid;
-
- while((pid = findPidByName( *argv))) {
- if (kill(pid, sig) != 0)
- fatalError( "Could not kill pid '%d': %s\n", pid, strerror(errno));
+ pid_t* pidList;
+
+ pidList = findPidByName( *argv);
+ for(; pidList && pidList!=0; pidList++) {
+ if (kill(*pidList, sig) != 0)
+ fatalError( "Could not kill pid '%d': %s\n", *pidList, strerror(errno));
+ else
+ errorMsg( "killed pid '%d'\n", *pidList);
}
+ /* Note that we don't bother to free the memory
+ * allocated in findPidByName(). It will be freed
+ * upon exit, so we can save a byte or two */
argv++;
}
}
diff --git a/reboot.c b/reboot.c
index 2f8b2b4a5..6e1f3d53b 100644
--- a/reboot.c
+++ b/reboot.c
@@ -28,7 +28,7 @@ extern int reboot_main(int argc, char **argv)
{
#ifdef BB_FEATURE_LINUXRC
/* don't assume init's pid == 1 */
- exit(kill(findPidByName("init"), SIGINT));
+ exit(kill(*(findPidByName("init")), SIGINT));
#else
exit(kill(1, SIGINT));
#endif
diff --git a/utility.c b/utility.c
index b91da4ce4..c3a102c5e 100644
--- a/utility.c
+++ b/utility.c
@@ -1259,17 +1259,15 @@ extern int device_open(char *device, int mode)
* This finds the pid of the specified process,
* by using the /dev/ps device driver.
*
- * [return]
- * 0 failure
- * pid when the pid is found.
+ * Returns a list of all matching PIDs
*/
-extern pid_t findPidByName( char* pidName)
+extern pid_t* findPidByName( char* pidName)
{
- int fd, i;
+ int fd, i, j;
char device[] = "/dev/ps";
- pid_t thePid = 0;
pid_t num_pids;
pid_t* pid_array = NULL;
+ pid_t* pidList=NULL;
/* open device */
fd = open(device, O_RDONLY);
@@ -1300,10 +1298,13 @@ extern pid_t findPidByName( char* pidName)
fatalError( "\nDEVPS_GET_PID_INFO: %s\n", strerror (errno));
if ((strstr(info.command_line, pidName) != NULL)) {
- thePid = info.pid;
- break;
+ pidList=realloc( pidList, sizeof(pid_t) * (j+2));
+ if (pidList==NULL)
+ fatalError("out of memory\n");
+ pidList[j++]=info.pid;
}
}
+ pidList[j]=0;
/* Free memory */
free( pid_array);
@@ -1312,7 +1313,7 @@ extern pid_t findPidByName( char* pidName)
if (close (fd) != 0)
fatalError( "close failed for `%s': %s\n",device, strerror (errno));
- return thePid;
+ return pidList;
}
#else /* BB_FEATURE_USE_DEVPS_PATCH */
#if ! defined BB_FEATURE_USE_PROCFS
@@ -1325,14 +1326,14 @@ extern pid_t findPidByName( char* pidName)
* Currently, it's implemented by rummaging through
* the proc filesystem.
*
- * [return]
- * 0 failure
- * pid when the pid is found.
+ * Returns a list of all matching PIDs
*/
-extern pid_t findPidByName( char* pidName)
+extern pid_t* findPidByName( char* pidName)
{
DIR *dir;
struct dirent *next;
+ pid_t* pidList=NULL;
+ int i=0;
dir = opendir("/proc");
if (!dir)
@@ -1347,7 +1348,7 @@ extern pid_t findPidByName( char* pidName)
if (!isdigit(*next->d_name))
continue;
- /* Now open the command line file */
+ /* Now open the status file */
sprintf(filename, "/proc/%s/status", next->d_name);
status = fopen(filename, "r");
if (!status) {
@@ -1357,10 +1358,14 @@ extern pid_t findPidByName( char* pidName)
fclose(status);
if ((strstr(buffer, pidName) != NULL)) {
- return strtol(next->d_name, NULL, 0);
+ pidList=realloc( pidList, sizeof(pid_t) * (i+2));
+ if (pidList==NULL)
+ fatalError("out of memory\n");
+ pidList[i++]=strtol(next->d_name, NULL, 0);
}
}
- return 0;
+ pidList[i]=0;
+ return pidList;
}
#endif /* BB_FEATURE_USE_DEVPS_PATCH */
#endif /* BB_KILLALL || ( BB_FEATURE_LINUXRC && ( BB_HALT || BB_REBOOT || BB_POWEROFF )) */
@@ -1371,7 +1376,7 @@ extern void *xmalloc(size_t size)
void *cp = malloc(size);
if (cp == NULL)
- fatalError("out of memory");
+ fatalError("out of memory\n");
return cp;
}