find.c
来自「支持SSL v2/v3, TLS, PKCS #5, PKCS #7, PKCS」· C语言 代码 · 共 409 行
C
409 行
/* * The contents of this file are subject to the Mozilla Public * License Version 1.1 (the "License"); you may not use this file * except in compliance with the License. You may obtain a copy of * the License at http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or * implied. See the License for the specific language governing * rights and limitations under the License. * * The Original Code is the Netscape security libraries. * * The Initial Developer of the Original Code is Netscape * Communications Corporation. Portions created by Netscape are * Copyright (C) 1994-2000 Netscape Communications Corporation. All * Rights Reserved. * * Contributor(s): * * Alternatively, the contents of this file may be used under the * terms of the GNU General Public License Version 2 or later (the * "GPL"), in which case the provisions of the GPL are applicable * instead of those above. If you wish to allow use of your * version of this file only under the terms of the GPL and not to * allow others to use your version of this file under the MPL, * indicate your decision by deleting the provisions above and * replace them with the notice and other provisions required by * the GPL. If you do not delete the provisions above, a recipient * may use your version of this file under either the MPL or the * GPL. */#ifdef DEBUGstatic const char CVS_ID[] = "@(#) $RCSfile: find.c,v $ $Revision: 1.1 $ $Date: 2000/03/31 19:43:14 $ $Name: NSS_3_1_1_RTM $";#endif /* DEBUG *//* * find.c * * This file implements the nssCKFWFindObjects type and methods. */#ifndef CK_H#include "ck.h"#endif /* CK_H *//* * NSSCKFWFindObjects * * -- create/destroy -- * nssCKFWFindObjects_Create * nssCKFWFindObjects_Destroy * * -- public accessors -- * NSSCKFWFindObjects_GetMDFindObjects * * -- implement public accessors -- * nssCKFWFindObjects_GetMDFindObjects * * -- private accessors -- * * -- module fronts -- * nssCKFWFindObjects_Next */struct NSSCKFWFindObjectsStr { NSSCKFWMutex *mutex; /* merely to serialise the MDObject calls */ NSSCKMDFindObjects *mdfo1; NSSCKMDFindObjects *mdfo2; NSSCKFWSession *fwSession; NSSCKMDSession *mdSession; NSSCKFWToken *fwToken; NSSCKMDToken *mdToken; NSSCKFWInstance *fwInstance; NSSCKMDInstance *mdInstance; NSSCKMDFindObjects *mdFindObjects; /* varies */};#ifdef DEBUG/* * But first, the pointer-tracking stuff. * * NOTE: the pointer-tracking support in NSS/base currently relies * upon NSPR's CallOnce support. That, however, relies upon NSPR's * locking, which is tied into the runtime. We need a pointer-tracker * implementation that uses the locks supplied through C_Initialize. * That support, however, can be filled in later. So for now, I'll * just do these routines as no-ops. */static CK_RVfindObjects_add_pointer( const NSSCKFWFindObjects *fwFindObjects){ return CKR_OK;}static CK_RVfindObjects_remove_pointer( const NSSCKFWFindObjects *fwFindObjects){ return CKR_OK;}NSS_IMPLEMENT CK_RVnssCKFWFindObjects_verifyPointer( const NSSCKFWFindObjects *fwFindObjects){ return CKR_OK;}#endif /* DEBUG *//* * nssCKFWFindObjects_Create * */NSS_EXTERN NSSCKFWFindObjects *nssCKFWFindObjects_Create( NSSCKFWSession *fwSession, NSSCKFWToken *fwToken, NSSCKFWInstance *fwInstance, NSSCKMDFindObjects *mdFindObjects1, NSSCKMDFindObjects *mdFindObjects2, CK_RV *pError){ NSSCKFWFindObjects *fwFindObjects; NSSArena *arena; NSSCKMDSession *mdSession; NSSCKMDToken *mdToken; NSSCKMDInstance *mdInstance; mdSession = nssCKFWSession_GetMDSession(fwSession); mdToken = nssCKFWToken_GetMDToken(fwToken); mdInstance = nssCKFWInstance_GetMDInstance(fwInstance); arena = nssCKFWSession_GetArena(fwSession, pError); if( (NSSArena *)NULL == arena ) { goto loser; } fwFindObjects = nss_ZNEW(arena, NSSCKFWFindObjects); if( (NSSCKFWFindObjects *)NULL == fwFindObjects ) { *pError = CKR_HOST_MEMORY; goto loser; } fwFindObjects->mdfo1 = mdFindObjects1; fwFindObjects->mdfo2 = mdFindObjects2; fwFindObjects->fwSession = fwSession; fwFindObjects->mdSession = mdSession; fwFindObjects->fwToken = fwToken; fwFindObjects->mdToken = mdToken; fwFindObjects->fwInstance = fwInstance; fwFindObjects->mdInstance = mdInstance; fwFindObjects->mutex = nssCKFWInstance_CreateMutex(fwInstance, arena, pError); if( (NSSCKFWMutex *)NULL == fwFindObjects->mutex ) { goto loser; }#ifdef DEBUG *pError = findObjects_add_pointer(fwFindObjects); if( CKR_OK != *pError ) { goto loser; }#endif /* DEBUG */ return fwFindObjects; loser: nss_ZFreeIf(fwFindObjects); if( (NSSCKMDFindObjects *)NULL != mdFindObjects1 ) { if( (void *)NULL != (void *)mdFindObjects1->Final ) { fwFindObjects->mdFindObjects = mdFindObjects1; mdFindObjects1->Final(mdFindObjects1, fwFindObjects, mdSession, fwSession, mdToken, fwToken, mdInstance, fwInstance); } } if( (NSSCKMDFindObjects *)NULL != mdFindObjects2 ) { if( (void *)NULL != (void *)mdFindObjects2->Final ) { fwFindObjects->mdFindObjects = mdFindObjects2; mdFindObjects2->Final(mdFindObjects2, fwFindObjects, mdSession, fwSession, mdToken, fwToken, mdInstance, fwInstance); } } if( CKR_OK == *pError ) { *pError = CKR_GENERAL_ERROR; } return (NSSCKFWFindObjects *)NULL;}/* * nssCKFWFindObjects_Destroy * */NSS_EXTERN voidnssCKFWFindObjects_Destroy( NSSCKFWFindObjects *fwFindObjects){#ifdef NSSDEBUG if( CKR_OK != nssCKFWFindObjects_verifyPointer(fwFindObjects) ) { return; }#endif /* NSSDEBUG */ (void)nssCKFWMutex_Destroy(fwFindObjects->mutex); if( (NSSCKMDFindObjects *)NULL != fwFindObjects->mdfo1 ) { if( (void *)NULL != (void *)fwFindObjects->mdfo1->Final ) { fwFindObjects->mdFindObjects = fwFindObjects->mdfo1; fwFindObjects->mdfo1->Final(fwFindObjects->mdfo1, fwFindObjects, fwFindObjects->mdSession, fwFindObjects->fwSession, fwFindObjects->mdToken, fwFindObjects->fwToken, fwFindObjects->mdInstance, fwFindObjects->fwInstance); } } if( (NSSCKMDFindObjects *)NULL != fwFindObjects->mdfo2 ) { if( (void *)NULL != (void *)fwFindObjects->mdfo2->Final ) { fwFindObjects->mdFindObjects = fwFindObjects->mdfo2; fwFindObjects->mdfo2->Final(fwFindObjects->mdfo2, fwFindObjects, fwFindObjects->mdSession, fwFindObjects->fwSession, fwFindObjects->mdToken, fwFindObjects->fwToken, fwFindObjects->mdInstance, fwFindObjects->fwInstance); } } nss_ZFreeIf(fwFindObjects);#ifdef DEBUG (void)findObjects_remove_pointer(fwFindObjects);#endif /* DEBUG */ return;}/* * nssCKFWFindObjects_GetMDFindObjects * */NSS_EXTERN NSSCKMDFindObjects *nssCKFWFindObjects_GetMDFindObjects( NSSCKFWFindObjects *fwFindObjects){#ifdef NSSDEBUG if( CKR_OK != nssCKFWFindObjects_verifyPointer(fwFindObjects) ) { return (NSSCKMDFindObjects *)NULL; }#endif /* NSSDEBUG */ return fwFindObjects->mdFindObjects;}/* * nssCKFWFindObjects_Next * */NSS_EXTERN NSSCKFWObject *nssCKFWFindObjects_Next( NSSCKFWFindObjects *fwFindObjects, NSSArena *arenaOpt, CK_RV *pError){ NSSCKMDObject *mdObject; NSSCKFWObject *fwObject = (NSSCKFWObject *)NULL; NSSArena *objArena;#ifdef NSSDEBUG if( (CK_RV *)NULL == pError ) { return (NSSCKFWObject *)NULL; } *pError = nssCKFWFindObjects_verifyPointer(fwFindObjects); if( CKR_OK != *pError ) { return (NSSCKFWObject *)NULL; }#endif /* NSSDEBUG */ *pError = nssCKFWMutex_Lock(fwFindObjects->mutex); if( CKR_OK != *pError ) { return (NSSCKFWObject *)NULL; } if( (NSSCKMDFindObjects *)NULL != fwFindObjects->mdfo1 ) { if( (void *)NULL != (void *)fwFindObjects->mdfo1->Next ) { fwFindObjects->mdFindObjects = fwFindObjects->mdfo1; mdObject = fwFindObjects->mdfo1->Next(fwFindObjects->mdfo1, fwFindObjects, fwFindObjects->mdSession, fwFindObjects->fwSession, fwFindObjects->mdToken, fwFindObjects->fwToken, fwFindObjects->mdInstance, fwFindObjects->fwInstance, arenaOpt, pError); if( (NSSCKMDObject *)NULL == mdObject ) { if( CKR_OK != *pError ) { goto done; } /* All done. */ fwFindObjects->mdfo1->Final(fwFindObjects->mdfo1, fwFindObjects, fwFindObjects->mdSession, fwFindObjects->fwSession, fwFindObjects->mdToken, fwFindObjects->fwToken, fwFindObjects->mdInstance, fwFindObjects->fwInstance); fwFindObjects->mdfo1 = (NSSCKMDFindObjects *)NULL; } else { goto wrap; } } } if( (NSSCKMDFindObjects *)NULL != fwFindObjects->mdfo2 ) { if( (void *)NULL != (void *)fwFindObjects->mdfo2->Next ) { fwFindObjects->mdFindObjects = fwFindObjects->mdfo2; mdObject = fwFindObjects->mdfo2->Next(fwFindObjects->mdfo2, fwFindObjects, fwFindObjects->mdSession, fwFindObjects->fwSession, fwFindObjects->mdToken, fwFindObjects->fwToken, fwFindObjects->mdInstance, fwFindObjects->fwInstance, arenaOpt, pError); if( (NSSCKMDObject *)NULL == mdObject ) { if( CKR_OK != *pError ) { goto done; } /* All done. */ fwFindObjects->mdfo2->Final(fwFindObjects->mdfo2, fwFindObjects, fwFindObjects->mdSession, fwFindObjects->fwSession, fwFindObjects->mdToken, fwFindObjects->fwToken, fwFindObjects->mdInstance, fwFindObjects->fwInstance); fwFindObjects->mdfo2 = (NSSCKMDFindObjects *)NULL; } else { goto wrap; } } } /* No more objects */ *pError = CKR_OK; goto done; wrap: /* * This is less than ideal-- we should determine if it's a token * object or a session object, and use the appropriate arena. * But that duplicates logic in nssCKFWObject_IsTokenObject. * Worry about that later. For now, be conservative, and use * the token arena. */ objArena = nssCKFWToken_GetArena(fwFindObjects->fwToken, pError); if( (NSSArena *)NULL == objArena ) { if( CKR_OK == *pError ) { *pError = CKR_HOST_MEMORY; } goto done; } fwObject = nssCKFWObject_Create(objArena, mdObject, fwFindObjects->fwSession, fwFindObjects->fwToken, fwFindObjects->fwInstance, pError); if( (NSSCKFWObject *)NULL == fwObject ) { if( CKR_OK == *pError ) { *pError = CKR_GENERAL_ERROR; } } done: (void)nssCKFWMutex_Unlock(fwFindObjects->mutex); return fwObject;}/* * NSSCKFWFindObjects_GetMDFindObjects * */NSS_EXTERN NSSCKMDFindObjects *NSSCKFWFindObjects_GetMDFindObjects( NSSCKFWFindObjects *fwFindObjects){#ifdef DEBUG if( CKR_OK != nssCKFWFindObjects_verifyPointer(fwFindObjects) ) { return (NSSCKMDFindObjects *)NULL; }#endif /* DEBUG */ return nssCKFWFindObjects_GetMDFindObjects(fwFindObjects);}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?