]> arthur.barton.de Git - netatalk.git/blob - bin/nbp/nbprgstr.c
Remove bdb env on exit
[netatalk.git] / bin / nbp / nbprgstr.c
1 /*
2  * $Id: nbprgstr.c,v 1.9 2009-10-29 11:35:58 didg Exp $
3  *
4  * Copyright (c) 1990,1993 Regents of The University of Michigan.
5  * All Rights Reserved.  See COPYRIGHT.
6  */
7
8 #ifdef HAVE_CONFIG_H
9 #include "config.h"
10 #endif /* HAVE_CONFIG_H */
11
12 #include <stdio.h>
13 #include <stdlib.h>
14 #include <string.h>
15 #include <sys/types.h>
16 #include <sys/param.h>
17
18 #include <netatalk/endian.h>
19 #include <netatalk/at.h>
20 #include <atalk/netddp.h>
21 #include <atalk/nbp.h>
22 #include <atalk/util.h>
23 #include <atalk/unicode.h>
24
25 static void Usage(char *av0)
26 {
27     char        *p;
28
29     if (( p = strrchr( av0, '/' )) == NULL ) {
30         p = av0;
31     } else {
32         p++;
33     }
34
35     fprintf( stderr, "Usage: %s [ -A address ] [-m Mac charset] [ -p port] obj:type@zone\n", p );
36     exit( 1 );
37 }
38
39 int main(int ac, char **av)
40 {
41     struct sockaddr_at  addr;
42     struct at_addr      ataddr;
43     char                *Obj = NULL, *Type = NULL, *Zone = NULL;
44     char                *convname = NULL;
45     int                 s, c, port = 0;
46     charset_t           chMac = CH_MAC;
47     
48     extern char         *optarg;
49     extern int          optind;
50
51     memset(&ataddr, 0, sizeof(ataddr));
52     while (( c = getopt( ac, av, "p:A:m:" )) != EOF ) {
53         switch ( c ) {
54         case 'A':
55             if (!atalk_aton(optarg, &ataddr)) {
56                 fprintf(stderr, "Bad address.\n");
57                 exit(1);
58             }
59             break;
60
61         case 'm':
62             if ((charset_t)-1 == (chMac = add_charset(optarg)) ) {
63                 fprintf(stderr, "Invalid Mac charset.\n");
64                 exit(1);
65             }
66             break;
67
68         case 'p' :
69             port = atoi( optarg );
70             break;
71
72         default :
73             Usage( av[ 0 ] );
74         }
75     }
76
77     if ( ac - optind != 1 ) {
78         Usage( av[ 0 ] );
79     }
80
81     /* Convert the name */
82     if ((size_t)(-1) == convert_string_allocate(CH_UNIX, chMac,
83                         av[optind], -1, &convname))
84         convname = av[optind];
85
86     /*
87      * Get the name. If Type or Obj aren't specified, error.
88      */
89     if ( nbp_name( convname, &Obj, &Type, &Zone ) || !Obj || !Type ) {
90         Usage( av[ 0 ] );
91     }
92
93     memset(&addr, 0, sizeof(addr));
94     memcpy(&addr.sat_addr, &ataddr, sizeof(addr.sat_addr));
95     if ((s = netddp_open(&addr, NULL)) < 0)
96         return( -1 );
97
98     if ( port ) {
99         addr.sat_port = port;
100     }
101
102     if ( nbp_rgstr( &addr, Obj, Type, Zone ) < 0 ) {
103         perror( "nbp_rgstr" );
104         fprintf( stderr, "Can't register %s:%s@%s\n", Obj, Type,
105                 Zone ? Zone : "*" );
106         exit( 1 );
107     }
108     netddp_close(s);
109
110     return 0;
111 }