diff options
-rw-r--r-- | srcx/jkill.c | 99 |
1 files changed, 66 insertions, 33 deletions
diff --git a/srcx/jkill.c b/srcx/jkill.c index 236a2f4..dae91d7 100644 --- a/srcx/jkill.c +++ b/srcx/jkill.c @@ -81,7 +81,8 @@ static void parse_jail_opts(int argc, char* argv[]); static void parse_host_opts(int argc, char* argv[]); static void usage(); -static void usage_jail(const char* name); +static void usage_jail(); +static void usage_hr(const char* name); int main(int argc, char* argv[]) { @@ -115,7 +116,7 @@ int main(int argc, char* argv[]) else { - parse_host_opts(argc, argv); + parse_host_opts(argc, argv, 1); argc -= optind; argv += optind; @@ -190,53 +191,74 @@ static void parse_jail_opts(int argc, char* argv[]) { char* t; int ch; + int ishr = 0; t = strchr(argv[0], '/'); t = t ? t + 1 : argv[0]; + g_verbose = 1; + g_force = 1; + g_usescripts = 1; + if(strcmp(t, "halt") == 0) { - g_verbose = 1; - g_force = 1; - g_usescripts = 1; g_restart = 0; + ishr = 1; } else if(strcmp(t, "reboot") == 0) { - g_verbose = 1; - g_force = 1; - g_usescripts = 1; g_restart = 1; + ishr = 1; } - else + /* Options for jkill */ + if(!ishr) { - /* - * When not named either of the above we fall through - * and process the arguments as usual. - */ - parse_host_opts(argc, argv); - return; + while((ch = getopt(argc, argv, "rt:")) != -1) + { + switch(ch) + { + case 'r': + g_restart = 1; + break; + + /* Timeout to use between kills */ + case 't': + g_timeout = atoi(optarg); + if(g_timeout <= 0) + errx(2, "invalid timeout argument: %s", optarg); + break; + + case '?': + default: + usage_jail(); + break; + } + } } - while((ch = getopt(argc, argv, "dk:lnqp")) != -1) + /* These are the options for 'halt' and 'reboot' */ + else { - switch(ch) + while((ch = getopt(argc, argv, "dk:lnqp")) != -1) { - case 'd': - case 'k': - case 'l': - case 'n': - case 'q': - case 'p': - warnx("the '-%c' option is not supported from inside a jail", (char)ch); - break; + switch(ch) + { + case 'd': + case 'k': + case 'l': + case 'n': + case 'q': + case 'p': + warnx("the '-%c' option is not supported from inside a jail", (char)ch); + break; - case '?': - default: - usage_jail(t); - break; + case '?': + default: + usage_hr(t); + break; + } } } @@ -244,10 +266,15 @@ static void parse_jail_opts(int argc, char* argv[]) argv += optind; if(argc > 0) - usage_jail(t); + { + if(ishr) + usage_hr(t); + else + usage_jail(); + } } -static void parse_host_opts(int argc, char* argv[]) +static void parse_host_opts(int argc, char* argv[], int namereq) { int ch; @@ -302,7 +329,7 @@ static void parse_host_opts(int argc, char* argv[]) argc -= optind; argv += optind; - if(argc <= 0) + if(namereq && argc <= 0) usage(); } @@ -470,7 +497,13 @@ static void usage() exit(2); } -static void usage_jail(const char* name) +static void usage_jail() +{ + fprintf(stderr, "usage: jkill [-r] [-t timeout]\n"); + exit(2); +} + +static void usage_hr(const char* name) { fprintf(stderr, "usage: %s\n", name); exit(2); |