diff options
-rw-r--r-- | archival/gzip.c | 2 | ||||
-rw-r--r-- | gzip.c | 2 | ||||
-rw-r--r-- | halt.c | 2 | ||||
-rw-r--r-- | init/halt.c | 2 | ||||
-rw-r--r-- | init/poweroff.c | 2 | ||||
-rw-r--r-- | init/reboot.c | 2 | ||||
-rw-r--r-- | internal.h | 2 | ||||
-rw-r--r-- | kill.c | 16 | ||||
-rw-r--r-- | poweroff.c | 2 | ||||
-rw-r--r-- | procps/kill.c | 16 | ||||
-rw-r--r-- | reboot.c | 2 | ||||
-rw-r--r-- | utility.c | 39 |
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"); } } @@ -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"); } } @@ -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); @@ -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++; } } @@ -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 @@ -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; } |