void check_master_browser_exists(time_t t)
{
	static time_t lastrun=0;
	struct subnet_record *subrec;
	const char *workgroup_name = lp_workgroup();

	if (!lastrun)
		lastrun = t;

	if (t < (lastrun + (CHECK_TIME_MST_BROWSE * 60)))
		return;

	lastrun = t;

	dump_workgroups(False);

	for (subrec = FIRST_SUBNET; subrec; subrec = NEXT_SUBNET_EXCLUDING_UNICAST(subrec)) {
		struct work_record *work;

		for (work = subrec->workgrouplist; work; work = work->next) {
			if (strequal(work->work_group, workgroup_name) && !AM_LOCAL_MASTER_BROWSER(work)) {
				/* Do a name query for the local master browser on this net. */
				query_name( subrec, work->work_group, 0x1d,
					check_for_master_browser_success,
					check_for_master_browser_fail,
					NULL);
			}
		}
	}
}
Example #2
0
static void announce_server(struct subnet_record *subrec, struct work_record *work,
                     struct server_record *servrec)
{
	/* Only do domain announcements if we are a master and it's
		our primary name we're being asked to announce. */

	if (AM_LOCAL_MASTER_BROWSER(work) && strequal(lp_netbios_name(),servrec->serv.name)) {
		send_local_master_announcement(subrec, work, servrec);
		send_workgroup_announcement(subrec, work);
	} else {
		send_host_announcement(subrec, work, servrec);
	}
}
Example #3
0
void announce_my_servers_removed(void)
{
    int announce_interval = lp_lm_interval();
    int lm_announce = lp_lm_announce();
    struct subnet_record *subrec;

    for (subrec = FIRST_SUBNET; subrec; subrec = NEXT_SUBNET_EXCLUDING_UNICAST(subrec))
    {
        struct work_record *work;
        for (work = subrec->workgrouplist; work; work = work->next)
        {
            struct server_record *servrec;

            work->announce_interval = 0;
            for (servrec = work->serverlist; servrec; servrec = servrec->next)
            {
                if (!is_myname(servrec->serv.name))
                    continue;
                servrec->serv.type = 0;
                if(AM_LOCAL_MASTER_BROWSER(work))
                    send_local_master_announcement(subrec, work, servrec);
                send_host_announcement(subrec, work, servrec);


                if ((announce_interval <= 0) || (lm_announce <= 0))
                {
                    /* user absolutely does not want LM announcements to be sent. */
                    continue;
                }

                if ((lm_announce >= 2) && (!found_lm_clients))
                {
                    /* has been set to 2 (Auto) but no LM clients detected (yet). */
                    continue;
                }

                /*
                 * lm announce was set or we have seen lm announcements, so do
                 * a lm announcement of host removed.
                 */

                send_lm_host_announcement(subrec, work, servrec, 0);
            }
        }
    }
}
Example #4
0
void browse_sync_remote(time_t t)
{
	char *s;
	const char *ptr;
	static time_t last_time = 0;
	char *s2;
	struct in_addr addr;
	struct work_record *work;
	char outbuf[1024];
	char *p;
	unstring myname;
	TALLOC_CTX *frame = NULL;

	if (last_time && (t < (last_time + REMOTE_ANNOUNCE_INTERVAL)))
		return;

	last_time = t;

	s = lp_remote_browse_sync(talloc_tos());
	if (!*s)
		return;

	/*
	 * We only do this if we are the local master browser
	 * for our workgroup on the firsst subnet.
	 */

	if((work = find_workgroup_on_subnet(FIRST_SUBNET, lp_workgroup())) == NULL) {   
		DEBUG(0,("browse_sync_remote: Cannot find workgroup %s on subnet %s\n",
			lp_workgroup(), FIRST_SUBNET->subnet_name ));
		return;
	}

	if(!AM_LOCAL_MASTER_BROWSER(work)) {
		DEBUG(5,("browse_sync_remote: We can only do this if we are a local master browser \
for workgroup %s on subnet %s.\n", lp_workgroup(), FIRST_SUBNET->subnet_name ));
		return;
	}