#define COPYOUT(sin, sa) do { \
if ((sa) && ((sa)->sa_family == AF_INET || (sa)->sa_family == 255)) \
- (sin) = ((struct sockaddr_in *)(void *)(sa))->sin_addr; \
+ (sin) = ((const struct sockaddr_in *)(const void *) \
+ (sa))->sin_addr; \
} while (0)
#define COPYOUT6(sin, sa) do { \
if ((sa) && ((sa)->sa_family == AF_INET6 || (sa)->sa_family == 255)) \
- (sin) = ((struct sockaddr_in6 *)(void *)(sa))->sin6_addr; \
+ (sin) = ((const struct sockaddr_in6 *)(const void *) \
+ (sa))->sin6_addr; \
} while (0)
#ifndef CLLADDR
}
static void
-get_addrs(int type, void *cp, struct sockaddr **sa)
+get_addrs(int type, const void *data, const struct sockaddr **sa)
{
+ const char *cp;
int i;
+ cp = data;
for (i = 0; i < RTAX_MAX; i++) {
if (type & (1 << i)) {
- sa[i] = (struct sockaddr *)cp;
+ sa[i] = (const struct sockaddr *)cp;
RT_ADVANCE(cp, sa[i]);
} else
sa[i] = NULL;
}
static int
-if_copyrt(struct dhcpcd_ctx *ctx, struct rt *rt, struct rt_msghdr *rtm)
+if_copyrt(struct dhcpcd_ctx *ctx, struct rt *rt, const struct rt_msghdr *rtm)
{
- uint8_t *ap;
- struct sockaddr *sa, *rti_info[RTAX_MAX];
+ const struct sockaddr *sa, *rti_info[RTAX_MAX];
- ap = (void *)(rtm + 1);
- sa = (void *)ap;
+ sa = (const void *)(rtm + 1);
if (sa->sa_family != AF_INET)
return -1;
if (~rtm->rtm_addrs & (RTA_DST | RTA_GATEWAY))
return -1;
#endif
- get_addrs(rtm->rtm_addrs, ap, rti_info);
+ get_addrs(rtm->rtm_addrs, sa, rti_info);
memset(rt, 0, sizeof(*rt));
rt->flags = (unsigned int)rtm->rtm_flags;
COPYOUT(rt->dest, rti_info[RTAX_DST]);
}
static int
-if_copyrt6(struct dhcpcd_ctx *ctx, struct rt6 *rt, struct rt_msghdr *rtm)
+if_copyrt6(struct dhcpcd_ctx *ctx, struct rt6 *rt, const struct rt_msghdr *rtm)
{
- uint8_t *ap;
- struct sockaddr *sa, *rti_info[RTAX_MAX];
+ const struct sockaddr *sa, *rti_info[RTAX_MAX];
- ap = (void *)(rtm + 1);
- sa = (void *)ap;
+ sa = (const void *)(rtm + 1);
if (sa->sa_family != AF_INET6)
return -1;
if (~rtm->rtm_addrs & (RTA_DST | RTA_GATEWAY))
return -1;
#endif
- get_addrs(rtm->rtm_addrs, ap, rti_info);
+ get_addrs(rtm->rtm_addrs, sa, rti_info);
memset(rt, 0, sizeof(*rt));
rt->flags = (unsigned int)rtm->rtm_flags;
COPYOUT6(rt->dest, rti_info[RTAX_DST]);
* a kernel bug or actually used for something.
* Either way it needs to be zeroed out.
*/
- struct sockaddr_in6 *sin6;
+ const struct sockaddr_in6 *sin6;
size_t e, i, final = 0, illegal = 0;
const unsigned char *p;
- sin6 = (void *)rti_info[RTAX_NETMASK];
+ sin6 = (const void *)rti_info[RTAX_NETMASK];
rt->mask = sin6->sin6_addr;
e = sin6->sin6_len - offsetof(struct sockaddr_in6, sin6_addr);
if (e > sizeof(struct in6_addr))
#endif
static void
-if_announce(struct dhcpcd_ctx *ctx, struct if_announcemsghdr *ifan)
+if_announce(struct dhcpcd_ctx *ctx, const struct if_announcemsghdr *ifan)
{
switch(ifan->ifan_what) {
}
static void
-if_ifinfo(struct dhcpcd_ctx *ctx, struct if_msghdr *ifm)
+if_ifinfo(struct dhcpcd_ctx *ctx, const struct if_msghdr *ifm)
{
struct interface *ifp;
int state;
}
static void
-if_rtm(struct dhcpcd_ctx *ctx, struct rt_msghdr *rtm)
+if_rtm(struct dhcpcd_ctx *ctx, const struct rt_msghdr *rtm)
{
- struct sockaddr *sa;
+ const struct sockaddr *sa;
/* Ignore messages generated by us */
if (rtm->rtm_pid == getpid()) {
return;
}
- sa = (void *)(rtm + 1);
+ sa = (const void *)(rtm + 1);
switch (sa->sa_family) {
#ifdef INET
case AF_INET:
* existance with a hardware address.
*/
if (rtm->rtm_flags & (RTF_HOST)) {
- uint8_t *ap;
- struct sockaddr *rti_info[RTAX_MAX];
+ const struct sockaddr *rti_info[RTAX_MAX];
struct in6_addr dst6;
struct sockaddr_dl sdl;
- ap = (void *)(rtm + 1);
- get_addrs(rtm->rtm_addrs, ap, rti_info);
+ get_addrs(rtm->rtm_addrs, rtm + 1, rti_info);
COPYOUT6(dst6, rti_info[RTAX_DST]);
DESCOPE(&dst6);
if (rti_info[RTAX_GATEWAY]->sa_family == AF_LINK)
}
static void
-if_ifa(struct dhcpcd_ctx *ctx, struct ifa_msghdr *ifam)
+if_ifa(struct dhcpcd_ctx *ctx, const struct ifa_msghdr *ifam)
{
struct interface *ifp;
- struct sockaddr *rti_info[RTAX_MAX];
+ const struct sockaddr *rti_info[RTAX_MAX];
/* XXX We have no way of knowing who generated these
* messages wich truely sucks because we want to
case AF_INET6:
{
struct in6_addr addr6, mask6;
- struct sockaddr_in6 *sin6;
+ const struct sockaddr_in6 *sin6;
int flags;
- sin6 = (void *)rti_info[RTAX_IFA];
+ sin6 = (const void *)rti_info[RTAX_IFA];
addr6 = sin6->sin6_addr;
DESCOPE(&addr6);
- sin6 = (void *)rti_info[RTAX_NETMASK];
+ sin6 = (const void *)rti_info[RTAX_NETMASK];
mask6 = sin6->sin6_addr;
DESCOPE(&mask6);
if (ifam->ifam_type == RTM_NEWADDR) {
}
static void
-if_dispatch(struct dhcpcd_ctx *ctx, struct rt_msghdr *rtm)
+if_dispatch(struct dhcpcd_ctx *ctx, const struct rt_msghdr *rtm)
{
switch(rtm->rtm_type) {
#ifdef RTM_IFANNOUNCE
case RTM_IFANNOUNCE:
- if_announce(ctx, (void *)rtm);
+ if_announce(ctx, (const void *)rtm);
break;
#endif
case RTM_IFINFO:
- if_ifinfo(ctx, (void *)rtm);
+ if_ifinfo(ctx, (const void *)rtm);
break;
case RTM_ADD: /* FALLTHROUGH */
case RTM_CHANGE: /* FALLTHROUGH */
case RTM_DELETE:
- if_rtm(ctx, (void *)rtm);
+ if_rtm(ctx, (const void *)rtm);
break;
#ifdef RTM_CHGADDR
case RTM_CHGADDR: /* FALLTHROUGH */
#endif
case RTM_DELADDR: /* FALLTHROUGH */
case RTM_NEWADDR:
- if_ifa(ctx, (void *)rtm);
+ if_ifa(ctx, (const void *)rtm);
break;
}
}
if_handlelink(struct dhcpcd_ctx *ctx)
{
/* route and ifwatchd like a msg buf size of 2048 */
- char buf[2048], *p, *e;
+ char buf[2048];
+ const char *p, *e;
size_t msglen;
ssize_t bytes;
+ const struct rt_msghdr *rtm;
if ((bytes = read(ctx->link_fd, buf, sizeof(buf))) == -1)
return -1;
e = buf + bytes;
for (p = buf; p < e; p += msglen) {
- msglen = ((struct rt_msghdr *)p)->rtm_msglen;
- if_dispatch(ctx, (struct rt_msghdr *)p);
+ rtm = (const void *)p;
+ msglen = rtm->rtm_msglen;
+ if_dispatch(ctx, rtm);
}
return 0;
}