Unix SMB/Netbios implementation.
Version 1.9.
NBT netbios routines and daemon - version 2
- Copyright (C) Andrew Tridgell 1994-1997
- Copyright (C) Luke Kenneth Casson Leighton 1994-1997
- Copyright (C) Jeremy Allison 1994-1997
+ Copyright (C) Andrew Tridgell 1994-1998
+ Copyright (C) Luke Kenneth Casson Leighton 1994-1998
+ Copyright (C) Jeremy Allison 1994-1998
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
extern int DEBUGLEVEL;
extern pstring scope;
-extern pstring myname;
-extern fstring myworkgroup;
+extern pstring global_myname;
+extern fstring global_myworkgroup;
extern char **my_netbios_names;
extern struct in_addr ipzero;
extern struct in_addr allones_ip;
static void become_domain_master_browser_bcast(char *);
-/*******************************************************************
- Unbecome a domain master browser - name release success function.
- ******************************************************************/
-
-static void unbecome_dmb_success(struct subnet_record *subrec,
- struct userdata_struct *userdata,
- struct nmb_name *released_name,
- struct in_addr released_ip)
-{
- struct work_record *work = find_workgroup_on_subnet(subrec, released_name->name);
- struct server_record *servrec;
-
- if(!work)
- {
- DEBUG(0,("unbecome_dmb_success: Cannot find workgroup %s on subnet %s\n",
- released_name->name, subrec->subnet_name));
- return;
- }
-
- if((servrec = find_server_in_workgroup( work, myname)) == NULL)
- {
- DEBUG(0,("unbecome_dmb_success: Error - cannot find server %s \
-in workgroup %s on subnet %s\n",
- myname, released_name->name, subrec->subnet_name));
- return;
- }
-
- /* Set the state in the workgroup structure. */
- work->dom_state = DOMAIN_NONE;
-
- /* Update our server status. */
- servrec->serv.type &= ~SV_TYPE_DOMAIN_MASTER;
-
- /* Tell the namelist writer to write out a change. */
- subrec->work_changed = True;
-
- /* Remove any list of local master browsers we are syncing with. */
- remove_workgroup_lmb_browsers(released_name->name);
-
- /* Delete the known domain master browser name from the workgroup
- struct. */
- bzero((char *)&work->dmb_name, sizeof(work->dmb_name));
- putip((char *)&work->dmb_addr, &ipzero);
-
- DEBUG(0,("\n ***** Samba server %s has stopped being a domain master browser \
-for workgroup %s on subnet %s *****\n\n", myname, work->work_group, subrec->subnet_name));
-
-}
-
-/*******************************************************************
- Unbecome a domain master browser - name release fail function.
- ******************************************************************/
-
-static void unbecome_dmb_fail(struct subnet_record *subrec,
- struct response_record *rrec,
- struct nmb_name *released_name)
-{
- DEBUG(0,("unbecome_dmb_fail: Failed to unbecome domain master browser for \
-workgroup %s on subnet %s.\n", released_name->name, subrec->subnet_name));
-}
-
-/*******************************************************************
- Unbecome a domain master browser.
- ******************************************************************/
-
-void unbecome_domain_master(char *workgroup_name)
-{
- struct subnet_record *subrec;
-
- for (subrec = FIRST_SUBNET; subrec; subrec = NEXT_SUBNET_INCLUDING_UNICAST(subrec))
- {
- struct work_record *work = find_workgroup_on_subnet(subrec, workgroup_name);
-
- if(work && (work->dom_state == DOMAIN_MST))
- {
- struct name_record *namerec;
- struct nmb_name nmbname;
- make_nmb_name(&nmbname,workgroup_name,0x1b,scope);
-
- /* We can only do this if we are a domain master already. */
- DEBUG(2,("unbecome_domain_master: attempting to stop being a domain \
-master browser for workgroup %s on subnet %s\n",
- work->work_group, subrec->subnet_name));
-
- /* Find the WORKGROUP<1b> name on the subnet namelist. */
- if((namerec = find_name_on_subnet(subrec, &nmbname, FIND_SELF_NAME))==NULL)
- {
- DEBUG(0,("unbecome_domain_master: Cannot find name %s on subnet %s.\n",
- namestr(&nmbname), subrec->subnet_name));
- continue;
- }
- release_name(subrec, namerec,
- unbecome_dmb_success,
- unbecome_dmb_fail,
- NULL);
- }
- }
-}
-
/****************************************************************************
Fail to become a Domain Master Browser on a subnet.
****************************************************************************/
/* Set the state back to DOMAIN_NONE. */
work->dom_state = DOMAIN_NONE;
- if((servrec = find_server_in_workgroup( work, myname)) == NULL)
+ if((servrec = find_server_in_workgroup( work, global_myname)) == NULL)
{
DEBUG(0,("become_domain_master_fail: Error - cannot find server %s \
in workgroup %s on subnet %s\n",
- myname, work->work_group, subrec->subnet_name));
+ global_myname, work->work_group, subrec->subnet_name));
return;
}
DEBUG(0,("become_domain_master_fail: Failed to become a domain master browser for \
workgroup %s on subnet %s. Couldn't register name %s.\n",
- work->work_group, subrec->subnet_name, namestr(fail_name)));
+ work->work_group, subrec->subnet_name, nmb_namestr(fail_name)));
}
/****************************************************************************
return;
}
- if((servrec = find_server_in_workgroup( work, myname)) == NULL)
+ if((servrec = find_server_in_workgroup( work, global_myname)) == NULL)
{
DEBUG(0,("become_domain_master_stage2: Error - cannot find server %s \
in workgroup %s on subnet %s\n",
- myname, registered_name->name, subrec->subnet_name));
+ global_myname, registered_name->name, subrec->subnet_name));
work->dom_state = DOMAIN_NONE;
return;
}
/* Tell the namelist writer to write out a change. */
subrec->work_changed = True;
- DEBUG(0,("\n ***** Samba server %s is now a domain master browser \
-for workgroup %s on subnet %s *****\n\n", myname, work->work_group, subrec->subnet_name));
+ if( DEBUGLVL( 0 ) )
+ {
+ dbgtext( "*****\n\nSamba server %s ", global_myname );
+ dbgtext( "is now a domain master browser for " );
+ dbgtext( "workgroup %s ", work->work_group );
+ dbgtext( "on subnet %s\n\n*****\n", subrec->subnet_name );
+ }
- if(subrec == unicast_subnet)
+ if( subrec == unicast_subnet )
{
struct nmb_name nmbname;
struct in_addr my_first_ip;
will stop us syncing with ourself if we are also
a local master browser. */
- make_nmb_name(&nmbname, myname, 0x20, scope);
+ make_nmb_name(&nmbname, global_myname, 0x20, scope);
work->dmb_name = nmbname;
/* Pick the first interface ip address as the domain master browser ip. */
*/
become_domain_master_browser_bcast(work->work_group);
}
+ else
+ {
+ /*
+ * Now we are a domain master on a broadcast subnet, we need to add
+ * the WORKGROUP<1b> name to the unicast subnet so that we can answer
+ * unicast requests sent to this name. This bug wasn't found for a while
+ * as it is strange to have a DMB without using WINS. JRA.
+ */
+ insert_permanent_name_into_unicast(subrec, registered_name, nb_flags);
+ }
}
/****************************************************************************
if(ismyip(ip) || ip_equal(allones_ip, ip) || ip_equal(ipzero, ip))
{
- DEBUG(3,("become_domain_master_query_success: Our address (%s) returned \
-in query for name %s (domain master browser name) on subnet %s. \
-Continuing with domain master code.\n",
- inet_ntoa(ip), namestr(nmbname), subrec->subnet_name));
+ if( DEBUGLVL( 3 ) )
+ {
+ dbgtext( "become_domain_master_query_success():\n" );
+ dbgtext( "Our address (%s) ", inet_ntoa(ip) );
+ dbgtext( "returned in query for name %s ", nmb_namestr(nmbname) );
+ dbgtext( "(domain master browser name) " );
+ dbgtext( "on subnet %s.\n", subrec->subnet_name );
+ dbgtext( "Continuing with domain master code.\n" );
+ }
become_domain_master_stage1(subrec, nmbname->name);
}
else
{
- DEBUG(0,("become_domain_master_query_success: There is already a domain \
-master browser at IP %s for workgroup %s registered on subnet %s.\n",
- inet_ntoa(ip), nmbname->name, subrec->subnet_name));
+ if( DEBUGLVL( 0 ) )
+ {
+ dbgtext( "become_domain_master_query_success:\n" );
+ dbgtext( "There is already a domain master browser at " );
+ dbgtext( "IP %s for workgroup %s ", inet_ntoa(ip), nmbname->name );
+ dbgtext( "registered on subnet %s.\n", subrec->subnet_name );
+ }
}
}
{
DEBUG(0,("become_domain_master_query_fail: Error %d returned when \
querying WINS server for name %s.\n",
- fail_code, namestr(question_name)));
+ fail_code, nmb_namestr(question_name)));
return;
}
if (find_name_on_subnet(subrec, &nmbname, FIND_SELF_NAME) == NULL)
{
- DEBUG(0,("become_domain_master_browser_bcast: At time %s attempting to become domain \
-master browser on workgroup %s on subnet %s\n", timestring(),
- workgroup_name, subrec->subnet_name));
+ if( DEBUGLVL( 0 ) )
+ {
+ dbgtext( "become_domain_master_browser_bcast:\n" );
+ dbgtext( "Attempting to become domain master browser on " );
+ dbgtext( "workgroup %s on subnet %s\n",
+ workgroup_name, subrec->subnet_name );
+ }
/* Send out a query to establish whether there's a
domain controller on the local subnet. If not,
if (find_name_on_subnet(unicast_subnet, &nmbname, FIND_SELF_NAME) == NULL)
{
- DEBUG(0,("%s become_domain_master_browser_wins: attempting to become domain \
-master browser on workgroup %s, subnet %s.\n",
- timestring(), workgroup_name, unicast_subnet->subnet_name));
+ if( DEBUGLVL( 0 ) )
+ {
+ dbgtext( "become_domain_master_browser_wins:\n" );
+ dbgtext( "Attempting to become domain master browser " );
+ dbgtext( "on workgroup %s, subnet %s.\n",
+ workgroup_name, unicast_subnet->subnet_name );
+ }
/* Send out a query to establish whether there's a
domain master broswer registered with WINS. If not,
DEBUG(0,("become_domain_master_browser_wins: querying WINS server at IP %s \
for domain master browser name %s on workgroup %s\n",
- inet_ntoa(unicast_subnet->myip), namestr(&nmbname), workgroup_name));
+ inet_ntoa(unicast_subnet->myip), nmb_namestr(&nmbname), workgroup_name));
query_name(unicast_subnet, nmbname.name, nmbname.name_type,
become_domain_master_query_success,
1.9.16p2 to 1.9.16p11 - due to a bug in namelogon.c,
cannot provide domain master / domain logon services.
*/
- become_domain_master_browser_wins(myworkgroup);
+ become_domain_master_browser_wins(global_myworkgroup);
}
else
- become_domain_master_browser_bcast(myworkgroup);
+ become_domain_master_browser_bcast(global_myworkgroup);
}
}