BioAPI_RETURN BioAPI BioAPI_EnumModules(BioAPI_BSP_SCHEMA * BspSchemaArray, uint32 ArraySize, uint32 * ElementsNeeded, uint32 * NumElementsReturned) { BioAPI_RETURN err; MDSU_CONTEXT MdsuContext; BioAPI_BSP_SCHEMA BioAPICapTemplate; BioAPI_BSP_SCHEMA BioAPICapData; BioAPI_BSP_SCHEMA * CurrentSchemaPtr; uint32 Count; /* Initialize in case of early return (usually caused by no installed modules) */ *NumElementsReturned = 0; *ElementsNeeded = 0; if((err = MDSU_Init(&MdsuContext, &BioAPIMemoryFuncs, &bioapi_UUID, MDS_CDSA_DIRECTORY, (CSSM_DB_ACCESS_READ | CSSM_DB_ACCESS_WRITE), BIOAPI_MDS_COMMIT_SIZE)) != BioAPI_OK) return err; /* Handle the simple case first...NULL passed for BspSchemaArray */ if(BspSchemaArray == NULL) { Count = 0; BioAPICapTemplate.SpecVersion.Major = BioAPI_MAJOR; BioAPICapTemplate.SpecVersion.Minor = BioAPI_MINOR; err = MDSU_FindFirst(&MdsuContext, &IfiMdsuBioAPIBspCapabilitySchema, &BioAPICapTemplate, MDSU_BIOAPI_BSP_CAP_SPECVERSION, &BioAPICapData, NULL); if (CSSM_OK != err) { MDSU_Term( &MdsuContext ); if (CSSMERR_DL_ENDOFDATA == err) return BioAPIERR_H_FRAMEWORK_FUNCTION_FAILED; return err; } while(CSSM_OK == err) { Count ++; err = MDSU_FindNext(&MdsuContext, &BioAPICapData, NULL); } *ElementsNeeded = Count; } else { if(ArraySize == 0) return BioAPI_ERRCODE_INVALID_DATA; Count = 0; CurrentSchemaPtr = BspSchemaArray; BioAPICapTemplate.SpecVersion.Major = BioAPI_MAJOR; BioAPICapTemplate.SpecVersion.Minor = BioAPI_MINOR; err = MDSU_FindFirst(&MdsuContext, &IfiMdsuBioAPIBspCapabilitySchema, &BioAPICapTemplate, MDSU_BIOAPI_BSP_CAP_SPECVERSION, &BioAPICapData, NULL); if (CSSM_OK != err) { MDSU_Term( &MdsuContext ); return err; } while(CSSM_OK == err) { Count ++; if(Count <= ArraySize) { memcpy(CurrentSchemaPtr, &BioAPICapData, sizeof(BioAPI_BSP_SCHEMA)); CurrentSchemaPtr++; } err = MDSU_FindNext(&MdsuContext, &BioAPICapData, NULL); } if(Count > ArraySize) { *NumElementsReturned = ArraySize; } else { *NumElementsReturned = Count; } *ElementsNeeded = Count; } MDSU_Term( &MdsuContext ); return (BioAPI_OK); }
BioAPI_RETURN BioAPI BioAPI_EnumDevices(const BioAPI_UUID *uuid, BioAPI_DEVICE_SCHEMA * DeviceSchemaArray, uint32 ArraySize, uint32 * ElementsNeeded, uint32 * NumElementsReturned) { BioAPI_RETURN err; MDSU_CONTEXT MdsuContext; BioAPI_DEVICE_SCHEMA DeviceTemplate; BioAPI_DEVICE_SCHEMA DeviceData; BioAPI_DEVICE_SCHEMA * CurrentSchemaPtr; uint32 Count; /* Initialize in case of early return (usually caused by no installed devices) */ *NumElementsReturned = 0; *ElementsNeeded = 0; if((err = MDSU_Init(&MdsuContext, &BioAPIMemoryFuncs, uuid, MDS_CDSA_DIRECTORY, (CSSM_DB_ACCESS_READ | CSSM_DB_ACCESS_WRITE), BIOAPI_MDS_COMMIT_SIZE)) != BioAPI_OK) return err; /* Handle the simple case first...NULL passed for DeviceSchemaArray */ if(DeviceSchemaArray == NULL) { Count = 0; BioAPI_CopyUuid (DeviceTemplate.ModuleId, uuid); ERR(err = MDSU_FindFirst(&MdsuContext, &IfiMdsuBioAPIBspDeviceSchema, &DeviceTemplate, MDSU_BIOAPI_DEV_MODULEID, &DeviceData, NULL)); if (CSSM_OK != err) { MDSU_Term( &MdsuContext ); return err; } while(CSSM_OK == err) { Count ++; err = MDSU_FindNext(&MdsuContext, &DeviceData, NULL); } *ElementsNeeded = Count; } else { if(ArraySize == 0) return BioAPI_ERRCODE_INVALID_DATA; Count = 0; CurrentSchemaPtr = DeviceSchemaArray; BioAPI_CopyUuid (DeviceTemplate.ModuleId, uuid); err = MDSU_FindFirst(&MdsuContext, &IfiMdsuBioAPIBspCapabilitySchema, &DeviceTemplate, MDSU_BIOAPI_DEV_MODULEID, &DeviceData, NULL); if (CSSM_OK != err) { MDSU_Term( &MdsuContext ); return err; } while(CSSM_OK == err) { Count ++; if(Count <= ArraySize) { memcpy(CurrentSchemaPtr, &DeviceData, sizeof(BioAPI_DEVICE_SCHEMA)); CurrentSchemaPtr++; } err = MDSU_FindNext(&MdsuContext, &DeviceData, NULL); } if(Count > ArraySize) { *NumElementsReturned = ArraySize; } else { *NumElementsReturned = Count; } *ElementsNeeded = Count; } MDSU_Term( &MdsuContext ); return (BioAPI_OK); }
static CSSM_RETURN __CleanMDS( MDSU_CONTEXT *pContext ) { CSSM_RETURN rv = CSSM_OK; MDSU_CDSA_COMMON_SCHEMA CommonTemplate; MDSU_CDSA_COMMON_SCHEMA CommonData; MDSU_CDSA_DL_PRIMARY_SCHEMA DLPrimaryTemplate; MDSU_CDSA_DL_PRIMARY_SCHEMA DLPrimaryData; MDSU_CDSA_DL_ENC_PRODUCT_SCHEMA DLEncProdTemplate; MDSU_CDSA_DL_ENC_PRODUCT_SCHEMA DLEncProdData; /* Execute a search on every DL record type to get a handle of all * records and then delete them. */ /* Common Schema */ CommonTemplate.ModuleID = MODULE_GUID; rv = MDSU_FindFirst( pContext, &IfiMdsuCdsadirCommonSchema, &CommonTemplate, MDSU_COM_MODULE_ID, &CommonData, NULL ); while ( rv == CSSM_OK ) { if ( CommonData.Manifest.Data ) { MDSU_free( pContext, CommonData.Manifest.Data ); } rv = MDSU_FindNext( pContext, &CommonData, NULL ); } if ( rv == CSSMERR_DL_ENDOFDATA ) { /* DL Primary Schema */ DLPrimaryTemplate.ModuleID = MODULE_GUID; rv = MDSU_FindFirst( pContext, &IfiMdsuCdsadirDLPrimarySchema, &DLPrimaryTemplate, MDSU_DLP_MODULE_ID, &DLPrimaryData, NULL ); while ( rv == CSSM_OK ) { if ( DLPrimaryData.Manifest.Data ) { MDSU_free( pContext, DLPrimaryData.Manifest.Data ); } rv = MDSU_FindNext( pContext, &DLPrimaryData, NULL ); } if ( rv == CSSMERR_DL_ENDOFDATA ) { /* DL Encapsulated Product Schema */ DLEncProdTemplate.ModuleID = MODULE_GUID; rv = MDSU_FindFirst( pContext, &IfiMdsuCdsadirDLEncProductSchema, &DLEncProdTemplate, MDSU_DLEP_MODULE_ID, &DLEncProdData, NULL ); while ( rv == CSSM_OK ) { rv = MDSU_FindNext( pContext, &DLEncProdData, NULL ); } if ( rv == CSSMERR_DL_ENDOFDATA ) { /* Flush everything from the MDS */ rv = MDSU_Revert( pContext ); } /* CSP Encapsulated Product removed */ } /* CSP Primary removed */ } /* Common removed */ /* Make sure nothing gets removed if there is an error */ if ( ( rv != CSSMERR_DL_ENDOFDATA ) && ( rv != CSSM_OK ) ) { MDSU_Commit( pContext ); } return rv; }