]> arthur.barton.de Git - netatalk.git/blob - bin/getzones/getzones.c
Added checks for config.h in bin/ code
[netatalk.git] / bin / getzones / getzones.c
1 #ifdef HAVE_CONFIG_H
2 #include "config.h"
3 #endif
4
5 #include <sys/types.h>
6 #include <sys/socket.h>
7 #include <sys/param.h>
8 #include <sys/uio.h>
9 #include <sys/time.h>
10 #include <netdb.h>
11 #include <stdio.h>
12 #include <string.h>
13 #include <netatalk/endian.h>
14 #include <netatalk/at.h>
15 #include <atalk/atp.h>
16 #include <atalk/zip.h>
17
18 usage( s )
19     char *s;
20 {
21     fprintf( stderr, "usage:\t%s [-m | -l] [address]\n", s );
22     exit( 1 );
23 }
24
25 main( argc, argv )
26     int         argc;
27     char        *argv[];
28 {
29     struct atp_handle   *ah;
30     struct atp_block    atpb;
31     struct sockaddr_at  saddr;
32     struct servent      *se;
33     char                reqdata[4], buf[ ATP_MAXDATA ];
34     struct iovec        iov;
35     short               temp, index = 0;
36     int                 c, myzoneflg = 0, localzonesflg = 0, errflg = 0;
37     extern int          optind;
38
39     reqdata[ 0 ] = ZIPOP_GETZONELIST;
40
41     while (( c = getopt( argc, argv, "ml" )) != EOF ) {
42         switch (c) {
43         case 'm':
44             if ( localzonesflg ) {
45                 ++errflg;
46             }
47             ++myzoneflg;
48             reqdata[ 0 ] = ZIPOP_GETMYZONE;
49             break;
50         case 'l':
51             if ( myzoneflg ) {
52                 ++errflg;
53             }
54             ++localzonesflg;
55             reqdata[ 0 ] = ZIPOP_GETLOCALZONES;
56             break;
57         default:
58             ++errflg;
59         }
60     }
61
62     if ( errflg || argc - optind > 1 ) {
63         usage( argv[ 0 ] );
64     }
65
66     memset( &saddr, 0, sizeof( struct sockaddr_at ));
67 #ifdef BSD4_4
68     saddr.sat_len = sizeof( struct sockaddr_at );
69 #endif BSD4_4
70     saddr.sat_family = AF_APPLETALK;
71     if (( se = getservbyname( "zip", "ddp" )) == NULL )
72         saddr.sat_port = 6;
73     else 
74         saddr.sat_port = ntohs( se->s_port );
75
76     if ( argc == optind ) {
77         saddr.sat_addr.s_net = ATADDR_ANYNET;
78         saddr.sat_addr.s_node = ATADDR_ANYNODE;
79     } else {
80         if ( !atalk_aton( argv[ optind ], &saddr.sat_addr )) {
81             fprintf( stderr, "Bad address.\n" );
82             exit( 1 );
83         }
84     }
85
86     if (( ah = atp_open( ATADDR_ANYPORT, &saddr.sat_addr )) == NULL ) {
87         perror( "atp_open" );
88         exit( 1 );
89     }
90
91     index = ( myzoneflg ? 0 : 1 );
92     reqdata[1] = 0;
93
94     do {
95         atpb.atp_saddr = &saddr;
96         temp = htons( index );
97         memcpy( reqdata + 2, &temp, 2 );
98         atpb.atp_sreqdata = reqdata;
99         atpb.atp_sreqdlen = 4;
100         atpb.atp_sreqto = 2;
101         atpb.atp_sreqtries = 5;
102
103         /* send getzone request zones (or get my zone)
104         */
105         if ( atp_sreq( ah, &atpb, 1, 0 ) < 0 ) {
106             perror( "atp_sreq" );
107             exit( 1 );
108         }
109
110         iov.iov_base = buf;
111         iov.iov_len = ATP_MAXDATA;
112         atpb.atp_rresiov = &iov;
113         atpb.atp_rresiovcnt = 1;
114
115         if ( atp_rresp( ah, &atpb ) < 0 ) {
116             perror( "atp_rresp" );
117             exit( 1 );
118         }
119
120         memcpy( &temp, (char *) iov.iov_base + 2, 2 );
121         temp = ntohs( temp );
122         print_zones( temp, (char *) iov.iov_base+4 );
123         index += temp;
124     } while ( !myzoneflg && !((char *)iov.iov_base)[ 0 ] );
125
126     if ( atp_close( ah ) != 0 ) {
127         perror( "atp_close" );
128         exit( 1 );
129     }
130
131     exit( 0 );
132 }
133
134
135 print_zones( n, buf )
136     short       n;      /* number of zones in this packet */
137     char        *buf;   /* zone length/name pairs */
138 {
139     for ( ; n--; buf += (*buf) + 1 ) {
140         printf( "%.*s\n", *buf, buf+1 );
141     }
142 }