79
95
wbc_status = wbcRequestResponse(WINBINDD_NETBIOS_NAME, NULL, &response);
80
96
BAIL_ON_WBC_ERROR(wbc_status);
82
info->netbios_name = talloc_strdup(info,
83
response.data.netbios_name);
98
info->netbios_name = strdup(response.data.netbios_name);
84
99
BAIL_ON_PTR_ERROR(info->netbios_name, wbc_status);
86
101
/* then the local workgroup name */
87
102
wbc_status = wbcRequestResponse(WINBINDD_DOMAIN_NAME, NULL, &response);
88
103
BAIL_ON_WBC_ERROR(wbc_status);
90
info->netbios_domain = talloc_strdup(info,
91
response.data.domain_name);
105
info->netbios_domain = strdup(response.data.domain_name);
92
106
BAIL_ON_PTR_ERROR(info->netbios_domain, wbc_status);
94
108
wbc_status = wbcDomainInfo(info->netbios_domain, &domain);
147
173
BAIL_ON_WBC_ERROR(wbc_status);
149
info = talloc(NULL, struct wbcDomainInfo);
175
info = (struct wbcDomainInfo *)wbcAllocateMemory(
176
1, sizeof(struct wbcDomainInfo), wbcDomainInfoDestructor);
150
177
BAIL_ON_PTR_ERROR(info, wbc_status);
152
info->short_name = talloc_strdup(info,
153
response.data.domain_info.name);
179
info->short_name = strdup(response.data.domain_info.name);
154
180
BAIL_ON_PTR_ERROR(info->short_name, wbc_status);
156
info->dns_name = talloc_strdup(info,
157
response.data.domain_info.alt_name);
182
info->dns_name = strdup(response.data.domain_info.alt_name);
158
183
BAIL_ON_PTR_ERROR(info->dns_name, wbc_status);
160
185
wbc_status = wbcStringToSid(response.data.domain_info.sid,
169
194
info->domain_flags |= WBC_DOMINFO_DOMAIN_PRIMARY;
173
199
wbc_status = WBC_ERR_SUCCESS;
176
if (!WBC_ERROR_IS_OK(wbc_status)) {
206
/* Get the list of current DCs */
207
wbcErr wbcDcInfo(const char *domain, size_t *num_dcs,
208
const char ***dc_names, const char ***dc_ips)
210
struct winbindd_request request;
211
struct winbindd_response response;
212
const char **names = NULL;
213
const char **ips = NULL;
214
wbcErr wbc_status = WBC_ERR_UNKNOWN_FAILURE;
219
/* Initialise request */
221
ZERO_STRUCT(request);
222
ZERO_STRUCT(response);
224
if (domain != NULL) {
225
strncpy(request.domain_name, domain,
226
sizeof(request.domain_name) - 1);
229
wbc_status = wbcRequestResponse(WINBINDD_DC_INFO,
230
&request, &response);
231
BAIL_ON_WBC_ERROR(wbc_status);
233
names = wbcAllocateStringArray(response.data.num_entries);
234
BAIL_ON_PTR_ERROR(names, wbc_status);
236
ips = wbcAllocateStringArray(response.data.num_entries);
237
BAIL_ON_PTR_ERROR(ips, wbc_status);
239
wbc_status = WBC_ERR_INVALID_RESPONSE;
241
p = (char *)response.extra_data.data;
243
if (response.length < (sizeof(struct winbindd_response)+1)) {
247
extra_len = response.length - sizeof(struct winbindd_response);
249
if (p[extra_len-1] != '\0') {
253
for (i=0; i<response.data.num_entries; i++) {
260
names[i] = strndup(p, q-p);
261
BAIL_ON_PTR_ERROR(names[i], wbc_status);
268
ips[i] = strndup(p, q-p);
269
BAIL_ON_PTR_ERROR(ips[i], wbc_status);
276
wbc_status = WBC_ERR_SUCCESS;
278
if (response.extra_data.data)
279
free(response.extra_data.data);
281
if (WBC_ERROR_IS_OK(wbc_status)) {
282
*num_dcs = response.data.num_entries;
288
wbcFreeMemory(names);
184
293
/* Resolve a NetbiosName via WINS */
185
294
wbcErr wbcResolveWinsByName(const char *name, char **ip)
417
527
BAIL_ON_WBC_ERROR(wbc_status);
420
/* Count number of domains */
426
if ((q = strchr(p, '\n')) != NULL)
431
d_list = talloc_array(NULL, struct wbcDomainInfo, count);
530
d_list = (struct wbcDomainInfo *)wbcAllocateMemory(
531
response.data.num_entries + 1,sizeof(struct wbcDomainInfo),
532
wbcDomainInfoListDestructor);
432
533
BAIL_ON_PTR_ERROR(d_list, wbc_status);
434
535
extra_data = strdup((char*)response.extra_data.data);
449
wbc_status = process_domain_info_string(d_list, &d_list[i], p);
550
wbc_status = process_domain_info_string(&d_list[i], p);
450
551
BAIL_ON_WBC_ERROR(wbc_status);
455
556
*domains = d_list;
456
558
*num_domains = i;
459
if (!WBC_ERROR_IS_OK(wbc_status)) {
561
winbindd_free_response(&response);
562
wbcFreeMemory(d_list);
466
564
return wbc_status;
567
static void wbcDomainControllerInfoDestructor(void *ptr)
569
struct wbcDomainControllerInfo *i =
570
(struct wbcDomainControllerInfo *)ptr;
469
574
/* Enumerate the domain trusts known by Winbind */
470
575
wbcErr wbcLookupDomainController(const char *domain,
502
609
BAIL_ON_WBC_ERROR(wbc_status);
504
dc->dc_name = talloc_strdup(dc, response.data.dsgetdcname.dc_unc);
611
dc->dc_name = strdup(response.data.dsgetdcname.dc_unc);
505
612
BAIL_ON_PTR_ERROR(dc->dc_name, wbc_status);
510
if (!WBC_ERROR_IS_OK(wbc_status)) {
514
619
return wbc_status;
517
static wbcErr wbc_create_domain_controller_info_ex(TALLOC_CTX *mem_ctx,
518
const struct winbindd_response *resp,
622
static void wbcDomainControllerInfoExDestructor(void *ptr)
624
struct wbcDomainControllerInfoEx *i =
625
(struct wbcDomainControllerInfoEx *)ptr;
626
free((char *)(i->dc_unc));
627
free((char *)(i->dc_address));
628
free((char *)(i->domain_guid));
629
free((char *)(i->domain_name));
630
free((char *)(i->forest_name));
631
free((char *)(i->dc_site_name));
632
free((char *)(i->client_site_name));
635
static wbcErr wbc_create_domain_controller_info_ex(const struct winbindd_response *resp,
519
636
struct wbcDomainControllerInfoEx **_i)
521
638
wbcErr wbc_status = WBC_ERR_SUCCESS;
522
639
struct wbcDomainControllerInfoEx *i;
523
640
struct wbcGuid guid;
525
i = talloc(mem_ctx, struct wbcDomainControllerInfoEx);
642
i = (struct wbcDomainControllerInfoEx *)wbcAllocateMemory(
643
1, sizeof(struct wbcDomainControllerInfoEx),
644
wbcDomainControllerInfoExDestructor);
526
645
BAIL_ON_PTR_ERROR(i, wbc_status);
528
i->dc_unc = talloc_strdup(i, resp->data.dsgetdcname.dc_unc);
647
i->dc_unc = strdup(resp->data.dsgetdcname.dc_unc);
529
648
BAIL_ON_PTR_ERROR(i->dc_unc, wbc_status);
531
i->dc_address = talloc_strdup(i, resp->data.dsgetdcname.dc_address);
650
i->dc_address = strdup(resp->data.dsgetdcname.dc_address);
532
651
BAIL_ON_PTR_ERROR(i->dc_address, wbc_status);
534
653
i->dc_address_type = resp->data.dsgetdcname.dc_address_type;
536
655
wbc_status = wbcStringToGuid(resp->data.dsgetdcname.domain_guid, &guid);
537
656
if (WBC_ERROR_IS_OK(wbc_status)) {
538
i->domain_guid = talloc(i, struct wbcGuid);
657
i->domain_guid = (struct wbcGuid *)malloc(
658
sizeof(struct wbcGuid));
539
659
BAIL_ON_PTR_ERROR(i->domain_guid, wbc_status);
541
661
*i->domain_guid = guid;
543
i->domain_guid = NULL;
546
i->domain_name = talloc_strdup(i, resp->data.dsgetdcname.domain_name);
664
i->domain_name = strdup(resp->data.dsgetdcname.domain_name);
547
665
BAIL_ON_PTR_ERROR(i->domain_name, wbc_status);
549
667
if (resp->data.dsgetdcname.forest_name[0] != '\0') {
550
i->forest_name = talloc_strdup(i,
551
resp->data.dsgetdcname.forest_name);
668
i->forest_name = strdup(resp->data.dsgetdcname.forest_name);
552
669
BAIL_ON_PTR_ERROR(i->forest_name, wbc_status);
554
i->forest_name = NULL;
557
672
i->dc_flags = resp->data.dsgetdcname.dc_flags;
559
674
if (resp->data.dsgetdcname.dc_site_name[0] != '\0') {
560
i->dc_site_name = talloc_strdup(i,
561
resp->data.dsgetdcname.dc_site_name);
675
i->dc_site_name = strdup(resp->data.dsgetdcname.dc_site_name);
562
676
BAIL_ON_PTR_ERROR(i->dc_site_name, wbc_status);
564
i->dc_site_name = NULL;
567
679
if (resp->data.dsgetdcname.client_site_name[0] != '\0') {
568
i->client_site_name = talloc_strdup(i,
680
i->client_site_name = strdup(
569
681
resp->data.dsgetdcname.client_site_name);
570
682
BAIL_ON_PTR_ERROR(i->client_site_name, wbc_status);
572
i->client_site_name = NULL;
580
692
return wbc_status;
642
753
return wbc_status;
756
static void wbcNamedBlobDestructor(void *ptr)
758
struct wbcNamedBlob *b = (struct wbcNamedBlob *)ptr;
760
while (b->name != NULL) {
761
free((char *)(b->name));
645
767
/* Initialize a named blob and add to list of blobs */
646
768
wbcErr wbcAddNamedBlob(size_t *num_blobs,
647
struct wbcNamedBlob **blobs,
769
struct wbcNamedBlob **pblobs,
648
770
const char *name,
653
775
wbcErr wbc_status = WBC_ERR_UNKNOWN_FAILURE;
654
struct wbcNamedBlob blob;
656
*blobs = talloc_realloc(NULL, *blobs, struct wbcNamedBlob,
658
BAIL_ON_PTR_ERROR(*blobs, wbc_status);
660
blob.name = talloc_strdup(*blobs, name);
661
BAIL_ON_PTR_ERROR(blob.name, wbc_status);
663
blob.blob.length = length;
664
blob.blob.data = (uint8_t *)talloc_memdup(*blobs, data, length);
665
BAIL_ON_PTR_ERROR(blob.blob.data, wbc_status);
667
(*(blobs))[*num_blobs] = blob;
776
struct wbcNamedBlob *blobs, *blob;
779
return WBC_ERR_INVALID_PARAM;
783
* Overallocate the b->name==NULL terminator for
784
* wbcNamedBlobDestructor
786
blobs = (struct wbcNamedBlob *)wbcAllocateMemory(
787
*num_blobs + 2, sizeof(struct wbcNamedBlob),
788
wbcNamedBlobDestructor);
791
return WBC_ERR_NO_MEMORY;
794
if (*pblobs != NULL) {
795
struct wbcNamedBlob *old = *pblobs;
796
memcpy(blobs, old, sizeof(struct wbcNamedBlob) * (*num_blobs));
797
if (*num_blobs != 0) {
798
/* end indicator for wbcNamedBlobDestructor */
805
blob = &blobs[*num_blobs];
807
blob->name = strdup(name);
808
BAIL_ON_PTR_ERROR(blob->name, wbc_status);
811
blob->blob.length = length;
812
blob->blob.data = (uint8_t *)malloc(length);
813
BAIL_ON_PTR_ERROR(blob->blob.data, wbc_status);
814
memcpy(blob->blob.data, data, length);
670
820
wbc_status = WBC_ERR_SUCCESS;
672
if (!WBC_ERROR_IS_OK(wbc_status) && blobs) {
673
wbcFreeMemory(*blobs);
822
wbcFreeMemory(blobs);
675
823
return wbc_status;