$NetBSD: patch-an,v 1.3 2006/01/24 22:16:55 adam Exp $ --- agent/mibgroup/mibII/route_write.c.orig 2005-09-16 19:00:23.000000000 +0200 +++ agent/mibgroup/mibII/route_write.c @@ -97,7 +97,7 @@ int addRoute(u_long dstip, u_long gwip, u_long iff, u_short flags) { -#if defined SIOCADDRT && !defined(irix6) +#if defined SIOCADDRT && !defined(irix6) && !defined(darwin) struct sockaddr_in dst; struct sockaddr_in gateway; int s, rc; @@ -132,6 +132,54 @@ addRoute(u_long dstip, u_long gwip, u_lo if (rc < 0) snmp_log_perror("ioctl"); return rc; +#elif defined darwin + size_t sa_in_size = sizeof(struct sockaddr_in); + int s, rc; + struct sockaddr_in dst; + struct sockaddr_in gateway; + struct { + struct rt_msghdr hdr; + char space[512]; + } rtmsg; + + s = socket(PF_ROUTE, SOCK_RAW, 0); + if (s < 0) { + snmp_log_perror("socket"); + return -1; + } + + shutdown(s, SHUT_RD); + /* possible panic otherwise */ + flags |= (RTF_UP | RTF_GATEWAY); + + bzero((char *)&dst, sa_in_size); + dst.sin_len = sa_in_size; + dst.sin_family = AF_INET; + dst.sin_addr.s_addr = htonl(dstip); + + bzero((char *)&gateway, sa_in_size); + gateway.sin_len = sa_in_size; + gateway.sin_family = AF_INET; + gateway.sin_addr.s_addr = htonl(gwip); + + bzero((char *)&rtmsg, sizeof(rtmsg)); + rtmsg.hdr.rtm_type = RTM_ADD; + rtmsg.hdr.rtm_version = RTM_VERSION; + rtmsg.hdr.rtm_addrs = RTA_DST | RTA_GATEWAY; + rtmsg.hdr.rtm_flags = RTF_GATEWAY; + + bcopy((char *)&dst, rtmsg.space, sa_in_size); + bcopy((char *)&gateway, (rtmsg.space+sa_in_size), sa_in_size); + + rc = sizeof(struct rt_msghdr) + sa_in_size + sa_in_size; + rtmsg.hdr.rtm_msglen = rc; + + if ((rc = write(s, (char *)&rtmsg, rc)) < 0) { + snmp_log_perror("writing to routing socket"); + return -1; + } + + return (rc); #else /* SIOCADDRT */ return -1; @@ -143,7 +191,7 @@ addRoute(u_long dstip, u_long gwip, u_lo int delRoute(u_long dstip, u_long gwip, u_long iff, u_short flags) { -#if defined SIOCDELRT && !defined(irix6) +#if defined SIOCDELRT && !defined(irix6) && !defined(darwin) struct sockaddr_in dst; struct sockaddr_in gateway; @@ -178,6 +226,56 @@ delRoute(u_long dstip, u_long gwip, u_lo close(s); return rc; +#elif defined darwin + size_t sa_in_size = sizeof(struct sockaddr_in); + int s, rc; + struct sockaddr_in dst; + struct sockaddr_in gateway; + struct { + struct rt_msghdr hdr; + char space[512]; + } rtmsg; + + s = socket(PF_ROUTE, SOCK_RAW, 0); + + if (s < 0) { + snmp_log_perror("socket"); + return -1; + } + + shutdown(s, SHUT_RD); + /* possible panic otherwise */ + flags |= (RTF_UP | RTF_GATEWAY); + + bzero((char *)&dst, sa_in_size); + dst.sin_len = sa_in_size; + dst.sin_family = AF_INET; + dst.sin_addr.s_addr = htonl(dstip); + + bzero((char *)&gateway, sa_in_size); + gateway.sin_len = sa_in_size; + gateway.sin_family = AF_INET; + gateway.sin_addr.s_addr = htonl(gwip); + + bzero((char *)&rtmsg, sizeof(rtmsg)); + rtmsg.hdr.rtm_type = RTM_DELETE; + rtmsg.hdr.rtm_version = RTM_VERSION; + rtmsg.hdr.rtm_addrs = RTA_DST | RTA_GATEWAY; + rtmsg.hdr.rtm_flags = RTF_GATEWAY; + + bcopy((char *)&dst, rtmsg.space, sa_in_size); + bcopy((char *)&gateway, (rtmsg.space+sa_in_size), sa_in_size); + + rc = sizeof(struct rt_msghdr) + sa_in_size + sa_in_size; + rtmsg.hdr.rtm_msglen = rc; + + if ((rc = write(s, (char *)&rtmsg, rc)) < 0) { + snmp_log_perror("writing to routing socket"); + return -1; + } + + return rc; + #else /* SIOCDELRT */ return 0; #endif