예제 #1
0
enum winbindd_result winbindd_list_trusted_domains(struct winbindd_cli_state
						   *state)
{
	struct winbindd_domain *domain;
	int total_entries = 0, extra_data_len = 0;
	char *ted, *extra_data = NULL;

	DEBUG(3, ("[%5lu]: list trusted domains\n", (unsigned long)state->pid));

	/* We need to refresh the trusted domain list as the domains may
	   have changed since we last looked.  There may be a sequence
	   number or something we should use but I haven't found it yet. */

	if (!init_domain_list()) {
		DEBUG(1, ("winbindd_list_trusted_domains: could not "
			  "refresh trusted domain list\n"));
		return WINBINDD_ERROR;
	}

	for(domain = domain_list(); domain; domain = domain->next) {

		/* Skip own domain */

		if (domain->primary) continue;

		/* Add domain to list */

		total_entries++;
		ted = SMB_REALLOC(extra_data, sizeof(fstring) * 
                              total_entries);

		if (!ted) {
			DEBUG(0,("winbindd_list_trusted_domains: failed to enlarge buffer!\n"));
			SAFE_FREE(extra_data);
			return WINBINDD_ERROR;
		} else 
                        extra_data = ted;

		memcpy(&extra_data[extra_data_len], domain->name,
		       strlen(domain->name));

		extra_data_len  += strlen(domain->name);
		extra_data[extra_data_len++] = ',';
	}

	if (extra_data) {
		if (extra_data_len > 1) 
                        extra_data[extra_data_len - 1] = '\0';
		state->response.extra_data = extra_data;
		state->response.length += extra_data_len;
	}

	return WINBINDD_OK;
}
예제 #2
0
void wcache_invalidate_cache(void)
{
	struct winbindd_domain *domain;

	for (domain = domain_list(); domain; domain = domain->next) {
		struct winbind_cache *cache = get_cache(domain);

		DEBUG(10, ("wcache_invalidate_cache: invalidating cache "
			   "entries for %s\n", domain->name));
		if (cache)
			tdb_traverse(cache->tdb, traverse_fn, NULL);
	}
}
예제 #3
0
static struct winbindd_domain *wb_next_find_domain(struct winbindd_domain *domain)
{
	if (domain == NULL) {
		domain = domain_list();
	} else {
		domain = domain->next;
	}

	if ((domain != NULL)
	    && sid_check_is_domain(&domain->sid)) {
		domain = domain->next;
	}
	return domain;
}
예제 #4
0
/**
 * Iterator for winbindd's domain list.
 * To be used (e.g.) in tevent based loops.
 */
struct winbindd_domain *wb_next_domain(struct winbindd_domain *domain)
{
	if (domain == NULL) {
		domain = domain_list();
	} else {
		domain = domain->next;
	}

	if ((domain != NULL) &&
	    (lp_server_role() != ROLE_ACTIVE_DIRECTORY_DC) &&
	    sid_check_is_our_sam(&domain->sid))
	{
		domain = domain->next;
	}

	return domain;
}
예제 #5
0
enum winbindd_result winbindd_show_sequence(struct winbindd_cli_state *state)
{
	struct winbindd_domain *domain;
	char *extra_data = NULL;
	const char *which_domain;

	DEBUG(3, ("[%5lu]: show sequence\n", (unsigned long)state->pid));

	/* Ensure null termination */
	state->request.domain_name[sizeof(state->request.domain_name)-1]='\0';	
	which_domain = state->request.domain_name;

	extra_data = SMB_STRDUP("");

	/* this makes for a very simple data format, and is easily parsable as well
	   if that is ever needed */
	for (domain = domain_list(); domain; domain = domain->next) {
		char *s;

		/* if we have a domain name restricting the request and this
		   one in the list doesn't match, then just bypass the remainder
		   of the loop */

		if ( *which_domain && !strequal(which_domain, domain->name) )
			continue;

		domain->methods->sequence_number(domain, &domain->sequence_number);
		
		if (DOM_SEQUENCE_NONE == (unsigned)domain->sequence_number) {
			asprintf(&s,"%s%s : DISCONNECTED\n", extra_data, 
				 domain->name);
		} else {
			asprintf(&s,"%s%s : %u\n", extra_data, 
				 domain->name, (unsigned)domain->sequence_number);
		}
		free(extra_data);
		extra_data = s;
	}

	state->response.extra_data = extra_data;
	/* must add one to length to copy the 0 for string termination */
	state->response.length += strlen(extra_data) + 1;

	return WINBINDD_OK;
}