2 * Copyright (c) 1990,1993 Regents of The University of Michigan.
3 * All Rights Reserved. See COPYRIGHT.
11 #include <sys/types.h>
12 #include <sys/param.h>
13 #include <sys/socket.h>
14 #include <sys/signal.h>
18 #include <netatalk/at.h>
19 #include <netatalk/endian.h>
20 #include <atalk/nbp.h>
21 #include <atalk/ddp.h>
22 #include <atalk/netddp.h>
27 /* FIXME/SOCKLEN_T: socklen_t is a unix98 feature. */
29 #define SOCKLEN_T unsigned int
32 int nbp_rgstr( sat, obj, type, zone )
33 struct sockaddr_at *sat;
34 const char *obj, *type, *zone;
36 struct sockaddr_at to;
40 struct timeval timeout;
47 if ( nbp_lookup( obj, type, zone, &nn, 1, &sat->sat_addr ) > 0 ) {
52 memset(&to, 0, sizeof(to));
53 if ((s = netddp_open(&to, NULL)) < 0)
57 *data++ = DDPTYPE_NBP;
58 nh.nh_op = NBPOP_RGSTR;
61 memcpy( data, &nh, SZ_NBPHDR );
64 memset(&nt, 0, sizeof(nt));
65 nt.nt_net = sat->sat_addr.s_net;
66 nt.nt_node = sat->sat_addr.s_node;
67 nt.nt_port = sat->sat_port;
68 memcpy( data, &nt, SZ_NBPTUPLE);
72 if (( cc = strlen( obj )) > NBPSTRLEN ) return( -1 );
74 memcpy( data, obj, cc );
81 if (( cc = strlen( type )) > NBPSTRLEN ) return( -1 );
83 memcpy( data, type, cc );
90 if (( cc = strlen( zone )) > NBPSTRLEN ) return( -1 );
92 memcpy( data, zone, cc );
96 *data++ = '*'; /* default zone */
100 if ( nbp_port == 0 ) {
101 if (( se = getservbyname( "nbp", "ddp" )) == NULL ) {
104 nbp_port = ntohs( se->s_port );
107 to.sat_port = nbp_port;
109 if ( netddp_sendto( s, nbp_send, data - nbp_send, 0,
110 (struct sockaddr *)&to,
111 sizeof( struct sockaddr_at )) < 0 ) {
116 FD_SET( s, &readfd );
119 if (( cc = select( s + 1, &readfd, 0, 0, &timeout )) < 0 ) {
127 namelen = sizeof( struct sockaddr_at );
128 if (( cc = netddp_recvfrom( s, nbp_recv, sizeof( nbp_recv ), 0,
129 (struct sockaddr *)&to, &namelen )) < 0 ) {
136 if ( *data++ != DDPTYPE_NBP ) {
139 memcpy( &nh, data, SZ_NBPHDR );
140 if ( nh.nh_op != NBPOP_OK ) {