From dd93c2ac6b123dc1105e7d8bcdf39d42b08b47d1 Mon Sep 17 00:00:00 2001 From: Daniel Golle Date: Sat, 28 Sep 2024 00:46:33 +0100 Subject: [PATCH] uxc: kill command expects --signal parameter OCI Runtime Command Line Interface specification states that the kill command should take a --signal parameter which can be either a numeric signal or a signal name. Implement that to comply with the OCI spec. Signed-off-by: Daniel Golle --- uxc.c | 161 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 157 insertions(+), 4 deletions(-) diff --git a/uxc.c b/uxc.c index c15b4bc..4926924 100644 --- a/uxc.c +++ b/uxc.c @@ -34,6 +34,10 @@ #include #include +#ifndef ARRAY_SIZE +# define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0])) +#endif + #include "log.h" #define UXC_VERSION "0.3" @@ -92,6 +96,7 @@ static struct option long_options[] = { {"json", no_argument, 0, 'j' }, {"mounts", required_argument, 0, 'm' }, {"pid-file", required_argument, 0, 'p' }, + {"signal", required_argument, 0, 's' }, {"temp-overlay-size", required_argument, 0, 't' }, {"write-overlay-path", required_argument, 0, 'w' }, {"verbose", no_argument, 0, 'v' }, @@ -99,6 +104,128 @@ static struct option long_options[] = { {0, 0, 0, 0 } }; +struct signame { + int signal; + char name[7]; +}; + +static const struct signame signames[] = { +#ifdef SIGABRT + { .signal = SIGABRT, .name = "ABRT" }, +#endif +#ifdef SIGALRM + { .signal = SIGALRM, .name = "ALRM" }, +#endif +#ifdef SIGBUS + { .signal = SIGBUS, .name = "BUS" }, +#endif +#ifdef SIGCHLD + { .signal = SIGCHLD, .name = "CHLD" }, +#endif +#ifdef SIGCLD + { .signal = SIGCLD, .name = "CLD" }, +#endif +#ifdef SIGCONT + { .signal = SIGCONT, .name = "CONT" }, +#endif +#ifdef SIGEMT + { .signal = SIGEMT, .name = "EMT" }, +#endif +#ifdef SIGFPE + { .signal = SIGFPE, .name = "FPE" }, +#endif +#ifdef SIGHUP + { .signal = SIGHUP, .name = "HUP" }, +#endif +#ifdef SIGILL + { .signal = SIGILL, .name = "ILL" }, +#endif +#ifdef SIGINFO + { .signal = SIGINFO, .name = "INFO" }, +#endif +#ifdef SIGINT + { .signal = SIGINT, .name = "INT" }, +#endif +#ifdef SIGIO + { .signal = SIGIO, .name = "IO" }, +#endif +#ifdef SIGIOT + { .signal = SIGIOT, .name = "IOT" }, +#endif +#ifdef SIGKILL + { .signal = SIGKILL, .name = "KILL" }, +#endif +#ifdef SIGLOST + { .signal = SIGLOST, .name = "LOST" }, +#endif +#ifdef SIGPIPE + { .signal = SIGPIPE, .name = "PIPE" }, +#endif +#ifdef SIGPOLL + { .signal = SIGPOLL, .name = "POLL" }, +#endif +#ifdef SIGPROF + { .signal = SIGPROF, .name = "PROF" }, +#endif +#ifdef SIGPWR + { .signal = SIGPWR, .name = "PWR" }, +#endif +#ifdef SIGQUIT + { .signal = SIGQUIT, .name = "QUIT" }, +#endif +#ifdef SIGSEGV + { .signal = SIGSEGV, .name = "SEGV" }, +#endif +#ifdef SIGSTKFLT + { .signal = SIGSTKFLT, .name = "STKFLT" }, +#endif +#ifdef SIGSTOP + { .signal = SIGSTOP, .name = "STOP" }, +#endif +#ifdef SIGSYS + { .signal = SIGSYS, .name = "SYS" }, +#endif +#ifdef SIGTERM + { .signal = SIGTERM, .name = "TERM" }, +#endif +#ifdef SIGTRAP + { .signal = SIGTRAP, .name = "TRAP" }, +#endif +#ifdef SIGTSTP + { .signal = SIGTSTP, .name = "TSTP" }, +#endif +#ifdef SIGTTIN + { .signal = SIGTTIN, .name = "TTIN" }, +#endif +#ifdef SIGTTOU + { .signal = SIGTTOU, .name = "TTOU" }, +#endif +#ifdef SIGUNUSED + { .signal = SIGUNUSED, .name = "UNUSED" }, +#endif +#ifdef SIGURG + { .signal = SIGURG, .name = "URG" }, +#endif +#ifdef SIGUSR1 + { .signal = SIGUSR1, .name = "USR1" }, +#endif +#ifdef SIGUSR2 + { .signal = SIGUSR2, .name = "USR2" }, +#endif +#ifdef SIGVTALRM + { .signal = SIGVTALRM, .name = "VTALRM" }, +#endif +#ifdef SIGWINCH + { .signal = SIGWINCH, .name = "WINCH" }, +#endif +#ifdef SIGXCPU + { .signal = SIGXCPU, .name = "XCPU" }, +#endif +#ifdef SIGXFSZ + { .signal = SIGXFSZ, .name = "XFSZ" }, +#endif +}; + AVL_TREE(runtime, avl_strcmp, false, NULL); AVL_TREE(settings, avl_strcmp, false, NULL); static struct blob_buf conf; @@ -120,7 +247,7 @@ static int usage(void) { printf("\t\t[--mounts ,,...,]\t\trequire filesystems to be available\n"); printf("\tstart [--console] \t\tstart container \n"); printf("\tstate \t\t\t\tget state of container \n"); - printf("\tkill []\t\t\tsend signal to container \n"); + printf("\tkill [--signal ]\t\tsend signal to container \n"); printf("\tenable \t\t\t\tstart container on boot\n"); printf("\tdisable \t\t\t\tdon't start container on boot\n"); printf("\tdelete [--force]\t\t\tdelete \n"); @@ -1375,6 +1502,28 @@ static void reload_conf(void) settings_add(); } +static int get_signum(const char *name) +{ + char *endptr; + long sig; + int i; + + sig = strtol(name, &endptr, 10); + if (endptr == name + strlen(name) && sig < NSIG) + /* string is a valid signal number */ + return sig; + + if (strncasecmp(name, "SIG", 3) == 0) + name += 3; + + for (i = 0; i < ARRAY_SIZE(signames); ++i) { + if (!strcmp(name, signames[i].name)) + return signames[i].signal; + } + + return -1; +} + int main(int argc, char **argv) { enum uxc_cmd cmd = CMD_UNKNOWN; @@ -1444,6 +1593,12 @@ int main(int argc, char **argv) pidfile = optarg; break; + case 's': + signal = get_signum(optarg); + if (signal < 0) + goto usage_out; + break; + case 't': tmprwsize = optarg; break; @@ -1521,9 +1676,7 @@ int main(int argc, char **argv) break; case CMD_KILL: - if (optind == (argc - 3)) - signal = atoi(argv[optind + 2]); - else if (optind > argc - 2) + if (optind > argc - 2) goto usage_out; ret = uxc_kill(argv[optind + 1], signal); -- 2.30.2