skill: add long options

This commit broke `-l <sig>' conversion, which needs to be fixed
before kill can be claimed to work similar enough way as it did
earlier.  The fix require libprocps change, because the current
print_given_signals() simply does not work in this case.

Signed-off-by: Sami Kerola <kerolasa@iki.fi>
This commit is contained in:
Sami Kerola 2011-10-22 12:20:35 +02:00
parent b4b73df69c
commit a45a1c6c88

136
skill.c
View File

@ -331,100 +331,72 @@ static void __attribute__ ((__noreturn__)) skillsnice_usage(void)
/* kill */ /* kill */
static void __attribute__ ((__noreturn__)) static void __attribute__ ((__noreturn__))
kill_main(int argc, char ** argv, kill_main(int argc, char **argv, struct run_time_conf_t *run_time)
struct run_time_conf_t *run_time)
{ {
const char *sigptr; const char *sigptr;
int signo = SIGTERM; int signo, i;
int exitvalue = 0; int sigopt = 0;
long pid;
int exitvalue = EXIT_SUCCESS;
static const struct option longopts[] = {
{"list", optional_argument, NULL, 'l'},
{"table", no_argument, NULL, 'L'},
{"signal", required_argument, NULL, 's'},
{"help", no_argument, NULL, 'h'},
{"version", no_argument, NULL, 'V'},
{NULL, 0, NULL, 0}
};
if (argc < 2) if (argc < 2)
kill_usage(); kill_usage();
if (!strcmp(argv[1], "-V") || !strcmp(argv[1], "--version")) {
display_kill_version();
exit(0);
}
if (argv[1][0] != '-') {
argv++;
argc--;
goto no_more_args;
}
/* The -l option prints out signal names. */ signo = skill_sig_option(&argc, argv);
if (argv[1][1] == 'l' && argv[1][2] == '\0') { if (signo < 0)
if (argc == 2) { signo = SIGTERM;
unix_print_signals(); else
exit(0); sigopt++;
}
/* at this point, argc must be 3 or more */
if (argc > 128 || argv[2][0] == '-')
kill_usage();
exit(print_given_signals(argc - 2, argv + 2, 80));
}
/* The -L option prints out signal names in a nice table. */ while ((i = getopt_long(argc, argv, "l::Ls:hV", longopts, NULL)) != -1)
if (argv[1][1] == 'L' && argv[1][2] == '\0') { switch (i) {
if (argc == 2) { case 'l':
if (optarg) {
/* FIXME */
errx(EXIT_FAILURE,
"signal name <-> number conversion is not implemented");
} else {
unix_print_signals();
}
exit(EXIT_SUCCESS);
case 'L':
pretty_print_signals(); pretty_print_signals();
exit(0); exit(EXIT_SUCCESS);
case 's':
signo = signal_name_to_number(optarg);
break;
case 'h':
kill_usage();
case 'V':
display_kill_version();
exit(EXIT_SUCCESS);
default:
kill_usage();
} }
kill_usage();
} argc -= optind + sigopt;
if (argv[1][1] == '-' && argv[1][2] == '\0') { argv += optind;
argv += 2;
argc -= 2; for (i = 0; i < argc; i++) {
goto no_more_args; pid = strtol_or_err(argv[i], _("failed to parse argument"));
} if (!kill((pid_t) pid, signo))
if (argv[1][1] == '-')
kill_usage(); /* likely --help */
// FIXME: "kill -sWINCH $$" not handled
if (argv[1][2] == '\0' && (argv[1][1] == 's' || argv[1][1] == 'n')) {
sigptr = argv[2];
argv += 3;
argc -= 3;
} else {
sigptr = argv[1] + 1;
argv += 2;
argc -= 2;
}
signo = signal_name_to_number(sigptr);
if (signo < 0) {
fprintf(stderr, _("ERROR: unknown signal name \"%s\".\n"),
sigptr);
kill_usage();
}
no_more_args:
if (!argc)
kill_usage(); /* nothing to kill? */
while (argc--) {
long pid;
char *endp;
pid = strtol(argv[argc], &endp, 10);
if (!*endp && (endp != argv[argc])) {
if (!kill((pid_t) pid, signo))
continue;
/*
* The UNIX standard contradicts itself. If at least
* one process is matched for each PID (as if
* processes could share PID!) and "the specified
* signal was successfully processed" (the systcall
* returned zero?) for at least one of those
* processes, then we must exit with zero. Note that
* an error might have also occured. The standard
* says we return non-zero if an error occurs. Thus
* if killing two processes gives 0 for one and EPERM
* for the other, we are required to return both zero
* and non-zero. Quantum kill???
*/
perror("kill");
exitvalue = 1;
continue; continue;
} exitvalue = EXIT_FAILURE;
fprintf(stderr, _("ERROR: garbage process ID \"%s\".\n"), continue;
argv[argc]);
kill_usage();
} }
exit(exitvalue); exit(exitvalue);
} }
#if 0 #if 0
static void _skillsnice_usage(int line) static void _skillsnice_usage(int line)
{ {