#include <time.h>
#include <stdio.h>
#include "testParams.h"
#include <security_cdsa_client/mdsclient.h>
#define DO_PAUSE 0
using namespace Security;
static void freeAttrs(
CSSM_DB_RECORD_ATTRIBUTE_DATA_PTR recordAttrs)
{
unsigned i;
for(i=0; i<recordAttrs->NumberOfAttributes; i++) {
CSSM_DB_ATTRIBUTE_DATA_PTR attrData = &recordAttrs->AttributeData[i];
if(attrData == NULL) {
printf("***freeAttrs screwup: NULL attrData\n");
return;
}
unsigned j;
for(j=0; j<attrData->NumberOfValues; j++) {
CSSM_DATA_PTR data = &attrData->Value[j];
if(data == NULL) {
printf("***freeAttrs screwup: NULL data\n");
return;
}
free(data->Data);
data->Data = NULL;
data->Length = 0;
}
free(attrData->Value);
attrData->Value = NULL;
}
}
static int doLookup(
MDSClient::Directory &mds,
CSSM_DB_RECORDTYPE recordType,
const char *key, const void *valPtr,
unsigned valLen,
CSSM_DB_ATTRIBUTE_FORMAT valForm, CSSM_DB_OPERATOR valOp) {
CSSM_QUERY query;
CSSM_DB_UNIQUE_RECORD_PTR record = NULL;
CSSM_HANDLE resultHand;
CSSM_DB_RECORD_ATTRIBUTE_DATA recordAttrs;
CSSM_SELECTION_PREDICATE predicate;
CSSM_DATA predData;
CSSM_DB_ATTRIBUTE_DATA outAttr;
CSSM_DB_ATTRIBUTE_INFO_PTR attrInfo;
const char *attrName = "ModuleID";
recordAttrs.DataRecordType = recordType;
recordAttrs.SemanticInformation = 0;
recordAttrs.NumberOfAttributes = 1;
recordAttrs.AttributeData = &outAttr;
memset(&outAttr, 0, sizeof(CSSM_DB_ATTRIBUTE_DATA));
attrInfo = &outAttr.Info;
attrInfo->AttributeNameFormat = CSSM_DB_ATTRIBUTE_NAME_AS_STRING;
attrInfo->Label.AttributeName = (char *)attrName;
attrInfo->AttributeFormat = CSSM_DB_ATTRIBUTE_FORMAT_STRING;
predicate.DbOperator = valOp;
predicate.Attribute.Info.AttributeNameFormat = CSSM_DB_ATTRIBUTE_NAME_AS_STRING;
predicate.Attribute.Info.Label.AttributeName = (char *)key;
predicate.Attribute.Info.AttributeFormat = valForm;
predData.Data = (uint8 *)valPtr;
predData.Length = valLen;
predicate.Attribute.Value = &predData;
predicate.Attribute.NumberOfValues = 1;
query.RecordType = recordType;
query.Conjunctive = CSSM_DB_NONE;
query.NumSelectionPredicates = 1;
query.SelectionPredicate = &predicate;
query.QueryLimits.TimeLimit = 0; query.QueryLimits.SizeLimit = 1; query.QueryFlags = 0;
#if 0
printf("doLookup: mds.dlGetFirst unstable' skipping!\n");
return -1;
#else
try {
#if 0
resultHand = mds.dlGetFirst(query, recordAttrs, record);
#else
resultHand = mds.dlGetFirst(query, recordAttrs, NULL, record);
#endif
}
catch(...) {
printf("doLookup: dlGetFirst threw exception!\n");
return -1;
}
#endif
if(resultHand == 0) {
printf("doLookup: no record found\n");
return -1;
}
mds.dlFreeUniqueId(record);
freeAttrs(&recordAttrs);
mds.dlAbortQuery(resultHand);
return 0;
}
int mdsLookupInit(TestParams *tp)
{
return 0;
}
int mdsLookup(TestParams *testParams)
{
for(unsigned loopNum=0; loopNum<testParams->numLoops; loopNum++) {
if(testParams->verbose) {
printf("mdsLookup loop %d\n", loopNum);
}
else if(!testParams->quiet) {
printChar(testParams->progressChar);
}
try {
MDSClient::Directory &mds = MDSClient::mds();
uint32 val = CSSM_ALGID_SHA1;
if(doLookup(mds, MDS_CDSADIR_CSP_CAPABILITY_RECORDTYPE,
"AlgType", &val, sizeof(uint32),
CSSM_DB_ATTRIBUTE_FORMAT_UINT32, CSSM_DB_EQUAL)) {
printf("***thread %u aborting\n", testParams->threadNum);
return -1;
}
}
catch(CssmError &err) {
cssmPerror("MDS init", err.error);
printf("mdsLookup: MDSClient::mds() threw CssmError!\n");
return -1;
}
catch(...) {
printf("mdsLookup: MDSClient::mds() threw exception!\n");
return -1;
}
#if DO_PAUSE
fpurge(stdin);
printf("Hit CR to continue: ");
getchar();
#endif
}
return 0;
}