]> arthur.barton.de Git - netatalk.git/blob - bin/nbp/nbplkup.c
a43ac41c06d850174b22ad88c9cca9737b4332bf
[netatalk.git] / bin / nbp / nbplkup.c
1 /*
2  * $Id: nbplkup.c,v 1.9 2009-10-29 11:35:57 didg Exp $
3  *
4  * Copyright (c) 1990,1991 Regents of The University of Michigan.
5  * All Rights Reserved.
6  *
7  * Permission to use, copy, modify, and distribute this software and
8  * its documentation for any purpose and without fee is hereby granted,
9  * provided that the above copyright notice appears in all copies and
10  * that both that copyright notice and this permission notice appear
11  * in supporting documentation, and that the name of The University
12  * of Michigan not be used in advertising or publicity pertaining to
13  * distribution of the software without specific, written prior
14  * permission. This software is supplied as is without expressed or
15  * implied warranties of any kind.
16  *
17  *      Research Systems Unix Group
18  *      The University of Michigan
19  *      c/o Mike Clark
20  *      535 W. William Street
21  *      Ann Arbor, Michigan
22  *      +1-313-763-0525
23  *      netatalk@itd.umich.edu
24  */
25
26 #ifdef HAVE_CONFIG_H
27 #include "config.h"
28 #endif /* HAVE_CONFIG_H */
29
30 #include <sys/types.h>
31 #include <netatalk/endian.h>
32 #include <netatalk/at.h>
33 #include <atalk/nbp.h>
34 #include <atalk/util.h>
35 #include <string.h>
36 #include <stdio.h>
37 #ifdef HAVE_STDLIB_H
38 #include <stdlib.h>
39 #endif
40
41
42 #include <atalk/unicode.h>
43
44 static char *Obj = "=";
45 static char *Type = "=";
46 static char *Zone = "*";
47
48 static void Usage(char *av0)
49 {
50     char        *p;
51
52     if (( p = strrchr( av0, '/' )) == NULL ) {
53         p = av0;
54     } else {
55         p++;
56     }
57
58     printf( "Usage:\t%s [ -A address ] [ -r responses] [-m Mac charset] [ obj:type@zone ]\n", p );
59     exit( 1 );
60 }
61
62 int main(int ac, char **av)
63 {
64     struct nbpnve       *nn;
65     char                *name;
66     int                 i, c, nresp = 1000;
67     struct at_addr      addr;
68     char                *obj = NULL;
69     size_t              obj_len;
70     charset_t           chMac = CH_MAC;
71     char *              convname;
72
73     extern char         *optarg;
74     extern int          optind;
75
76     memset(&addr, 0, sizeof(addr));
77     while (( c = getopt( ac, av, "r:A:m:" )) != EOF ) {
78         switch ( c ) {
79         case 'A':
80             if (!atalk_aton(optarg, &addr)) {
81                 fprintf(stderr, "Bad address.\n");
82                 exit(1);
83             }
84             break;
85         case 'r' :
86             nresp = atoi( optarg );
87             break;
88         case 'm':
89             if ((charset_t)-1 == (chMac = add_charset(optarg)) ) {
90                 fprintf(stderr, "Invalid Mac charset.\n");
91                 exit(1);
92             }
93             break;
94
95         default :
96             Usage( av[ 0 ] );
97             exit( 1 );
98         }
99     }
100
101     if (( nn = (struct nbpnve *)malloc( nresp * sizeof( struct nbpnve )))
102             == NULL ) {
103         perror( "malloc" );
104         exit( 1 );
105     }
106
107     if ( ac - optind > 1 ) {
108         Usage( av[ 0 ] );
109         exit( 1 );
110     }
111
112     /*
113      * Get default values from the environment. We need to copy out
114      * the results, here, since nbp_name returns it's parameters
115      * in static space, and we'll clobber them when we call it again
116      * later.
117      */
118     if (( name = getenv( "NBPLKUP" )) != NULL ) {
119         if ( nbp_name( name, &Obj, &Type, &Zone )) {
120             fprintf( stderr,
121                     "Environment variable syntax error: NBPLKUP = %s\n",
122                     name );
123             exit( 1 );
124         }
125
126         if (( name = (char *)malloc( strlen( Obj ) + 1 )) == NULL ) {
127             perror( "malloc" );
128             exit( 1 );
129         }
130         strcpy( name, Obj );
131         Obj = name;
132
133         if (( name = (char *)malloc( strlen( Type ) + 1 )) == NULL ) {
134             perror( "malloc" );
135             exit( 1 );
136         }
137         strcpy( name, Type );
138         Type = name;
139
140         if (( name = (char *)malloc( strlen( Zone ) + 1 )) == NULL ) {
141             perror( "malloc" );
142             exit( 1 );
143         }
144         strcpy( name, Zone );
145         Zone = name;
146
147     }
148
149     if ( ac - optind == 1 ) {
150         if ((size_t)(-1) == convert_string_allocate( CH_UNIX, chMac,
151                            av[ optind ], -1, &convname))
152             convname = av[ optind ];
153
154         if ( nbp_name( convname, &Obj, &Type, &Zone )) {
155             Usage( av[ 0 ] );
156             exit( 1 );
157         }
158     }
159
160     if (( c = nbp_lookup( Obj, Type, Zone, nn, nresp, &addr)) < 0 ) {
161         perror( "nbp_lookup" );
162         exit( -1 );
163     }
164     for ( i = 0; i < c; i++ ) {
165         
166         if ((size_t)(-1) == (obj_len = convert_string_allocate( chMac, 
167                        CH_UNIX, nn[ i ].nn_obj, nn[ i ].nn_objlen, &obj)) ) {
168             obj_len = nn[ i ].nn_objlen;
169             if (( obj = strdup(nn[ i ].nn_obj)) == NULL ) {
170                 perror( "strdup" );
171                 exit( 1 );
172             }
173         }
174
175         printf( "%31.*s:%-34.*s %u.%u:%u\n",
176                 (int)obj_len, obj,
177                 nn[ i ].nn_typelen, nn[ i ].nn_type,
178                 ntohs( nn[ i ].nn_sat.sat_addr.s_net ),
179                 nn[ i ].nn_sat.sat_addr.s_node,
180                 nn[ i ].nn_sat.sat_port );
181
182         free(obj);
183     }
184
185     free(nn);
186     return 0;
187 }