]> arthur.barton.de Git - netatalk.git/blobdiff - etc/atalkd/rtmp.c
Big configure.in cleanup
[netatalk.git] / etc / atalkd / rtmp.c
index f5db9ef032a4950e5437e008591e75173a556520..727562b0bd31b5dcfcbd7131c8283c3c48d93b6f 100644 (file)
@@ -1,14 +1,26 @@
 /*
+ * $Id: rtmp.c,v 1.17 2009-12-08 03:21:16 didg Exp $
+ *
  * Copyright (c) 1990,1993 Regents of The University of Michigan.
  * All Rights Reserved. See COPYRIGHT.
  */
 
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif /* HAVE_CONFIG_H */
+
 #include <stdlib.h>
-#include <sys/syslog.h>
+#include <string.h>
+#include <errno.h>
+#include <atalk/logger.h>
 #include <sys/types.h>
 #include <sys/param.h>
 #include <sys/socket.h>
 #include <sys/ioctl.h>
+#ifdef TRU64
+#include <sys/mbuf.h>
+#include <net/route.h>
+#endif /* TRU64 */
 #include <net/if.h>
 #include <net/route.h>
 #include <netatalk/endian.h>
@@ -16,7 +28,7 @@
 
 #ifdef __svr4__
 #include <sys/sockio.h>
-#endif __svr4__
+#endif /* __svr4__ */
 
 #include <atalk/ddp.h>
 #include <atalk/atp.h>
 #include "zip.h"
 #include "list.h"
 #include "atserv.h"
+#include "route.h"
+#include "main.h"
 
