}
static void
-handle_signal(__unused int sig, siginfo_t *siginfo, __unused void *context)
+handle_signal(int sig, siginfo_t *siginfo, __unused void *context)
{
/* So that we can operate safely under a signal we instruct
* eloop to pass a copy of the siginfo structure to handle_signal1
* as the very first thing to do. */
- dhcpcd_siginfo.signo = siginfo->si_signo;
- dhcpcd_siginfo.pid = siginfo->si_pid;
+ dhcpcd_siginfo.signo = sig;
+ dhcpcd_siginfo.pid = siginfo ? siginfo->si_pid : 0;
eloop_timeout_add_now(dhcpcd_ctx->eloop,
handle_signal1, &dhcpcd_siginfo);
}
syslog(LOG_WARNING, "FreeBSD errors that are worked around:");
syslog(LOG_WARNING, "IPv4 subnet routes cannot be deleted");
#endif
-#ifdef __OpenBSD__
- syslog(LOG_WARNING, "OpenBSD errors that need to be fixed:");
- syslog(LOG_WARNING,
- "IPv4 subnet routes cannot be deleted");
- syslog(LOG_WARNING, "IPv6 prefixes cannot be deleted");
-#endif
ctx.ifc = argc - optind;
ctx.ifv = argv + optind;
memset(&rtm, 0, sizeof(rtm));
rtm.hdr.rtm_version = RTM_VERSION;
rtm.hdr.rtm_seq = 1;
+ rtm.hdr.rtm_addrs = RTA_DST;
if (action == 0)
rtm.hdr.rtm_type = RTM_CHANGE;
- else if (action > 0)
+ else if (action > 0) {
rtm.hdr.rtm_type = RTM_ADD;
- else
+ rtm.hdr.rtm_addrs |= RTA_GATEWAY;
+ } else
rtm.hdr.rtm_type = RTM_DELETE;
rtm.hdr.rtm_flags = RTF_UP;
#ifdef SIOCGIFPRIORITY
rtm.hdr.rtm_priority = rt->metric;
#endif
+ rtm.hdr.rtm_hdrlen = sizeof(rtm.hdr);
+
/* None interface subnet routes are static. */
if (rt->gate.s_addr != INADDR_ANY ||
rt->net.s_addr != state->net.s_addr ||
rt->dest.s_addr != (state->addr.s_addr & state->net.s_addr))
rtm.hdr.rtm_flags |= RTF_STATIC;
- rtm.hdr.rtm_addrs = RTA_DST | RTA_GATEWAY;
if (rt->dest.s_addr == rt->gate.s_addr &&
rt->net.s_addr == INADDR_BROADCAST)
rtm.hdr.rtm_flags |= RTF_HOST;
}
ADDADDR(&rt->dest);
- if ((rtm.hdr.rtm_flags & RTF_HOST &&
- rt->gate.s_addr != htonl(INADDR_LOOPBACK)) ||
- !(rtm.hdr.rtm_flags & RTF_STATIC))
- {
- /* Make us a link layer socket for the host gateway */
- memset(&su, 0, sizeof(su));
- su.sdl.sdl_len = sizeof(struct sockaddr_dl);
- link_addr(rt->iface->name, &su.sdl);
- ADDSU;
- } else
- ADDADDR(&rt->gate);
+ if (rtm.hdr.rtm_addrs & RTA_GATEWAY) {
+ if ((rtm.hdr.rtm_flags & RTF_HOST &&
+ rt->gate.s_addr != htonl(INADDR_LOOPBACK)) ||
+ !(rtm.hdr.rtm_flags & RTF_STATIC))
+ {
+ /* Make us a link layer socket for the host gateway */
+ memset(&su, 0, sizeof(su));
+ su.sdl.sdl_len = sizeof(struct sockaddr_dl);
+ link_addr(rt->iface->name, &su.sdl);
+ ADDSU;
+ } else
+ ADDADDR(&rt->gate);
+ }
if (rtm.hdr.rtm_addrs & RTA_NETMASK)
ADDADDR(&rt->net);
rtm.hdr.rtm_type = RTM_ADD;
else
rtm.hdr.rtm_type = RTM_DELETE;
-
rtm.hdr.rtm_flags = RTF_UP;
+ rtm.hdr.rtm_addrs = RTA_DST | RTA_NETMASK;
#ifdef SIOCGIFPRIORITY
rtm.hdr.rtm_priority = rt->metric;
#endif
rtm.hdr.rtm_flags |= RTF_CLONING;
#endif
- rtm.hdr.rtm_addrs = RTA_DST | RTA_GATEWAY | RTA_NETMASK;
if (action >= 0)
- rtm.hdr.rtm_addrs |= RTA_IFP | RTA_IFA;
+ rtm.hdr.rtm_addrs |= RTA_GATEWAY | RTA_IFP | RTA_IFA;
ADDADDR(&rt->dest);
- if (!(rtm.hdr.rtm_flags & RTF_GATEWAY)) {
- lla = ipv6_linklocal(rt->iface);
- if (lla == NULL) /* unlikely as we need a LL to get here */
- return -1;
- ADDADDRS(&lla->addr, rt->iface->index);
- } else {
- lla = NULL;
- ADDADDRS(&rt->gate, rt->iface->index);
+ lla = NULL;
+ if (rtm.hdr.rtm_addrs & RTA_GATEWAY) {
+ if (!(rtm.hdr.rtm_flags & RTF_GATEWAY)) {
+ lla = ipv6_linklocal(rt->iface);
+ if (lla == NULL) /* unlikely */
+ return -1;
+ ADDADDRS(&lla->addr, rt->iface->index);
+ } else {
+ lla = NULL;
+ ADDADDRS(&rt->gate, rt->iface->index);
+ }
}
if (rtm.hdr.rtm_addrs & RTA_NETMASK) {