nmbd/nmbd_become_dmb.c

ソースコードを見る。

関数

static void become_domain_master_browser_bcast (const char *)
static void become_domain_master_fail (struct subnet_record *subrec, struct response_record *rrec, struct nmb_name *fail_name)
static void become_domain_master_stage2 (struct subnet_record *subrec, struct userdata_struct *userdata, struct nmb_name *registered_name, uint16 nb_flags, int ttl, struct in_addr registered_ip)
static void become_domain_master_stage1 (struct subnet_record *subrec, const char *wg_name)
static void become_domain_master_query_success (struct subnet_record *subrec, struct userdata_struct *userdata, struct nmb_name *nmbname, struct in_addr ip, struct res_rec *rrec)
static void become_domain_master_query_fail (struct subnet_record *subrec, struct response_record *rrec, struct nmb_name *question_name, int fail_code)
static void become_domain_master_browser_wins (const char *workgroup_name)
void add_domain_names (time_t t)

変数

in_addr allones_ip
uint16 samba_nb_type


関数

static void become_domain_master_browser_bcast ( const char *   )  [static]

nmbd_become_dmb.c273 行で定義されています。

参照先 become_domain_master_query_fail()become_domain_master_query_success()dbgtext()DOMAIN_NONEfind_name_on_subnet()find_workgroup_on_subnet()make_nmb_name()query_name()subnet_record::subnet_name.

参照元 add_domain_names()become_domain_master_stage2().

00274 {
00275         struct subnet_record *subrec;
00276 
00277         for (subrec = FIRST_SUBNET; subrec; subrec = NEXT_SUBNET_EXCLUDING_UNICAST(subrec)) { 
00278                 struct work_record *work = find_workgroup_on_subnet(subrec, workgroup_name);
00279 
00280                 if (work && (work->dom_state == DOMAIN_NONE)) {
00281                         struct nmb_name nmbname;
00282                         make_nmb_name(&nmbname,workgroup_name,0x1b);
00283 
00284                         /*
00285                          * Check for our name on the given broadcast subnet first, only initiate
00286                          * further processing if we cannot find it.
00287                          */
00288 
00289                         if (find_name_on_subnet(subrec, &nmbname, FIND_SELF_NAME) == NULL) {
00290                                 if( DEBUGLVL( 0 ) ) {
00291                                         dbgtext( "become_domain_master_browser_bcast:\n" );
00292                                         dbgtext( "Attempting to become domain master browser on " );
00293                                         dbgtext( "workgroup %s on subnet %s\n",
00294                                                 workgroup_name, subrec->subnet_name );
00295                                 }
00296 
00297                                 /* Send out a query to establish whether there's a 
00298                                    domain controller on the local subnet. If not,
00299                                    we can become a domain controller. 
00300                                 */
00301 
00302                                 DEBUG(0,("become_domain_master_browser_bcast: querying subnet %s \
00303 for domain master browser on workgroup %s\n", subrec->subnet_name, workgroup_name));
00304 
00305                                 query_name(subrec, workgroup_name, nmbname.name_type,
00306                                         become_domain_master_query_success, 
00307                                         become_domain_master_query_fail,
00308                                         NULL);
00309                         }
00310                 }
00311         }
00312 }

static void become_domain_master_fail ( struct subnet_record subrec,
struct response_record rrec,
struct nmb_name fail_name 
) [static]

nmbd_become_dmb.c36 行で定義されています。

参照先 work_record::dom_stateDOMAIN_NONEfind_server_in_workgroup()find_workgroup_on_subnet()global_mynamenmb_name::namenmb_namestr()pull_ascii_nstring()server_record::servsubnet_record::subnet_nameserver_info_struct::typesubnet_record::work_changedwork_record::work_group.

参照元 become_domain_master_stage1().

00039 {
00040         unstring failname;
00041         struct work_record *work;
00042         struct server_record *servrec;
00043 
00044         pull_ascii_nstring(failname, sizeof(failname), fail_name->name);
00045         work = find_workgroup_on_subnet(subrec, failname);
00046         if(!work) {
00047                 DEBUG(0,("become_domain_master_fail: Error - cannot find \
00048 workgroup %s on subnet %s\n", failname, subrec->subnet_name));
00049                 return;
00050         }
00051 
00052         /* Set the state back to DOMAIN_NONE. */
00053         work->dom_state = DOMAIN_NONE;
00054 
00055         if((servrec = find_server_in_workgroup( work, global_myname())) == NULL) {
00056                 DEBUG(0,("become_domain_master_fail: Error - cannot find server %s \
00057 in workgroup %s on subnet %s\n",
00058                         global_myname(), work->work_group, subrec->subnet_name));
00059                 return;
00060         }
00061 
00062         /* Update our server status. */
00063         servrec->serv.type &= ~SV_TYPE_DOMAIN_MASTER;
00064 
00065         /* Tell the namelist writer to write out a change. */
00066         subrec->work_changed = True;
00067 
00068         DEBUG(0,("become_domain_master_fail: Failed to become a domain master browser for \
00069 workgroup %s on subnet %s. Couldn't register name %s.\n",
00070                 work->work_group, subrec->subnet_name, nmb_namestr(fail_name)));
00071 }

