/* Unix SMB/CIFS implementation. Winbind client asynchronous API, utility functions Copyright (C) Gerald (Jerry) Carter 2007-2008 This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this program. If not, see . */ /* Required Headers */ #include "replace.h" #include "libwbclient.h" #include "../winbind_client.h" static void wbcNamedBlobDestructor(void *ptr) { struct wbcNamedBlob *b = (struct wbcNamedBlob *)ptr; while (b->name != NULL) { free(discard_const_p(char, b->name)); free(b->blob.data); b += 1; } } /* Initialize a named blob and add to list of blobs */ wbcErr wbcAddNamedBlob(size_t *num_blobs, struct wbcNamedBlob **pblobs, const char *name, uint32_t flags, uint8_t *data, size_t length) { wbcErr wbc_status = WBC_ERR_UNKNOWN_FAILURE; struct wbcNamedBlob *blobs, *blob; if (name == NULL) { return WBC_ERR_INVALID_PARAM; } /* * Overallocate the b->name==NULL terminator for * wbcNamedBlobDestructor */ blobs = (struct wbcNamedBlob *)wbcAllocateMemory( *num_blobs + 2, sizeof(struct wbcNamedBlob), wbcNamedBlobDestructor); if (blobs == NULL) { return WBC_ERR_NO_MEMORY; } if (*pblobs != NULL) { struct wbcNamedBlob *old = *pblobs; memcpy(blobs, old, sizeof(struct wbcNamedBlob) * (*num_blobs)); if (*num_blobs != 0) { /* end indicator for wbcNamedBlobDestructor */ old[0].name = NULL; } wbcFreeMemory(old); } *pblobs = blobs; blob = &blobs[*num_blobs]; blob->name = strdup(name); BAIL_ON_PTR_ERROR(blob->name, wbc_status); blob->flags = flags; blob->blob.length = length; blob->blob.data = (uint8_t *)malloc(length); BAIL_ON_PTR_ERROR(blob->blob.data, wbc_status); memcpy(blob->blob.data, data, length); *num_blobs += 1; *pblobs = blobs; blobs = NULL; wbc_status = WBC_ERR_SUCCESS; done: wbcFreeMemory(blobs); return wbc_status; }