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);
	}
Beispiel #3
0
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, "");
    }
  }
}