]> arthur.barton.de Git - netatalk.git/blobdiff - etc/atalkd/nbp.c
- merge branch-netatalk-afp-3x-dev, HEAD was tagged before
[netatalk.git] / etc / atalkd / nbp.c
index e94130d8a610939cde66625089b9298bf8a6ebbd..a01521f73dc07f49f8a4b83bacbe01054208e575 100644 (file)
@@ -1,15 +1,26 @@
 /*
+ * $Id: nbp.c,v 1.11 2005-04-28 20:49:46 bfernhomberg 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 <string.h>
-#include <sys/syslog.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 <netatalk/at.h>
 #include <atalk/ddp.h>
@@ -19,7 +30,7 @@
 
 #ifdef __svr4__
 #include <sys/sockio.h>
-#endif __svr4__
+#endif /* __svr4__ */
 
 #include "atserv.h"
 #include "interface.h"
@@ -49,11 +60,11 @@ void nbp_ack( fd, nh_op, nh_id, to )
     nh.nh_id = nh_id;
     data = packet;
     *data++ = DDPTYPE_NBP;
-    bcopy( &nh, data, SZ_NBPHDR );
+    memcpy( data, &nh, SZ_NBPHDR );
     data += SZ_NBPHDR;
     if ( sendto( fd, packet, data - packet, 0, (struct sockaddr *)to,
            sizeof( struct sockaddr_at )) < 0 ) {
-       syslog( LOG_ERR, "sendto: %m" );
+       LOG(log_error, logtype_atalkd, "sendto: %s", strerror(errno) );
     }
 }
 
@@ -68,32 +79,33 @@ int nbp_packet( ap, from, data, len )
     struct nbpnve      nn;
     struct sockaddr_at sat;
     struct nbptab      *ntab;
-    struct ziptab      *zt;
+    struct ziptab      *zt=NULL;
     struct interface   *iface;
     struct list                *l;
     struct rtmptab     *rtmp;
     char               *end, *nbpop, *zonep, packet[ ATP_BUFSIZ ];
     int                        n, i, cc, locallkup;
