$NetBSD: patch-an,v 1.4 2011/05/27 10:55:25 adam Exp $

--- agent/mibgroup/mibII/route_write.c.orig	2010-03-20 19:36:28.000000000 +0000
+++ agent/mibgroup/mibII/route_write.c
@@ -93,7 +93,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;
@@ -128,6 +128,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;
@@ -139,7 +187,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;
@@ -174,6 +222,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
