/* Enumerate the domain trusts known by Winbind */ wbcErr wbcListTrusts(struct wbcDomainInfo **domains, size_t *num_domains) { struct winbindd_response response; wbcErr wbc_status = WBC_ERR_UNKNOWN_FAILURE; char *p = NULL; char *extra_data = NULL; struct wbcDomainInfo *d_list = NULL; int i = 0; *domains = NULL; *num_domains = 0; ZERO_STRUCT(response); /* Send request */ wbc_status = wbcRequestResponse(WINBINDD_LIST_TRUSTDOM, NULL, &response); BAIL_ON_WBC_ERROR(wbc_status); /* Decode the response */ p = (char *)response.extra_data.data; if ((p == NULL) || (strlen(p) == 0)) { /* We should always at least get back our own SAM domain */ wbc_status = WBC_ERR_DOMAIN_NOT_FOUND; BAIL_ON_WBC_ERROR(wbc_status); } d_list = (struct wbcDomainInfo *)wbcAllocateMemory( response.data.num_entries + 1,sizeof(struct wbcDomainInfo), wbcDomainInfoListDestructor); BAIL_ON_PTR_ERROR(d_list, wbc_status); extra_data = strdup((char*)response.extra_data.data); BAIL_ON_PTR_ERROR(extra_data, wbc_status); p = extra_data; /* Outer loop processes the list of domain information */ for (i=0; i<response.data.num_entries && p; i++) { char *next = strchr(p, '\n'); if (next) { *next = '\0'; next++; } wbc_status = process_domain_info_string(&d_list[i], p); BAIL_ON_WBC_ERROR(wbc_status); p = next; } *domains = d_list; d_list = NULL; *num_domains = i; done: winbindd_free_response(&response); wbcFreeMemory(d_list); free(extra_data); return wbc_status; }
/* Enumerate the domain trusts known by Winbind */ wbcErr wbcListTrusts(struct wbcDomainInfo **domains, size_t *num_domains) { struct winbindd_response response; wbcErr wbc_status = WBC_ERR_UNKNOWN_FAILURE; char *p = NULL; char *q = NULL; char *extra_data = NULL; int count = 0; struct wbcDomainInfo *d_list = NULL; int i = 0; *domains = NULL; *num_domains = 0; ZERO_STRUCT(response); /* Send request */ wbc_status = wbcRequestResponse(WINBINDD_LIST_TRUSTDOM, NULL, &response); BAIL_ON_WBC_ERROR(wbc_status); /* Decode the response */ p = (char *)response.extra_data.data; if (strlen(p) == 0) { /* We should always at least get back our own SAM domain */ wbc_status = WBC_ERR_DOMAIN_NOT_FOUND; BAIL_ON_WBC_ERROR(wbc_status); } /* Count number of domains */ count = 0; while (p) { count++; if ((q = strchr(p, '\n')) != NULL) q++; p = q; } d_list = talloc_array(NULL, struct wbcDomainInfo, count); BAIL_ON_PTR_ERROR(d_list, wbc_status); extra_data = strdup((char*)response.extra_data.data); BAIL_ON_PTR_ERROR(extra_data, wbc_status); p = extra_data; /* Outer loop processes the list of domain information */ for (i=0; i<count && p; i++) { char *next = strchr(p, '\n'); if (next) { *next = '\0'; next++; } wbc_status = process_domain_info_string(d_list, &d_list[i], p); BAIL_ON_WBC_ERROR(wbc_status); p = next; } *domains = d_list; *num_domains = i; done: if (!WBC_ERROR_IS_OK(wbc_status)) { if (d_list) talloc_free(d_list); if (extra_data) free(extra_data); } return wbc_status; }