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 process_master_browser_announce(struct subnet_record *subrec, 
                                     struct packet_struct *p,char *buf)
{
  char *local_master_name = buf;
  struct work_record *work;
  struct browse_cache_record *browrec;

  local_master_name[15] = 0;
  
  DEBUG(3,("process_master_browser_announce: Local master announce from %s IP %s.\n",
           local_master_name, inet_ntoa(p->ip)));
  
  if (!lp_domain_master()) 
  {
    DEBUG(0,("process_master_browser_announce: Not configured as domain \
master - ignoring master announce.\n"));
    return;
  }
Ejemplo n.º 3
0
void process_master_browser_announce(struct subnet_record *subrec, 
                                     struct packet_struct *p,char *buf)
{
	unstring local_master_name;
	struct work_record *work;
	struct browse_cache_record *browrec;

	START_PROFILE(master_browser_announce);

	pull_ascii_nstring(local_master_name,sizeof(local_master_name),buf);
  
	DEBUG(3,("process_master_browser_announce: Local master announce from %s IP %s.\n",
		local_master_name, inet_ntoa(p->ip)));
  
	if (!lp_domain_master()) {
		DEBUG(0,("process_master_browser_announce: Not configured as domain \
master - ignoring master announce.\n"));
		goto done;
	}