summaryrefslogtreecommitdiff
path: root/source/nameconf.c
diff options
context:
space:
mode:
authorSamba Release Account <samba-bugs@samba.org>1996-08-23 10:17:30 +0000
committerSamba Release Account <samba-bugs@samba.org>1996-08-23 10:17:30 +0000
commitf24e341e7e4d8726b98d3a0f83b24f61817fe536 (patch)
tree1bad80f28cc1171d91422b7b958a3f8115078075 /source/nameconf.c
parent6df471f6636694bcd741b61df8615858c5445f81 (diff)
downloadsamba-f24e341e7e4d8726b98d3a0f83b24f61817fe536.tar.gz
- 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
Diffstat (limited to 'source/nameconf.c')
-rw-r--r--source/nameconf.c349
1 files changed, 349 insertions, 0 deletions
diff --git a/source/nameconf.c b/source/nameconf.c
new file mode 100644
index 00000000000..79fa2abe431
--- /dev/null
+++ b/source/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);
+}
+
+