static void become_domain_master_stage2 ( struct subnet_record subrec,
struct userdata_struct userdata,
struct nmb_name registered_name,
uint16  nb_flags,
int  ttl,
struct in_addr  registered_ip 
) [static]

nmbd_become_dmb.c77 行で定義されています。

参照先 become_domain_master_browser_bcast()dbgtext()work_record::dmb_addrwork_record::dmb_namework_record::dom_stateDOMAIN_MSTDOMAIN_NONEfind_server_in_workgroup()find_workgroup_on_subnet()global_mynameiface_n_ip()insert_permanent_name_into_unicast()make_nmb_name()nmb_name::namepull_ascii_nstring()server_record::servsubnet_record::subnet_nameserver_info_struct::typeunicast_subnetsubnet_record::work_changedwork_record::work_group.

参照元 become_domain_master_stage1().

00082 {
00083         unstring regname;
00084         struct work_record *work;
00085         struct server_record *servrec;
00086 
00087         pull_ascii_nstring(regname, sizeof(regname), registered_name->name);
00088         work = find_workgroup_on_subnet( subrec, regname);
00089 
00090         if(!work) {
00091                 DEBUG(0,("become_domain_master_stage2: Error - cannot find \
00092 workgroup %s on subnet %s\n", regname, subrec->subnet_name));
00093                 return;
00094         }
00095 
00096         if((servrec = find_server_in_workgroup( work, global_myname())) == NULL) {
00097                 DEBUG(0,("become_domain_master_stage2: Error - cannot find server %s \
00098 in workgroup %s on subnet %s\n", 
00099                 global_myname(), regname, subrec->subnet_name));
00100                 work->dom_state = DOMAIN_NONE;
00101                 return;
00102         }
00103 
00104         /* Set the state in the workgroup structure. */
00105         work->dom_state = DOMAIN_MST; /* Become domain master. */
00106 
00107         /* Update our server status. */
00108         servrec->serv.type |= (SV_TYPE_NT|SV_TYPE_DOMAIN_MASTER);
00109 
00110         /* Tell the namelist writer to write out a change. */
00111         subrec->work_changed = True;
00112 
00113         if( DEBUGLVL( 0 ) ) {
00114                 dbgtext( "*****\n\nSamba server %s ", global_myname() );
00115                 dbgtext( "is now a domain master browser for " );
00116                 dbgtext( "workgroup %s ", work->work_group );
00117                 dbgtext( "on subnet %s\n\n*****\n", subrec->subnet_name );
00118         }
00119 
00120         if( subrec == unicast_subnet ) {
00121                 struct nmb_name nmbname;
00122                 struct in_addr my_first_ip;
00123                 struct in_addr *nip;
00124 
00125                 /* Put our name and first IP address into the 
00126                    workgroup struct as domain master browser. This
00127                    will stop us syncing with ourself if we are also
00128                    a local master browser. */
00129 
00130                 make_nmb_name(&nmbname, global_myname(), 0x20);
00131 
00132                 work->dmb_name = nmbname;
00133                 /* Pick the first interface ip address as the domain master browser ip. */
00134                 nip = iface_n_ip(0);
00135 
00136                 if (!nip) {
00137                         DEBUG(0,("become_domain_master_stage2: Error. iface_n_ip returned NULL\n"));
00138                         return;
00139                 }
00140 
00141                 my_first_ip = *nip;
00142 
00143                 putip((char *)&work->dmb_addr, &my_first_ip);
00144 
00145                 /* We successfully registered by unicast with the
00146                    WINS server.  We now expect to become the domain
00147                    master on the local subnets. If this fails, it's
00148                    probably a 1.9.16p2 to 1.9.16p11 server's fault.
00149 
00150                    This is a configuration issue that should be addressed
00151                    by the network administrator - you shouldn't have
00152                    several machines configured as a domain master browser
00153                    for the same WINS scope (except if they are 1.9.17 or
00154                    greater, and you know what you're doing.
00155 
00156                    see docs/DOMAIN.txt.
00157 
00158                 */
00159                 become_domain_master_browser_bcast(work->work_group);
00160         } else {
00161                 /*
00162                  * Now we are a domain master on a broadcast subnet, we need to add
00163                  * the WORKGROUP<1b> name to the unicast subnet so that we can answer
00164                  * unicast requests sent to this name. This bug wasn't found for a while
00165                  * as it is strange to have a DMB without using WINS. JRA.
00166                  */
00167                 insert_permanent_name_into_unicast(subrec, registered_name, nb_flags);
00168         }
00169 }

