int main(int argc, char **argv) { struct kill_control ctl = { .numsig = SIGTERM }; int nerrs = 0, ct = 0; setlocale(LC_ALL, ""); bindtextdomain(PACKAGE, LOCALEDIR); textdomain(PACKAGE); atexit(close_stdout); ctl.do_pid = (!strcmp(program_invocation_short_name, "pid")); /* Yecch */ if (ctl.do_pid) /* FIXME: remove in March 2016. */ warnx(_("use of 'kill --pid' option as command name is deprecated")); argv = parse_arguments(argc, argv, &ctl); /* The rest of the arguments should be process ids and names. */ for ( ; (ctl.arg = *argv) != NULL; argv++) { char *ep = NULL; errno = 0; ctl.pid = strtol(ctl.arg, &ep, 10); if (errno == 0 && ep && *ep == '\0' && ctl.arg < ep) { if (kill_verbose(&ctl) != 0) nerrs++; ct++; } else { struct proc_processes *ps = proc_open_processes(); int found = 0; if (!ps) continue; if (!ctl.check_all) proc_processes_filter_by_uid(ps, getuid()); proc_processes_filter_by_name(ps, ctl.arg); while (proc_next_pid(ps, &ctl.pid) == 0) { if (kill_verbose(&ctl) != 0) nerrs++; ct++; found = 1; } proc_close_processes(ps); if (!found) { nerrs++, ct++; warnx(_("cannot find process \"%s\""), ctl.arg); } } } if (ct && nerrs == 0) return EXIT_SUCCESS; /* full success */ else if (ct == nerrs) return EXIT_FAILURE; /* all failed */ return KILL_EXIT_SOMEOK; /* partial success */ }
static int test_processes(int argc, char *argv[]) { pid_t pid; struct proc_processes *ps; ps = proc_open_processes(); if (!ps) err(EXIT_FAILURE, "open list of processes failed"); if (argc >= 3 && strcmp(argv[1], "--name") == 0) proc_processes_filter_by_name(ps, argv[2]); if (argc >= 3 && strcmp(argv[1], "--uid") == 0) proc_processes_filter_by_uid(ps, (uid_t) atol(argv[2])); while (proc_next_pid(ps, &pid) == 0) printf(" %d", pid); printf("\n"); proc_close_processes(ps); return EXIT_SUCCESS; }