Fixes for manpage from Bill Hawes <whawes@star.net>.
[Samba/gbeck.git] / source / namedbserver.c
blob9c7bb664ab23fda93c7e25ad36b50c717f6209ca
1 /*
2 Unix SMB/Netbios implementation.
3 Version 1.9.
4 NBT netbios routines and daemon - version 2
5 Copyright (C) Andrew Tridgell 1994-1997
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.
21 Revision History:
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
31 #include "includes.h"
32 #include "smb.h"
34 extern int ClientNMB;
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 except those with time of 0
50 remove_all_servers indicates everybody dies.
51 ******************************************************************/
52 void remove_old_servers(struct work_record *work, time_t t,
53 BOOL remove_all)
55 struct server_record *s;
56 struct server_record *nexts;
58 /* expire old entries in the serverlist */
59 for (s = work->serverlist; s; s = nexts)
61 if (remove_all || (s->death_time && (t == -1 || s->death_time < t)))
63 DEBUG(3,("Removing dead server %s\n",s->serv.name));
64 updatedlists = True;
65 nexts = s->next;
67 if (s->prev) s->prev->next = s->next;
68 if (s->next) s->next->prev = s->prev;
70 if (work->serverlist == s)
71 work->serverlist = s->next;
73 free(s);
75 else
77 nexts = s->next;
83 /***************************************************************************
84 add a server into the list
85 **************************************************************************/
86 static void add_server(struct work_record *work,struct server_record *s)
88 struct server_record *s2;
90 if (!work->serverlist) {
91 work->serverlist = s;
92 s->prev = NULL;
93 s->next = NULL;
94 return;
97 for (s2 = work->serverlist; s2->next; s2 = s2->next) ;
99 s2->next = s;
100 s->next = NULL;
101 s->prev = s2;
105 /****************************************************************************
106 find a server in a server list.
107 **************************************************************************/
108 struct server_record *find_server(struct work_record *work, char *name)
110 struct server_record *ret;
112 if (!work) return NULL;
114 for (ret = work->serverlist; ret; ret = ret->next)
116 if (strequal(ret->serv.name,name))
118 return ret;
121 return NULL;
125 /****************************************************************************
126 add a server entry
127 ****************************************************************************/
128 struct server_record *add_server_entry(struct subnet_record *d,
129 struct work_record *work,
130 char *name,int servertype,
131 int ttl,char *comment,
132 BOOL replace)
134 BOOL newentry=False;
135 struct server_record *s;
137 if (name[0] == '*')
139 return (NULL);
142 s = find_server(work, name);
144 if (s && !replace)
146 DEBUG(4,("Not replacing %s\n",name));
147 return(s);
150 if (!s || s->serv.type != servertype || !strequal(s->serv.comment, comment))
151 updatedlists=True;
153 if (!s)
155 newentry = True;
156 s = (struct server_record *)malloc(sizeof(*s));
158 if (!s) return(NULL);
160 bzero((char *)s,sizeof(*s));
164 if (strequal(lp_workgroup(),work->work_group))
166 if (servertype)
167 servertype |= SV_TYPE_LOCAL_LIST_ONLY;
169 else
171 servertype &= ~SV_TYPE_LOCAL_LIST_ONLY;
174 /* update the entry */
175 StrnCpy(s->serv.name,name,sizeof(s->serv.name)-1);
176 StrnCpy(s->serv.comment,comment,sizeof(s->serv.comment)-1);
177 strupper(s->serv.name);
178 s->serv.type = servertype;
179 s->death_time = servertype ? (ttl?time(NULL)+ttl*3:0) : (time(NULL)-1);
181 /* for a domain entry, the comment field refers to the server name */
183 if (s->serv.type & SV_TYPE_DOMAIN_ENUM) strupper(s->serv.comment);
185 if (newentry)
187 add_server(work, s);
189 DEBUG(3,("Added "));
191 else
193 DEBUG(3,("Updated "));
196 DEBUG(3,("server entry %s of type %x (%s) to %s %s\n",
197 name,servertype,comment,
198 work->work_group,inet_ntoa(d->bcast_ip)));
200 return(s);
204 /*******************************************************************
205 expire old servers in the serverlist
206 ******************************************************************/
207 void expire_servers(time_t t)
209 struct subnet_record *d;
211 for (d = FIRST_SUBNET; d ; d = NEXT_SUBNET_INCLUDING_WINS(d))
213 struct work_record *work;
215 for (work = d->workgrouplist; work; work = work->next)
217 remove_old_servers(work, t, False);