static void become_domain_master_stage1 ( struct subnet_record subrec,
const char *  wg_name 
) [static]

nmbd_become_dmb.c176 行で定義されています。

参照先 become_domain_master_fail()become_domain_master_stage2()work_record::dom_stateDOMAIN_WAITfind_workgroup_on_subnet()register_name()samba_nb_typesubnet_record::subnet_namework_record::work_group.

参照元 become_domain_master_query_fail()become_domain_master_query_success().

00177 { 
00178         struct work_record *work;
00179 
00180         DEBUG(2,("become_domain_master_stage1: Becoming domain master browser for \
00181 workgroup %s on subnet %s\n", wg_name, subrec->subnet_name));
00182 
00183         /* First, find the workgroup on the subnet. */
00184         if((work = find_workgroup_on_subnet( subrec, wg_name )) == NULL) {
00185                 DEBUG(0,("become_domain_master_stage1: Error - unable to find workgroup %s on subnet %s.\n",
00186                         wg_name, subrec->subnet_name));
00187                 return;
00188         }
00189 
00190         DEBUG(3,("become_domain_master_stage1: go to first stage: register <1b> name\n"));
00191         work->dom_state = DOMAIN_WAIT;
00192 
00193         /* WORKGROUP<1b> is the domain master browser name. */
00194         register_name(subrec, work->work_group,0x1b,samba_nb_type,
00195                         become_domain_master_stage2,
00196                         become_domain_master_fail, NULL);
00197 }

static void become_domain_master_query_success ( struct subnet_record subrec,
struct userdata_struct userdata,
struct nmb_name nmbname,
struct in_addr  ip,
struct res_rec rrec 
) [static]

nmbd_become_dmb.c206 行で定義されています。

参照先 allones_ipbecome_domain_master_stage1()dbgtext()is_zero_ip()ismyip()nmb_name::namenamenmb_namestr()pull_ascii_nstring()subnet_record::subnet_name.

参照元 become_domain_master_browser_bcast()become_domain_master_browser_wins().

00210 {
00211         unstring name;
00212         pull_ascii_nstring(name, sizeof(name), nmbname->name);
00213 
00214         /* If the given ip is not ours, then we can't become a domain
00215                 controler as the name is already registered.
00216         */
00217 
00218         /* BUG note. Samba 1.9.16p11 servers seem to return the broadcast
00219                 address or zero ip for this query. Pretend this is ok. */
00220 
00221         if(ismyip(ip) || ip_equal(allones_ip, ip) || is_zero_ip(ip)) {
00222                 if( DEBUGLVL( 3 ) ) {
00223                         dbgtext( "become_domain_master_query_success():\n" );
00224                         dbgtext( "Our address (%s) ", inet_ntoa(ip) );
00225                         dbgtext( "returned in query for name %s ", nmb_namestr(nmbname) );
00226                         dbgtext( "(domain master browser name) " );
00227                         dbgtext( "on subnet %s.\n", subrec->subnet_name );
00228                         dbgtext( "Continuing with domain master code.\n" );
00229                 }
00230 
00231                 become_domain_master_stage1(subrec, name);
00232         } else {
00233                 if( DEBUGLVL( 0 ) ) {
00234                         dbgtext( "become_domain_master_query_success:\n" );
00235                         dbgtext( "There is already a domain master browser at " );
00236                         dbgtext( "IP %s for workgroup %s ", inet_ntoa(ip), name );
00237                         dbgtext( "registered on subnet %s.\n", subrec->subnet_name );
00238                 }
00239         }
00240 }

static void become_domain_master_query_fail ( struct subnet_record subrec,
struct response_record rrec,
struct nmb_name question_name,
int  fail_code 
) [static]

nmbd_become_dmb.c248 行で定義されています。

参照先 become_domain_master_stage1()nmb_name::namenamenmb_namestr()pull_ascii_nstring()unicast_subnet.

参照元 become_domain_master_browser_bcast()become_domain_master_browser_wins().

