bool_t string_to_signum(const char *str, int *ret) { if (signame_to_signum(str, ret)) return TRUE; return string_to_integer(str, ret); }
static void parse_pdeathsig(struct privctx *opts, const char *str) { if (!strcmp(str, "keep")) { if (prctl(PR_GET_PDEATHSIG, &opts->pdeathsig) != 0) errx(SETPRIV_EXIT_PRIVERR, _("failed to get parent death signal")); } else if (!strcmp(str, "clear")) { opts->pdeathsig = -1; } else if ((opts->pdeathsig = signame_to_signum(str)) < 0) { errx(EXIT_FAILURE, _("unknown signal: %s"), str); } }
static int arg_to_signum(char *arg, int maskbit) { int numsig; char *ep; if (isdigit(*arg)) { numsig = strtol(arg, &ep, 10); if (NSIG <= numsig && maskbit && (numsig & 128) != 0) numsig -= 128; if (*ep != 0 || numsig < 0 || NSIG <= numsig) return -1; return numsig; } return signame_to_signum(arg); }
int arg_to_signum (char *arg, int maskbit) { int numsig; char *ep; if (isdigit (*arg)) { numsig = strtol (arg, &ep, 10); if (numsig >= NSIG && maskbit && (numsig & 128) != 0) numsig -= 128; if (*ep != 0 || numsig < 0 || numsig >= NSIG) return (-1); return (numsig); } return (signame_to_signum (arg)); }
/** * signal name to int * * returns the signal number for a signal name. signame might be SIGHUP or * HUP for example. * * returns * -2 for too short sig name * -1 for unknown signal * >0 signal number */ int signum(char* signame) { char sigtmp[10] = ""; char *sig = sigtmp; // if the string is less than 3 characters, abort if (strlen(signame) < 3) return -2; // if the first 3 chars are "SIG", remove them if (signame[0] == 'S' && signame[1] == 'I' && signame[2] == 'G') { memcpy(sig, &(signame[3]), strlen(signame)-3); sig[strlen(signame)-3] = '\0'; } else { sig = signame; } return signame_to_signum(sig); }
int main(int argc, char *argv[], char *envp[]) { char *cmd = NULL, *ptr; int retval = EXIT_SUCCESS, c, interval = 2, len, i, j, *lens = NULL; while ((c = getopt(argc, argv, "+hn:s:")) != -1) { switch (c) { case 'h': retval = EXIT_SUCCESS; goto main_exit; break; case 's': sig = atoi(optarg); if (!sig) { sig = signame_to_signum(optarg); } break; case 'n': interval = atoi(optarg); if (!interval) { retval = EXIT_SUCCESS; goto main_exit; } break; default: retval = EXIT_FAILURE; goto main_exit; } } if (argc <= optind) { usage(argv[0]); retval = EXIT_FAILURE; goto main_exit; } signal(SIGINT, stirb); signal(SIGTERM, stirb); signal(SIGHUP, stirb); signal(SIGCHLD, kindermord); if ((childpid = fork()) == 0) { if (execve(argv[optind], argv+optind, envp) < 0) { perror(argv[optind]); exit(1); } } else { sleep(interval); kill(childpid, sig); waitpid(childpid, NULL, 0); } main_exit: if (cmd) free(cmd); if (lens) free(lens); return retval; }
int trapcmd(int argc, char **argv) { char *action; char **ap; int signo; if (argc <= 1) { for (signo = 0 ; signo <= NSIG ; signo++) if (trap[signo] != NULL) { out1fmt("trap -- "); print_quoted(trap[signo]); out1fmt(" %s\n", (signo) ? sys_signame[signo] : "EXIT"); } return 0; } ap = argv + 1; action = NULL; if (strcmp(*ap, "--") == 0) if (*++ap == NULL) return 0; if (signame_to_signum(*ap) == -1) { if ((*ap)[0] == '-') { if ((*ap)[1] == '\0') ap++; else if ((*ap)[1] == 'l' && (*ap)[2] == '\0') { printsignals(); return 0; } else error("bad option %s\n", *ap); } else action = *ap++; } while (*ap) { if (is_number(*ap)) signo = number(*ap); else signo = signame_to_signum(*ap); if (signo < 0 || signo > NSIG) error("%s: bad trap", *ap); INTOFF; if (action) action = savestr(action); if (trap[signo]) ckfree(trap[signo]); trap[signo] = action; if (signo != 0) setsignal(signo, 0); INTON; ap++; } return 0; }
int main(int argc, char *argv[]) { int errors, numsig, pid; char *ep; setprogname(argv[0]); setlocale(LC_ALL, ""); if (argc < 2) usage(); numsig = SIGTERM; argc--, argv++; if (strcmp(*argv, "-l") == 0) { argc--, argv++; if (argc > 1) usage(); if (argc == 1) { if (isdigit((unsigned char)**argv) == 0) usage(); numsig = strtol(*argv, &ep, 10); if (*ep != '\0') { errx(EXIT_FAILURE, "illegal signal number: %s", *argv); /* NOTREACHED */ } if (numsig >= 128) numsig -= 128; if (numsig <= 0 || numsig >= NSIG) nosig(*argv); printf("%s\n", sys_signame[numsig]); exit(0); } printsignals(stdout); exit(0); } if (!strcmp(*argv, "-s")) { argc--, argv++; if (argc < 1) { warnx("option requires an argument -- s"); usage(); } if (strcmp(*argv, "0")) { if ((numsig = signame_to_signum(*argv)) < 0) nosig(*argv); } else numsig = 0; argc--, argv++; } else if (**argv == '-') { char *sn = *argv + 1; if (isalpha((unsigned char)*sn)) { if ((numsig = signame_to_signum(sn)) < 0) nosig(sn); } else if (isdigit((unsigned char)*sn)) { numsig = strtol(sn, &ep, 10); if (*ep) { errx(EXIT_FAILURE, "illegal signal number: %s", sn); /* NOTREACHED */ } if (numsig < 0 || numsig >= NSIG) nosig(sn); } else nosig(sn); argc--, argv++; } if (argc == 0) usage(); for (errors = 0; argc; argc--, argv++) { #ifdef SHELL extern int getjobpgrp(const char *); if (*argv[0] == '%') { pid = getjobpgrp(*argv); if (pid == 0) { warnx("illegal job id: %s", *argv); errors = 1; continue; } } else #endif { pid = strtol(*argv, &ep, 10); if (!**argv || *ep) { warnx("illegal process id: %s", *argv); errors = 1; continue; } } if (kill(pid, numsig) == -1) { warn("%s", *argv); errors = 1; } #ifdef SHELL /* Wakeup the process if it was suspended, so it can exit without an explicit 'fg'. */ if (numsig == SIGTERM || numsig == SIGHUP) kill(pid, SIGCONT); #endif } exit(errors); /* NOTREACHED */ }
int main(int argc, char *argv[]) { int errors, numsig, pid; char *ep; if (argc < 2) usage(); numsig = SIGTERM; argc--, argv++; if (!strcmp(*argv, "-l")) { argc--, argv++; if (argc > 1) usage(); if (argc == 1) { if (!isdigit(**argv)) usage(); numsig = strtol(*argv, &ep, 10); if (!**argv || *ep) errx(2, "illegal signal number: %s", *argv); if (numsig >= 128) numsig -= 128; if (numsig <= 0 || numsig >= sys_nsig) nosig(*argv); printf("%s\n", sys_signame[numsig]); return (0); } printsignals(stdout); return (0); } if (!strcmp(*argv, "-s")) { argc--, argv++; if (argc < 1) { warnx("option requires an argument -- s"); usage(); } if (strcmp(*argv, "0")) { if ((numsig = signame_to_signum(*argv)) < 0) nosig(*argv); } else numsig = 0; argc--, argv++; } else if (**argv == '-' && *(*argv + 1) != '-') { ++*argv; if (isalpha(**argv)) { if ((numsig = signame_to_signum(*argv)) < 0) nosig(*argv); } else if (isdigit(**argv)) { numsig = strtol(*argv, &ep, 10); if (!**argv || *ep) errx(2, "illegal signal number: %s", *argv); if (numsig < 0) nosig(*argv); } else nosig(*argv); argc--, argv++; } if (argc > 0 && strncmp(*argv, "--", 2) == 0) argc--, argv++; if (argc == 0) usage(); for (errors = 0; argc; argc--, argv++) { #ifdef SHELL if (**argv == '%') pid = getjobpgrp(*argv); else #endif { pid = strtol(*argv, &ep, 10); if (!**argv || *ep) errx(2, "illegal process id: %s", *argv); } if (kill(pid, numsig) == -1) { warn("%s", *argv); errors = 1; } } return (errors); }
int main(int argc, char *argv[]) { int errors, numsig, pid; char *ep; if (argc < 2) usage(); numsig = SIGTERM; argc--; argv++; if (!strcmp(*argv, "-l")) { argc--, argv++; if (argc > 1) usage(); if (argc == 1) { if (isdigit((unsigned char)**argv) == 0) usage(); numsig = strtol(*argv, &ep, 10); if (!*argv || *ep) errx(1, "illegal signal number: %s", *argv); if (numsig >= 128) numsig -= 128; if (numsig <= 0 || numsig >= NSIG) nosig(*argv); printf("%s\n", sys_signame[numsig]); exit(0); } printsignals(stdout); exit(0); } if (!strcmp(*argv, "-s")) { argc--, argv++; if (argc < 1) { warnx("option requires an argument -- s"); usage(); } if (strcmp(*argv, "0")) { if ((numsig = signame_to_signum(*argv)) < 0) nosig(*argv); } else numsig = 0; argc--, argv++; } else if (**argv == '-') { ++*argv; if (isalpha(**argv)) { if ((numsig = signame_to_signum(*argv)) < 0) nosig(*argv); } else if (isdigit(**argv)) { numsig = strtol(*argv, &ep, 10); if (!*argv || *ep) errx(1, "illegal signal number: %s", *argv); if (numsig <= 0 || numsig >= NSIG) nosig(*argv); } else nosig(*argv); argc--, argv++; } if (argc == 0) usage(); for (errors = 0; argc; argc--, argv++) { pid = strtol(*argv, &ep, 10); if (!*argv || *ep) { warnx("illegal process id: %s", *argv); errors = 1; } else if (kill(pid, numsig) == -1) { warn("%s", *argv); errors = 1; } } exit(errors); }
int trapcmd(int argc, char **argv) { char *action; char **ap; int signo; int errs = 0; int printonly = 0; ap = argv + 1; if (argc == 2 && strcmp(*ap, "-l") == 0) { printsignals(); return 0; } if (argc == 2 && strcmp(*ap, "-") == 0) { for (signo = 0; signo < NSIG; signo++) { if (trap[signo] == NULL) continue; INTOFF; ckfree(trap[signo]); trap[signo] = NULL; if (signo != 0) setsignal(signo, 0); INTON; } return 0; } if (argc >= 2 && strcmp(*ap, "-p") == 0) { printonly = 1; ap++; argc--; } if (argc > 1 && strcmp(*ap, "--") == 0) { argc--; ap++; } if (argc <= 1) { int count; if (printonly) { for (count = 0, signo = 0 ; signo < NSIG ; signo++) if (trap[signo] == NULL) { if (count == 0) out1str("trap -- -"); out1fmt(" %s", trap_signame(signo)); /* oh! unlucky 13 */ if (++count >= 13) { out1str("\n"); count = 0; } } if (count) out1str("\n"); } for (count = 0, signo = 0 ; signo < NSIG ; signo++) if (trap[signo] != NULL && trap[signo][0] == '\0') { if (count == 0) out1str("trap -- ''"); out1fmt(" %s", trap_signame(signo)); /* * the prefix is 10 bytes, with 4 byte * signal names (common) we have room in * the 70 bytes left on a normal line for * 70/(4+1) signals, that's 14, but to * allow for the occasional longer sig name * we output one less... */ if (++count >= 13) { out1str("\n"); count = 0; } } if (count) out1str("\n"); for (signo = 0 ; signo < NSIG ; signo++) if (trap[signo] != NULL && trap[signo][0] != '\0') { out1str("trap -- "); print_quoted(trap[signo]); out1fmt(" %s\n", trap_signame(signo)); } return 0; } action = NULL; if (!printonly && !is_number(*ap)) { if ((*ap)[0] == '-' && (*ap)[1] == '\0') ap++; /* reset to default */ else action = *ap++; /* can be '' for "ignore" */ argc--; } if (argc < 2) { /* there must be at least 1 condition */ out2str("Usage: trap [-l]\n" " trap -p [condition ...]\n" " trap action condition ...\n" " trap N condition ...\n"); return 2; } while (*ap) { signo = signame_to_signum(*ap); if (signo < 0 || signo >= NSIG) { /* This is not a fatal error, so sayeth posix */ outfmt(out2, "trap: '%s' bad condition\n", *ap); errs = 1; ap++; continue; } ap++; if (printonly) { out1str("trap -- "); if (trap[signo] == NULL) out1str("-"); else print_quoted(trap[signo]); out1fmt(" %s\n", trap_signame(signo)); continue; } INTOFF; if (action) action = savestr(action); if (trap[signo]) ckfree(trap[signo]); trap[signo] = action; if (signo != 0) setsignal(signo, 0); INTON; } return errs; }
int trapcmd(shinstance *psh, int argc, char **argv) { char *action; char **ap; int signo; #ifndef HAVE_SYS_SIGNAME init_sys_signame(); #endif if (argc <= 1) { for (signo = 0 ; signo <= NSIG ; signo++) if (psh->trap[signo] != NULL) { out1fmt(psh, "trap -- "); print_quoted(psh, psh->trap[signo]); out1fmt(psh, " %s\n", (signo) ? sys_signame[signo] : "EXIT"); } return 0; } ap = argv + 1; action = NULL; if (strcmp(*ap, "--") == 0) if (*++ap == NULL) return 0; if (signame_to_signum(psh, *ap) == -1) { if ((*ap)[0] == '-') { if ((*ap)[1] == '\0') ap++; else if ((*ap)[1] == 'l' && (*ap)[2] == '\0') { printsignals(psh); return 0; } else error(psh, "bad option %s\n", *ap); } else action = *ap++; } while (*ap) { if (is_number(*ap)) signo = number(psh, *ap); else signo = signame_to_signum(psh, *ap); if (signo < 0 || signo > NSIG) error(psh, "%s: bad trap", *ap); INTOFF; if (action) action = savestr(psh, action); if (psh->trap[signo]) ckfree(psh, psh->trap[signo]); psh->trap[signo] = action; if (signo != 0) setsignal(psh, signo, 0); INTON; ap++; } return 0; }