/* * Pidof functionality. */ int affix_pidof(char *name, int flags, pid_t pid) { PROC *p; PIDQ *q; int i,oind; pid_t opid[PIDOF_OMITSZ], spid = 0; char *basec = NULL; for (oind = PIDOF_OMITSZ-1; oind > 0; oind--) opid[oind] = 0; if (flags&PIDOF_SCRIPTS) scripts_too++; if (flags&PIDOF_OMIT) { opid[oind] = pid; oind++; } if (flags&PIDOF_POMIT) { opid[oind] = getppid(); oind++; } if (flags&PIDOF_BASENAME) { char *ch; basec = strdup(name); name = basename(basec); if ((ch = strchr(name, ' '))) { *ch = '\0'; } } /* Print out process-ID's one by one. */ readproc(); if ((q = pidof(name)) == NULL) goto exit; while ((p = get_next_from_pid_q(q))) { if (flags & PIDOF_OMIT) { for (i = 0; i < oind; i++) { if (opid[i] == p->pid) break; } /* * On a match, continue with * the for loop above. */ if (i < oind) continue; } if (flags & PIDOF_SINGLE) { if (spid) continue; else spid = p->pid; } } exit: free(basec); freeproc(); return spid; }
/* * Pidof functionality. */ int main(int argc, char *argv[]) { PIDQ_HEAD *q; PROC *p; pid_t spid; int first = 1; /* Print out process-ID's one by one. */ readproc(); if ((q = pidof(argv[1])) != NULL) { spid = 0; while ((p = get_next_from_pid_q(q))) { if (!first) printf(" "); printf("%d", p->pid); first = 0; } } printf("\n"); closelog(); return(first ? 1 : 0); }
/* * Pidof functionality. */ int main_pidof(int argc, char **argv) { PIDQ_HEAD *q; PROC *p; pid_t opid[PIDOF_OMITSZ], spid; int f; int first = 1; int i, oind, opt, flags = 0; int chroot_check = 0; struct stat st; char tmp[512]; for (oind = PIDOF_OMITSZ-1; oind > 0; oind--) opid[oind] = 0; opterr = 0; while ((opt = getopt(argc,argv,"hco:sx")) != EOF) switch (opt) { case '?': nsyslog(LOG_ERR,"invalid options on command line!\n"); closelog(); exit(1); case 'c': if (geteuid() == 0) chroot_check = 1; break; case 'o': if (oind >= PIDOF_OMITSZ -1) { nsyslog(LOG_ERR,"omit pid buffer size %d " "exceeded!\n", PIDOF_OMITSZ); closelog(); exit(1); } if (strcmp("%PPID",optarg) == 0) opid[oind] = getppid(); else if ((opid[oind] = atoi(optarg)) < 1) { nsyslog(LOG_ERR, "illegal omit pid value (%s)!\n", optarg); closelog(); exit(1); } oind++; flags |= PIDOF_OMIT; break; case 's': flags |= PIDOF_SINGLE; break; case 'x': scripts_too++; break; default: /* Nothing */ break; } argc -= optind; argv += optind; /* Check if we are in a chroot */ if (chroot_check) { snprintf(tmp, 512, "/proc/%d/root", getpid()); if (stat(tmp, &st) < 0) { nsyslog(LOG_ERR, "stat failed for %s!\n", tmp); closelog(); exit(1); } } /* Print out process-ID's one by one. */ readproc(DO_STAT); for(f = 0; f < argc; f++) { if ((q = pidof(argv[f])) != NULL) { spid = 0; while ((p = get_next_from_pid_q(q))) { if (flags & PIDOF_OMIT) { for (i = 0; i < oind; i++) if (opid[i] == p->pid) break; /* * On a match, continue with * the for loop above. */ if (i < oind) continue; } if (flags & PIDOF_SINGLE) { if (spid) continue; else spid = 1; } if (chroot_check) { struct stat st2; snprintf(tmp, 512, "/proc/%d/root", p->pid); if (stat(tmp, &st2) < 0 || st.st_dev != st2.st_dev || st.st_ino != st2.st_ino) { continue; } } if (!first) printf(" "); printf("%d", p->pid); first = 0; } } } if (!first) printf("\n"); closelog(); return(first ? 1 : 0); }