commit a31f717839e7e343ae5cc75e7e4e24b7ff703ccc from: Stefan Sperling date: Mon Sep 11 11:41:42 2023 UTC allow T_HANDLER to process any number of arguments between 0 and 6 This way we can write handlers that accept all arguments listed in their ctl table as actual arguments, rather than passing unused parameters which contain ununitialized garbage. The benefit is better clarity about the expected values of arguments passed on by handler functions. Adjust motd and crontab handlers accordingly which use T_HANDLER. All instances of call_editor() now use T_HANDLER_FILL1. commit - df1b71b4ffb08376e1c36576d0cb9ba9456cbeba commit + a31f717839e7e343ae5cc75e7e4e24b7ff703ccc blob - 5595248f26d9a4f1057c8112534aad0e2dc3c15b blob + d71a7330b615a2751313d4717e6d18e45af1b46e --- ctl.c +++ ctl.c @@ -62,8 +62,9 @@ daemons2todaemons(struct daemons *daemons, struct ctl static char table[16]; /* service routines */ -void edit_crontab(char *, char **, char *); -void install_crontab(char *, char **, char *); +void edit_crontab(char *); +void install_crontab(char *); +void edit_motd(char *); void call_editor(char *, char **, char *); int edit_file(char *, mode_t, char *, char **); void ctl_symlink(char *, char *, char *); @@ -125,7 +126,7 @@ struct ctl ctl_crontab[] = { /* MOTD */ struct ctl ctl_motd[] = { { "edit", "edit message-of-the-day", - { "motd", NULL, NULL }, call_editor, 0, T_HANDLER }, + { "motd", NULL, NULL }, edit_motd, 0, T_HANDLER }, { 0, 0, { 0 }, 0, 0, 0 } }; @@ -641,6 +642,7 @@ ctlhandler(int argc, char **argv, char *modhvar) void (*xhandler)(); int xflag_x; char **xtest_args = NULL; + int nargs; memset(&daemons1, 0, sizeof(daemons1)); @@ -734,10 +736,37 @@ ctlhandler(int argc, char **argv, char *modhvar) /* fill_tmpfile will return 0 if tmpfile or args are NULL */ case T_HANDLER: /* pointer to handler routine, fill main args */ - if (fill_tmpfile(fillargs, tmpfile, tmp_args)) { + nargs = fill_tmpfile(fillargs, tmpfile, tmp_args); + switch (nargs) { + case 0: + (*xhandler)(); + break; + case 1: + (*xhandler)(tmp_args[0]); + break; + case 2: + (*xhandler)(tmp_args[0], tmp_args[1]); + break; + case 3: (*xhandler)(tmp_args[0], tmp_args[1], tmp_args[2]); - } else { - (*xhandler)(fillargs[0], fillargs[1], fillargs[2]); + break; + case 4: + (*xhandler)(tmp_args[0], tmp_args[1], tmp_args[2], + tmp_args[3]); + break; + case 5: + (*xhandler)(tmp_args[0], tmp_args[1], tmp_args[2], + tmp_args[3], tmp_args[4]); + break; + case 6: + (*xhandler)(tmp_args[0], tmp_args[1], tmp_args[2], + tmp_args[3], tmp_args[4], tmp_args[5]); + break; + case NOPTFILL: /* bump this when adding more cases */ + default: + printf("%% handler %s %s requires too many " + "arguments: %d\n", hname, argv[1], nargs); + break; } break; case T_HANDLER_FILL1: @@ -763,15 +792,20 @@ ctlhandler(int argc, char **argv, char *modhvar) return 1; } +/* + * Copy arguments from fillargs to tmp_args with temporary filenames + * expanded. Return the number of arguments stored in tmp_args. + * The maximum number of arguments allowed is NOPTFILL - 1. + */ int fill_tmpfile(char **fillargs, char *tmpfile, char **tmp_args) { - int i; + int i, n; if (fillargs == NULL || tmpfile == NULL) return 0; - for (i = 0; i < NOPTFILL - 1; i++) { + for (i = 0, n = 0; i < NOPTFILL - 1; i++) { if(fillargs[i] == NULL) { break; } @@ -780,12 +814,14 @@ fill_tmpfile(char **fillargs, char *tmpfile, char **tm } else { tmp_args[i] = fillargs[i]; } + n++; } - return 1; + + return n; } void -edit_crontab(char *name, char **args, char *z) +edit_crontab(char *name) { char *crontab_argv[] = { CRONTAB, "-u", "root", "-l", NULL }; char tmpfile[PATH_MAX]; @@ -826,7 +862,7 @@ edit_crontab(char *name, char **args, char *z) } } - if (edit_file(tmpfile, daemons->mode, daemons->propername, args) == 0) { + if (edit_file(tmpfile, daemons->mode, daemons->propername, NULL) == 0) { crontab_argv[3] = tmpfile; if (cmdargs(CRONTAB, crontab_argv) != 0) printf("%% failed to install crontab\n"); @@ -836,7 +872,7 @@ done: } void -install_crontab(char *name, char **args, char *z) +install_crontab(char *name) { char *crontab_argv[] = { CRONTAB, "-u", "root", NULL, NULL }; char tmpfile[PATH_MAX]; @@ -863,6 +899,12 @@ install_crontab(char *name, char **args, char *z) printf("%% failed to install crontab\n"); rls_lock(fd); } +} + +void +edit_motd(char *name) +{ + call_editor(name, NULL, NULL); } void