2 Unix SMB/Netbios implementation.
4 NBT netbios routines and daemon - version 2
5 Copyright (C) Andrew Tridgell 1994-1996
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 14 jan 96: lkcl@pires.co.uk
24 added multiple workgroup domain master support
26 04 jul 96: lkcl@pires.co.uk
27 created module namedbserver containing server database functions
35 extern int ClientDGRAM;
37 extern int DEBUGLEVEL;
39 extern pstring myname;
41 /* this is our domain/workgroup/server database */
42 extern struct subnet_record *subnetlist;
44 extern BOOL updatedlists;
47 /*******************************************************************
48 expire old servers in the serverlist
49 time of -1 indicates everybody dies
50 ******************************************************************/
51 void remove_old_servers(struct work_record *work, time_t t)
53 struct server_record *s;
54 struct server_record *nexts;
56 /* expire old entries in the serverlist */
57 for (s = work->serverlist; s; s = nexts)
59 if (t == -1 || (s->death_time && s->death_time < t))
61 DEBUG(3,("Removing dead server %s\n",s->serv.name));
65 if (s->prev) s->prev->next = s->next;
66 if (s->next) s->next->prev = s->prev;
68 if (work->serverlist == s)
69 work->serverlist = s->next;
81 /***************************************************************************
82 add a server into the list
83 **************************************************************************/
84 static void add_server(struct work_record *work,struct server_record *s)
86 struct server_record *s2;
88 if (!work->serverlist) {
95 for (s2 = work->serverlist; s2->next; s2 = s2->next) ;
103 /****************************************************************************
105 ****************************************************************************/
106 struct server_record *add_server_entry(struct subnet_record *d,
107 struct work_record *work,
108 char *name,int servertype,
109 int ttl,char *comment,
113 struct server_record *s;
120 for (s = work->serverlist; s; s = s->next)
122 if (strequal(name,s->serv.name)) break;
127 DEBUG(4,("Not replacing %s\n",name));
131 if (!s || s->serv.type != servertype || !strequal(s->serv.comment, comment))
137 s = (struct server_record *)malloc(sizeof(*s));
139 if (!s) return(NULL);
141 bzero((char *)s,sizeof(*s));
145 if (d->my_interface && strequal(lp_workgroup(),work->work_group))
148 servertype |= SV_TYPE_LOCAL_LIST_ONLY;
152 servertype &= ~SV_TYPE_LOCAL_LIST_ONLY;
155 /* update the entry */
156 StrnCpy(s->serv.name,name,sizeof(s->serv.name)-1);
157 StrnCpy(s->serv.comment,comment,sizeof(s->serv.comment)-1);
158 strupper(s->serv.name);
159 s->serv.type = servertype;
160 s->death_time = servertype ? (ttl?time(NULL)+ttl*3:0) : (time(NULL)-1);
162 /* for a domain entry, the comment field refers to the server name */
164 if (s->serv.type & SV_TYPE_DOMAIN_ENUM) strupper(s->serv.comment);
174 DEBUG(3,("Updated "));
177 DEBUG(3,("server entry %s of type %x (%s) to %s %s\n",
178 name,servertype,comment,
179 work->work_group,inet_ntoa(d->bcast_ip)));
185 /*******************************************************************
186 expire old servers in the serverlist
187 ******************************************************************/
188 void expire_servers(time_t t)
190 struct subnet_record *d;
192 for (d = subnetlist ; d ; d = d->next)
194 struct work_record *work;
196 for (work = d->workgrouplist; work; work = work->next)
198 remove_old_servers(work, t);