00251 {
00252         unstring name;
00253 
00254         /* If the query was unicast, and the error is not NAM_ERR (name didn't exist),
00255                 then this is a failure. Otherwise, not finding the name is what we want. */
00256 
00257         if((subrec == unicast_subnet) && (fail_code != NAM_ERR)) {
00258                 DEBUG(0,("become_domain_master_query_fail: Error %d returned when \
00259 querying WINS server for name %s.\n", 
00260                         fail_code, nmb_namestr(question_name)));
00261                 return;
00262         }
00263 
00264         /* Otherwise - not having the name allows us to register it. */
00265         pull_ascii_nstring(name, sizeof(name), question_name->name);
00266         become_domain_master_stage1(subrec, name);
00267 }

static void become_domain_master_browser_wins ( const char *  workgroup_name  )  [static]

nmbd_become_dmb.c318 行で定義されています。

参照先 become_domain_master_query_fail()become_domain_master_query_success()dbgtext()work_record::dom_stateDOMAIN_NONEfind_name_on_subnet()find_workgroup_on_subnet()make_nmb_name()subnet_record::myipnmb_namestr()query_name()subnet_record::subnet_nameunicast_subnet.

参照元 add_domain_names().

00319 {
00320         struct work_record *work;
00321 
00322         work = find_workgroup_on_subnet(unicast_subnet, workgroup_name);
00323 
00324         if (work && (work->dom_state == DOMAIN_NONE)) {
00325                 struct nmb_name nmbname;
00326 
00327                 make_nmb_name(&nmbname,workgroup_name,0x1b);
00328 
00329                 /*
00330                  * Check for our name on the unicast subnet first, only initiate
00331                  * further processing if we cannot find it.
00332                  */
00333 
00334                 if (find_name_on_subnet(unicast_subnet, &nmbname, FIND_SELF_NAME) == NULL) {
00335                         if( DEBUGLVL( 0 ) ) {
00336                                 dbgtext( "become_domain_master_browser_wins:\n" );
00337                                 dbgtext( "Attempting to become domain master browser " );
00338                                 dbgtext( "on workgroup %s, subnet %s.\n",
00339                                         workgroup_name, unicast_subnet->subnet_name );
00340                         }
00341 
00342                         /* Send out a query to establish whether there's a 
00343                            domain master broswer registered with WINS. If not,
00344                            we can become a domain master browser. 
00345                         */
00346 
00347                         DEBUG(0,("become_domain_master_browser_wins: querying WINS server from IP %s \
00348 for domain master browser name %s on workgroup %s\n",
00349                                 inet_ntoa(unicast_subnet->myip), nmb_namestr(&nmbname), workgroup_name));
00350 
00351                         query_name(unicast_subnet, workgroup_name, nmbname.name_type,
00352                                 become_domain_master_query_success,
00353                                 become_domain_master_query_fail,
00354                                 NULL);
00355                 }
00356         }
00357 }

void add_domain_names ( time_t  t  ) 

nmbd_become_dmb.c364 行で定義されています。

参照先 add_logon_names()become_domain_master_browser_bcast()become_domain_master_browser_wins()lp_workgroup()we_are_a_wins_client().

参照元 process().

00365 {
00366         static time_t lastrun = 0;
00367 
00368         if ((lastrun != 0) && (t < lastrun + (CHECK_TIME_ADD_DOM_NAMES * 60)))
00369                 return;
00370 
00371         lastrun = t;
00372 
00373         /* Do the "internet group" - <1c> names. */
00374         if (lp_domain_logons())
00375                 add_logon_names();
00376 
00377         /* Do the domain master names. */
00378         if(lp_domain_master()) {
00379                 if(we_are_a_wins_client()) {
00380                         /* We register the WORKGROUP<1b> name with the WINS
00381                                 server first, and call add_domain_master_bcast()
00382                                 only if this is successful.
00383 
00384                                 This results in domain logon services being gracefully provided,
00385                                 as opposed to the aggressive nature of 1.9.16p2 to 1.9.16p11.
00386                                 1.9.16p2 to 1.9.16p11 - due to a bug in namelogon.c,
00387                                 cannot provide domain master / domain logon services.
00388                         */
00389                         become_domain_master_browser_wins(lp_workgroup());
00390                 } else {
00391                         become_domain_master_browser_bcast(lp_workgroup());
00392                 }
00393         }
00394 }


変数

struct in_addr allones_ip

interface.c26 行で定義されています。

uint16 samba_nb_type

nmbd_namelistdb.c26 行で定義されています。

参照元 add_samba_names_to_subnet()become_domain_master_stage1()become_local_master_browser()become_local_master_stage1()become_logon_server()initiate_myworkgroup_startup()register_my_workgroup_and_names()register_my_workgroup_one_subnet()set_samba_nb_type().


Sambaに対してSat Aug 29 21:23:52 2009に生成されました。  doxygen 1.4.7