DWORD VmDirStringListFromMultiString( PCSTR pszMultiString, DWORD dwCountHint, // 0 if caller doesn't know PVMDIR_STRING_LIST *ppStrList ) { PVMDIR_STRING_LIST pStringList = NULL; DWORD dwError = 0; dwError = VmDirStringListInitialize(&pStringList, dwCountHint); BAIL_ON_VMDIR_ERROR(dwError); do { dwError = VmDirStringListAddStrClone(pszMultiString, pStringList); BAIL_ON_VMDIR_ERROR(dwError); pszMultiString += strlen(pszMultiString) + 1; } while (*pszMultiString != '\0'); *ppStrList = pStringList; cleanup: return dwError; error: VmDirStringListFree(pStringList); goto cleanup; }
static DWORD VmDirRegConfigMultiStringToStrList( PCSTR pszValues, PVMDIR_STRING_LIST* ppStrList ) { DWORD dwError = 0; DWORD dwValuesLen = 0; PCSTR pszIter = NULL; PVMDIR_STRING_LIST pStrList = NULL; if (pszValues) { pszIter = pszValues; while (pszIter != NULL && *pszIter != '\0') { dwValuesLen++; pszIter += VmDirStringLenA(pszIter) + 1; } dwError = VmDirStringListInitialize(&pStrList, dwValuesLen); BAIL_ON_VMDIR_ERROR(dwError); pszIter = pszValues; while (pszIter != NULL && *pszIter != '\0') { dwError = VmDirStringListAddStrClone(pszIter, pStrList); BAIL_ON_VMDIR_ERROR(dwError); pszIter += VmDirStringLenA(pszIter) + 1; } *ppStrList = pStrList; pStrList = NULL; } cleanup: if (pStrList) { VmDirStringListFree(pStrList); } return dwError; error: goto cleanup; }
// // Enumerates the objects at a certain DN. If you just want to verify that the // user can enumerate but don't care about the actual objects, pass NULL // for ppObjectList. // // NB -- The VMDIR_STRING_LIST returned contains full DNs for the individual // objects. // DWORD VmDirTestGetObjectList( LDAP *pLd, PCSTR pszDn, PVMDIR_STRING_LIST *ppObjectList /* OPTIONAL */ ) { DWORD dwError = 0; DWORD dwObjectCount = 0; PCSTR ppszAttrs[] = {NULL}; LDAPMessage *pResult = NULL; PVMDIR_STRING_LIST pObjectList = NULL; dwError = ldap_search_ext_s( pLd, pszDn, LDAP_SCOPE_SUBTREE, "(objectClass=*)", (PSTR*)ppszAttrs, 0, NULL, NULL, NULL, -1, &pResult); BAIL_ON_VMDIR_ERROR(dwError); if (ppObjectList != NULL) { dwObjectCount = ldap_count_entries(pLd, pResult); dwError = VmDirStringListInitialize(&pObjectList, dwObjectCount); BAIL_ON_VMDIR_ERROR(dwError); if (dwObjectCount > 0) { LDAPMessage* pEntry = ldap_first_entry(pLd, pResult); // // Grab the next entry. The first one will be the base DN itself. // pEntry = ldap_next_entry(pLd, pEntry); for (; pEntry != NULL; pEntry = ldap_next_entry(pLd, pEntry)) { dwError = VmDirStringListAddStrClone(ldap_get_dn(pLd, pEntry), pObjectList); BAIL_ON_VMDIR_ERROR(dwError); } } *ppObjectList = pObjectList; } cleanup: if (pResult) { ldap_msgfree(pResult); } return dwError; error: VmDirStringListFree(pObjectList); goto cleanup; }