+    u_char             tmplen;
 
     end = data + len;
     if ( data >= end ) {
-       syslog( LOG_INFO, "nbp_packet malformed packet" );
+       LOG(log_info, logtype_atalkd, "nbp_packet malformed packet" );
        return 1;
     }
     if ( *data++ != DDPTYPE_NBP ) {
-       syslog( LOG_INFO, "nbp_packet bad ddp type" );
+       LOG(log_info, logtype_atalkd, "nbp_packet bad ddp type" );
        return 1;
     }
 
     if ( data + SZ_NBPHDR + SZ_NBPTUPLE > end ) {
-       syslog( LOG_INFO, "nbp_packet: malformed packet" );
+       LOG(log_info, logtype_atalkd, "nbp_packet: malformed packet" );
        return 1;
     }
     memcpy( &nh, data, SZ_NBPHDR );
     nbpop = data;                      /* remember for fwd and brrq */
     data += SZ_NBPHDR;
     if ( nh.nh_cnt != 1 ) {
-       syslog( LOG_INFO, "nbp_packet: bad tuple count (%d/%d)", nh.nh_cnt,
+       LOG(log_info, logtype_atalkd, "nbp_packet: bad tuple count (%d/%d)", nh.nh_cnt,
                nh.nh_op );
        return 1;
     }
@@ -104,42 +116,48 @@ int nbp_packet( ap, from, data, len )
     memset( &nn.nn_sat, 0, sizeof( struct sockaddr_at ));
 #ifdef BSD4_4
     nn.nn_sat.sat_len = sizeof( struct sockaddr_at );
-#endif BSD4_4
+#endif /* BSD4_4 */
     nn.nn_sat.sat_family = AF_APPLETALK;
     nn.nn_sat.sat_addr.s_net = nt.nt_net;
     nn.nn_sat.sat_addr.s_node = nt.nt_node;
     nn.nn_sat.sat_port = nt.nt_port;
 
     /* object */
-    if ( data >= end || ( *data < 0 || *data > 32 ) || data + *data > end ) {
-       syslog( LOG_INFO, "nbp_packet: malformed packet" );
+    tmplen = (u_char) *data;
+    if ( data >= end || tmplen > 32 || data + tmplen > end ) {
+       LOG(log_info, logtype_atalkd, "nbp_packet: malformed packet" );
        return 1;
     }
-    nn.nn_objlen = *data++;
+    nn.nn_objlen = tmplen;
+    data++;
     memcpy( nn.nn_obj, data, nn.nn_objlen );
     data += nn.nn_objlen;
 
     /* type */
-    if ( data >= end || ( *data < 0 || *data > 32 ) || data + *data > end ) {
-       syslog( LOG_INFO, "nbp_packet: malformed packet" );
+    tmplen = (u_char) *data;
+    if ( data >= end || tmplen > 32 || data + tmplen > end ) {
+       LOG(log_info, logtype_atalkd, "nbp_packet: malformed packet" );
        return 1;
     }
-    nn.nn_typelen = *data++;
+    nn.nn_typelen = tmplen;
+    data++;
     memcpy( nn.nn_type, data, nn.nn_typelen );
     data += nn.nn_typelen;
 
     /* zone */
-    if ( data >= end || ( *data < 0 || *data > 32 ) || data + *data > end ) {
-       syslog( LOG_INFO, "nbp_packet: malformed packet" );
+    tmplen = (u_char) *data;
+    if ( data >= end || tmplen > 32 || data + tmplen > end ) {
+       LOG(log_info, logtype_atalkd, "nbp_packet: malformed packet" );
        return 1;
     }
     zonep = data;                      /* remember for fwd */
-    nn.nn_zonelen = *data++;
+    nn.nn_zonelen = tmplen;
+    data++;
     memcpy( nn.nn_zone, data, nn.nn_zonelen );
     data += nn.nn_zonelen;
 
     if ( data != end ) {
-       syslog( LOG_INFO, "nbp_packet: malformed packet" );
+       LOG(log_info, logtype_atalkd, "nbp_packet: malformed packet" );
        return 1;
     }
 
@@ -195,7 +213,7 @@ int nbp_packet( ap, from, data, len )
 
            /* calculate and save multicast address */
            if (zone_bcast(zt) < 0) {
-               syslog(LOG_ERR, "nbp_packet: zone_bcast");
+               LOG(log_error, logtype_atalkd, "nbp_packet: zone_bcast");
                return -1;
            }
 
@@ -207,7 +225,8 @@ int nbp_packet( ap, from, data, len )
                    if ( zt == (struct ziptab *)l->l_data ) {
                        /* add multicast */
                        if (addmulti(iface->i_name, zt->zt_bcast) < 0) {
-                           syslog( LOG_ERR, "nbp_packet: addmulti: %m" );
+                           LOG(log_error, logtype_atalkd, "nbp_packet: addmulti: %s",
+                                   strerror(errno) );
                            return -1;
                        }
                    }
@@ -217,7 +236,7 @@ int nbp_packet( ap, from, data, len )
 
        if (( ntab = (struct nbptab *)malloc( sizeof( struct nbptab )))
                == 0 ) {
-           syslog( LOG_ERR, "nbp_packet: malloc: %m" );
+           LOG(log_error, logtype_atalkd, "nbp_packet: malloc: %s", strerror(errno) );
            return -1;
        }
        memcpy( &ntab->nt_nve, &nn, sizeof( struct nbpnve ));
@@ -364,7 +383,7 @@ int nbp_packet( ap, from, data, len )
        if ( zt == 0 ) {
 #ifdef BSD4_4
            sat.sat_len = sizeof( struct sockaddr_at );
-#endif BSD4_4
+#endif /* BSD4_4 */
            sat.sat_family = AF_APPLETALK;
            sat.sat_port = ap->ap_port;
 
@@ -392,14 +411,14 @@ int nbp_packet( ap, from, data, len )
 
            if ( sendto( ap->ap_fd, data - len, len, 0, (struct sockaddr *)&sat,
                    sizeof( struct sockaddr_at )) < 0 ) {
-               syslog( LOG_ERR, "nbp brrq sendto: %m" );
+               LOG(log_error, logtype_atalkd, "nbp brrq sendto: %s", strerror(errno) );
            }
 
            locallkup = 1;
        } else {
 #ifdef BSD4_4
            sat.sat_len = sizeof( struct sockaddr_at );
-#endif BSD4_4
+#endif /* BSD4_4 */
            sat.sat_family = AF_APPLETALK;
            sat.sat_port = ap->ap_port;
            for ( l = zt->zt_rt; l; l = l->l_next ) {
@@ -413,7 +432,7 @@ int nbp_packet( ap, from, data, len )
                        }
                    }
                    if ( !iface ) {
-                       syslog( LOG_ERR, "nbp_packet: \
+                       LOG(log_error, logtype_atalkd, "nbp_packet: \
 Can't find route's interface!" );
                        return -1;
                    }
@@ -427,7 +446,7 @@ Can't find route's interface!" );
                    }
                }
                if ( !ap ) {
-                   syslog( LOG_ERR, "nbp_packet: Can't find port!" );
+                   LOG(log_error, logtype_atalkd, "nbp_packet: Can't find port!" );
                    return -1;
                }
 
@@ -437,19 +456,19 @@ Can't find route's interface!" );
                        locallkup = 1;
                    }
                    nh.nh_op = NBPOP_LKUP;
-                   bcopy( &nh, nbpop, SZ_NBPHDR );
+                   memcpy( nbpop, &nh, SZ_NBPHDR );
                    sat.sat_addr.s_net = rtmp->rt_firstnet;
                    sat.sat_addr.s_node = ATADDR_BCAST;
                } else {
                    if ( rtmp->rt_gate == 0 ) {
                        nh.nh_op = NBPOP_LKUP;
-                       bcopy( &nh, nbpop, SZ_NBPHDR );
+                       memcpy( nbpop, &nh, SZ_NBPHDR );
                        sat.sat_addr.s_net = 0;
                        sat.sat_addr.s_node = ATADDR_BCAST;
                        locallkup = 1;
                    } else {
                        nh.nh_op = NBPOP_FWD;
-                       bcopy( &nh, nbpop, SZ_NBPHDR );
+                       memcpy( nbpop, &nh, SZ_NBPHDR );
                        sat.sat_addr.s_net = rtmp->rt_firstnet;
                        sat.sat_addr.s_node = 0;
                    }
@@ -458,8 +477,9 @@ Can't find route's interface!" );
                if ( sendto( ap->ap_fd, data - len, len, 0,
                        (struct sockaddr *)&sat,
                        sizeof( struct sockaddr_at )) < 0 ) {
-                   syslog( LOG_ERR, "nbp brrq sendto %u.%u: %m",
-                           ntohs( sat.sat_addr.s_net ), sat.sat_addr.s_node );
+                   LOG(log_error, logtype_atalkd, "nbp brrq sendto %u.%u: %s",
+                           ntohs( sat.sat_addr.s_net ), sat.sat_addr.s_node,
+                           strerror(errno) );
                    continue;
                }
            }
@@ -474,13 +494,14 @@ Can't find route's interface!" );
         /* send lkup on net. we need to make sure we're a router. */
         if ( !locallkup && (ap->ap_iface->i_flags & IFACE_ISROUTER)) {
            nh.nh_op = NBPOP_LKUP;
-           bcopy( &nh, nbpop, SZ_NBPHDR );
+           memcpy( nbpop, &nh, SZ_NBPHDR );
            from->sat_addr.s_net = 0;
            from->sat_addr.s_node = ATADDR_BCAST;
            if ( sendto( ap->ap_fd, data - len, len, 0, (struct sockaddr *)from,
                    sizeof( struct sockaddr_at )) < 0 ) {
-               syslog( LOG_ERR, "nbp fwd sendto %u.%u: %m",
-                       ntohs( from->sat_addr.s_net ), from->sat_addr.s_node );
+               LOG(log_error, logtype_atalkd, "nbp fwd sendto %u.%u: %s",
+                       ntohs( from->sat_addr.s_net ), from->sat_addr.s_node,
+                       strerror(errno) );
                return 0;
            }
        }
@@ -542,21 +563,22 @@ Can't find route's interface!" );
             * Another tuple won't fit. Send what we've already
             * got, and start the next packet.
             */
-           if ( data + SZ_NBPTUPLE + 3 + ntab->nt_nve.nn_objlen +
+           if ( n > 14 || data + SZ_NBPTUPLE + 3 + ntab->nt_nve.nn_objlen +
                    ntab->nt_nve.nn_typelen + ntab->nt_nve.nn_zonelen > end ) {
                nh.nh_op = NBPOP_LKUPREPLY;
                nh.nh_cnt = n;
                cc = data - packet;
                data = packet;
                *data++ = DDPTYPE_NBP;
-               bcopy( &nh, data, SZ_NBPHDR );
+               memcpy( data, &nh, SZ_NBPHDR );
 
                if ( sendto( ap->ap_fd, packet, cc, 0,
                        (struct sockaddr *)&nn.nn_sat,
                        sizeof( struct sockaddr_at )) < 0 ) {
-                   syslog( LOG_ERR, "nbp lkup sendto %u.%u: %m",
+                   LOG(log_error, logtype_atalkd, "nbp lkup sendto %u.%u: %s",
                            ntohs( nn.nn_sat.sat_addr.s_net ),
-                           nn.nn_sat.sat_addr.s_node );
+                           nn.nn_sat.sat_addr.s_node,
+                           strerror(errno) );
                    return 0;
                }
 
@@ -595,7 +617,7 @@ Can't find route's interface!" );
             */
            if ( ntab->nt_nve.nn_zonelen ) {
                *data++ = ntab->nt_nve.nn_zonelen;
-               bcopy( ntab->nt_nve.nn_zone, data, ntab->nt_nve.nn_zonelen );
+               memcpy( data, ntab->nt_nve.nn_zone, ntab->nt_nve.nn_zonelen );
                data += ntab->nt_nve.nn_zonelen;
            } else {
                *data++ = 1;
@@ -611,21 +633,22 @@ Can't find route's interface!" );
            cc = data - packet;
            data = packet;
            *data++ = DDPTYPE_NBP;
-           bcopy( &nh, data, SZ_NBPHDR );
+           memcpy( data, &nh, SZ_NBPHDR );
 
            if ( sendto( ap->ap_fd, packet, cc, 0,
                    (struct sockaddr *)&nn.nn_sat,
                    sizeof( struct sockaddr_at )) < 0 ) {
-               syslog( LOG_ERR, "nbp lkup sendto %u.%u: %m",
+               LOG(log_error, logtype_atalkd, "nbp lkup sendto %u.%u: %s",
                        ntohs( nn.nn_sat.sat_addr.s_net ),
-                       nn.nn_sat.sat_addr.s_node );
+                       nn.nn_sat.sat_addr.s_node,
+                       strerror(errno) );
                return 0;
            }
        }
        break;
 
     default :
-       syslog( LOG_INFO, "nbp_packet: bad op (%d)", nh.nh_op );
+       LOG(log_info, logtype_atalkd, "nbp_packet: bad op (%d)", nh.nh_op );
        return 1;
     }