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; }
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); } }
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; }
/** * 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; }
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; }