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 */ }
int main (int argc, char *argv[]) { int errors, numsig, pid; char *ep, *arg, *p; int do_pid, do_kill, check_all; int *pids, *ip; progname = argv[0]; if ((p = strrchr(progname, '/')) != NULL) progname = p+1; setlocale(LC_ALL, ""); bindtextdomain(PACKAGE, LOCALEDIR); textdomain(PACKAGE); numsig = SIGTERM; do_pid = (! strcmp (progname, "pid")); /* Yecch */ do_kill = 0; check_all = 0; /* loop through the arguments. actually, -a is the only option can be used with other options. `kill' is basically a one-option-at-most program. */ for (argc--, argv++; argc > 0; argc--, argv++) { arg = *argv; if (*arg != '-') { break; } if (! strcmp (arg, "--")) { argc--, argv++; break; } if (! strcmp (arg, "-v") || ! strcmp (arg, "-V") || ! strcmp (arg, "--version")) { printf(_("%s from %s\n"), progname, PACKAGE_STRING); return 0; } if (! strcmp (arg, "-a")) { check_all++; continue; } if (! strcmp (arg, "-l")) { if (argc < 2) { printsignals (stdout); return 0; } if (argc > 2) { return usage (1); } /* argc == 2, accept "kill -l $?" */ arg = argv[1]; if ((numsig = arg_to_signum (arg, 1)) < 0) { fprintf (stderr, _("%s: unknown signal %s\n"), progname, arg); return 1; } printsig (numsig); return 0; } if (! strcmp (arg, "-p")) { do_pid++; if (do_kill) return usage (1); continue; } if (! strcmp (arg, "-s")) { if (argc < 2) { return usage (1); } do_kill++; if (do_pid) return usage (1); argc--, argv++; arg = *argv; if ((numsig = arg_to_signum (arg, 0)) < 0) { nosig (arg); return 1; } continue; } if (! strcmp (arg, "-q")) { if (argc < 2) return usage (1); argc--, argv++; arg = *argv; #ifdef HAVE_SIGQUEUE sigdata.sival_int = strtol_or_err(arg, _("failed to parse sigval")); use_sigval = 1; #endif continue; } /* `arg' begins with a dash but is not a known option. so it's probably something like -HUP, or -1/-n try to deal with it. -n could be signal n, or pid -n (i.e. process group n). In case of doubt POSIX tells us to assume a signal. If a signal has been parsed, assume it's a pid, break */ if (do_kill) break; arg++; if ((numsig = arg_to_signum (arg, 0)) < 0) { return usage (1); } do_kill++; if (do_pid) return usage (1); continue; } if (! *argv) { return usage (1); } if (do_pid) { numsig = -1; } /* we're done with the options. the rest of the arguments should be process ids and names. kill them. */ for (errors = 0; (arg = *argv) != NULL; argv++) { pid = strtol (arg, &ep, 10); if (! *ep) errors += kill_verbose (arg, pid, numsig); else { pids = get_pids (arg, check_all); if (! pids) { errors++; fprintf (stderr, _("%s: can't find process \"%s\"\n"), progname, arg); continue; } for (ip = pids; *ip >= 0; ip++) errors += kill_verbose (arg, *ip, numsig); free (pids); } } return (errors); }