diff options
Diffstat (limited to 'toys/pidof.c')
-rw-r--r-- | toys/pidof.c | 100 |
1 files changed, 100 insertions, 0 deletions
diff --git a/toys/pidof.c b/toys/pidof.c new file mode 100644 index 00000000..c6f0d556 --- /dev/null +++ b/toys/pidof.c @@ -0,0 +1,100 @@ +/* vi: set sw=4 ts=4: + * + * pidof.c - Print the PIDs of all processes with the given names. + * + * Copyright 2012 Andreas Heck <aheck@gmx.de> + * + * Not in SUSv4. + * See http://opengroup.org/onlinepubs/9699919799/utilities/ + +USE_PIDOF(NEWTOY(pidof, "e@d*c#b:a", TOYFLAG_USR|TOYFLAG_BIN)) + +config PIDOF + bool "pidof" + default y + help + usage: pidof [NAME]... + + Print the PIDs of all processes with the given names. +*/ + +#include "toys.h" + +#define TT this.pidof + +#define PATH_LEN 64 +#define PROC_DIR "/proc/" +#define CMD_LINE "/cmdline" + +static int matched = 0; + +static int for_each_pid(void (*callback) (const char *pid)) { + DIR *dp; + struct dirent *entry; + FILE *fp; + int n, pathpos; + char cmd[PATH_MAX]; + char path[PATH_LEN]; + char **curname; + + dp = opendir(PROC_DIR); + if (!dp) { + perror("opendir"); + return 1; + } + + while ((entry = readdir(dp))) { + if (!isdigit(entry->d_name[0])) continue; + strcpy(path, PROC_DIR); + pathpos = strlen(PROC_DIR); + + if (pathpos + strlen(entry->d_name) + 1 > PATH_LEN) continue; + + strcpy(&path[pathpos], entry->d_name); + pathpos += strlen(entry->d_name); + + if (pathpos + strlen(CMD_LINE) + 1 > PATH_LEN) continue; + strcpy(&path[pathpos], CMD_LINE); + + fp = fopen(path, "r"); + if (!fp) { + perror("fopen"); + continue; + } + + n = fread(cmd, 1, PATH_MAX, fp); + fclose(fp); + if (n == 0) continue; + + for (curname = toys.optargs; *curname; curname++) { + if (strcmp(basename(cmd), *curname) == 0) { + callback(entry->d_name); + } + } + } + + closedir(dp); + + return 0; +} + +static void print_pid (const char *pid) { + if (matched) putchar(' '); + fputs(pid, stdout); + matched = 1; +} + +void pidof_main(void) +{ + int err; + + if (!toys.optargs) exit(1); + + err = for_each_pid(print_pid); + if (err) exit(1); + + if (!matched) + exit(1); + else + putchar('\n'); +} |