diff options
Diffstat (limited to 'usr.sbin/rtadvd/control_server.c')
-rw-r--r-- | usr.sbin/rtadvd/control_server.c | 147 |
1 files changed, 106 insertions, 41 deletions
diff --git a/usr.sbin/rtadvd/control_server.c b/usr.sbin/rtadvd/control_server.c index 4432994..7d2ddc5 100644 --- a/usr.sbin/rtadvd/control_server.c +++ b/usr.sbin/rtadvd/control_server.c @@ -55,15 +55,18 @@ #include "control_server.h" #include "timer.h" -static sig_atomic_t p_do_reload; -static sig_atomic_t p_do_die; - -void set_do_reload(int sig __unused) { p_do_reload = 1; } -void set_do_die(int sig __unused) { p_do_die = 1; } -void reset_do_reload(void) { p_do_reload = 0; } -void reset_do_die(void) { p_do_die = 0; } -int do_reload(void) { return (p_do_reload); } -int do_die(void) { return (p_do_die); } +static char *do_reload_ifname; +static int do_reload; +static int do_shutdown; + +void set_do_reload(int sig __unused) { do_reload = 1; } +void set_do_reload_ifname(char *ifname){ do_reload_ifname = ifname; } +void set_do_shutdown(int sig __unused) { do_shutdown = 1; } +void reset_do_reload(void) { do_reload = 0; do_reload_ifname = NULL; } +void reset_do_shutdown(void) { do_shutdown = 0; } +int is_do_reload(void) { return (do_reload); } +int is_do_shutdown(void) { return (do_shutdown); } +char *reload_ifname(void) { return (do_reload_ifname); } #define DEF_PL_HANDLER(key) { #key, cmsg_getprop_##key } @@ -71,14 +74,16 @@ static int cmsg_getprop_echo(struct ctrl_msg_pl *); static int cmsg_getprop_version(struct ctrl_msg_pl *); static int cmsg_getprop_ifilist(struct ctrl_msg_pl *); static int cmsg_getprop_ifi(struct ctrl_msg_pl *); +static int cmsg_getprop_ifi_ra_timer(struct ctrl_msg_pl *); static int cmsg_getprop_rai(struct ctrl_msg_pl *); -static int cmsg_getprop_rai_timer(struct ctrl_msg_pl *); static int cmsg_getprop_pfx(struct ctrl_msg_pl *); static int cmsg_getprop_rdnss(struct ctrl_msg_pl *); static int cmsg_getprop_dnssl(struct ctrl_msg_pl *); -#ifdef ROUTEINFO static int cmsg_getprop_rti(struct ctrl_msg_pl *); -#endif + +static int cmsg_setprop_reload(struct ctrl_msg_pl *); +static int cmsg_setprop_enable(struct ctrl_msg_pl *); +static int cmsg_setprop_disable(struct ctrl_msg_pl *); static struct dispatch_table { const char *dt_comm; @@ -89,11 +94,9 @@ static struct dispatch_table { DEF_PL_HANDLER(version), DEF_PL_HANDLER(ifilist), DEF_PL_HANDLER(ifi), + DEF_PL_HANDLER(ifi_ra_timer), DEF_PL_HANDLER(rai), - DEF_PL_HANDLER(rai_timer), -#ifdef ROUTEINFO DEF_PL_HANDLER(rti), -#endif DEF_PL_HANDLER(pfx), DEF_PL_HANDLER(rdnss), DEF_PL_HANDLER(dnssl), @@ -135,7 +138,7 @@ cmsg_getprop_ifilist(struct ctrl_msg_pl *cp) len += strlen(ifi->ifi_ifname) + 1; } - syslog(LOG_DEBUG, "<%s> len = %d", __func__, len); + syslog(LOG_DEBUG, "<%s> len = %zu", __func__, len); p = malloc(len); if (p == NULL) @@ -179,7 +182,7 @@ cmsg_getprop_ifi(struct ctrl_msg_pl *cp) exit(1); len = cmsg_str2bin(p, ifi, sizeof(*ifi)); - syslog(LOG_DEBUG, "<%s> len = %d", __func__, len); + syslog(LOG_DEBUG, "<%s> len = %zu", __func__, len); if (len == 0) return (1); @@ -220,7 +223,7 @@ cmsg_getprop_rai(struct ctrl_msg_pl *cp) exit(1); len = cmsg_str2bin(p, rai, sizeof(*rai)); - syslog(LOG_DEBUG, "<%s> len = %d", __func__, len); + syslog(LOG_DEBUG, "<%s> len = %zu", __func__, len); if (len == 0) return (1); @@ -232,7 +235,7 @@ cmsg_getprop_rai(struct ctrl_msg_pl *cp) } static int -cmsg_getprop_rai_timer(struct ctrl_msg_pl *cp) +cmsg_getprop_ifi_ra_timer(struct ctrl_msg_pl *cp) { struct ifinfo *ifi; struct rainfo *rai; @@ -256,8 +259,8 @@ cmsg_getprop_rai_timer(struct ctrl_msg_pl *cp) cp->cp_ifname); return (1); } - if ((rtimer = rai->rai_timer) == NULL) { - syslog(LOG_ERR, "<%s> %s has no rai_timer", __func__, + if ((rtimer = ifi->ifi_ra_timer) == NULL) { + syslog(LOG_ERR, "<%s> %s has no ifi_ra_timer", __func__, cp->cp_ifname); return (1); } @@ -266,7 +269,7 @@ cmsg_getprop_rai_timer(struct ctrl_msg_pl *cp) exit(1); len = cmsg_str2bin(p, rtimer, sizeof(*rtimer)); - syslog(LOG_DEBUG, "<%s> len = %d", __func__, len); + syslog(LOG_DEBUG, "<%s> len = %zu", __func__, len); if (len == 0) return (1); @@ -277,7 +280,6 @@ cmsg_getprop_rai_timer(struct ctrl_msg_pl *cp) return (0); } -#ifdef ROUTEINFO static int cmsg_getprop_rti(struct ctrl_msg_pl *cp) { @@ -309,7 +311,7 @@ cmsg_getprop_rti(struct ctrl_msg_pl *cp) len += sizeof(*rti); } - syslog(LOG_DEBUG, "<%s> len = %d", __func__, len); + syslog(LOG_DEBUG, "<%s> len = %zu", __func__, len); p = malloc(len); if (p == NULL) @@ -326,7 +328,6 @@ cmsg_getprop_rti(struct ctrl_msg_pl *cp) return (0); } -#endif static int cmsg_getprop_pfx(struct ctrl_msg_pl *cp) @@ -359,7 +360,7 @@ cmsg_getprop_pfx(struct ctrl_msg_pl *cp) len += sizeof(*pfx); } - syslog(LOG_DEBUG, "<%s> len = %d", __func__, len); + syslog(LOG_DEBUG, "<%s> len = %zu", __func__, len); p = malloc(len); if (p == NULL) @@ -386,8 +387,8 @@ cmsg_getprop_rdnss(struct ctrl_msg_pl *cp) struct rdnss_addr *rda; char *p; size_t len; - u_int16_t *rdn_cnt; - u_int16_t *rda_cnt; + uint16_t *rdn_cnt; + uint16_t *rda_cnt; syslog(LOG_DEBUG, "<%s> enter", __func__); @@ -417,7 +418,7 @@ cmsg_getprop_rdnss(struct ctrl_msg_pl *cp) } } - syslog(LOG_DEBUG, "<%s> len = %d", __func__, len); + syslog(LOG_DEBUG, "<%s> len = %zu", __func__, len); p = malloc(len); if (p == NULL) @@ -425,14 +426,14 @@ cmsg_getprop_rdnss(struct ctrl_msg_pl *cp) memset(p, 0, len); cp->cp_val = p; - rdn_cnt = (u_int16_t *)p; + rdn_cnt = (uint16_t *)p; p += sizeof(*rdn_cnt); TAILQ_FOREACH(rdn, &rai->rai_rdnss, rd_next) { *rdn_cnt += 1; memcpy(p, rdn, sizeof(*rdn)); p += sizeof(*rdn); - rda_cnt = (u_int16_t *)p; + rda_cnt = (uint16_t *)p; p += sizeof(*rda_cnt); TAILQ_FOREACH(rda, &rdn->rd_list, ra_next) { *rda_cnt += 1; @@ -455,8 +456,8 @@ cmsg_getprop_dnssl(struct ctrl_msg_pl *cp) struct dnssl_addr *dna; char *p; size_t len; - u_int16_t *dns_cnt; - u_int16_t *dna_cnt; + uint16_t *dns_cnt; + uint16_t *dna_cnt; syslog(LOG_DEBUG, "<%s> enter", __func__); @@ -486,7 +487,7 @@ cmsg_getprop_dnssl(struct ctrl_msg_pl *cp) } } - syslog(LOG_DEBUG, "<%s> len = %d", __func__, len); + syslog(LOG_DEBUG, "<%s> len = %zu", __func__, len); p = malloc(len); if (p == NULL) @@ -494,14 +495,14 @@ cmsg_getprop_dnssl(struct ctrl_msg_pl *cp) memset(p, 0, len); cp->cp_val = p; - dns_cnt = (u_int16_t *)cp->cp_val; + dns_cnt = (uint16_t *)cp->cp_val; p += sizeof(*dns_cnt); TAILQ_FOREACH(dns, &rai->rai_dnssl, dn_next) { (*dns_cnt)++; memcpy(p, dns, sizeof(*dns)); p += sizeof(*dns); - dna_cnt = (u_int16_t *)p; + dna_cnt = (uint16_t *)p; p += sizeof(*dna_cnt); TAILQ_FOREACH(dna, &dns->dn_list, da_next) { (*dna_cnt)++; @@ -541,10 +542,14 @@ cmsg_setprop(struct ctrl_msg_pl *cp) if (cp == NULL || cp->cp_key == NULL) return (1); - if (strncmp(cp->cp_key, "reload", 8) == 0) - set_do_reload(0); - else if (strncmp(cp->cp_key, "shutdown", 8) == 0) - set_do_die(0); + if (strncmp(cp->cp_key, "reload", sizeof("reload")) == 0) + cmsg_setprop_reload(cp); + else if (strncmp(cp->cp_key, "shutdown", sizeof("shutdown")) == 0) + set_do_shutdown(0); + else if (strncmp(cp->cp_key, "enable", sizeof("enable")) == 0) + cmsg_setprop_enable(cp); + else if (strncmp(cp->cp_key, "disable", sizeof("disable")) == 0) + cmsg_setprop_disable(cp); else if (strncmp(cp->cp_key, "echo", 8) == 0) ; /* do nothing */ else @@ -553,6 +558,64 @@ cmsg_setprop(struct ctrl_msg_pl *cp) return (0); } +static int +cmsg_setprop_reload(struct ctrl_msg_pl *cp) +{ + + syslog(LOG_DEBUG, "<%s> enter", __func__); + + set_do_reload_ifname(cp->cp_ifname); + set_do_reload(1); + + return (0); +} + +static int +cmsg_setprop_enable(struct ctrl_msg_pl *cp) +{ + struct ifinfo *ifi; + + syslog(LOG_DEBUG, "<%s> enter", __func__); + + TAILQ_FOREACH(ifi, &ifilist, ifi_next) { + if (strcmp(cp->cp_ifname, ifi->ifi_ifname) == 0) + break; + } + if (ifi == NULL) { + syslog(LOG_ERR, "<%s> %s not found", __func__, + cp->cp_ifname); + return (1); + } + + ifi->ifi_persist = 1; + set_do_reload_ifname(ifi->ifi_ifname); + set_do_reload(0); + + return (0); +} + +static int +cmsg_setprop_disable(struct ctrl_msg_pl *cp) +{ + struct ifinfo *ifi; + + syslog(LOG_DEBUG, "<%s> enter", __func__); + + TAILQ_FOREACH(ifi, &ifilist, ifi_next) { + if (strcmp(cp->cp_ifname, ifi->ifi_ifname) == 0) + break; + } + if (ifi == NULL) { + syslog(LOG_ERR, "<%s> %s not found", __func__, + cp->cp_ifname); + return (1); + } + + ifi->ifi_persist = 0; + + return (0); +} + int cmsg_handler_server(int fd) { @@ -626,7 +689,7 @@ cmsg_handler_server(int fd) syslog(LOG_DEBUG, "<%s> cm->cm_type = %d", __func__, cm->cm_type); syslog(LOG_DEBUG, - "<%s> cm->cm_len = %d", __func__, cm->cm_len); + "<%s> cm->cm_len = %zu", __func__, cm->cm_len); switch (cm->cm_type) { case CM_TYPE_EOM: @@ -646,6 +709,8 @@ cmsg_handler_server(int fd) cm->cm_len = sizeof(*cm); cm->cm_len += cmsg_pl2bin(msg, &cp); } + if (cp.cp_val != NULL) + free(cp.cp_val); break; case CM_TYPE_REQ_SET_PROP: cmsg_bin2pl(msg, &cp); |