commit - b89991056cdba3650e3f4782b0a938b3c38116f9
commit + 2cca9bd6cf03e750edb3b76d1cfd5bff1cb51953
blob - 17256bbabcae936e02f020bc676e43ad55dc1a51
blob + 10708daf18f31248cb47bdfec873ce1807bc56a1
--- commands.c
+++ commands.c
*/
#define ssctl sizeof(struct ctl)
+#define ssctl2 sizeof(struct ctl2)
Command cmdtab[] = {
{ "hostname", hostnamehelp, CMPL0 0, 0, hostname, 1, 1, 0, 0 },
{ "interface", interfacehelp, CMPL(i) 0, 0, interface, 1, 1, 1, 1 },
{ "dvmrp", dvmrphelp, CMPL(t) (char **)ctl_dvmrp, ssctl, ctlhandler, 1, 1, 0, 1 },
{ "rad", radhelp, CMPL(t) (char **)ctl_rad, ssctl, ctlhandler, 1, 1, 0, 1 },
{ "sasync", sasynchelp, CMPL(t) (char **)ctl_sasync, ssctl, ctlhandler, 1, 1, 0, 1 },
- { "dhcp", dhcphelp, CMPL(t) (char **)ctl_dhcp, ssctl, ctlhandler, 1, 1, 0, 1 },
+ { "dhcp", dhcphelp, CMPL(t) (char **)ctl_dhcp, ssctl2, ctlhandler, 1, 1, 0, 1 },
{ "snmp", snmphelp, CMPL(t) (char **)ctl_snmp, ssctl, ctlhandler, 1, 1, 0, 1 },
{ "ldap", ldaphelp, CMPL(t) (char **)ctl_ldap, ssctl, ctlhandler, 1, 1, 0, 1 },
{ "smtp", smtphelp, CMPL(t) (char **)ctl_smtp, ssctl, ctlhandler, 1, 1, 0, 1 },
blob - 407a33805d855e38bbb8d2106b5ae650ca1bf46b
blob + 2f6db66af9157ff6d800f4c87da3647435ce6d42
--- ctl.c
+++ ctl.c
#include "editing.h"
#include "ctl.h"
+static inline void
+ctl2toctl(struct ctl *ctl, const struct ctl2 *ctl2)
+{
+ ctl->name = ctl2->name;
+ ctl->help = ctl2->help;
+ memcpy(ctl->args, ctl2->args, sizeof(ctl->args));
+ if (ctl2->type == T_HANDLER_FILL1)
+ ctl->args[1] = (char *)ctl2->test_args;
+ ctl->handler = ctl2->handler;
+ ctl->flag_x = ctl->flag_x;
+ ctl->type = ctl->type;
+}
+
+static inline void
+daemons2todaemons(struct daemons *daemons, struct ctl *ctl1,
+ const struct daemons2 *daemons2)
+{
+ daemons->name = daemons2->name;
+ daemons->propername = daemons2->propername;
+ ctl2toctl(ctl1, daemons2->table);
+ daemons->table = ctl1;
+ daemons->tmpfile = daemons2->tmpfile;
+ daemons->mode = daemons2->mode;
+ daemons->doreload = daemons2->doreload;
+ daemons->rtablemax = daemons2->rtablemax;
+}
+
/* table variable (for pkill usage) */
static char table[16];
{ "rad", "rad", ctl_rad, RADCONF_TEMP, 0600, 0, 0 },
{ "dvmrp", "DVMRP",ctl_dvmrp, DVMRPCONF_TEMP, 0600, 0, RT_TABLEID_MAX },
{ "sasync", "SAsync",ctl_sasync, SASYNCCONF_TEMP,0600, 0, RT_TABLEID_MAX },
-{ "dhcp", "DHCP", ctl_dhcp, DHCPCONF_TEMP, 0600, 0, RT_TABLEID_MAX },
{ "snmp", "SNMP", ctl_snmp, SNMPCONF_TEMP, 0600, 0, RT_TABLEID_MAX },
{ "sshd", "SSH", ctl_sshd, SSHDCONF_TEMP, 0600, 0, RT_TABLEID_MAX },
{ "ntp", "NTP", ctl_ntp, NTPCONF_TEMP, 0600, 0, 0 },
{ 0, 0, 0, 0, 0, 0 }
};
+struct daemons2 ctl_daemons2[] = {
+{ "dhcp", "DHCP", ctl_dhcp, DHCPCONF_TEMP, 0600, 0, RT_TABLEID_MAX },
+};
+
/* per-daemon commands, and their C or executable functions */
/* CRONTAB */
};
/* dhcpd */
-char *ctl_dhcp_test[] = { DHCPD, "-nc", REQTEMP, NULL };
-struct ctl ctl_dhcp[] = {
+struct ctl2 ctl_dhcp[] = {
{ "enable", "enable DHCPd daemon",
- { DHCPD, "-c", REQTEMP, "-l", DHCPLEASES, NULL }, NULL, DB_X_ENABLE,
- T_EXEC },
- { "disable", "disable DHCPd daemon",
- { PKILL, table, "dhcpd", NULL }, NULL, DB_X_DISABLE, T_EXEC },
+ { DHCPD, "-c", REQTEMP, "-l", DHCPLEASES, NULL }, { NULL, }, NULL,
+ DB_X_ENABLE, T_EXEC },
+ { "disable", "disable DHCPd daemon",
+ { PKILL, table, "dhcpd", NULL }, { NULL, }, NULL, DB_X_DISABLE, T_EXEC },
{ "edit", "edit,test and stage DHCPd config",
- { "dhcp", (char *)ctl_dhcp_test, NULL }, call_editor, 0,
+ { "dhcp", NULL }, { DHCPD, "-nc", REQTEMP, NULL }, call_editor, 0,
T_HANDLER_FILL1 },
{ "config-test", "test staged DHCPd config",
- { DHCPD, "-nc", REQTEMP, "-l", DHCPLEASES, NULL }, NULL, 0,
- T_EXEC },
- { 0, 0, { 0 }, 0, 0, 0 }
+ { DHCPD, "-nc", REQTEMP, "-l", DHCPLEASES, NULL }, { NULL, },
+ NULL, 0, T_EXEC },
+ { NULL, NULL, { NULL }, { NULL }, NULL, 0, 0 }
};
/* snmpd, snmpctl */
ctlhandler(int argc, char **argv, char *modhvar)
{
struct daemons *daemons;
+ struct daemons2 *daemons2;
struct ctl *x;
+ struct ctl2 *x2;
+ struct daemons daemons1;
+ struct ctl ctl1;
char tmpfile[PATH_MAX];
char *step_args[NOPTFILL] = { NULL, NULL, NULL, NULL, NULL, NULL };
char *tmp_args[NOPTFILL] = { NULL, NULL, NULL, NULL, NULL, NULL };
char **fillargs;
+ char **xargs;
+ int xtype;
+ void (*xhandler)();
+ int xflag_x;
+
+ memset(&daemons1, 0, sizeof(daemons1));
/* loop daemon list to find table pointer */
daemons = (struct daemons *) genget(hname, (char **)ctl_daemons,
sizeof(struct daemons));
- if (daemons == 0) {
- printf("%% Internal error - Invalid argument %s\n", argv[1]);
- return 0;
+ if (daemons == NULL) {
+ daemons2 = (struct daemons2 *) genget(hname,
+ (char **)ctl_daemons2, sizeof(struct daemons2));
+ if (daemons2 == NULL) {
+ printf("%% Internal error - Invalid argument %s\n", argv[1]);
+ return 0;
+ }
+ daemons2todaemons(&daemons1, &ctl1, daemons2);
+ daemons = &daemons1;
} else if (Ambiguous(daemons)) {
printf("%% Internal error - Ambiguous argument %s\n", argv[1]);
return 0;
return 0;
}
- x = (struct ctl *) genget(argv[1], (char **)daemons->table,
- sizeof(struct ctl));
- if (x == 0) {
- printf("%% Invalid argument %s\n", argv[1]);
- return 0;
- } else if (Ambiguous(x)) {
- printf("%% Ambiguous argument %s\n", argv[1]);
- return 0;
+ if (daemons1.name != NULL) {
+ x2 = (struct ctl2 *) genget(argv[1],
+ (char **)daemons2->table, sizeof(struct ctl2));
+ if (x2 == NULL) {
+ printf("%% Invalid argument %s\n", argv[1]);
+ return 0;
+ } else if (Ambiguous(x2)) {
+ printf("%% Ambiguous argument %s\n", argv[1]);
+ return 0;
+ }
+ xargs = x2->args;
+ xtype = x2->type;
+ xhandler = x2->handler;
+ xflag_x = x2->flag_x;
+ } else {
+ x = (struct ctl *) genget(argv[1], (char **)daemons->table,
+ sizeof(struct ctl));
+ if (x == NULL) {
+ printf("%% Invalid argument %s\n", argv[1]);
+ return 0;
+ } else if (Ambiguous(x)) {
+ printf("%% Ambiguous argument %s\n", argv[1]);
+ return 0;
+ }
+ xargs = x->args;
+ xtype = x->type;
+ xhandler = x->handler;
+ xflag_x = x->flag_x;
}
- fillargs = step_optreq(x->args, step_args, argc, argv, 2);
+ fillargs = step_optreq(xargs, step_args, argc, argv, 2);
if (fillargs == NULL)
return 0;
- switch(x->type) {
+ switch(xtype) {
/* 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)) {
- (*x->handler)(tmp_args[0], tmp_args[1], tmp_args[2]);
+ (*xhandler)(tmp_args[0], tmp_args[1], tmp_args[2]);
} else {
- (*x->handler)(fillargs[0], fillargs[1], fillargs[2]);
+ (*xhandler)(fillargs[0], fillargs[1], fillargs[2]);
}
break;
case T_HANDLER_FILL1:
/* pointer to handler routine, fill args @ args[1] pointer */
- if (fill_tmpfile((char **)&fillargs[1], tmpfile, tmp_args))
- (*x->handler)(fillargs[0], tmp_args, fillargs[2]);
+ if (fill_tmpfile((char **)fillargs[1], tmpfile, tmp_args))
+ (*xhandler)(fillargs[0], tmp_args, fillargs[2]);
else
- (*x->handler)(fillargs[0], (char **)fillargs[1], fillargs[2]);
+ (*xhandler)(fillargs[0], (char **)fillargs[1], fillargs[2]);
break;
case T_EXEC:
/* command to execute via execv syscall, fill main args */
break;
}
- if (x->flag_x != 0) {
- flag_x("ctl", daemons->name, x->flag_x, NULL);
+ if (xflag_x != 0) {
+ flag_x("ctl", daemons->name, xflag_x, NULL);
}
return 1;
int found = 0;
char tmpfile[64];
struct daemons *daemons;
+ struct daemons2 *daemons2;
- for (daemons = ctl_daemons; daemons->name != 0; daemons++)
+ for (daemons = ctl_daemons; daemons->name != 0; daemons++) {
if (strncmp(daemons->name, name, strlen(name)) == 0) {
found = 1;
break;
}
+ }
+ if (found) {
+ snprintf(tmpfile, sizeof(tmpfile), "%s.%d", daemons->tmpfile,
+ cli_rtable);
+ edit_file(tmpfile, daemons->mode, daemons->propername, args);
+ return;
+ }
+ for (daemons2 = ctl_daemons2; daemons2->name != 0; daemons2++) {
+ if (strncmp(daemons2->name, name, strlen(name)) == 0) {
+ found = 1;
+ break;
+ }
+ }
if (!found) {
printf("%% call_editor internal error\n");
return;
}
-
- snprintf(tmpfile, sizeof(tmpfile), "%s.%d", daemons->tmpfile,
+ snprintf(tmpfile, sizeof(tmpfile), "%s.%d", daemons2->tmpfile,
cli_rtable);
-
- edit_file(tmpfile, daemons->mode, daemons->propername, args);
+ edit_file(tmpfile, daemons2->mode, daemons2->propername, args);
}
static void
blob - 23cea48dd84cd5bce7b4c64b2ebd91bbf33f4f0a
blob + 8140478bd623a1711ccbe4f587611cde53515ea7
--- ctl.h
+++ ctl.h
int type;
};
+struct ctl2 {
+ char *name;
+ char *help;
+ char *args[32];
+ char *test_args[32];
+ void (*handler)();
+ int flag_x;
+ int type;
+};
+
#define T_HANDLER 1
#define T_HANDLER_FILL1 2
#define T_EXEC 3
int rtablemax;
};
+struct daemons2 {
+ char *name;
+ char *propername;
+ struct ctl2 *table;
+ char *tmpfile;
+ mode_t mode;
+ int doreload;
+ int rtablemax;
+};
+
/* tmp config locations */
#define PFCONF_TEMP "/var/run/pf.conf"
#define OSPFCONF_TEMP "/var/run/ospfd.conf"
extern struct ctl ctl_dvmrp[];
extern struct ctl ctl_rad[];
extern struct ctl ctl_sasync[];
-extern struct ctl ctl_dhcp[];
+extern struct ctl2 ctl_dhcp[];
extern struct ctl ctl_snmp[];
extern struct ctl ctl_smtp[];
extern struct ctl ctl_sshd[];