--- etc/atalkd/zip.c.orig Fri Jan 23 07:15:56 1998 +++ etc/atalkd/zip.c Wed Nov 10 16:10:20 1999 @@ -14,6 +14,8 @@ #include #include #include +#include +#include #ifdef __svr4__ #include @@ -31,8 +33,13 @@ #include "list.h" #include "multicast.h" +extern int strndiacasecmp(), setaddr(), bootaddr(); + struct ziptab *ziptab = NULL, *ziplast = NULL; +int zonecheck(), ladd(); + +void zip_packet( ap, from, data, len ) struct atport *ap; struct sockaddr_at *from; @@ -46,11 +53,11 @@ struct rtmptab *rtmp; struct list *l; struct ziptab *zt; - u_short firstnet, lastnet, tonet, index, nz; + u_int16_t firstnet, lastnet, index, nz; char *end, zname[ 32 ], packet[ 587 ], *nzones, *lastflag; char *reply, *rend, *ziphdr; int zlen, n, zipop, rcnt, qcnt, zcnt, zsz; - extern int debug, stabletimer; + extern int stabletimer; end = data + len; @@ -68,7 +75,7 @@ syslog( LOG_INFO, "zip_packet malformed packet" ); return; } - bcopy( data, &zh, sizeof( struct ziphdr )); + memcpy( &zh, data, sizeof( struct ziphdr )); data += sizeof( struct ziphdr ); switch ( zh.zh_op ) { @@ -83,9 +90,9 @@ qcnt = zh.zh_count; - while ( data + sizeof( u_short ) <= end && qcnt-- > 0 ) { - bcopy( data, &firstnet, sizeof( u_short )); - data += sizeof( u_short ); + while ( data + sizeof( u_int16_t ) <= end && qcnt-- > 0 ) { + memcpy( &firstnet, data, sizeof( firstnet )); + data += sizeof( firstnet ); /* * Look for the given network number (firstnet). @@ -112,7 +119,7 @@ for ( zsz = 0, zcnt = 0, l = rtmp->rt_zt; l; l = l->l_next ) { zcnt++; zt = (struct ziptab *)l->l_data; - zsz += sizeof( u_short ) + 1 + zt->zt_len; + zsz += sizeof( u_int16_t ) + 1 + zt->zt_len; } /* @@ -123,7 +130,7 @@ if ( rcnt > 0 ) { zh.zh_op = ZIPOP_REPLY; zh.zh_cnt = rcnt; - bcopy( &zh, ziphdr, sizeof( struct ziphdr )); + memcpy( ziphdr, &zh, sizeof( struct ziphdr )); if ( sendto( ap->ap_fd, packet, reply - packet, 0, (struct sockaddr *)from, sizeof( struct sockaddr_at )) < 0 ) { @@ -138,11 +145,11 @@ /* ereply */ for ( l = rtmp->rt_zt; l; l = l->l_next, rcnt++ ) { zt = (struct ziptab *)l->l_data; - if ( reply + sizeof( u_short ) + 1 + zt->zt_len > + if ( reply + sizeof( u_int16_t ) + 1 + zt->zt_len > rend ) { zh.zh_op = ZIPOP_EREPLY; zh.zh_cnt = zcnt; - bcopy( &zh, ziphdr, sizeof( struct ziphdr )); + memcpy( ziphdr, &zh, sizeof( struct ziphdr )); if ( sendto( ap->ap_fd, packet, reply - packet, 0, (struct sockaddr *)from, sizeof( struct sockaddr_at )) < 0 ) { @@ -153,17 +160,17 @@ rcnt = 0; } - bcopy( &firstnet, reply, sizeof( u_short )); - reply += sizeof( u_short ); + memcpy( reply, &firstnet, sizeof( firstnet )); + reply += sizeof( firstnet ); *reply++ = zt->zt_len; - bcopy( zt->zt_name, reply, zt->zt_len ); + memcpy( reply, zt->zt_name, zt->zt_len ); reply += zt->zt_len; } if ( rcnt > 0 ) { zh.zh_op = ZIPOP_EREPLY; zh.zh_cnt = zcnt; - bcopy( &zh, ziphdr, sizeof( struct ziphdr )); + memcpy( ziphdr, &zh, sizeof( struct ziphdr )); if ( sendto( ap->ap_fd, packet, reply - packet, 0, (struct sockaddr *)from, sizeof( struct sockaddr_at )) < 0 ) { @@ -179,10 +186,10 @@ for ( l = rtmp->rt_zt; l; l = l->l_next, rcnt++ ) { zt = (struct ziptab *)l->l_data; - bcopy( &firstnet, reply, sizeof( u_short )); - reply += sizeof( u_short ); + memcpy( reply, &firstnet, sizeof( firstnet )); + reply += sizeof( firstnet ); *reply++ = zt->zt_len; - bcopy( zt->zt_name, reply, zt->zt_len ); + memcpy( reply, zt->zt_name, zt->zt_len ); reply += zt->zt_len; } } @@ -190,7 +197,7 @@ if ( rcnt > 0 ) { zh.zh_op = ZIPOP_REPLY; zh.zh_cnt = rcnt; - bcopy( &zh, ziphdr, sizeof( struct ziphdr )); + memcpy( ziphdr, &zh, sizeof( struct ziphdr )); if ( sendto( ap->ap_fd, packet, reply - packet, 0, (struct sockaddr *)from, sizeof( struct sockaddr_at )) < 0 ) { @@ -216,12 +223,12 @@ rtmp = 0; do { - if ( data + sizeof( u_short ) + 1 > end ) { /* + strlen */ + if ( data + sizeof( u_int16_t ) + 1 > end ) { /* + strlen */ syslog( LOG_INFO, "zip reply short (%d)", len ); return; } - bcopy( data, &firstnet, sizeof( u_short )); - data += sizeof( u_short ); + memcpy( &firstnet, data, sizeof( firstnet )); + data += sizeof( firstnet ); if ( rtmp && rtmp->rt_firstnet != firstnet ) { /* XXX */ @@ -262,7 +269,7 @@ syslog( LOG_INFO, "zip reply short (%d)", len ); return; } - bcopy( data, zname, zlen ); + memcpy( zname, data, zlen ); data += zlen; /* @@ -331,11 +338,11 @@ * Note that we're not advancing "data" here. We do that * at the top of the do-while loop, below. */ - if ( data + sizeof( u_short ) + 1 > end ) { /* + strlen */ + if ( data + sizeof( u_int16_t ) + 1 > end ) { /* + strlen */ syslog( LOG_INFO, "zip ereply short (%d)", len ); return; } - bcopy( data, &firstnet, sizeof( u_short )); + memcpy( &firstnet, data, sizeof( firstnet )); /* Check if this is the interface's route. */ if ( firstnet == gate->g_iface->i_rt->rt_firstnet ) { @@ -383,12 +390,12 @@ * We copy out firstnet, twice (see above). Not * a big deal, and it makes the end condition cleaner. */ - if ( data + sizeof( u_short ) + 1 > end ) { /* + strlen */ + if ( data + sizeof( u_int16_t ) + 1 > end ) { /* + strlen */ syslog( LOG_INFO, "zip ereply short (%d)", len ); return; } - bcopy( data, &firstnet, sizeof( u_short )); - data += sizeof( u_short ); + memcpy( &firstnet, data, sizeof( firstnet )); + data += sizeof( firstnet ); /* check route */ if ( firstnet != rtmp->rt_firstnet ) { @@ -405,7 +412,7 @@ syslog( LOG_INFO, "zip ereply short (%d)", len ); return; } - bcopy( data, zname, zlen ); + memcpy( zname, data, zlen ); data += zlen; addzone( rtmp, zlen, zname ); } while ( data < end ); @@ -438,15 +445,15 @@ return; } - if ( zh.zh_zero != 0 || data + 2 * sizeof( u_short ) > end ) { + if ( zh.zh_zero != 0 || data + 2 * sizeof( u_int16_t ) > end ) { syslog( LOG_INFO, "zip_packet malformed packet" ); return; } - bcopy( data, &firstnet, sizeof( u_short )); - data += sizeof( u_short ); - bcopy( data, &lastnet, sizeof( u_short )); - data += sizeof( u_short ); + memcpy( &firstnet, data, sizeof( firstnet )); + data += sizeof( firstnet ); + memcpy( &lastnet, data, sizeof( lastnet )); + data += sizeof( lastnet ); if ( firstnet != 0 || lastnet != 0 || data >= end ) { syslog( LOG_INFO, "zip_packet malformed packet" ); return; @@ -457,7 +464,7 @@ syslog( LOG_INFO, "zip_packet malformed packet" ); return; } - bcopy( data, zname, zlen ); + memcpy( zname, data, zlen ); data = packet; end = data + sizeof( packet ); @@ -468,13 +475,13 @@ * Skip to the nets. Fill in header when we're done. */ data += 1 + sizeof( struct ziphdr ); - bcopy( &iface->i_rt->rt_firstnet, data, sizeof( u_short )); - data += sizeof( u_short ); - bcopy( &iface->i_rt->rt_lastnet, data, sizeof( u_short )); - data += sizeof( u_short ); + memcpy( data, &iface->i_rt->rt_firstnet, sizeof( u_int16_t )); + data += sizeof( u_int16_t ); + memcpy( data, &iface->i_rt->rt_lastnet, sizeof( u_int16_t )); + data += sizeof( u_int16_t ); *data++ = zlen; - bcopy( zname, data, zlen ); + memcpy( data, zname, zlen ); data += zlen; /* @@ -502,7 +509,7 @@ /* multicast */ *data++ = 6; /* sizeof ??? */ - bcopy( zone_mcast( zt->zt_name, zt->zt_len ), data, 6 ); + memcpy( data, zone_mcast( zt->zt_name, zt->zt_len ), 6 ); data += 6; /* @@ -510,13 +517,13 @@ */ if ( zh.zh_flags & ZIPGNI_INVALID ) { *data++ = zt->zt_len; - bcopy( zt->zt_name, data, zt->zt_len ); + memcpy( data, zt->zt_name, zt->zt_len ); data += zt->zt_len; } /* fill in header */ *packet = DDPTYPE_ZIP; - bcopy( &zh, packet + 1, sizeof( struct ziphdr )); + memcpy( packet + 1, &zh, sizeof( struct ziphdr )); /* * If the address we received this request from isn't correct @@ -555,10 +562,10 @@ syslog( LOG_INFO, "zip_packet malformed packet" ); return; } - bcopy( data, &firstnet, sizeof( u_short )); - data += sizeof( u_short ); - bcopy( data, &lastnet, sizeof( u_short )); - data += sizeof( u_short ); + memcpy( &firstnet, data, sizeof( firstnet )); + data += sizeof( firstnet ); + memcpy( &lastnet, data, sizeof( lastnet )); + data += sizeof( lastnet ); /* * We never ask for a zone, so we can get back what the @@ -685,7 +692,7 @@ syslog( LOG_INFO, "zip atp malformed packet" ); return; } - bcopy( data, &ah, sizeof( struct atphdr )); + memcpy( &ah, data, sizeof( struct atphdr )); data += sizeof( struct atphdr ); if ( ah.atphd_ctrlinfo != ATP_TREQ ) { syslog( LOG_INFO, "zip atp bad control" ); @@ -700,8 +707,8 @@ zipop = *data++; data++; - bcopy( data, &index, sizeof( u_short )); - data += sizeof( u_short ); + memcpy( &index, data, sizeof( index )); + data += sizeof( index ); index = ntohs( index ); if ( data != end ) { syslog( LOG_INFO, "zip atp malformed packet" ); @@ -711,12 +718,12 @@ data = packet; end = data + sizeof( packet ); *data++ = DDPTYPE_ATP; - bcopy( &ah, data, sizeof( struct atphdr )); + memcpy( data, &ah, sizeof( struct atphdr )); data += sizeof( struct atphdr ); lastflag = data++; /* mark and space for last flag */ *data++ = 0; nzones = data; /* mark and space for zone count */ - data += sizeof( u_short ); + data += sizeof( u_int16_t ); switch ( zipop ) { case ZIPOP_GETMYZONE : @@ -743,7 +750,7 @@ return; } *data++ = zt->zt_len; - bcopy( zt->zt_name, data, zt->zt_len ); + memcpy( data, zt->zt_name, zt->zt_len ); data += zt->zt_len; *lastflag = 0; @@ -758,7 +765,7 @@ break; } *data++ = zt->zt_len; - bcopy( zt->zt_name, data, zt->zt_len ); + memcpy( data, zt->zt_name, zt->zt_len ); data += zt->zt_len; } @@ -784,7 +791,7 @@ break; } *data++ = zt->zt_len; - bcopy( zt->zt_name, data, zt->zt_len ); + memcpy( data, zt->zt_name, zt->zt_len ); data += zt->zt_len; } @@ -799,7 +806,7 @@ /* send reply */ if ( nz > 0 ) { nz = htons( nz ); - bcopy( &nz, nzones, sizeof( u_short )); + memcpy( nzones, &nz, sizeof( nz )); if ( sendto( ap->ap_fd, packet, data - packet, 0, (struct sockaddr *)from, sizeof( struct sockaddr_at )) < 0 ) { @@ -817,6 +824,7 @@ } } +void zip_getnetinfo( iface ) struct interface *iface; { @@ -824,13 +832,12 @@ struct ziphdr zh; struct sockaddr_at sat; char *data, packet[ 40 ]; - u_short net; - int i; + u_int16_t net; syslog( LOG_INFO, "zip_getnetinfo for %s", iface->i_name ); for ( ap = iface->i_ports; ap; ap = ap->ap_next ) { - if ( ap->ap_packet == zip_packet ) { + if ( (void *) ap->ap_packet == (void *) zip_packet ) { break; } } @@ -845,13 +852,13 @@ zh.zh_op = ZIPOP_GNI; zh.zh_zero = 0; - bcopy( &zh, data, sizeof( struct ziphdr )); + memcpy( data, &zh, sizeof( struct ziphdr )); data += sizeof( struct ziphdr ); net = 0; - bcopy( &net, data, sizeof( u_short )); - data += sizeof( u_short ); - bcopy( &net, data, sizeof( u_short )); - data += sizeof( u_short ); + memcpy( data, &net, sizeof( net )); + data += sizeof( net ); + memcpy( data, &net, sizeof( net )); + data += sizeof( net ); /* * Set our requesting zone to NULL, so the response will contain @@ -889,7 +896,7 @@ if (( zt->zt_name = (char *)malloc( len )) == NULL ) { return( NULL ); } - bcopy( name, zt->zt_name, len ); + memcpy( zt->zt_name, name, len ); zt->zt_rt = NULL; zt->zt_bcast = NULL; zt->zt_next = NULL; @@ -898,6 +905,7 @@ return( zt ); } +void addzone( rt, len, zone ) struct rtmptab *rt; int len; @@ -951,6 +959,7 @@ /* * Insert at the end. Return < 0 if a mapping already exists, 0 otherwise. */ +int ladd( head, data ) struct list **head; void *data; @@ -982,6 +991,7 @@ return( 0 ); } +int zonecheck( rtmp, iface ) struct rtmptab *rtmp; struct interface *iface;