From 5945be9718b8ea56c8dde99729c0ec0e56080fee Mon Sep 17 00:00:00 2001 From: Samba Release Account Date: Fri, 23 Aug 1996 10:17:30 +0000 Subject: - fixed bugs in nmb response packet checking. - added multiple workgroup code - samba can register under different (unique) NetBIOS aliases, one per workgroup it joins. lkcl (This used to be commit f24e341e7e4d8726b98d3a0f83b24f61817fe536) --- source3/nameconf.c | 349 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 349 insertions(+) create mode 100644 source3/nameconf.c (limited to 'source3/nameconf.c') diff --git a/source3/nameconf.c b/source3/nameconf.c new file mode 100644 index 0000000000..79fa2abe43 --- /dev/null +++ b/source3/nameconf.c @@ -0,0 +1,349 @@ +/* + Unix SMB/Netbios implementation. + Version 1.9. + NBT netbios routines and daemon - version 2 + Copyright (C) David Chappell 1996 + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + + Revision History: + + 30 July 96: David.Chappell@mail.trincoll.edu + Expanded multiple workgroup domain master browser support. + +*/ + +/* +** nameconf.c +** These functions dispense information from smbbrowse.conf. +** +** +*/ + +#include "includes.h" +extern int DEBUGLEVEL; + +#if 0 +struct smbbrowse_parms + { + char *name; + BOOL (*reader)(char *string, void *toset); + } smbbrowse_table[] = +{ + {"preferred master", NULL}, + {"local master", NULL}, + {"domain master", NULL} +} ; +#endif + +/* +** Structure for the list of workgroups from smbbrowse.conf. This +** structure should only be manipulated thru the functions in this file. +** That is why it is not defined in a header file. +*/ +struct smbbrowse +{ + char work_name[16]; /* workgroup name */ + char browsing_alias[16]; /* alias for our role in this workgroup */ + struct server_identity *my_names; /* a list of server name we should appear here as */ + BOOL should_workgroup_member; /* should we try to become a member of this workgroup? */ + BOOL should_local_master; /* should we try to become a master browser? */ + BOOL should_domain_master; /* should we try to become the domain master browser? */ +} ; + +/* The whole list */ +static struct smbbrowse *smbbrowse_workgroups = (struct smbbrowse*)NULL; + +/* The size of the list */ +static int array_size = 0; + +/* The next available space in the list */ +static int nexttoken = 0; + +int get_num_workgroups(void) +{ + return nexttoken; +} + +/* +** This makes a new workgroup structure, possibly taking an +** old one as a model. +*/ +static struct smbbrowse *new_workgroup(struct smbbrowse *model, + const char *workgroup_name, + const char *default_name) +{ + struct smbbrowse *new; + + if( ! (array_size > nexttoken) ) + { + array_size += 10; + smbbrowse_workgroups = (struct smbbrowse*)realloc(smbbrowse_workgroups, + array_size * sizeof(struct smbbrowse)); + } + + new = &smbbrowse_workgroups[nexttoken]; + + if(model != (struct smbbrowse *)NULL ) + memcpy(new, model, sizeof(struct smbbrowse)); + else + memset(new, 0, sizeof(struct smbbrowse)); + + StrnCpy(new->work_name, workgroup_name, 15); + strupper(new->work_name); + + if (strequal(lp_workgroup(), workgroup_name)) + StrnCpy(new->browsing_alias, default_name, 15); + else + sprintf(new->browsing_alias, "%.14s%x", default_name, nexttoken); + strupper(new->browsing_alias); + + DEBUG(4,("wg: %s alias: %s token: %x\n", + new->work_name, new->browsing_alias, nexttoken)); + + nexttoken++; + return new; +} + +/* +** If fed a workgroup name, this function returns its token number. +** If the workgroup does not exist a new token is assigned unless +** new workgroups are not allowed. +*/ +int conf_workgroup_name_to_token(const char *workgroup_name, + const char *default_name) +{ + int idx; + + /* Look for an existing instance. */ + for(idx=0; idx < nexttoken; idx++) + { + if(strequal(workgroup_name, smbbrowse_workgroups[idx].work_name)) + { + return idx; + } + } + + /* See if creating new ones in admissable. */ + for(idx=0; idx < nexttoken; idx++) + { + if(strequal("*", smbbrowse_workgroups[idx].work_name)) + { + struct smbbrowse *w = new_workgroup(&smbbrowse_workgroups[idx], + workgroup_name, default_name); + w->should_workgroup_member = False; + + return (nexttoken - 1); + } + } + + /* Not allowed */ + DEBUG(4, ("refusing to allow new workgroup\n")); + return -1; +} + +/* +** This is a workgroups array bounds checker. +*/ +static int range_check(int token) +{ + if(token < 0 || token >= nexttoken) + { + DEBUG(0, ("range_check(): failed\n")); + return True; + } + + return False; +} + +/* +** Given a token, return the name. +*/ +char *conf_workgroup_name(int token) +{ + if(range_check(token)) + return (char*)NULL; + + return smbbrowse_workgroups[token].work_name; +} + +/* +** Given a token, return True if we should try +** to become a master browser. +*/ +int conf_should_workgroup_member(int token) + { + + if(range_check(token)) + return False; + + return smbbrowse_workgroups[token].should_workgroup_member; + } + +/* +** Given a token, return True if we should try +** to become a master browser. +*/ +int conf_should_local_master(int token) + { + if(range_check(token)) + return False; + + return smbbrowse_workgroups[token].should_local_master; + } + +/* +** Given a token, return True if we should try +** to become a domain master browser. +*/ +int conf_should_domain_master(int token) + { + if(range_check(token)) + return False; + + return smbbrowse_workgroups[token].should_domain_master; + } + +/* +** Given a token, return the name. +*/ +char *conf_browsing_alias(int token) + { + if(range_check(token)) + return (char*)NULL; + + return smbbrowse_workgroups[token].browsing_alias; + } + +/* +** Return the server comment which should be used with the +** browsing alias. +*/ +char *conf_browsing_alias_comment(int token) +{ + if(range_check(token)) + return (char*) NULL; + + return "Browser"; + } + +/* +** Given an alias name for this server, return the name of the workgroup +** for which it is the browsing alias. +*/ +char *conf_alias_to_workgroup(const char *alias) +{ + int x; + + DEBUG(4,("alias_to_workgroup: %s", alias)); + + for(x=0; x < nexttoken; x++) + { + DEBUG(4,("%s ", smbbrowse_workgroups[x].browsing_alias)); + + if(strequal(alias, smbbrowse_workgroups[x].browsing_alias)) + { + DEBUG(4,("OK\n")); + return smbbrowse_workgroups[x].work_name; + } + } + DEBUG(4,("not found\n")); + return (char*)NULL; +} + +/* +** Given an alias name for this server, return the name of the workgroup +** for which it is the browsing alias. +*/ +int conf_alias_to_token(const char *alias) +{ + int x; + + for(x=0; x < nexttoken; x++) + { + if(strequal(alias, smbbrowse_workgroups[x].browsing_alias)) + { + return x; + } + } + return -1; +} + +/* +** Since there is no smbbrowse.conf file, we will fill in +** the structures with information from the smb.conf file. +*/ +static void default_smbbrowse_conf(const char *default_name) +{ + struct smbbrowse *w; + + /* The workgroup specified in smb.conf */ + w = new_workgroup((struct smbbrowse *)NULL, lp_workgroup(), default_name); + w->should_local_master = lp_preferred_master(); + w->should_domain_master = lp_domain_master(); + w->should_workgroup_member = True; + + /* default action: allow any new workgroup to be added */ + w = new_workgroup((struct smbbrowse *)NULL, "*", default_name); + w->should_local_master = False; + w->should_domain_master = False; + w->should_workgroup_member = False; +} + +/* +** This function is called from main(). +*/ +void read_smbbrowse_conf(char *default_name) +{ + FILE *f = fopen(BROWSEFILE,"r"); + if (f) + { + while (!feof(f)) + { + pstring line; + char *ptr; + int count = 0; + + pstring work_name; + struct smbbrowse *w; + + if (!fgets_slash(line,sizeof(pstring),f)) continue; + + if (*line == '#') continue; + + strcpy(work_name,""); + + ptr = line; + + if (next_token(&ptr, work_name, NULL)) ++count; + + if (count <= 0) continue; + + w = new_workgroup((struct smbbrowse *)NULL, work_name, default_name); + w->should_local_master = lp_local_master(); + w->should_domain_master = lp_domain_master(); + w->should_workgroup_member = True; + } + + fclose(f); + } + else + { + DEBUG(2,("Can't open browse configuration file %s\n",BROWSEFILE)); + } + default_smbbrowse_conf(default_name); +} + + -- cgit