aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/pending.c25
-rw-r--r--toys/lsb/killall.c15
-rw-r--r--toys/lsb/pidof.c4
3 files changed, 19 insertions, 25 deletions
diff --git a/lib/pending.c b/lib/pending.c
index 9e250854..a06912ee 100644
--- a/lib/pending.c
+++ b/lib/pending.c
@@ -6,33 +6,28 @@
#include "toys.h"
// Execute a callback for each PID that matches a process name from a list.
-void for_each_pid_with_name_in(char **names, int (*callback)(pid_t pid, char *name))
+void name_to_pid(char **names, int (*callback)(pid_t pid, char *name))
{
DIR *dp;
struct dirent *entry;
- char cmd[sizeof(toybuf)], path[64];
- char **curname;
if (!(dp = opendir("/proc"))) perror_exit("opendir");
while ((entry = readdir(dp))) {
int fd, n;
+ unsigned u;
+ char *cmd, **curname;
- if (!isdigit(*entry->d_name)) continue;
-
- if (sizeof(path) <= snprintf(path, sizeof(path), "/proc/%s/cmdline",
- entry->d_name)) continue;
-
- if (-1 == (fd=open(path, O_RDONLY))) continue;
- n = read(fd, cmd, sizeof(cmd));
- close(fd);
- if (n<1) continue;
+ if (!(u = atoi(entry->d_name))) continue;
+ sprintf(libbuf, "/proc/%u/cmdline", u);
+ if (!(cmd = readfile(libbuf, libbuf, sizeof(libbuf)))) continue;
for (curname = names; *curname; curname++)
- if (!strcmp(basename(cmd), *curname))
- if (!callback(atol(entry->d_name), *curname)) goto done;
+ if (*curname == '/' ? !strcmp(cmd, *curname)
+ : !strcmp(basename(cmd), basename(*curname))
+ if (!callback(u, *curname)) break;
+ if (*curname) break;
}
-done:
closedir(dp);
}
diff --git a/toys/lsb/killall.c b/toys/lsb/killall.c
index fe433282..59151d8b 100644
--- a/toys/lsb/killall.c
+++ b/toys/lsb/killall.c
@@ -32,21 +32,20 @@ static int kill_process(pid_t pid, char *name)
{
int ret;
- if (pid == TT.cur_pid) return 1;
+ if (pid == TT.cur_pid) return 0;
if (toys.optflags & FLAG_i) {
sprintf(toybuf, "Signal %s(%d) ?", name, pid);
- if (yesno(toybuf, 0) == 0) return 1;
+ if (yesno(toybuf, 0) == 0) return 0;
}
- toys.exitval = 0;
-
ret = kill(pid, TT.signum);
- if (toys.optflags & FLAG_v)
+ if (ret == -1 && !(toys.optflags & FLAG_q))
+ error_msg("bad %u", (unsigned)pid);
+ else if (toys.optflags & FLAG_v)
printf("Killed %s(%d) with signal %d\n", name, pid, TT.signum);
- if (ret == -1 && !(toys.optflags & FLAG_q)) perror("kill");
- return 1;
+ return 0;
}
void killall_main(void)
@@ -76,7 +75,7 @@ void killall_main(void)
TT.cur_pid = getpid();
- for_each_pid_with_name_in(names, kill_process);
+ names_to_pid(names, kill_process);
if (toys.exitval && !(toys.optflags & FLAG_q)) error_exit("No such process");
}
diff --git a/toys/lsb/pidof.c b/toys/lsb/pidof.c
index 7285b6ae..70582a51 100644
--- a/toys/lsb/pidof.c
+++ b/toys/lsb/pidof.c
@@ -43,12 +43,12 @@ static int print_pid(pid_t pid, char * name)
xprintf("%*s", len+(!toys.exitval), toybuf);
toys.exitval = 0;
- return !(toys.optflags & FLAG_s);
+ return toys.optflags & FLAG_s;
}
void pidof_main(void)
{
toys.exitval = 1;
- for_each_pid_with_name_in(toys.optargs, print_pid);
+ name_to_pid(toys.optargs, print_pid);
if (!toys.exitval) xputc('\n');
}