int prociter(int (*proch)(pid_t pid, pid_t ppid, char *tmpname, void *data), void *data) { char *name = NULL; DIR *d = NULL; struct dirent *de = NULL; struct dirent scratch[2] = { { 0, }, }; pid_t pid = -1; pid_t ppid = -1; int ret = 0; d = sys_opendir(PROC); if (!d) return -1; for (;;) { errno = 0; de = sys_readdir(d, scratch); if (!de || errno != 0) break; if (gf_string2int(de->d_name, &pid) != -1 && pid >= 0) { ppid = pidinfo(pid, &name); switch (ppid) { case -1: continue; case -2: break; } ret = proch(pid, ppid, name, data); GF_FREE(name); if (ret) break; } } sys_closedir(d); if (!de && errno) { fprintf(stderr, "failed to traverse " PROC " (%s)\n", strerror(errno)); ret = -1; } return ret; }
int prociter (int (*proch) (pid_t pid, pid_t ppid, char *tmpname, void *data), void *data) { char *name = NULL; DIR *d = NULL; struct dirent *de = NULL; pid_t pid = -1; pid_t ppid = -1; int ret = 0; d = opendir (PROC); if (!d) { ret = -1; goto out; } while (errno = 0, de = readdir (d)) { if (gf_string2int (de->d_name, &pid) != -1 && pid >= 0) { ppid = pidinfo (pid, &name); switch (ppid) { case -1: continue; case -2: closedir (d); return -1; } ret = proch (pid, ppid, name, data); if (ret) { goto out; } GF_FREE (name); name = NULL; } } if (errno) { fprintf (stderr, "failed to traverse "PROC" (%s)\n", strerror (errno)); goto out; } ret = 0; out: if (d) closedir (d); if (name) GF_FREE (name); return ret; }