2
* $Id: nbp_rgstr.c,v 1.4 2002/01/17 06:12:02 srittau Exp $
4
* Copyright (c) 1990,1993 Regents of The University of Michigan.
5
* All Rights Reserved. See COPYRIGHT.
10
#endif /* HAVE_CONFIG_H */
16
#include <sys/types.h>
17
#include <sys/param.h>
18
#include <sys/socket.h>
21
#include <netatalk/at.h>
22
#include <netatalk/endian.h>
23
#include <atalk/nbp.h>
24
#include <atalk/ddp.h>
25
#include <atalk/netddp.h>
29
#endif /* HAVE_NETDB_H */
32
/* FIXME/SOCKLEN_T: socklen_t is a unix98 feature. */
34
#define SOCKLEN_T unsigned int
35
#endif /* ! SOCKLEN_T */
37
int nbp_rgstr( sat, obj, type, zone )
38
struct sockaddr_at *sat;
39
const char *obj, *type, *zone;
41
struct sockaddr_at to;
45
struct timeval timeout;
52
if ( nbp_lookup( obj, type, zone, &nn, 1, &sat->sat_addr ) > 0 ) {
57
memset(&to, 0, sizeof(to));
58
if ((s = netddp_open(&to, NULL)) < 0)
62
*data++ = DDPTYPE_NBP;
63
nh.nh_op = NBPOP_RGSTR;
66
memcpy( data, &nh, SZ_NBPHDR );
69
memset(&nt, 0, sizeof(nt));
70
nt.nt_net = sat->sat_addr.s_net;
71
nt.nt_node = sat->sat_addr.s_node;
72
nt.nt_port = sat->sat_port;
73
memcpy( data, &nt, SZ_NBPTUPLE);
77
if (( cc = strlen( obj )) > NBPSTRLEN ) return( -1 );
79
memcpy( data, obj, cc );
86
if (( cc = strlen( type )) > NBPSTRLEN ) return( -1 );
88
memcpy( data, type, cc );
95
if (( cc = strlen( zone )) > NBPSTRLEN ) return( -1 );
97
memcpy( data, zone, cc );
101
*data++ = '*'; /* default zone */
105
if ( nbp_port == 0 ) {
106
if (( se = getservbyname( "nbp", "ddp" )) == NULL ) {
109
nbp_port = ntohs( se->s_port );
112
to.sat_port = nbp_port;
114
if ( netddp_sendto( s, nbp_send, data - nbp_send, 0,
115
(struct sockaddr *)&to,
116
sizeof( struct sockaddr_at )) < 0 ) {
121
FD_SET( s, &readfd );
124
if (( cc = select( s + 1, &readfd, 0, 0, &timeout )) < 0 ) {
132
namelen = sizeof( struct sockaddr_at );
133
if (( cc = netddp_recvfrom( s, nbp_recv, sizeof( nbp_recv ), 0,
134
(struct sockaddr *)&to, &namelen )) < 0 ) {
141
if ( *data++ != DDPTYPE_NBP ) {
144
memcpy( &nh, data, SZ_NBPHDR );
145
if ( nh.nh_op != NBPOP_OK ) {