summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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 e275fa2..0a969d8 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 e275fa2..0a969d8 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 81d24cf..bcd69b9 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 81d24cf..bcd69b9 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 0f23b95..bc8e677 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 2f8b2b4..6e1f3d5 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 c8c8136..1313f36 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 260f4a0..c6dc79f 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 0f23b95..bc8e677 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 260f4a0..c6dc79f 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 2f8b2b4..6e1f3d5 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 b91da4c..c3a102c 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;
}