nmbd/nmbd_become_lmb.c

ソースコードを見る。

関数

void insert_permanent_name_into_unicast (struct subnet_record *subrec, struct nmb_name *nmbname, uint16 nb_type)
static void remove_permanent_name_from_unicast (struct subnet_record *subrec, struct nmb_name *nmbname)
static void reset_workgroup_state (struct subnet_record *subrec, const char *workgroup_name, BOOL force_new_election)
static void unbecome_local_master_success (struct subnet_record *subrec, struct userdata_struct *userdata, struct nmb_name *released_name, struct in_addr released_ip)
static void unbecome_local_master_fail (struct subnet_record *subrec, struct response_record *rrec, struct nmb_name *fail_name)
static void release_1d_name (struct subnet_record *subrec, const char *workgroup_name, BOOL force_new_election)
static void release_msbrowse_name_success (struct subnet_record *subrec, struct userdata_struct *userdata, struct nmb_name *released_name, struct in_addr released_ip)
static void release_msbrowse_name_fail (struct subnet_record *subrec, struct response_record *rrec, struct nmb_name *fail_name)
void unbecome_local_master_browser (struct subnet_record *subrec, struct work_record *work, BOOL force_new_election)
static void become_local_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_local_master_fail2 (struct subnet_record *subrec, struct response_record *rrec, struct nmb_name *fail_name)
static void become_local_master_stage1 (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_local_master_fail1 (struct subnet_record *subrec, struct response_record *rrec, struct nmb_name *fail_name)
void become_local_master_browser (struct subnet_record *subrec, struct work_record *work)
void set_workgroup_local_master_browser_name (struct work_record *work, const char *newname)

変数

uint16 samba_nb_type


関数

void insert_permanent_name_into_unicast ( struct subnet_record subrec,
struct nmb_name nmbname,
uint16  nb_type 
)

nmbd_become_lmb.c33 行で定義されています。

参照先 add_ip_to_name_record()add_name_to_subnet()find_name_on_subnet()subnet_record::myipnmb_name::namenamenmb_name::name_typePERMANENT_NAMEpull_ascii_nstring()unicast_subnet.

参照元 become_domain_master_stage2()become_local_master_stage1()become_local_master_stage2()become_logon_server_success()insert_refresh_name_into_unicast().

00035 {
00036         unstring name;
00037         struct name_record *namerec;
00038 
00039         if((namerec = find_name_on_subnet(unicast_subnet, nmbname, FIND_SELF_NAME)) == NULL) {
00040                 pull_ascii_nstring(name, sizeof(name), nmbname->name);
00041                 /* The name needs to be created on the unicast subnet. */
00042                 (void)add_name_to_subnet( unicast_subnet, name,
00043                                 nmbname->name_type, nb_type,
00044                                 PERMANENT_TTL, PERMANENT_NAME, 1, &subrec->myip);
00045         } else {
00046                 /* The name already exists on the unicast subnet. Add our local
00047                 IP for the given broadcast subnet to the name. */
00048                 add_ip_to_name_record( namerec, subrec->myip);
00049         }
00050 }

static void remove_permanent_name_from_unicast ( struct subnet_record subrec,
struct nmb_name nmbname 
) [static]

nmbd_become_lmb.c56 行で定義されています。

参照先 find_name_on_subnet()subnet_record::myipremove_ip_from_name_record()remove_name_from_namelist()unicast_subnet.

参照元 release_msbrowse_name_fail()release_msbrowse_name_success()reset_workgroup_state().

00058 {
00059         struct name_record *namerec;
00060 
00061         if((namerec = find_name_on_subnet(unicast_subnet, nmbname, FIND_SELF_NAME)) != NULL) {
00062                 /* Remove this broadcast subnet IP address from the name. */
00063                 remove_ip_from_name_record( namerec, subrec->myip);
00064                 if(namerec->data.num_ips == 0)
00065                         remove_name_from_namelist( unicast_subnet, namerec);
00066         }
00067 }

static void reset_workgroup_state ( struct subnet_record subrec,
const char *  workgroup_name,
BOOL  force_new_election 
) [static]

nmbd_become_lmb.c74 行で定義されています。

参照先 work_record::ElectionCriterionfind_server_in_workgroup()find_workgroup_on_subnet()global_mynamemake_nmb_name()MST_NONEMST_POTENTIALwork_record::mst_statework_record::needelectionremove_permanent_name_from_unicast()server_record::servset_workgroup_local_master_browser_name()subnet_record::subnet_nameserver_info_struct::typesubnet_record::work_changedwork_record::work_group.

参照元 become_local_master_fail1()unbecome_local_master_fail()unbecome_local_master_success().

00076 {
00077         struct work_record *work;
00078         struct server_record *servrec;
00079         struct nmb_name nmbname;
00080 
00081         if((work = find_workgroup_on_subnet( subrec, workgroup_name)) == NULL) {
00082                 DEBUG(0,("reset_workgroup_state: Error - cannot find workgroup %s on \
00083 subnet %s.\n", workgroup_name, subrec->subnet_name ));
00084                 return;
00085         }
00086 
00087         if((servrec = find_server_in_workgroup( work, global_myname())) == NULL) {
00088                 DEBUG(0,("reset_workgroup_state: Error - cannot find server %s \
00089 in workgroup %s on subnet %s\n",
00090                         global_myname(), work->work_group, subrec->subnet_name));
00091                 work->mst_state = lp_local_master() ? MST_POTENTIAL : MST_NONE;
00092                 return;
00093         }
00094 
00095         /* Update our server status - remove any master flag and replace
00096                 it with the potential browser flag. */
00097         servrec->serv.type &= ~SV_TYPE_MASTER_BROWSER;
00098         servrec->serv.type |= (lp_local_master() ? SV_TYPE_POTENTIAL_BROWSER : 0);
00099 
00100         /* Tell the namelist writer to write out a change. */
00101         subrec->work_changed = True;
00102 
00103         /* Reset our election flags. */
00104         work->ElectionCriterion &= ~0x4;
00105 
00106         work->mst_state = lp_local_master() ? MST_POTENTIAL : MST_NONE;
00107 
00108         /* Forget who the local master browser was for
00109                 this workgroup. */
00110 
00111         set_workgroup_local_master_browser_name( work, "");
00112 
00113         /*
00114          * Ensure the IP address of this subnet is not registered as one
00115          * of the IP addresses of the WORKGROUP<1d> name on the unicast
00116          * subnet. This undoes what we did below when we became a local
00117          * master browser.
00118          */
00119 
00120         make_nmb_name(&nmbname, work->work_group, 0x1d);
00121 
00122         remove_permanent_name_from_unicast( subrec, &nmbname);
00123 
00124         if(force_new_election)
00125                 work->needelection = True;
00126 }

static void unbecome_local_master_success ( struct subnet_record subrec,
struct userdata_struct userdata,
struct nmb_name released_name,
struct in_addr  released_ip 
) [static]

nmbd_become_lmb.c132 行で定義されています。

参照先 userdata_struct::datadbgtext()global_mynamenmb_name::namenmb_namestr()pull_ascii_nstring()reset_workgroup_state()subnet_record::subnet_name.

参照元 release_1d_name().

00136 { 
00137         BOOL force_new_election = False;
00138         unstring relname;
00139 
00140         memcpy((char *)&force_new_election, userdata->data, sizeof(BOOL));
00141 
00142         DEBUG(3,("unbecome_local_master_success: released name %s.\n",
00143                 nmb_namestr(released_name)));
00144 
00145         /* Now reset the workgroup and server state. */
00146         pull_ascii_nstring(relname, sizeof(relname), released_name->name);
00147         reset_workgroup_state( subrec, relname, force_new_election );
00148 
00149         if( DEBUGLVL( 0 ) ) {
00150                 dbgtext( "*****\n\n" );
00151                 dbgtext( "Samba name server %s ", global_myname() );
00152                 dbgtext( "has stopped being a local master browser " );
00153                 dbgtext( "for workgroup %s ", relname );
00154                 dbgtext( "on subnet %s\n\n*****\n", subrec->subnet_name );
00155         }
00156 
00157 }

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

nmbd_become_lmb.c163 行で定義されています。

参照先 userdata_struct::datadbgtext()find_name_on_subnet()global_mynamenmb_name::namenmb_namestr()pull_ascii_nstring()remove_name_from_namelist()reset_workgroup_state()response_record::userdata.

参照元 release_1d_name().

00165 {
00166         struct name_record *namerec;
00167         struct userdata_struct *userdata = rrec->userdata;
00168         BOOL force_new_election = False;
00169         unstring failname;
00170 
00171         memcpy((char *)&force_new_election, userdata->data, sizeof(BOOL));
00172 
00173         DEBUG(0,("unbecome_local_master_fail: failed to release name %s. \
00174 Removing from namelist anyway.\n", nmb_namestr(fail_name)));
00175 
00176         /* Do it anyway. */
00177         namerec = find_name_on_subnet(subrec, fail_name, FIND_SELF_NAME);
00178         if(namerec)
00179                 remove_name_from_namelist(subrec, namerec);
00180 
00181         /* Now reset the workgroup and server state. */
00182         pull_ascii_nstring(failname, sizeof(failname), fail_name->name);
00183         reset_workgroup_state( subrec, failname, force_new_election );
00184 
00185         if( DEBUGLVL( 0 ) ) {
00186                 dbgtext( "*****\n\n" );
00187                 dbgtext( "Samba name server %s ", global_myname() );
00188                 dbgtext( "has stopped being a local master browser " );
00189                 dbgtext( "for workgroup %s ", failname );
00190                 dbgtext( "on subnet %s\n\n*****\n", subrec->subnet_name );
00191         }
00192 }

static void release_1d_name ( struct subnet_record subrec,
const char *  workgroup_name,
BOOL  force_new_election 
) [static]

nmbd_become_lmb.c198 行で定義されています。

参照先 userdata_struct::copy_fnuserdata_struct::datafind_name_on_subnet()userdata_struct::free_fnmake_nmb_name()release_name()sizeunbecome_local_master_fail()unbecome_local_master_success()userdata_struct::userdata_lenzero_free().

参照元 unbecome_local_master_browser().

00200 {
00201         struct nmb_name nmbname;
00202         struct name_record *namerec;
00203 
00204         make_nmb_name(&nmbname, workgroup_name, 0x1d);
00205         if((namerec = find_name_on_subnet( subrec, &nmbname, FIND_SELF_NAME))!=NULL) {
00206                 struct userdata_struct *userdata;
00207                 size_t size = sizeof(struct userdata_struct) + sizeof(BOOL);
00208 
00209                 if((userdata = (struct userdata_struct *)SMB_MALLOC(size)) == NULL) {
00210                         DEBUG(0,("release_1d_name: malloc fail.\n"));
00211                         return;
00212                 }
00213 
00214                 userdata->copy_fn = NULL;
00215                 userdata->free_fn = NULL;
00216                 userdata->userdata_len = sizeof(BOOL);
00217                 memcpy((char *)userdata->data, &force_new_election, sizeof(BOOL));
00218 
00219                 release_name(subrec, namerec,
00220                         unbecome_local_master_success,
00221                         unbecome_local_master_fail,
00222                         userdata);
00223 
00224                 zero_free(userdata, size);
00225         }
00226 }

static void release_msbrowse_name_success ( struct subnet_record subrec,
struct userdata_struct userdata,
struct nmb_name released_name,
struct in_addr  released_ip 
) [static]

nmbd_become_lmb.c232 行で定義されています。

参照先 nmb_namestr()remove_permanent_name_from_unicast()subnet_record::subnet_name.

参照元 unbecome_local_master_browser().

00236 {
00237         DEBUG(4,("release_msbrowse_name_success: Released name %s on subnet %s\n.",
00238                 nmb_namestr(released_name), subrec->subnet_name ));
00239 
00240         /* Remove the permanent MSBROWSE name added into the unicast subnet. */
00241         remove_permanent_name_from_unicast( subrec, released_name);
00242 }

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

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

参照先 find_name_on_subnet()nmb_namestr()remove_name_from_namelist()remove_permanent_name_from_unicast()subnet_record::subnet_name.

参照元 unbecome_local_master_browser().

00251 {
00252         struct name_record *namerec;
00253 
00254         DEBUG(4,("release_msbrowse_name_fail: Failed to release name %s on subnet %s\n.",
00255                 nmb_namestr(fail_name), subrec->subnet_name ));
00256 
00257         /* Release the name anyway. */
00258         namerec = find_name_on_subnet(subrec, fail_name, FIND_SELF_NAME);
00259         if(namerec)
00260                 remove_name_from_namelist(subrec, namerec);
00261 
00262         /* Remove the permanent MSBROWSE name added into the unicast subnet. */
00263         remove_permanent_name_from_unicast( subrec, fail_name);
00264 }

void unbecome_local_master_browser ( struct subnet_record subrec,
struct work_record work,
BOOL  force_new_election 
)

nmbd_become_lmb.c271 行で定義されています。

参照先 find_name_on_subnet()find_server_in_workgroup()global_mynamemake_nmb_name()MST_NONEMST_POTENTIALwork_record::mst_stateMST_UNBECOMING_MASTERrelease_1d_name()release_msbrowse_name_fail()release_msbrowse_name_success()release_name()retransmit_or_expire_response_records()subnet_record::subnet_namework_record::work_group.

参照元 become_local_master_fail2()process_election()process_local_master_announce()process_reset_browser().

00273 {
00274         struct name_record *namerec;
00275         struct nmb_name nmbname;
00276 
00277   /* Sanity check. */
00278 
00279         DEBUG(2,("unbecome_local_master_browser: unbecoming local master for workgroup %s \
00280 on subnet %s\n",work->work_group, subrec->subnet_name));
00281   
00282         if(find_server_in_workgroup( work, global_myname()) == NULL) {
00283                 DEBUG(0,("unbecome_local_master_browser: Error - cannot find server %s \
00284 in workgroup %s on subnet %s\n",
00285                         global_myname(), work->work_group, subrec->subnet_name));
00286                         work->mst_state = lp_local_master() ? MST_POTENTIAL : MST_NONE;
00287                 return;
00288         }
00289   
00290         /* Set the state to unbecoming. */
00291         work->mst_state = MST_UNBECOMING_MASTER;
00292 
00293         /*
00294          * Release the WORKGROUP<1d> name asap to allow another machine to
00295          * claim it.
00296          */
00297 
00298         release_1d_name( subrec, work->work_group, force_new_election);
00299 
00300         /* Deregister any browser names we may have. */
00301         make_nmb_name(&nmbname, MSBROWSE, 0x1);
00302         if((namerec = find_name_on_subnet( subrec, &nmbname, FIND_SELF_NAME))!=NULL) {
00303                 release_name(subrec, namerec,
00304                         release_msbrowse_name_success,
00305                         release_msbrowse_name_fail,
00306                         NULL);
00307         }
00308 
00309         /*
00310          * Ensure we have sent and processed these release packets
00311          * before returning - we don't want to process any election
00312          * packets before dealing with the 1d release.
00313          */
00314 
00315         retransmit_or_expire_response_records(time(NULL));
00316 }

static void become_local_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_lmb.c323 行で定義されています。

参照先 broadcast_announce_request()dbgtext()find_server_in_workgroup()find_workgroup_on_subnet()global_mynameinsert_permanent_name_into_unicast()MST_BROWSERMST_NONEMST_POTENTIALwork_record::mst_statenmb_name::nameserver_record::nextpull_ascii_nstring()reset_announce_timer()server_record::servwork_record::serverlistset_workgroup_local_master_browser_name()subnet_record::subnet_nameserver_info_struct::typesubnet_record::work_changedwork_record::work_group.

参照元 become_local_master_stage1().

00328 {
00329         int i = 0;
00330         struct server_record *sl;
00331         struct work_record *work;
00332         struct server_record *servrec;
00333         unstring regname;
00334 
00335         pull_ascii_nstring(regname, sizeof(regname), registered_name->name);
00336         work = find_workgroup_on_subnet( subrec, regname);
00337 
00338         if(!work) {
00339                 DEBUG(0,("become_local_master_stage2: Error - cannot find \
00340 workgroup %s on subnet %s\n", regname, subrec->subnet_name));
00341                 return;
00342         }
00343 
00344         if((servrec = find_server_in_workgroup( work, global_myname())) == NULL) {
00345                 DEBUG(0,("become_local_master_stage2: Error - cannot find server %s \
00346 in workgroup %s on subnet %s\n",
00347                         global_myname(), regname, subrec->subnet_name));
00348                         work->mst_state = lp_local_master() ? MST_POTENTIAL : MST_NONE;
00349                 return;
00350         }
00351   
00352         DEBUG(3,("become_local_master_stage2: registered as master browser for workgroup %s \
00353 on subnet %s\n", work->work_group, subrec->subnet_name));
00354 
00355         work->mst_state = MST_BROWSER; /* registering WORKGROUP(1d) succeeded */
00356 
00357         /* update our server status */
00358         servrec->serv.type |= SV_TYPE_MASTER_BROWSER;
00359         servrec->serv.type &= ~SV_TYPE_POTENTIAL_BROWSER;
00360 
00361         /* Tell the namelist writer to write out a change. */
00362         subrec->work_changed = True;
00363 
00364         /* Add this name to the workgroup as local master browser. */
00365         set_workgroup_local_master_browser_name( work, global_myname());
00366 
00367         /* Count the number of servers we have on our list. If it's
00368                 less than 10 (just a heuristic) request the servers
00369                 to announce themselves.
00370         */
00371         for( sl = work->serverlist; sl != NULL; sl = sl->next)
00372                 i++;
00373 
00374         if (i < 10) {
00375                 /* Ask all servers on our local net to announce to us. */
00376                 broadcast_announce_request(subrec, work);
00377         }
00378 
00379         /*
00380          * Now we are a local master on a broadcast subnet, we need to add
00381          * the WORKGROUP<1d> name to the unicast subnet so that we can answer
00382          * unicast requests sent to this name. We can create this name directly on
00383          * the unicast subnet as a WINS server always returns true when registering
00384          * this name, and discards the registration. We use the number of IP
00385          * addresses registered to this name as a reference count, as we
00386          * remove this broadcast subnet IP address from it when we stop becoming a local
00387          * master browser for this broadcast subnet.
00388          */
00389 
00390         insert_permanent_name_into_unicast( subrec, registered_name, nb_flags);
00391 
00392         /* Reset the announce master browser timer so that we try and tell a domain
00393                 master browser as soon as possible that we are a local master browser. */
00394         reset_announce_timer();
00395 
00396         if( DEBUGLVL( 0 ) ) {
00397                 dbgtext( "*****\n\n" );
00398                 dbgtext( "Samba name server %s ", global_myname() );
00399                 dbgtext( "is now a local master browser " );
00400                 dbgtext( "for workgroup %s ", work->work_group );
00401                 dbgtext( "on subnet %s\n\n*****\n", subrec->subnet_name );
00402         }
00403 }

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

nmbd_become_lmb.c409 行で定義されています。

参照先 find_workgroup_on_subnet()nmb_name::namenmb_namestr()pull_ascii_nstring()subnet_record::subnet_nameunbecome_local_master_browser().

参照元 become_local_master_stage1().

00412 {
00413         unstring failname;
00414         struct work_record *work;
00415 
00416         DEBUG(0,("become_local_master_fail2: failed to register name %s on subnet %s. \
00417 Failed to become a local master browser.\n", nmb_namestr(fail_name), subrec->subnet_name));
00418 
00419         pull_ascii_nstring(failname, sizeof(failname), fail_name->name);
00420         work = find_workgroup_on_subnet( subrec, failname);
00421 
00422         if(!work) {
00423                 DEBUG(0,("become_local_master_fail2: Error - cannot find \
00424 workgroup %s on subnet %s\n", failname, subrec->subnet_name));
00425                 return;
00426         }
00427 
00428         /* Roll back all the way by calling unbecome_local_master_browser(). */
00429         unbecome_local_master_browser(subrec, work, False);
00430 }

static void become_local_master_stage1 ( 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_lmb.c436 行で定義されています。

参照先 become_local_master_fail2()become_local_master_stage2()userdata_struct::datafind_workgroup_on_subnet()insert_permanent_name_into_unicast()MST_MSBwork_record::mst_stateregister_name()samba_nb_typesubnet_record::subnet_namework_record::work_group.

参照元 become_local_master_browser().

00441 {
00442         char *work_name = userdata->data;
00443         struct work_record *work = find_workgroup_on_subnet( subrec, work_name);
00444 
00445         if(!work) {
00446                 DEBUG(0,("become_local_master_stage1: Error - cannot find \
00447                         %s on subnet %s\n", work_name, subrec->subnet_name));
00448                 return;
00449         }
00450 
00451         DEBUG(3,("become_local_master_stage1: go to stage 2: register the %s<1d> name.\n",
00452                 work->work_group));
00453 
00454         work->mst_state = MST_MSB; /* Registering MSBROWSE was successful. */
00455 
00456         /*
00457          * We registered the MSBROWSE name on a broadcast subnet, now need to add
00458          * the MSBROWSE name to the unicast subnet so that we can answer
00459          * unicast requests sent to this name. We create this name directly on
00460          * the unicast subnet.
00461          */
00462 
00463         insert_permanent_name_into_unicast( subrec, registered_name, nb_flags);
00464 
00465         /* Attempt to register the WORKGROUP<1d> name. */
00466         register_name(subrec, work->work_group,0x1d,samba_nb_type,
00467                 become_local_master_stage2,
00468                 become_local_master_fail2,
00469                 NULL);
00470 }

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

nmbd_become_lmb.c476 行で定義されています。

参照先 userdata_struct::datafind_server_in_workgroup()find_workgroup_on_subnet()global_mynamenmb_namestr()reset_workgroup_state()subnet_record::subnet_nameresponse_record::userdatawork_record::work_group.

参照元 become_local_master_browser().

00479 {
00480         char *work_name = rrec->userdata->data;
00481         struct work_record *work = find_workgroup_on_subnet(subrec, work_name);
00482 
00483         if(!work) {
00484                 DEBUG(0,("become_local_master_fail1: Error - cannot find \
00485 workgroup %s on subnet %s\n", work_name, subrec->subnet_name));
00486                 return;
00487         }
00488 
00489         if(find_server_in_workgroup(work, global_myname()) == NULL) {
00490                 DEBUG(0,("become_local_master_fail1: Error - cannot find server %s \
00491 in workgroup %s on subnet %s\n",
00492                         global_myname(), work->work_group, subrec->subnet_name));
00493                 return;
00494         }
00495 
00496         reset_workgroup_state( subrec, work->work_group, False );
00497 
00498         DEBUG(0,("become_local_master_fail1: Failed to become a local master browser for \
00499 workgroup %s on subnet %s. Couldn't register name %s.\n",
00500                 work->work_group, subrec->subnet_name, nmb_namestr(fail_name)));
00501 }

void become_local_master_browser ( struct subnet_record subrec,
struct work_record work 
)

nmbd_become_lmb.c512 行で定義されています。

参照先 become_local_master_fail1()become_local_master_stage1()userdata_struct::copy_fnuserdata_struct::datawork_record::ElectionCriterionfind_server_in_workgroup()userdata_struct::free_fnglobal_mynameMST_BACKUPwork_record::mst_stateregister_name()samba_nb_typesizesubnet_record::subnet_nameuserdata_struct::userdata_lensubnet_record::work_changedwork_record::work_groupzero_free().

参照元 run_elections().

00513 {
00514         struct userdata_struct *userdata;
00515         size_t size = sizeof(struct userdata_struct) + sizeof(fstring) + 1;
00516 
00517         /* Sanity check. */
00518         if (!lp_local_master()) { 
00519                 DEBUG(0,("become_local_master_browser: Samba not configured as a local master browser.\n"));
00520                 return;
00521         }
00522 
00523         if(!AM_POTENTIAL_MASTER_BROWSER(work)) {
00524                 DEBUG(2,("become_local_master_browser: Awaiting potential browser state. Current state is %d\n",
00525                         work->mst_state ));
00526                 return;
00527         }
00528 
00529         if(find_server_in_workgroup( work, global_myname()) == NULL) {
00530                 DEBUG(0,("become_local_master_browser: Error - cannot find server %s \
00531 in workgroup %s on subnet %s\n",
00532                         global_myname(), work->work_group, subrec->subnet_name));
00533                 return;
00534         }
00535 
00536         DEBUG(2,("become_local_master_browser: Starting to become a master browser for workgroup \
00537 %s on subnet %s\n", work->work_group, subrec->subnet_name));
00538   
00539         DEBUG(3,("become_local_master_browser: first stage - attempt to register ^1^2__MSBROWSE__^2^1\n"));
00540         work->mst_state = MST_BACKUP; /* an election win was successful */
00541 
00542         work->ElectionCriterion |= 0x5;
00543 
00544         /* Tell the namelist writer to write out a change. */
00545         subrec->work_changed = True;
00546 
00547         /* Setup the userdata_struct. */
00548         if((userdata = (struct userdata_struct *)SMB_MALLOC(size)) == NULL) {
00549                 DEBUG(0,("become_local_master_browser: malloc fail.\n"));
00550                 return;
00551         }
00552 
00553         userdata->copy_fn = NULL;
00554         userdata->free_fn = NULL;
00555         userdata->userdata_len = strlen(work->work_group)+1;
00556         overmalloc_safe_strcpy(userdata->data, work->work_group, size - sizeof(*userdata) - 1);
00557 
00558         /* Register the special browser group name. */
00559         register_name(subrec, MSBROWSE, 0x01, samba_nb_type|NB_GROUP,
00560                 become_local_master_stage1,
00561                 become_local_master_fail1,
00562                 userdata);
00563 
00564         zero_free(userdata, size);
00565 }

void set_workgroup_local_master_browser_name ( struct work_record work,
const char *  newname 
)

nmbd_become_lmb.c574 行で定義されています。

参照先 work_record::local_master_browser_namestrequal()work_record::work_group.

参照元 become_local_master_stage2()process_local_master_announce()process_workgroup_announce()reset_workgroup_state().

00575 {
00576         DEBUG(5,("set_workgroup_local_master_browser_name: setting local master name to '%s' \
00577 for workgroup %s.\n", newname, work->work_group ));
00578 
00579 #if 0
00580   /*
00581    * Apparently some sites use the workgroup name as the local
00582    * master browser name. Arrrrggghhhhh ! (JRA).
00583    */
00584   if(strequal( work->work_group, newname))
00585   {
00586     DEBUG(5, ("set_workgroup_local_master_browser_name: Refusing to set \
00587 local_master_browser_name for workgroup %s to workgroup name.\n",
00588          work->work_group ));
00589     return;
00590   }
00591 #endif
00592 
00593         unstrcpy(work->local_master_browser_name, newname);
00594 }


変数

uint16 samba_nb_type

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


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