/* * Copyright (c) 2000-2001 Apple Computer, Inc. All Rights Reserved. * * The contents of this file constitute Original Code as defined in and are * subject to the Apple Public Source License Version 1.2 (the 'License'). * You may not use this file except in compliance with the License. Please obtain * a copy of the License at http://www.apple.com/publicsource and read it before * using this file. * * This Original Code and all software distributed under the License are * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS * OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, INCLUDING WITHOUT * LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR * PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. Please see the License for the * specific language governing rights and limitations under the License. */ // // cssmmds - MDS interface for CSSM & friends // #ifdef __MWERKS__ #define _CPP_CSSMMDS #endif #include "cssmmds.h" #include ModuleNexus MdsComponent::mds; MdsComponent::MdsComponent(const Guid &guid) : mMyGuid(guid) { mIsValid = false; } MdsComponent::~MdsComponent() { } void MdsComponent::getInfo() const { rewind(mds().config); char buffer[1024]; while (fgets(buffer, sizeof(buffer), mds().config)) { static const char space[] = " \t\f"; char *p = buffer + strspn(buffer, space); if (*p == '#' || *p == '\0' || *p == '\n') continue; // comment or blank line // field 1: guid const char *guid = p; p += strcspn(p, space); if (!*p) CssmError::throwMe(CSSM_ERRCODE_MDS_ERROR); *p++ = '\0'; try { if (Guid(guid) != mMyGuid) continue; // no match this line } catch (const CssmCommonError &error) { if (error.cssmError() == CSSM_ERRCODE_INVALID_GUID) CssmError::throwMe(CSSM_ERRCODE_MDS_ERROR); // invalid file guid => MDS error throw; // pass all other errors } // field 2: flags/options p += strspn(p, space); mServices = 0; mIsThreadSafe = false; while (*p && !isspace(*p)) { switch (*p) { case 'a': mServices |= CSSM_SERVICE_AC; break; case 'c': mServices |= CSSM_SERVICE_CSP; break; case 'd': mServices |= CSSM_SERVICE_DL; break; case 'C': mServices |= CSSM_SERVICE_CL; break; case 't': mServices |= CSSM_SERVICE_TP; break; case 'm': mIsThreadSafe = true; break; default: CssmError::throwMe(CSSM_ERRCODE_MDS_ERROR); } p++; } if (!*p) CssmError::throwMe(CSSM_ERRCODE_MDS_ERROR); p += strspn(p, space); // skip space p[strlen(p)-1] = '\0'; // remove trailing newline mPath = p; // rest of line is pathname, uninterpreted mIsValid = true; return; } // not found in file CssmError::throwMe(CSSM_ERRCODE_INVALID_GUID); // @@@ should have "guid not found" error } #if !defined(_MDS_PATH) # define _MDS_PATH "/System/Library/Frameworks/Security.framework/Resources/MDS" #endif MdsComponent::MDS::MDS() { const char *path = getenv("MDSPATH"); if (path == NULL) path = getenv("MDSFILE"); if (path == NULL) path = _MDS_PATH; if (!(config = fopen(path, "r"))) CssmError::throwMe(CSSM_ERRCODE_MDS_ERROR); } MdsComponent::MDS::~MDS() { fclose(config); }