lib: Remove unused serverid.tdb
[samba.git] / source3 / nmbd / nmbd_logonnames.c
1 /* 
2    Unix SMB/CIFS implementation.
3    NBT netbios routines and daemon - version 2
4    Copyright (C) Andrew Tridgell 1994-1998
5    Copyright (C) Luke Kenneth Casson Leighton 1994-1998
6    Copyright (C) Jeremy Allison 1994-2003
7    
8    This program is free software; you can redistribute it and/or modify
9    it under the terms of the GNU General Public License as published by
10    the Free Software Foundation; either version 3 of the License, or
11    (at your option) any later version.
12    
13    This program is distributed in the hope that it will be useful,
14    but WITHOUT ANY WARRANTY; without even the implied warranty of
15    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16    GNU General Public License for more details.
17    
18    You should have received a copy of the GNU General Public License
19    along with this program.  If not, see <http://www.gnu.org/licenses/>.
20    
21 */
22
23 #include "includes.h"
24 #include "../librpc/gen_ndr/svcctl.h"
25 #include "nmbd/nmbd.h"
26
27 extern uint16_t samba_nb_type; /* Samba's NetBIOS type. */
28
29 /****************************************************************************
30   Fail to become a Logon server on a subnet.
31 ****************************************************************************/
32
33 static void become_logon_server_fail(struct subnet_record *subrec,
34                                       struct response_record *rrec,
35                                       struct nmb_name *fail_name)
36 {
37         unstring failname;
38         struct work_record *work;
39         struct server_record *servrec;
40
41         pull_ascii_nstring(failname, sizeof(failname), fail_name->name);
42         work = find_workgroup_on_subnet(subrec, failname);
43         if(!work) {
44                 DEBUG(0,("become_logon_server_fail: Error - cannot find \
45 workgroup %s on subnet %s\n", failname, subrec->subnet_name));
46                 return;
47         }
48
49         if((servrec = find_server_in_workgroup( work, lp_netbios_name())) == NULL) {
50                 DEBUG(0,("become_logon_server_fail: Error - cannot find server %s \
51 in workgroup %s on subnet %s\n",
52                         lp_netbios_name(), failname, subrec->subnet_name));
53                 work->log_state = LOGON_NONE;
54                 return;
55         }
56
57         /* Set the state back to LOGON_NONE. */
58         work->log_state = LOGON_NONE;
59
60         servrec->serv.type &= ~SV_TYPE_DOMAIN_CTRL;
61
62         DEBUG(0,("become_logon_server_fail: Failed to become a domain master for \
63 workgroup %s on subnet %s. Couldn't register name %s.\n",
64                 work->work_group, subrec->subnet_name, nmb_namestr(fail_name)));
65
66 }
67
68 /****************************************************************************
69   Become a Logon server on a subnet.
70   ****************************************************************************/
71
72 static void become_logon_server_success(struct subnet_record *subrec,
73                                         struct userdata_struct *userdata,
74                                         struct nmb_name *registered_name,
75                                         uint16_t nb_flags,
76                                         int ttl, struct in_addr registered_ip)
77 {
78         unstring reg_name;
79         struct work_record *work;
80         struct server_record *servrec;
81
82         pull_ascii_nstring(reg_name, sizeof(reg_name), registered_name->name);
83         work = find_workgroup_on_subnet( subrec, reg_name);
84         if(!work) {
85                 DEBUG(0,("become_logon_server_success: Error - cannot find \
86 workgroup %s on subnet %s\n", reg_name, subrec->subnet_name));
87                 return;
88         }
89
90         if((servrec = find_server_in_workgroup( work, lp_netbios_name())) == NULL) {
91                 DEBUG(0,("become_logon_server_success: Error - cannot find server %s \
92 in workgroup %s on subnet %s\n",
93                         lp_netbios_name(), reg_name, subrec->subnet_name));
94                 work->log_state = LOGON_NONE;
95                 return;
96         }
97
98         /* Set the state in the workgroup structure. */
99         work->log_state = LOGON_SRV; /* Become domain master. */
100
101         /* Update our server status. */
102         servrec->serv.type |= (SV_TYPE_NT|SV_TYPE_DOMAIN_MEMBER);
103         /* To allow Win95 policies to load we need to set type domain
104                 controller.
105         */
106         servrec->serv.type |= SV_TYPE_DOMAIN_CTRL;
107
108         /* Tell the namelist writer to write out a change. */
109         subrec->work_changed = True;
110
111         /*
112          * Add the WORKGROUP<1C> name to the UNICAST subnet with the IP address
113          * for this subnet so we will respond to queries on this name.
114          */
115
116         {
117                 struct nmb_name nmbname;
118                 make_nmb_name(&nmbname,lp_workgroup(),0x1c);
119                 insert_permanent_name_into_unicast(subrec, &nmbname, 0x1c);
120         }
121
122         DEBUG(0,("become_logon_server_success: Samba is now a logon server \
123 for workgroup %s on subnet %s\n", work->work_group, subrec->subnet_name));
124 }
125
126 /*******************************************************************
127   Become a logon server by attempting to register the WORKGROUP<1c>
128   group name.
129 ******************************************************************/
130
131 static void become_logon_server(struct subnet_record *subrec,
132                                 struct work_record *work)
133 {
134         DEBUG(2,("become_logon_server: Atempting to become logon server for workgroup %s \
135 on subnet %s\n", work->work_group,subrec->subnet_name));
136
137         DEBUG(3,("become_logon_server: go to first stage: register %s<1c> name\n",
138                 work->work_group));
139         work->log_state = LOGON_WAIT;
140
141         register_name(subrec, work->work_group,0x1c,samba_nb_type|NB_GROUP,
142                         become_logon_server_success,
143                         become_logon_server_fail, NULL);
144 }
145
146 /*****************************************************************************
147   Add the internet group <1c> logon names by unicast and broadcast.
148   ****************************************************************************/
149
150 void add_logon_names(void)
151 {
152         struct subnet_record *subrec;
153
154         for (subrec = FIRST_SUBNET; subrec; subrec = NEXT_SUBNET_INCLUDING_UNICAST(subrec)) {
155                 struct work_record *work = find_workgroup_on_subnet(subrec, lp_workgroup());
156
157                 if (work && (work->log_state == LOGON_NONE)) {
158                         struct nmb_name nmbname;
159                         make_nmb_name(&nmbname,lp_workgroup(),0x1c);
160
161                         if (find_name_on_subnet(subrec, &nmbname, FIND_SELF_NAME) == NULL) {
162                                 if( DEBUGLVL( 0 ) ) {
163                                         dbgtext( "add_domain_logon_names:\n" );
164                                         dbgtext( "Attempting to become logon server " );
165                                         dbgtext( "for workgroup %s ", lp_workgroup() );
166                                         dbgtext( "on subnet %s\n", subrec->subnet_name );
167                                 }
168                                 become_logon_server(subrec, work);
169                         }
170                 }
171         }
172 }