preferred master option will force an election every 5 minutes if the
[Samba.git] / source / nmbsync.c
blob2efb364bcae5a929ced3f5dd912d8e2c886b27b7
1 /*
2 Unix SMB/Netbios implementation.
3 Version 1.9.
4 NBT netbios routines to synchronise browse lists
5 Copyright (C) Andrew Tridgell 1994-1995
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.
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.
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.
23 #include "includes.h"
25 extern int ClientNMB;
26 extern int ClientDGRAM;
28 extern int DEBUGLEVEL;
30 extern pstring myname;
32 extern int name_type;
33 extern int max_protocol;
34 extern struct in_addr dest_ip;
35 extern int pid;
36 extern int gid;
37 extern int uid;
38 extern int mid;
39 extern BOOL got_pass;
40 extern BOOL have_ip;
41 extern pstring workgroup;
42 extern pstring service;
43 extern pstring desthost;
44 extern BOOL connect_as_ipc;
46 /****************************************************************************
47 fudge for getpass function
48 ****************************************************************************/
49 char *getsmbpass(char *pass)
51 return "dummy"; /* return anything: it should be ignored anyway */
54 /****************************************************************************
55 adds information retrieved from a NetServerEnum call
56 ****************************************************************************/
57 static BOOL add_info(struct subnet_record *d, struct work_record *work, int servertype)
59 char *rparam = NULL;
60 char *rdata = NULL;
61 int rdrcnt,rprcnt;
62 char *p;
63 pstring param;
64 int uLevel = 1;
65 int count = -1;
67 /* now send a SMBtrans command with api ServerEnum? */
68 p = param;
69 SSVAL(p,0,0x68); /* api number */
70 p += 2;
71 strcpy(p,"WrLehDz");
72 p = skip_string(p,1);
74 strcpy(p,"B16BBDz");
76 p = skip_string(p,1);
77 SSVAL(p,0,uLevel);
78 SSVAL(p,2,0x2000); /* buf length */
79 p += 4;
80 SIVAL(p,0,servertype);
81 p += 4;
83 strcpy(p, work->work_group);
84 p = skip_string(p,1);
86 if (cli_call_api(PTR_DIFF(p,param),0, 8,10000,
87 &rprcnt,&rdrcnt, param,NULL,
88 &rparam,&rdata))
90 int res = SVAL(rparam,0);
91 int converter=SVAL(rparam,2);
92 int i;
94 if (res == 0)
96 count=SVAL(rparam,4);
97 p = rdata;
99 for (i = 0;i < count;i++, p += 26)
101 char *sname = p;
102 uint32 stype = IVAL(p,18);
103 int comment_offset = IVAL(p,22) & 0xFFFF;
104 char *cmnt = comment_offset?(rdata+comment_offset-converter):"";
106 struct work_record *w = work;
108 DEBUG(4, ("\t%-16.16s %08x %s\n", sname, stype, cmnt));
110 if (stype & SV_TYPE_DOMAIN_ENUM)
112 /* creates workgroup on remote subnet */
113 if ((w = find_workgroupstruct(d,sname,True)))
115 announce_request(w, d->bcast_ip);
119 if (w)
120 add_server_entry(d,w,sname,stype,lp_max_ttl(),cmnt,False);
125 if (rparam) free(rparam);
126 if (rdata) free(rdata);
128 return(True);
132 /*******************************************************************
133 synchronise browse lists with another browse server.
135 log in on the remote server's SMB port to their IPC$ service,
136 do a NetServerEnum and update our server and workgroup databases.
137 ******************************************************************/
138 void sync_browse_lists(struct subnet_record *d, struct work_record *work,
139 char *name, int nm_type, struct in_addr ip, BOOL local)
141 uint32 local_type = local ? SV_TYPE_LOCAL_LIST_ONLY : 0;
143 if (!d || !work || !AM_MASTER(work)) return;
145 pid = getpid();
146 uid = getuid();
147 gid = getgid();
148 mid = pid + 100;
149 name_type = nm_type;
151 got_pass = True;
153 DEBUG(4,("sync browse lists with %s for %s %s\n",
154 work->work_group, name, inet_ntoa(ip)));
156 strcpy(workgroup,work->work_group);
157 strcpy(desthost,name);
158 dest_ip = ip;
160 if (zero_ip(dest_ip)) return;
161 have_ip = True;
163 connect_as_ipc = True;
165 /* connect as server and get domains, then servers */
167 sprintf(service,"\\\\%s\\IPC$", name);
168 strupper(service);
170 if (cli_open_sockets(SMB_PORT))
172 if (cli_send_login(NULL,NULL,True,True))
174 add_info(d, work, local_type|SV_TYPE_DOMAIN_ENUM);
175 add_info(d, work, local_type|(SV_TYPE_ALL&
176 ~(SV_TYPE_DOMAIN_ENUM|SV_TYPE_LOCAL_LIST_ONLY)));
179 close_sockets();