diff options
Diffstat (limited to 'usr.sbin/rtsold/rtsol.c')
-rw-r--r-- | usr.sbin/rtsold/rtsol.c | 133 |
1 files changed, 37 insertions, 96 deletions
diff --git a/usr.sbin/rtsold/rtsol.c b/usr.sbin/rtsold/rtsol.c index 850e5d9..13845f3 100644 --- a/usr.sbin/rtsold/rtsol.c +++ b/usr.sbin/rtsold/rtsol.c @@ -73,7 +73,6 @@ static struct sockaddr_in6 from; static int rcvcmsglen; int rssock; -static char rsid[IFNAMSIZ + 1 + sizeof(DNSINFO_ORIGIN_LABEL) + 1 + NI_MAXHOST]; struct ifinfo_head_t ifinfo_head = TAILQ_HEAD_INITIALIZER(ifinfo_head); @@ -83,18 +82,14 @@ static const struct sockaddr_in6 sin6_allrouters = { .sin6_addr = IN6ADDR_LINKLOCAL_ALLROUTERS_INIT, }; -static void call_script(const int, const char *const *, - struct script_msg_head_t *); +static void call_script(const int, const char *const *, void *); static size_t dname_labeldec(char *, size_t, const char *); static int safefile(const char *); static struct ra_opt *find_raopt(struct rainfo *, int, void *, size_t); -static int ra_opt_rdnss_dispatch(struct ifinfo *, struct rainfo *, - struct script_msg_head_t *, struct script_msg_head_t *); -static char *make_rsid(const char *, const char *, struct rainfo *); #define _ARGS_OTHER otherconf_script, ifi->ifname -#define _ARGS_RESADD resolvconf_script, "-a", rsid -#define _ARGS_RESDEL resolvconf_script, "-d", rsid +#define _ARGS_RESADD resolvconf_script, "-a", ifi->ifname +#define _ARGS_RESDEL resolvconf_script, "-d", ifi->ifname #define CALL_SCRIPT(name, sm_head) \ do { \ @@ -311,7 +306,7 @@ rtsol_input(int s) warnmsg(LOG_ERR, __func__, "invalid icmp type(%d) from %s on %s", icp->icmp6_type, inet_ntop(AF_INET6, &from.sin6_addr, ntopbuf, - sizeof(ntopbuf)), + INET6_ADDRSTRLEN), if_indextoname(pi->ipi6_ifindex, ifnamebuf)); return; } @@ -320,7 +315,7 @@ rtsol_input(int s) warnmsg(LOG_INFO, __func__, "invalid icmp code(%d) from %s on %s", icp->icmp6_code, inet_ntop(AF_INET6, &from.sin6_addr, ntopbuf, - sizeof(ntopbuf)), + INET6_ADDRSTRLEN), if_indextoname(pi->ipi6_ifindex, ifnamebuf)); return; } @@ -330,7 +325,7 @@ rtsol_input(int s) "invalid RA with hop limit(%d) from %s on %s", *hlimp, inet_ntop(AF_INET6, &from.sin6_addr, ntopbuf, - sizeof(ntopbuf)), + INET6_ADDRSTRLEN), if_indextoname(pi->ipi6_ifindex, ifnamebuf)); return; } @@ -339,7 +334,7 @@ rtsol_input(int s) warnmsg(LOG_INFO, __func__, "invalid RA with non link-local source from %s on %s", inet_ntop(AF_INET6, &from.sin6_addr, ntopbuf, - sizeof(ntopbuf)), + INET6_ADDRSTRLEN), if_indextoname(pi->ipi6_ifindex, ifnamebuf)); return; } @@ -350,14 +345,14 @@ rtsol_input(int s) warnmsg(LOG_INFO, __func__, "received RA from %s on an unexpected IF(%s)", inet_ntop(AF_INET6, &from.sin6_addr, ntopbuf, - sizeof(ntopbuf)), + INET6_ADDRSTRLEN), if_indextoname(pi->ipi6_ifindex, ifnamebuf)); return; } warnmsg(LOG_DEBUG, __func__, "received RA from %s on %s, state is %d", - inet_ntop(AF_INET6, &from.sin6_addr, ntopbuf, sizeof(ntopbuf)), + inet_ntop(AF_INET6, &from.sin6_addr, ntopbuf, INET6_ADDRSTRLEN), ifi->ifname, ifi->state); nd_ra = (struct nd_router_advert *)icp; @@ -383,8 +378,6 @@ rtsol_input(int s) ELM_MALLOC(rai, exit(1)); rai->rai_ifinfo = ifi; TAILQ_INIT(&rai->rai_ra_opt); - rai->rai_saddr.sin6_family = AF_INET6; - rai->rai_saddr.sin6_len = sizeof(rai->rai_saddr); memcpy(&rai->rai_saddr.sin6_addr, &from.sin6_addr, sizeof(rai->rai_saddr.sin6_addr)); newent_rai = 1; @@ -413,19 +406,19 @@ rtsol_input(int s) "too short RDNSS option" "in RA from %s was ignored.", inet_ntop(AF_INET6, &from.sin6_addr, - ntopbuf, sizeof(ntopbuf))); + ntopbuf, INET6_ADDRSTRLEN)); break; } addr = (struct in6_addr *)(raoptp + sizeof(*rdnss)); while ((char *)addr < (char *)RA_OPT_NEXT_HDR(raoptp)) { if (inet_ntop(AF_INET6, addr, ntopbuf, - sizeof(ntopbuf)) == NULL) { + INET6_ADDRSTRLEN) == NULL) { warnmsg(LOG_INFO, __func__, "an invalid address in RDNSS option" " in RA from %s was ignored.", inet_ntop(AF_INET6, &from.sin6_addr, - ntopbuf, sizeof(ntopbuf))); + ntopbuf, INET6_ADDRSTRLEN)); addr++; continue; } @@ -489,7 +482,7 @@ rtsol_input(int s) "too short DNSSL option" "in RA from %s was ignored.", inet_ntop(AF_INET6, &from.sin6_addr, - ntopbuf, sizeof(ntopbuf))); + ntopbuf, INET6_ADDRSTRLEN)); break; } @@ -575,11 +568,10 @@ ra_opt_handler(struct ifinfo *ifi) struct rainfo *rai; struct script_msg *smp1, *smp2, *smp3; struct timeval now; - struct script_msg_head_t sm_rdnss_head = - TAILQ_HEAD_INITIALIZER(sm_rdnss_head); - struct script_msg_head_t sm_dnssl_head = - TAILQ_HEAD_INITIALIZER(sm_dnssl_head); - + TAILQ_HEAD(, script_msg) sm_rdnss_head = + TAILQ_HEAD_INITIALIZER(sm_rdnss_head); + TAILQ_HEAD(, script_msg) sm_dnssl_head = + TAILQ_HEAD_INITIALIZER(sm_dnssl_head); int dcount, dlen; dcount = 0; @@ -666,69 +658,17 @@ free2: free1: free(smp1); } - /* Call the script for each information source. */ - if (uflag) - ra_opt_rdnss_dispatch(ifi, rai, &sm_rdnss_head, - &sm_dnssl_head); - } - /* Call the script for each interface. */ - if (!uflag) - ra_opt_rdnss_dispatch(ifi, NULL, &sm_rdnss_head, - &sm_dnssl_head); - return (0); -} - -char * -make_rsid(const char *ifname, const char *origin, struct rainfo *rai) -{ - char hbuf[NI_MAXHOST]; - - if (rai == NULL) - sprintf(rsid, "%s:%s", ifname, origin); - else { - if (!IN6_IS_ADDR_LINKLOCAL(&rai->rai_saddr.sin6_addr)) - return (NULL); - if (getnameinfo((struct sockaddr *)&rai->rai_saddr, - rai->rai_saddr.sin6_len, hbuf, sizeof(hbuf), NULL, 0, - NI_NUMERICHOST) != 0) - return (NULL); - sprintf(rsid, "%s:%s:[%s]", ifname, origin, hbuf); - } - warnmsg(LOG_DEBUG, __func__, "rsid = [%s]", rsid); - return (rsid); -} - -int -ra_opt_rdnss_dispatch(struct ifinfo *ifi, - struct rainfo *rai, - struct script_msg_head_t *sm_rdnss_head, - struct script_msg_head_t *sm_dnssl_head) -{ - const char *r; - struct script_msg *smp1; - int error; - - error = 0; + } /* Add \n for DNSSL list. */ - if (!TAILQ_EMPTY(sm_dnssl_head)) { - ELM_MALLOC(smp1, goto ra_opt_rdnss_freeit); + if (!TAILQ_EMPTY(&sm_dnssl_head)) { + ELM_MALLOC(smp1, goto ra_opt_handler_freeit); smp1->sm_msg = resstr_nl; - TAILQ_INSERT_TAIL(sm_dnssl_head, smp1, sm_next); - } - TAILQ_CONCAT(sm_rdnss_head, sm_dnssl_head, sm_next); - - if (rai != NULL && uflag) - r = make_rsid(ifi->ifname, DNSINFO_ORIGIN_LABEL, rai); - else - r = make_rsid(ifi->ifname, DNSINFO_ORIGIN_LABEL, NULL); - if (r == NULL) { - warnmsg(LOG_ERR, __func__, "make_rsid() failed. " - "Script was not invoked."); - error = 1; - goto ra_opt_rdnss_freeit; - } - if (!TAILQ_EMPTY(sm_rdnss_head)) - CALL_SCRIPT(RESADD, sm_rdnss_head); + TAILQ_INSERT_TAIL(&sm_dnssl_head, smp1, sm_next); + } + TAILQ_CONCAT(&sm_rdnss_head, &sm_dnssl_head, sm_next); + + if (!TAILQ_EMPTY(&sm_rdnss_head)) + CALL_SCRIPT(RESADD, &sm_rdnss_head); else if (ifi->ifi_rdnss == IFI_DNSOPT_STATE_RECEIVED || ifi->ifi_dnssl == IFI_DNSOPT_STATE_RECEIVED) { CALL_SCRIPT(RESDEL, NULL); @@ -736,21 +676,21 @@ ra_opt_rdnss_dispatch(struct ifinfo *ifi, ifi->ifi_dnssl = IFI_DNSOPT_STATE_NOINFO; } -ra_opt_rdnss_freeit: +ra_opt_handler_freeit: /* Clear script message queue. */ - if (!TAILQ_EMPTY(sm_rdnss_head)) { - while ((smp1 = TAILQ_FIRST(sm_rdnss_head)) != NULL) { - TAILQ_REMOVE(sm_rdnss_head, smp1, sm_next); + if (!TAILQ_EMPTY(&sm_rdnss_head)) { + while ((smp1 = TAILQ_FIRST(&sm_rdnss_head)) != NULL) { + TAILQ_REMOVE(&sm_rdnss_head, smp1, sm_next); free(smp1); } } - if (!TAILQ_EMPTY(sm_dnssl_head)) { - while ((smp1 = TAILQ_FIRST(sm_dnssl_head)) != NULL) { - TAILQ_REMOVE(sm_dnssl_head, smp1, sm_next); + if (!TAILQ_EMPTY(&sm_dnssl_head)) { + while ((smp1 = TAILQ_FIRST(&sm_dnssl_head)) != NULL) { + TAILQ_REMOVE(&sm_dnssl_head, smp1, sm_next); free(smp1); } } - return (error); + return (0); } static struct ra_opt * @@ -769,18 +709,19 @@ find_raopt(struct rainfo *rai, int type, void *msg, size_t len) } static void -call_script(const int argc, const char *const argv[], - struct script_msg_head_t *sm_head) +call_script(const int argc, const char *const argv[], void *head) { const char *scriptpath; int fd[2]; int error; pid_t pid, wpid; + TAILQ_HEAD(, script_msg) *sm_head; if ((scriptpath = argv[0]) == NULL) return; fd[0] = fd[1] = -1; + sm_head = head; if (sm_head != NULL && !TAILQ_EMPTY(sm_head)) { error = pipe(fd); if (error) { |