/* * Read schema definition from file * We only care for * attributetypes * objectclasses * ditcontentrules * attributeindices */ DWORD VmDirReadSchemaFile( PCSTR pszSchemaFilePath, PVMDIR_STRING_LIST* ppAtStrList, PVMDIR_STRING_LIST* ppOcStrList, PVMDIR_STRING_LIST* ppCrStrList, PVMDIR_STRING_LIST* ppIdxStrList ) { DWORD dwError = 0; CHAR pbuf[1024] = {0}; FILE* fp = NULL; PVMDIR_STRING_LIST pAtStrList = NULL; PVMDIR_STRING_LIST pOcStrList = NULL; PVMDIR_STRING_LIST pCrStrList = NULL; PVMDIR_STRING_LIST pIdxStrList = NULL; if (!pszSchemaFilePath || !ppAtStrList || !ppOcStrList || !ppCrStrList || !ppIdxStrList) { BAIL_WITH_VMDIR_ERROR(dwError, VMDIR_ERROR_INVALID_PARAMETER); } dwError = VmDirStringListInitialize(&pAtStrList, 2048); BAIL_ON_VMDIR_ERROR(dwError); dwError = VmDirStringListInitialize(&pOcStrList, 512); BAIL_ON_VMDIR_ERROR(dwError); dwError = VmDirStringListInitialize(&pCrStrList, 512); BAIL_ON_VMDIR_ERROR(dwError); dwError = VmDirStringListInitialize(&pIdxStrList, 16); BAIL_ON_VMDIR_ERROR(dwError); #ifndef _WIN32 fp = fopen(pszSchemaFilePath, "r"); #else if (fopen_s(&fp, pszSchemaFilePath, "r") != 0) { fp = NULL; } #endif if (NULL == fp) { dwError = errno; VMDIR_LOG_ERROR(VMDIR_LOG_MASK_ALL, "Open schema file (%s) failed. Error (%d)", pszSchemaFilePath, dwError); BAIL_ON_VMDIR_ERROR(dwError); } while (fgets(pbuf, sizeof(pbuf), fp) != NULL) { PSTR pszTag = NULL; if ((pbuf[0] == '\n') || (pbuf[0] == '#') || (pbuf[0] != ' ' && (pszTag = VmDirStringChrA(pbuf, ':')) == NULL)) { continue; } if (IS_ATTRIBUTETYPES_TAG(pbuf)) { dwError = _VmDirReadOneDefFromFile(fp, pAtStrList); BAIL_ON_VMDIR_ERROR(dwError); } else if (IS_OBJECTCLASSES_TAG(pbuf)) { dwError = _VmDirReadOneDefFromFile(fp, pOcStrList); BAIL_ON_VMDIR_ERROR(dwError); } else if (IS_CONTENTRULES_TAG(pbuf)) { dwError = _VmDirReadOneDefFromFile(fp, pCrStrList); BAIL_ON_VMDIR_ERROR(dwError); } else if (IS_ATTRIBUTEINDICES_TAG(pbuf)) { dwError = _VmDirReadOneDefFromFile(fp, pIdxStrList); BAIL_ON_VMDIR_ERROR(dwError); } else { continue; } } *ppAtStrList = pAtStrList; *ppOcStrList = pOcStrList; *ppCrStrList = pCrStrList; *ppIdxStrList = pIdxStrList; cleanup: if (fp) { fclose(fp); } return dwError; error: VmDirStringListFree(pAtStrList); VmDirStringListFree(pOcStrList); VmDirStringListFree(pCrStrList); VmDirStringListFree(pIdxStrList); goto cleanup; }
/* * This function is only for testing purpose. * It call load and verify to validate schema definition integrity. */ DWORD UnitTestSchemaInstanceInit( PSTR* ppszDescs, DWORD dwDescsSize, PVDIR_SCHEMA_INSTANCE* ppSchema ) { DWORD dwError = 0; DWORD dwCnt = 0; DWORD dwIdx = 0; USHORT dwATSize = 0; USHORT dwOCSize = 0; USHORT dwCRSize = 0; USHORT dwSRSize = 0; USHORT dwNFSize = 0; PVDIR_SCHEMA_INSTANCE pSchema = NULL; PSTR pszTmp = NULL; qsort(ppszDescs, dwDescsSize, sizeof(*ppszDescs), schemaInitPPSTRCmp); for (dwCnt=0; dwCnt < dwDescsSize; dwCnt++) { if (IS_ATTRIBUTETYPES_TAG(ppszDescs[dwCnt])) { dwATSize++; } else if (IS_OBJECTCLASSES_TAG(ppszDescs[dwCnt])) { dwOCSize++; } else if (IS_CONTENTRULES_TAG(ppszDescs[dwCnt])) { dwCRSize++; } else if (IS_STRUCTURERULES_TAG(ppszDescs[dwCnt])) { dwSRSize++; } else if (IS_NAMEFORM_TAG(ppszDescs[dwCnt])) { dwNFSize++; } } dwError = VdirSchemaInstanceAllocate(&pSchema, dwATSize, dwOCSize, dwCRSize, dwSRSize, dwNFSize); BAIL_ON_VMDIR_ERROR(dwError); for (dwCnt=0, dwIdx = 0; dwCnt < dwDescsSize; dwCnt++) { if (IS_ATTRIBUTETYPES_TAG(ppszDescs[dwCnt])) { dwError = VmDirSchemaParseStrToATDesc( ppszDescs[dwCnt], pSchema->ats.pATSortName+dwIdx); BAIL_ON_VMDIR_ERROR(dwError); dwIdx++; } } for (dwCnt=0, dwIdx = 0; dwCnt < dwDescsSize ; dwCnt++) { if (IS_OBJECTCLASSES_TAG(ppszDescs[dwCnt])) { dwError = VmDirSchemaParseStrToOCDesc( ppszDescs[dwCnt], pSchema->ocs.pOCSortName+dwIdx); BAIL_ON_VMDIR_ERROR(dwError); dwIdx++; } } for (dwCnt=0, dwIdx = 0; dwCnt < dwDescsSize ; dwCnt++) { if (IS_CONTENTRULES_TAG(ppszDescs[dwCnt])) { dwError = VmDirSchemaParseStrToContentDesc( ppszDescs[dwCnt], pSchema->contentRules.pContentSortName+dwIdx); BAIL_ON_VMDIR_ERROR(dwError); dwIdx++; } } for (dwCnt=0, dwIdx = 0; dwCnt < dwDescsSize ; dwCnt++) { if (IS_STRUCTURERULES_TAG(ppszDescs[dwCnt])) { dwError = VmDirSchemaParseStrToStructureDesc( ppszDescs[dwCnt], pSchema->structureRules.pStructureSortRuleID+dwIdx); BAIL_ON_VMDIR_ERROR(dwError); dwIdx++; } } for (dwCnt=0, dwIdx = 0; dwCnt < dwDescsSize ; dwCnt++) { if (IS_NAMEFORM_TAG(ppszDescs[dwCnt])) { dwError = VmDirSchemaParseStrToNameformDesc( ppszDescs[dwCnt], pSchema->nameForms.pNameFormSortName + dwIdx); BAIL_ON_VMDIR_ERROR(dwError); dwIdx++; } } #ifdef LDAP_DEBUG for (dwCnt = 0; dwCnt < dwOCSize; dwCnt ++) { VMDIR_SAFE_FREE_MEMORY(pszTmp); VdirSchemaVerifyOCDescPrint( pSchema->ocs.pOCSortName+dwCnt, &pszTmp); printf("%s\n", VDIR_SAFE_STRING(pszTmp)); } for (dwCnt = 0; dwCnt < dwATSize; dwCnt ++) { VMDIR_SAFE_FREE_MEMORY(pszTmp); VdirSchemaVerifyATDescPrint( pSchema->ats.pATSortName+dwCnt, &pszTmp); printf("%s\n", VDIR_SAFE_STRING(pszTmp)); } #endif dwError = VmDirSchemaLoadInstance(pSchema); BAIL_ON_VMDIR_ERROR(dwError); if (! VmDirSchemaVerifyIntegrity(pSchema)) { dwError = ERROR_INVALID_SCHEMA; BAIL_ON_VMDIR_ERROR(dwError); } *ppSchema = pSchema; cleanup: VMDIR_SAFE_FREE_MEMORY(pszTmp); return dwError; error: if (pSchema) { VdirSchemaInstanceFree(pSchema); } *ppSchema = NULL; goto cleanup; }