$NetBSD: patch-an,v 1.2 2005/08/01 11:56:54 wiz Exp $
--- agent/mibgroup/mibII/route_write.c.orig	2005-07-30 22:18:06.000000000 +1000
+++ agent/mibgroup/mibII/route_write.c	2005-07-30 22:18:28.000000000 +1000
@@ -102,7 +102,7 @@
 int
 addRoute(u_long dstip, u_long gwip, u_long iff, u_short flags)
 {
-#ifndef dynix
+#if !(defined dynix || defined darwin)
     struct sockaddr_in dst;
     struct sockaddr_in gateway;
     int             s, rc;
@@ -141,6 +141,55 @@
     return rc;
 #endif
 
+#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                           /* dynix */
     /*
      *  Throws up the following errors:
@@ -166,7 +215,7 @@
 int
 delRoute(u_long dstip, u_long gwip, u_long iff, u_short flags)
 {
-#ifndef dynix
+#if !(defined dynix || defined darwin)
 
     struct sockaddr_in dst;
     struct sockaddr_in gateway;
@@ -205,6 +254,56 @@
     return rc;
 #endif
 
+#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                           /* dynix */
     /*
      * See 'addRoute' for the list of errors.
