lots of changes to nmbd
[kai/samba.git] / source3 / utils / nmblookup.c
1 /* 
2    Unix SMB/Netbios implementation.
3    Version 1.9.
4    NBT client - used to lookup netbios names
5    Copyright (C) Andrew Tridgell 1994-1995
6    
7    This program is free software; you can redistribute it and/or modify
8    it under the terms of the GNU General Public License as published by
9    the Free Software Foundation; either version 2 of the License, or
10    (at your option) any later version.
11    
12    This program is distributed in the hope that it will be useful,
13    but WITHOUT ANY WARRANTY; without even the implied warranty of
14    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15    GNU General Public License for more details.
16    
17    You should have received a copy of the GNU General Public License
18    along with this program; if not, write to the Free Software
19    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20    
21 */
22
23 #ifdef SYSLOG
24 #undef SYSLOG
25 #endif
26
27 #include "includes.h"
28
29 extern int DEBUGLEVEL;
30
31 extern pstring scope;
32
33 extern pstring myhostname;
34 extern struct in_addr ipzero;
35
36 int ServerFD= -1;
37
38 /****************************************************************************
39   open the socket communication
40   **************************************************************************/
41 static BOOL open_sockets(void)
42 {
43   struct hostent *hp;
44  
45   /* get host info */
46   if ((hp = Get_Hostbyname(myhostname)) == 0) 
47     {
48       DEBUG(0,( "Get_Hostbyname: Unknown host. %s\n",myhostname));
49       return False;
50     }   
51
52   ServerFD = open_socket_in(SOCK_DGRAM, NMB_PORT,3);
53
54   if (ServerFD == -1)
55     return(False);
56
57   set_socket_options(ServerFD,"SO_BROADCAST");
58
59   DEBUG(3, ("Socket opened.\n"));
60   return True;
61 }
62
63
64 /****************************************************************************
65   initialise connect, service and file structs
66 ****************************************************************************/
67 static BOOL init_structs(void )
68 {
69   if (!get_myname(myhostname,NULL))
70     return(False);
71
72   return True;
73 }
74
75 /****************************************************************************
76 usage on the program
77 ****************************************************************************/
78 static void usage(void)
79 {
80   printf("Usage: nmblookup [-M] [-B bcast address] [-d debuglevel] name\n");
81   printf("Version %s\n",VERSION);
82   printf("\t-d debuglevel         set the debuglevel\n");
83   printf("\t-B broadcast address  the address to use for broadcasts\n");
84   printf("\t-M                    searches for a master browser\n");
85   printf("\t-S                    lookup node status as well\n");
86   printf("\n");
87 }
88
89
90 /****************************************************************************
91   main program
92 ****************************************************************************/
93 int main(int argc,char *argv[])
94 {
95   int opt;
96   unsigned int lookup_type = 0x0;
97   pstring lookup;
98   extern int optind;
99   extern char *optarg;
100   BOOL find_master=False;
101   BOOL find_status=False;
102   int i;
103   
104   DEBUGLEVEL = 1;
105   *lookup = 0;
106
107   TimeInit();
108
109   setup_logging(argv[0],True);
110
111   charset_initialise();
112
113   while ((opt = getopt(argc, argv, "p:d:B:i:SMh")) != EOF)
114     switch (opt)
115       {
116       case 'B':
117         iface_set_default(NULL,optarg,NULL);
118         break;
119       case 'i':
120         strcpy(scope,optarg);
121         strupper(scope);
122         break;
123       case 'M':
124         find_master = True;
125         break;
126       case 'S':
127         find_status = True;
128         break;
129       case 'd':
130         DEBUGLEVEL = atoi(optarg);
131         break;
132       case 'h':
133         usage();
134         exit(0);
135         break;
136       default:
137         usage();
138         exit(1);
139       }
140
141   if (argc < 2) {
142     usage();
143     exit(1);
144   }
145
146   load_interfaces();
147   init_structs();
148   if (!open_sockets()) return(1);
149
150   DEBUG(1,("Sending queries to %s\n",inet_ntoa(*iface_bcast(ipzero))));
151
152
153   for (i=optind;i<argc;i++)
154     {
155       BOOL bcast = True;
156       int retries = 2;
157       char *p;
158       struct in_addr ip;
159
160       strcpy(lookup,argv[i]);
161
162       if (find_master) {
163         if (*lookup == '-') {
164           strcpy(lookup,"\01\02__MSBROWSE__\02");
165           lookup_type = 1;
166         } else {
167           lookup_type = 0x1b;
168         }
169       }
170
171       p = strchr(lookup,'#');
172
173       if (p) {
174         *p = 0;
175         sscanf(p+1,"%x",&lookup_type);
176         bcast = False;
177         retries = 1;
178       }
179
180       if (name_query(ServerFD,lookup,lookup_type,bcast,True,
181                      *iface_bcast(ipzero),&ip,NULL)) 
182         {
183           printf("%s %s\n",inet_ntoa(ip),lookup);
184           if (find_status) 
185             {
186               printf("Looking up status of %s\n",inet_ntoa(ip));
187               name_status(ServerFD,lookup,lookup_type,True,ip,NULL,NULL,NULL);
188               printf("\n");
189             }
190       } else {
191         printf("couldn't find name %s\n",lookup);
192       }
193     }
194
195   return(0);
196 }