Cleanups to pidof (including some global infrastructure shared with killall).
diff --git a/lib/lib.c b/lib/lib.c
index 8cc85a9..2c4361a 100644
--- a/lib/lib.c
+++ b/lib/lib.c
@@ -811,56 +811,34 @@
 }
 
 // Execute a callback for each PID that matches a process name from a list.
-int for_each_pid_with_name_in(char **names,
-        void (*callback) (const char *pid)) {
-#define PATH_LEN 64
-
+void for_each_pid_with_name_in(char **names, void (*callback)(pid_t pid))
+{
     DIR *dp;
     struct dirent *entry;
-    FILE *fp;
-    int n, pathpos;
-    char cmd[PATH_MAX];
-    char path[PATH_LEN];
+    char cmd[PATH_MAX], path[64];
     char **curname;
 
-    dp = opendir("/proc");
-    if (!dp) {
-        perror("opendir");
-        return 1;
-    }
+    if (!(dp = opendir("/proc"))) perror_exit("opendir");
 
     while ((entry = readdir(dp))) {
-        if (!isdigit(entry->d_name[0])) continue;
-        strcpy(path, "/proc/");
-        pathpos = 6;
+        int fd;
 
-        if (pathpos + strlen(entry->d_name) + 1 > PATH_LEN) continue;
+        if (!isdigit(*entry->d_name)) continue;
 
-        strcpy(&path[pathpos], entry->d_name);
-        pathpos += strlen(entry->d_name);
+        if (sizeof(path) <= snprintf(path, sizeof(path), "/proc/%s/cmdline", 
+            entry->d_name)) continue;
 
-        if (pathpos + strlen("/cmdline") + 1 > PATH_LEN) continue;
-        strcpy(&path[pathpos], "/cmdline");
+        if (-1 != (fd=xopen(path, O_RDONLY))) {
+            int n = read(fd, cmd, sizeof(cmd));
 
-        fp = fopen(path, "r");
-        if (!fp) {
-            perror("fopen");
-            continue;
-        }
+            close(fd);
+            if (n<1) continue;
 
-        n = fread(cmd, 1, PATH_MAX, fp); 
-        fclose(fp);
-        if (n == 0) continue;
-
-        for (curname = names; *curname; curname++) {
-            if (strcmp(basename(cmd), *curname) == 0) {
-                callback(entry->d_name);
-            }
+            for (curname = names; *curname; curname++)
+                if (!strcmp(basename(cmd), *curname))
+                    callback(atol(entry->d_name));
         }
     }
 
     closedir(dp);
-
-    return 0;
-#undef PATH_LEN
 }