-
-void rtmp_delzonemap(rtmp)
-    struct rtmptab *rtmp;
+void rtmp_delzonemap(struct rtmptab *rtmp)
 {
     struct list                *lz, *flz, *lr, *flr;
     struct ziptab      *zt;
@@ -84,9 +96,7 @@ void rtmp_delzonemap(rtmp)
 /*
  * Complete configuration for phase 1 interface using RTMP information.
  */
-static int rtmp_config( rh, iface )
-    struct rtmp_head   *rh;
-    struct interface   *iface;
+static int rtmp_config( struct rtmp_head *rh, struct interface *iface)
 {
     extern int         stabletimer;
     int cc;
@@ -96,7 +106,7 @@ static int rtmp_config( rh, iface )
      * configuration with RTMP.
      */
     if ( iface->i_flags & IFACE_PHASE2 ) {
-       syslog( LOG_INFO, "rtmp_config ignoring data" );
+       LOG(log_info, logtype_atalkd, "rtmp_config ignoring data" );
        return 0;
     }
 
@@ -106,7 +116,7 @@ static int rtmp_config( rh, iface )
     if ( rh->rh_net != iface->i_addr.sat_addr.s_net ) {
        if (( iface->i_flags & IFACE_SEED ) &&
                rh->rh_net != iface->i_caddr.sat_addr.s_net) {
-           syslog( LOG_ERR, "rtmp_config net mismatch %u != %u",
+           LOG(log_error, logtype_atalkd, "rtmp_config net mismatch %u != %u",
                    ntohs( rh->rh_net ),
                    ntohs( iface->i_addr.sat_addr.s_net ));
            return 1;
@@ -129,12 +139,13 @@ static int rtmp_config( rh, iface )
       return -1;
 
     if (cc) {
-       syslog( LOG_ERR, "rtmp_config: can't route %u.%u to loopback: %m",
+       LOG(log_error, logtype_atalkd, "rtmp_config: can't route %u.%u to loopback: %s",
                ntohs( iface->i_addr.sat_addr.s_net ),
-               iface->i_addr.sat_addr.s_node );
+               iface->i_addr.sat_addr.s_node,
+               strerror(errno) );
     }
 
-    syslog( LOG_INFO, "rtmp_config configured %s", iface->i_name );
+    LOG(log_info, logtype_atalkd, "rtmp_config configured %s", iface->i_name );
     iface->i_flags |= IFACE_CONFIG;
     if ( iface == ciface ) {
        ciface = ciface->i_next;
@@ -148,8 +159,7 @@ static int rtmp_config( rh, iface )
  * Delete rtmp from the per-interface in-use table, remove all
  * zone references, and remove the route from the kernel.
  */
-static void rtmp_delinuse( rtmp )
-    struct rtmptab     *rtmp;
+static void rtmp_delinuse(struct rtmptab *rtmp)
 {
     struct rtmptab     *irt;
 
@@ -183,8 +193,7 @@ static void rtmp_delinuse( rtmp )
 /*
  * Add rtmp to the per-interface in-use table.  No verification is done...
  */
-static void rtmp_addinuse( rtmp )
-    struct rtmptab     *rtmp;
+static void rtmp_addinuse( struct rtmptab *rtmp)
 {
     struct rtmptab     *irt;
 
@@ -211,8 +220,7 @@ static void rtmp_addinuse( rtmp )
  * at this point?  What do we do if we get several copies of a route in
  * an RTMP packet?
  */
-static int rtmp_copyzones( to, from )
-    struct rtmptab     *to, *from;
+static int rtmp_copyzones( struct rtmptab *to,struct rtmptab *from)
 {
     struct list                *lz, *lr;
 
@@ -229,7 +237,7 @@ static int rtmp_copyzones( to, from )
            }
        }
        if ( lr == NULL ) {
-           syslog( LOG_ERR, "rtmp_copyzones z -> r without r -> z, abort" );
+           LOG(log_error, logtype_atalkd, "rtmp_copyzones z -> r without r -> z, abort" );
            return -1;
        }
     }
@@ -242,12 +250,11 @@ static int rtmp_copyzones( to, from )
  * Remove rtmp from the in-use table and the per-gate table.
  * Free any associated space.
  */
-void rtmp_free( rtmp )
-    struct rtmptab     *rtmp;
+void rtmp_free( struct rtmptab *rtmp)
 {
     struct gate                *gate;
 
-    syslog(LOG_INFO, "rtmp_free: %u-%u", ntohs(rtmp->rt_firstnet),
+    LOG(log_info, logtype_atalkd, "rtmp_free: %u-%u", ntohs(rtmp->rt_firstnet),
           ntohs(rtmp->rt_lastnet));
     if ( rtmp->rt_iprev ) {
        rtmp_delinuse( rtmp );
@@ -280,14 +287,13 @@ void rtmp_free( rtmp )
  * Find a replacement for "replace".  If we can't find a replacement,
  * return 1.  If we do find a replacement, return 0. -1 on error.
  */
-int rtmp_replace( replace )
-    struct rtmptab     *replace;
+int rtmp_replace(struct rtmptab *replace)
 {
     struct interface   *iface;
     struct gate                *gate;
     struct rtmptab     *rtmp, *found = NULL;
 
-    syslog(LOG_INFO, "rtmp_replace %u-%u", ntohs(replace->rt_firstnet),
+    LOG(log_info, logtype_atalkd, "rtmp_replace %u-%u", ntohs(replace->rt_firstnet),
           ntohs(replace->rt_lastnet));
     for ( iface = interfaces; iface; iface = iface->i_next ) {
         if ((replace->rt_iface != iface) && 
@@ -325,8 +331,7 @@ int rtmp_replace( replace )
 }
 
 
-static int rtmp_new( rtmp )
-    struct rtmptab     *rtmp;
+static int rtmp_new(struct rtmptab *rtmp)
 {
     struct interface   *i;
     struct rtmptab     *r;
@@ -362,7 +367,7 @@ static int rtmp_new( rtmp )
     if ( i ) { /* can we get here without r being set? */
        if ( r->rt_firstnet != rtmp->rt_firstnet ||
                r->rt_lastnet != rtmp->rt_lastnet ) {
-           syslog( LOG_INFO, "rtmp_new netrange mismatch %u-%u != %u-%u",
+           LOG(log_info, logtype_atalkd, "rtmp_new netrange mismatch %u-%u != %u-%u",
                    ntohs( r->rt_firstnet ), ntohs( r->rt_lastnet ),
                    ntohs( rtmp->rt_firstnet ), ntohs( rtmp->rt_lastnet ));
            return 1;
@@ -389,16 +394,13 @@ static int rtmp_new( rtmp )
 }
 
 
-int rtmp_packet( ap, from, data, len )
-    struct atport      *ap;
-    struct sockaddr_at *from;
-    char               *data;
-    int                        len;
+int rtmp_packet(struct atport *ap, struct sockaddr_at *from, char *data, int len)
 {
     struct rtmp_head   rh;
     struct rtmp_tuple  rt, xrt;
     struct gate                *gate;
     struct interface   *iface;
+    struct interface   *iface2;
     struct rtmptab     *rtmp;
     char               *end, packet[ ATP_BUFSIZ ];
     int                 cc;
@@ -406,12 +408,27 @@ int rtmp_packet( ap, from, data, len )
     end = data + len;
 
     if ( data >= end ) {
-       syslog( LOG_INFO, "rtmp_packet no data" );
+       LOG(log_info, logtype_atalkd, "rtmp_packet no data" );
        return 1;
     }
 
     iface = ap->ap_iface;
 
+    /* linux 2.6 sends broadcast queries to the first available socket 
+       (in our case the last configured) 
+       try to find the right one.
+       Note: now a misconfigured or plugged router can broadcast
+       a wrong route
+    */
+    for ( iface2 = interfaces; iface2; iface2 = iface2->i_next ) {
+        if ( iface2->i_rt && from->sat_addr.s_net >= iface2->i_rt->rt_firstnet && 
+                from->sat_addr.s_net <= iface2->i_rt->rt_lastnet) 
+        {
+              iface = iface2;
+        }
+    }
+    /* end of linux 2.6 workaround */
+    
     /* ignore our own packets */
     if ( from->sat_addr.s_net == iface->i_addr.sat_addr.s_net &&
            from->sat_addr.s_node == iface->i_addr.sat_addr.s_node  ) {
@@ -424,21 +441,21 @@ int rtmp_packet( ap, from, data, len )
         * Response and Data.
         */
        if ( data + sizeof( struct rtmprdhdr ) > end ) {
-           syslog( LOG_INFO, "rtmp_packet no data header" );
+           LOG(log_info, logtype_atalkd, "rtmp_packet no data header" );
            return 1;
        }
-       bcopy( data, &rh, sizeof( struct rtmprdhdr ));
+       memcpy( &rh, data, sizeof( struct rtmprdhdr ));
        data += sizeof( struct rtmprdhdr );
 
        /* check rh address against from address */
        if ( rh.rh_nodelen != 8 ) {
-           syslog( LOG_INFO, "rtmp_packet bad node len (%d)", rh.rh_nodelen );
+           LOG(log_info, logtype_atalkd, "rtmp_packet bad node len (%d)", rh.rh_nodelen );
            return 1;
        }
        if (( from->sat_addr.s_net != 0 && 
              from->sat_addr.s_net != rh.rh_net ) ||
              from->sat_addr.s_node != rh.rh_node ) {
-           syslog( LOG_INFO, "rtmp_packet address mismatch" );
+           LOG(log_info, logtype_atalkd, "rtmp_packet address mismatch" );
            return 1;
        }
 
@@ -446,24 +463,25 @@ int rtmp_packet( ap, from, data, len )
            if ( iface->i_flags & IFACE_NOROUTER ) {
                /* remove addr to loopback route */
                if ((cc = looproute( iface, RTMP_DEL )) < 0) {
-                 syslog(LOG_ERR, "rtmp_packet: looproute");
+                 LOG(log_error, logtype_atalkd, "rtmp_packet: looproute");
                  return -1;
                } 
 
                if (cc)
-                 syslog( LOG_ERR, "rtmp_packet: can't remove loopback: %m" );
+                 LOG(log_error, logtype_atalkd, "rtmp_packet: can't remove loopback: %s",
+                         strerror(errno) );
 
                iface->i_flags &= ~IFACE_NOROUTER;
                iface->i_time = 0;
-               syslog( LOG_INFO, "rtmp_packet router has become available" );
+               LOG(log_info, logtype_atalkd, "rtmp_packet router has become available" );
            }
            if ( iface->i_flags & IFACE_PHASE1 ) {
              if (rtmp_config( &rh, iface ) < 0) {
-                 syslog(LOG_ERR, "rtmp_packet: rtmp_config");
+                 LOG(log_error, logtype_atalkd, "rtmp_packet: rtmp_config");
                  return -1;
              }
            } else if (zip_getnetinfo( iface ) < 0) {
-             syslog(LOG_ERR, "rtmp_packet: zip_getnetinfo");
+             LOG(log_error, logtype_atalkd, "rtmp_packet: zip_getnetinfo");
              return -1;
            }
            return 0;
@@ -477,15 +495,15 @@ int rtmp_packet( ap, from, data, len )
         * Parse first tuple.  For phase 2, verify that net is correct.
         */
        if ( data + SZ_RTMPTUPLE > end ) {
-           syslog( LOG_INFO, "rtmp_packet missing first tuple" );
+           LOG(log_info, logtype_atalkd, "rtmp_packet missing first tuple" );
            return 1;
        }
-       bcopy( data, &rt, SZ_RTMPTUPLE );
+       memcpy( &rt, data, SZ_RTMPTUPLE );
        data += SZ_RTMPTUPLE;
 
        if ( rt.rt_net == 0 ) {
            if ( rt.rt_dist != 0x82 ) {
-               syslog( LOG_INFO, "rtmp_packet bad phase 1 version" );
+               LOG(log_info, logtype_atalkd, "rtmp_packet bad phase 1 version" );
                return 1;
            }
 
@@ -495,21 +513,21 @@ int rtmp_packet( ap, from, data, len )
             * no extended tuples in this packet.
             */
            if ( data + SZ_RTMPTUPLE > end ) {
-               syslog( LOG_INFO, "rtmp_packet missing second tuple" );
+               LOG(log_info, logtype_atalkd, "rtmp_packet missing second tuple" );
                return 1;
            }
-           bcopy( data, &rt, SZ_RTMPTUPLE );
+           memcpy( &rt, data, SZ_RTMPTUPLE );
            data += SZ_RTMPTUPLE;
        } else if ( rt.rt_dist & 0x80 ) {
            if ( data + SZ_RTMPTUPLE > end ) {
-               syslog( LOG_INFO, "rtmp_packet missing first range-end" );
+               LOG(log_info, logtype_atalkd, "rtmp_packet missing first range-end" );
                return 1;
            }
-           bcopy( data, &xrt, SZ_RTMPTUPLE );
+           memcpy( &xrt, data, SZ_RTMPTUPLE );
            data += SZ_RTMPTUPLE;
 
            if ( xrt.rt_dist != 0x82 ) {
-               syslog( LOG_INFO, "rtmp_packet bad phase 2 version" );
+               LOG(log_info, logtype_atalkd, "rtmp_packet bad phase 2 version" );
                return 1;
            }
 
@@ -518,7 +536,7 @@ int rtmp_packet( ap, from, data, len )
             */
            if ( rt.rt_net != iface->i_rt->rt_firstnet ||
                    xrt.rt_net != iface->i_rt->rt_lastnet ) {
-               syslog( LOG_INFO, "rtmp_packet interface mismatch" );
+               LOG(log_info, logtype_atalkd, "rtmp_packet interface mismatch" );
                return 1;
            }
        } else {
@@ -529,14 +547,14 @@ int rtmp_packet( ap, from, data, len )
             * might just as well check it.
            if ( rt.rt_net != iface->i_rt->rt_firstnet ||
                    rt.rt_net != iface->i_rt->rt_lastnet ) {
-               syslog( LOG_INFO, "rtmp_packet phase 1 interface mismatch" );
+               LOG(log_info, logtype_atalkd, "rtmp_packet phase 1 interface mismatch" );
                return 1;
            }
             */
-#else PHASE1NET
-           syslog( LOG_INFO, "rtmp_packet bad first tuple" );
+#else /* PHASE1NET */
+           LOG(log_info, logtype_atalkd, "rtmp_packet bad first tuple" );
            return 1;
-#endif PHASE1NET
+#endif /* PHASE1NET */
        }
 
        /*
@@ -549,20 +567,20 @@ int rtmp_packet( ap, from, data, len )
            }
        }
        if ( !gate ) {  /* new gateway */
-           if (( gate = (struct gate *)malloc( sizeof( struct gate ))) == 0 ) {
-               syslog( LOG_ERR, "rtmp_packet: malloc: %m" );
+           if (( gate = (struct gate *)malloc( sizeof( struct gate ))) == NULL ) {
+               LOG(log_error, logtype_atalkd, "rtmp_packet: malloc: %s", strerror(errno) );
                return -1;
            }
            gate->g_next = iface->i_gate;
-           gate->g_prev = 0;
-           gate->g_rt = 0;
+           gate->g_prev = NULL;
+           gate->g_rt = NULL;
            gate->g_iface = iface;      /* need this? */
            gate->g_sat = *from;
            if ( iface->i_gate ) {
                iface->i_gate->g_prev = gate;
            }
            iface->i_gate = gate;
-           syslog( LOG_INFO, "rtmp_packet gateway %u.%u up",
+           LOG(log_info, logtype_atalkd, "rtmp_packet gateway %u.%u up",
                    ntohs( gate->g_sat.sat_addr.s_net ),
                    gate->g_sat.sat_addr.s_node );
        }
@@ -598,29 +616,29 @@ int rtmp_packet( ap, from, data, len )
                 * ugly.)
                 */
                if ( rtmp->rt_firstnet != rt.rt_net ) {
-                   syslog( LOG_INFO, "rtmp_packet firstnet mismatch %u!=%u",
+                   LOG(log_info, logtype_atalkd, "rtmp_packet firstnet mismatch %u!=%u",
                            ntohs( rtmp->rt_firstnet ), ntohs( rt.rt_net ));
                    return 1;
                }
                if ( rt.rt_dist & 0x80 ) {
                    if (( rtmp->rt_flags & RTMPTAB_EXTENDED ) == 0 ) {
-                       syslog( LOG_INFO, "rtmp_packet extended mismatch %u",
+                       LOG(log_info, logtype_atalkd, "rtmp_packet extended mismatch %u",
                                ntohs( rtmp->rt_firstnet ));
                        return 1;
                    }
                    if ( rtmp->rt_lastnet != xrt.rt_net ) {
-                       syslog( LOG_INFO, "rtmp_packet lastnet mismatch %u!=%u",
+                       LOG(log_info, logtype_atalkd, "rtmp_packet lastnet mismatch %u!=%u",
                            ntohs( rtmp->rt_lastnet ), ntohs( xrt.rt_net ));
                        return 1;
                    }
                } else {
                    if ( rtmp->rt_flags & RTMPTAB_EXTENDED ) {
-                       syslog( LOG_INFO, "rtmp_packet !extended mismatch %u",
+                       LOG(log_info, logtype_atalkd, "rtmp_packet !extended mismatch %u",
                                ntohs( rtmp->rt_firstnet ));
                        return 1;
                    }
                    if ( rtmp->rt_lastnet != rt.rt_net ) {
-                       syslog( LOG_INFO, "rtmp_packet lastnet mismatch %u!=%u",
+                       LOG(log_info, logtype_atalkd, "rtmp_packet lastnet mismatch %u!=%u",
                            ntohs( rtmp->rt_lastnet ), ntohs( rt.rt_net ));
                        return 1;
                    }
@@ -658,7 +676,7 @@ int rtmp_packet( ap, from, data, len )
                                rtmp->rt_hops = ( rt.rt_dist & 0x7f ) + 1;
                            }
                            if (rtmp_replace( rtmp ) < 0) {
-                             syslog(LOG_ERR, "rtmp_packet: rtmp_replace");
+                             LOG(log_error, logtype_atalkd, "rtmp_packet: rtmp_replace");
                              return -1;
                            }
                        }
@@ -666,7 +684,7 @@ int rtmp_packet( ap, from, data, len )
                        rtmp->rt_hops = ( rt.rt_dist & 0x7f ) + 1;
                        if ( rtmp->rt_hops > ( rt.rt_dist & 0x7f ) + 1 ) {
                          if (rtmp_new( rtmp ) < 0) {
-                             syslog(LOG_ERR, "rtmp_packet: rtmp_new");
+                             LOG(log_error, logtype_atalkd, "rtmp_packet: rtmp_new");
                              return -1;
                          }
                        }
@@ -678,18 +696,18 @@ int rtmp_packet( ap, from, data, len )
                 * we're not likely to be asked for the same tuple twice
                 * in a row.
                 */
-               if ( rtmp->rt_next != 0 ) {
+               if ( rtmp->rt_next != NULL ) {
                    gate->g_rt->rt_prev->rt_next = gate->g_rt;
                    gate->g_rt = rtmp->rt_next;
-                   rtmp->rt_next = 0;
+                   rtmp->rt_next = NULL;
                }
            } else if (( rt.rt_dist & 0x7f ) + 1 > RTMPHOPS_MAX ) {
-               syslog( LOG_INFO, "rtmp_packet bad hop count from %u.%u for %u",
+               LOG(log_info, logtype_atalkd, "rtmp_packet bad hop count from %u.%u for %u",
                        ntohs( from->sat_addr.s_net ), from->sat_addr.s_node,
                        ntohs( rt.rt_net ));
            } else {            /* new for router */
                if (( rtmp = newrt(iface)) == NULL ) {
-                   syslog( LOG_ERR, "rtmp_packet: newrt: %m" );
+                   LOG(log_error, logtype_atalkd, "rtmp_packet: newrt: %s", strerror(errno) );
                    return -1;
                }
                rtmp->rt_firstnet = rt.rt_net;
@@ -706,7 +724,7 @@ int rtmp_packet( ap, from, data, len )
                /*
                 * Add rtmptab entry to end of list (leave head alone).
                 */
-               if ( gate->g_rt == 0 ) {
+               if ( gate->g_rt == NULL ) {
                    rtmp->rt_prev = rtmp;
                    gate->g_rt = rtmp;
                } else {
@@ -716,7 +734,7 @@ int rtmp_packet( ap, from, data, len )
                }
                
                if (rtmp_new( rtmp ) < 0) {
-                   syslog(LOG_ERR, "rtmp_packet: rtmp_new");
+                   LOG(log_error, logtype_atalkd, "rtmp_packet: rtmp_new");
                    return -1;
                }
            }
@@ -724,14 +742,14 @@ int rtmp_packet( ap, from, data, len )
            if ( data + SZ_RTMPTUPLE > end ) {
                break;
            }
-           bcopy( data, &rt, SZ_RTMPTUPLE );
+           memcpy( &rt, data, SZ_RTMPTUPLE );
            data += SZ_RTMPTUPLE;
            if ( rt.rt_dist & 0x80 ) {
                if ( data + SZ_RTMPTUPLE > end ) {
-                   syslog( LOG_INFO, "rtmp_packet missing range-end" );
+                   LOG(log_info, logtype_atalkd, "rtmp_packet missing range-end" );
                    return 1;
                }
-               bcopy( data, &xrt, SZ_RTMPTUPLE );
+               memcpy( &xrt, data, SZ_RTMPTUPLE );
                data += SZ_RTMPTUPLE;
            }
        }
@@ -740,7 +758,7 @@ int rtmp_packet( ap, from, data, len )
         * Make sure we've processed the whole packet.
         */
        if ( data != end ) {
-           syslog( LOG_INFO, "rtmp_packet length and count mismatch" );
+           LOG(log_info, logtype_atalkd, "rtmp_packet length and count mismatch" );
        }
        break;
 
@@ -749,7 +767,7 @@ int rtmp_packet( ap, from, data, len )
         * Request and RDR.
         */
         if (((iface->i_flags & IFACE_ISROUTER) == 0) ||
-           iface->i_rt->rt_zt == 0 ||
+           iface->i_rt->rt_zt == NULL ||
            ( iface->i_flags & IFACE_CONFIG ) == 0 ) {
            return 0;
        }
@@ -759,39 +777,39 @@ int rtmp_packet( ap, from, data, len )
            rh.rh_net = iface->i_addr.sat_addr.s_net;
            rh.rh_nodelen = 8;
            rh.rh_node = iface->i_addr.sat_addr.s_node;
-           bcopy( &rh, data, sizeof( struct rtmp_head ));
+           memcpy( data, &rh, sizeof( struct rtmp_head ));
            data += sizeof( struct rtmp_head );
 
            if ( iface->i_flags & IFACE_PHASE2 ) {
                rt.rt_net = iface->i_rt->rt_firstnet;
                rt.rt_dist = 0x80;
-               bcopy( &rt, data, SZ_RTMPTUPLE );
+               memcpy( data, &rt, SZ_RTMPTUPLE );
                data += SZ_RTMPTUPLE;
 
                rt.rt_net = iface->i_rt->rt_lastnet;
                rt.rt_dist = 0x82;
-               bcopy( &rt, data, SZ_RTMPTUPLE );
+               memcpy( data, &rt, SZ_RTMPTUPLE );
                data += SZ_RTMPTUPLE;
            }
            if ( sendto( ap->ap_fd, packet, data - packet, 0,
                    (struct sockaddr *)from,
                    sizeof( struct sockaddr_at )) < 0 ) {
-               syslog( LOG_ERR, "as_timer sendto: %m" );
+               LOG(log_error, logtype_atalkd, "as_timer sendto: %s", strerror(errno) );
            }
        } else if ( *data == 2 || *data == 3 ) {
 #ifdef DEBUG
            printf( "rtmp_packet rdr (%d) from %u.%u\n",
                    *data, ntohs( from->sat_addr.s_net ),
                    from->sat_addr.s_node );
-#endif DEBUG
+#endif /* DEBUG */
        } else {
-           syslog( LOG_INFO, "rtmp_packet unknown request from %u.%u\n",
+           LOG(log_info, logtype_atalkd, "rtmp_packet unknown request from %u.%u",
                    ntohs( from->sat_addr.s_net ), from->sat_addr.s_node );
        }
        break;
 
     default :
-       syslog( LOG_INFO, "rtmp_packet bad ddp type from %u.%u",
+       LOG(log_info, logtype_atalkd, "rtmp_packet bad ddp type from %u.%u",
                    ntohs( from->sat_addr.s_net ), from->sat_addr.s_node );
        return 0;
     }
@@ -799,22 +817,21 @@ int rtmp_packet( ap, from, data, len )
     return 0;
 }
 
-int rtmp_request( iface )
-    struct interface   *iface;
+int rtmp_request( struct interface *iface)
 {
     struct sockaddr_at sat;
     struct atport      *ap;
     char               *data, packet[ 2 ];
 
-    syslog( LOG_INFO, "rtmp_request for %s", iface->i_name );
+    LOG(log_info, logtype_atalkd, "rtmp_request for %s", iface->i_name );
 
     for ( ap = iface->i_ports; ap; ap = ap->ap_next ) {
        if ( ap->ap_packet == rtmp_packet ) {
            break;
        }
     }
-    if ( ap == 0 ) {
-       syslog( LOG_ERR, "rtmp_request can't find rtmp socket!" );
+    if ( ap == NULL ) {
+       LOG(log_error, logtype_atalkd, "rtmp_request can't find rtmp socket!" );
        return -1;
     }
 
@@ -825,57 +842,67 @@ int rtmp_request( iface )
     /*
      * There is a problem with the net zero "hint" hack.
      */
-    bzero( &sat, sizeof( struct sockaddr_at ));
+    memset( &sat, 0, sizeof( struct sockaddr_at ));
 #ifdef BSD4_4
     sat.sat_len = sizeof( struct sockaddr_at );
-#endif BSD4_4
+#endif /* BSD4_4 */
     sat.sat_family = AF_APPLETALK;
     sat.sat_addr.s_net = iface->i_addr.sat_addr.s_net;
     sat.sat_addr.s_node = ATADDR_BCAST;
     sat.sat_port = ap->ap_port;
     if ( sendto( ap->ap_fd, packet, data - packet, 0, (struct sockaddr *)&sat,
            sizeof( struct sockaddr_at )) < 0 ) {
-       syslog( LOG_ERR, "rtmp_request sendto: %m" );
+       LOG(log_error, logtype_atalkd, "rtmp_request sendto: %s", strerror(errno) );
        return -1;
     }
     return 0;
 }
 
 
-int looproute( iface, cmd )
-    struct interface   *iface;
-    int                        cmd;
+int looproute(struct interface *iface, unsigned int cmd)
 {
     struct sockaddr_at dst, loop;
 
     if ( cmd == RTMP_DEL && ( iface->i_flags & IFACE_LOOP ) == 0 ) {
-       syslog( LOG_ERR, "looproute panic no route" );
+       LOG(log_error, logtype_atalkd, "looproute panic no route" );
        return -1;
     }
 
     if ( cmd == RTMP_ADD && ( iface->i_flags & IFACE_LOOP )) {
-       syslog( LOG_ERR, "looproute panic two routes" );
+       LOG(log_error, logtype_atalkd, "looproute panic two routes" );
        return -1;
     }
 
-    bzero( &dst, sizeof( struct sockaddr_at ));
+    memset( &dst, 0, sizeof( struct sockaddr_at ));
 #ifdef BSD4_4
     dst.sat_len = sizeof( struct sockaddr_at );
-#endif BSD4_4
+#endif /* BSD4_4 */
     dst.sat_family = AF_APPLETALK;
     dst.sat_addr.s_net = iface->i_addr.sat_addr.s_net;
     dst.sat_addr.s_node = iface->i_addr.sat_addr.s_node;
-    bzero( &loop, sizeof( struct sockaddr_at ));
+    memset( &loop, 0, sizeof( struct sockaddr_at ));
 #ifdef BSD4_4
     loop.sat_len = sizeof( struct sockaddr_at );
-#endif BSD4_4
+#endif /* BSD4_4 */
     loop.sat_family = AF_APPLETALK;
     loop.sat_addr.s_net = htons( ATADDR_ANYNET );
     loop.sat_addr.s_node = ATADDR_ANYNODE;
 
-    if ( route( cmd, &dst, &loop, RTF_UP | RTF_HOST )) {
+#ifndef BSD4_4
+    if ( route( cmd,
+               (struct sockaddr *) &dst,
+               (struct sockaddr *) &loop,
+               RTF_UP | RTF_HOST ) ) {
        return( 1 );
     }
+#else /* ! BSD4_4 */
+    if ( route( cmd,
+               (struct sockaddr_at *) &dst,
+               (struct sockaddr_at *) &loop,
+               RTF_UP | RTF_HOST ) ) {
+       return ( 1);
+    }
+#endif /* BSD4_4 */
     if ( cmd == RTMP_ADD ) {
        iface->i_flags |= IFACE_LOOP;
     }
@@ -885,9 +912,7 @@ int looproute( iface, cmd )
     return( 0 );
 }
 
-int gateroute( command, rtmp )
-    int                        command;
-    struct rtmptab     *rtmp;
+int gateroute(unsigned int command, struct rtmptab *rtmp)
 {
     struct sockaddr_at dst, gate;
     unsigned short     net;
@@ -906,10 +931,10 @@ int gateroute( command, rtmp )
      * the kernel.  Otherwise, we'll get a bunch of routes to the loop
      * back interface, and who wants that?
      */
-    bzero( &gate, sizeof( struct sockaddr_at ));
+    memset( &gate, 0, sizeof( struct sockaddr_at ));
 #ifdef BSD4_4
     gate.sat_len = sizeof( struct sockaddr_at );
-#endif BSD4_4
+#endif /* BSD4_4 */
     gate.sat_family = AF_APPLETALK;
     gate.sat_addr.s_net = rtmp->rt_gate->g_sat.sat_addr.s_net;
     gate.sat_addr.s_node = rtmp->rt_gate->g_sat.sat_addr.s_node;
@@ -917,20 +942,35 @@ int gateroute( command, rtmp )
        gate.sat_addr.s_net = net;
     }
 
-    bzero( &dst, sizeof( struct sockaddr_at ));
+    memset( &dst, 0, sizeof( struct sockaddr_at ));
 #ifdef BSD4_4
     dst.sat_len = sizeof( struct sockaddr_at );
-#endif BSD4_4
+#endif /* BSD4_4 */
     dst.sat_family = AF_APPLETALK;
     dst.sat_addr.s_node = ATADDR_ANYNODE;
 
     do {
        dst.sat_addr.s_net = htons( net );
-       if ( route( command, &dst, &gate, RTF_UP | RTF_GATEWAY )) {
-           syslog( LOG_ERR, "route: %u -> %u.%u: %m", net,
-                   ntohs( gate.sat_addr.s_net ), gate.sat_addr.s_node );
+#ifndef BSD4_4
+       if ( route( command,
+                   (struct sockaddr *) &dst,
+                   (struct sockaddr *) &gate,
+                   RTF_UP | RTF_GATEWAY )) {
+           LOG(log_error, logtype_atalkd, "route: %u -> %u.%u: %s", net,
+                   ntohs( gate.sat_addr.s_net ), gate.sat_addr.s_node,
+                   strerror(errno) );
+           continue;
+       }
+#else /* ! BSD4_4 */
+       if ( route( command,
+                   (struct sockaddr_at *) &dst,
+                   (struct sockaddr_at *) &gate,
+                   RTF_UP | RTF_GATEWAY )) {
+           LOG(log_error, logtype_atalkd, "route: %u -> %u.%u: %s", net,
+                   ntohs( gate.sat_addr.s_net ), gate.sat_addr.s_node, strerror(errno) );
            continue;
        }
+#endif /* ! BSD4_4 */
     } while ( net++ < ntohs( rtmp->rt_lastnet ));
 
     if ( command == RTMP_ADD ) {
@@ -948,8 +988,8 @@ newrt(const struct interface *iface)
 {
     struct rtmptab     *rtmp;
 
-    if (( rtmp = (struct rtmptab *)calloc(1, sizeof(struct rtmptab))) == 0 ) {
-       return( 0 );
+    if (( rtmp = (struct rtmptab *)calloc(1, sizeof(struct rtmptab))) == NULL ) {
+       return( NULL );
     }
 
     rtmp->rt_iface = iface;