static void check(int pid) { if (execname && !pid_is_exec(pid, execname)) { return; } if (userspec && !pid_is_user(pid, user_id)) { return; } if (cmdname && !pid_is_cmd(pid, cmdname)) { return; } push(pid); }
static void check(int pid) { struct pid_list *p; if (execname && !pid_is_exec(pid)) { return; } if (cmdname && !pid_is_name(pid)) { return; } if (userspec && !pid_is_user(pid)) { return; } p = xmalloc(sizeof(*p)); p->next = G.found_procs; p->pid = pid; G.found_procs = p; }
RC_PIDLIST * rc_find_pids(const char *exec, const char *const *argv, uid_t uid, pid_t pid) { DIR *procdir; struct dirent *entry; FILE *fp; bool container_pid = false; bool openvz_host = false; char *line = NULL; size_t len = 0; pid_t p; char buffer[PATH_MAX]; struct stat sb; pid_t runscript_pid = 0; char *pp; RC_PIDLIST *pids = NULL; RC_PID *pi; if ((procdir = opendir("/proc")) == NULL) return NULL; /* We never match RC_RUNSCRIPT_PID if present so we avoid the below scenario /etc/init.d/ntpd stop does start-stop-daemon --stop --name ntpd catching /etc/init.d/ntpd stop nasty */ if ((pp = getenv("RC_RUNSCRIPT_PID"))) { if (sscanf(pp, "%d", &runscript_pid) != 1) runscript_pid = 0; } /* If /proc/self/status contains EnvID: 0, then we are an OpenVZ host, and we will need to filter out processes that are inside containers from our list of pids. */ if (exists("/proc/self/status")) { fp = fopen("/proc/self/status", "r"); if (fp) { while (! feof(fp)) { rc_getline(&line, &len, fp); if (strncmp(line, "envID:\t0", 8) == 0) { openvz_host = true; break; } } fclose(fp); } } while ((entry = readdir(procdir)) != NULL) { if (sscanf(entry->d_name, "%d", &p) != 1) continue; if (runscript_pid != 0 && runscript_pid == p) continue; if (pid != 0 && pid != p) continue; if (uid) { snprintf(buffer, sizeof(buffer), "/proc/%d", p); if (stat(buffer, &sb) != 0 || sb.st_uid != uid) continue; } if (exec && !pid_is_exec(p, exec)) continue; if (argv && !pid_is_argv(p, (const char *const *)argv)) continue; /* If this is an OpenVZ host, filter out container processes */ if (openvz_host) { snprintf(buffer, sizeof(buffer), "/proc/%d/status", p); if (exists(buffer)) { fp = fopen(buffer, "r"); if (! fp) continue; while (! feof(fp)) { rc_getline(&line, &len, fp); if (strncmp(line, "envID:", 6) == 0) { container_pid = ! (strncmp(line, "envID:\t0", 8) == 0); break; } } fclose(fp); } } if (container_pid) continue; if (!pids) { pids = xmalloc(sizeof(*pids)); LIST_INIT(pids); } pi = xmalloc(sizeof(*pi)); pi->pid = p; LIST_INSERT_HEAD(pids, pi, entries); } if (line != NULL) free(line); closedir(procdir); return pids; }