static struct work_record *create_workgroup(const char *name, int ttl) { struct work_record *work; struct subnet_record *subrec; int t = -1; if((work = SMB_MALLOC_P(struct work_record)) == NULL) { DEBUG(0,("create_workgroup: malloc fail !\n")); return NULL; } memset((char *)work, '\0', sizeof(*work)); name_to_unstring(work->work_group, name); work->serverlist = NULL; work->RunningElection = False; work->ElectionCount = 0; work->announce_interval = 0; work->needelection = False; work->needannounce = True; work->lastannounce_time = time(NULL); work->mst_state = lp_local_master() ? MST_POTENTIAL : MST_NONE; work->dom_state = DOMAIN_NONE; work->log_state = LOGON_NONE; work->death_time = (ttl != PERMANENT_TTL) ? time(NULL)+(ttl*3) : PERMANENT_TTL; /* Make sure all token representations of workgroups are unique. */ for (subrec = FIRST_SUBNET; subrec && (t == -1); subrec = NEXT_SUBNET_INCLUDING_UNICAST(subrec)) { struct work_record *w; for (w = subrec->workgrouplist; w && t == -1; w = w->next) { if (strequal(w->work_group, work->work_group)) t = w->token; } } if (t == -1) work->token = ++workgroup_count; else work->token = t; /* No known local master browser as yet. */ *work->local_master_browser_name = '\0'; /* No known domain master browser as yet. */ *work->dmb_name.name = '\0'; zero_ip_v4(&work->dmb_addr); /* WfWg uses 01040b01 */ /* Win95 uses 01041501 */ /* NTAS uses ???????? */ work->ElectionCriterion = (MAINTAIN_LIST)|(BROWSER_ELECTION_VERSION<<8); work->ElectionCriterion |= (lp_os_level() << 24); if (lp_domain_master()) work->ElectionCriterion |= 0x80; return work; }
void initiate_myworkgroup_startup(struct subnet_record *subrec, struct work_record *work) { int i; if(!strequal(lp_workgroup(), work->work_group)) return; /* If this is a broadcast subnet then start elections on it if we are so configured. */ if ((subrec != unicast_subnet) && (subrec != remote_broadcast_subnet) && (subrec != wins_server_subnet) && lp_preferred_master() && lp_local_master()) { DEBUG(3, ("initiate_myworkgroup_startup: preferred master startup for \ workgroup %s on subnet %s\n", work->work_group, subrec->subnet_name)); work->needelection = True; work->ElectionCriterion |= (1<<3); }
static void check_for_master_browser_fail( struct subnet_record *subrec, struct response_record *rrec, struct nmb_name *question_name, int fail_code) { char *workgroup_name = question_name->name; struct work_record *work = find_workgroup_on_subnet(subrec, workgroup_name); if(work == NULL) { DEBUG(0,("check_for_master_browser_fail: Unable to find workgroup %s on subnet %s.=\n", workgroup_name, subrec->subnet_name )); return; } if (strequal(work->work_group, global_myworkgroup)) { if (lp_local_master()) { /* We have discovered that there is no local master browser, and we are configured to initiate an election that we will participate in. */ DEBUG(2,("check_for_master_browser_fail: Forcing election on workgroup %s subnet %s\n", work->work_group, subrec->subnet_name )); /* Setting this means we will participate when the election is run in run_elections(). */ work->needelection = True; } else { /* We need to force an election, because we are configured not to become the local master, but we still need one, having detected that one doesn't exist. */ send_election_dgram(subrec, work->work_group, 0, 0, ""); } } }