find.c (3484B)
1 /* This Source Code Form is subject to the terms of the Mozilla Public 2 * License, v. 2.0. If a copy of the MPL was not distributed with this 3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 4 5 #include "ckdbm.h" 6 7 static void 8 nss_dbm_mdFindObjects_Final( 9 NSSCKMDFindObjects *mdFindObjects, 10 NSSCKFWFindObjects *fwFindObjects, 11 NSSCKMDSession *mdSession, 12 NSSCKFWSession *fwSession, 13 NSSCKMDToken *mdToken, 14 NSSCKFWToken *fwToken, 15 NSSCKMDInstance *mdInstance, 16 NSSCKFWInstance *fwInstance) 17 { 18 nss_dbm_find_t *find = (nss_dbm_find_t *)mdFindObjects->etc; 19 20 /* Locks might have system resources associated */ 21 (void)NSSCKFWMutex_Destroy(find->list_lock); 22 (void)NSSArena_Destroy(find->arena); 23 } 24 25 static NSSCKMDObject * 26 nss_dbm_mdFindObjects_Next( 27 NSSCKMDFindObjects *mdFindObjects, 28 NSSCKFWFindObjects *fwFindObjects, 29 NSSCKMDSession *mdSession, 30 NSSCKFWSession *fwSession, 31 NSSCKMDToken *mdToken, 32 NSSCKFWToken *fwToken, 33 NSSCKMDInstance *mdInstance, 34 NSSCKFWInstance *fwInstance, 35 NSSArena *arena, 36 CK_RV *pError) 37 { 38 nss_dbm_find_t *find = (nss_dbm_find_t *)mdFindObjects->etc; 39 struct nss_dbm_dbt_node *node; 40 nss_dbm_object_t *object; 41 NSSCKMDObject *rv; 42 43 while (1) { 44 /* Lock */ 45 { 46 *pError = NSSCKFWMutex_Lock(find->list_lock); 47 if (CKR_OK != *pError) { 48 return (NSSCKMDObject *)NULL; 49 } 50 51 node = find->found; 52 if ((struct nss_dbm_dbt_node *)NULL != node) { 53 find->found = node->next; 54 } 55 56 *pError = NSSCKFWMutex_Unlock(find->list_lock); 57 if (CKR_OK != *pError) { 58 /* screwed now */ 59 return (NSSCKMDObject *)NULL; 60 } 61 } 62 63 if ((struct nss_dbm_dbt_node *)NULL == node) { 64 break; 65 } 66 67 if (nss_dbm_db_object_still_exists(node->dbt)) { 68 break; 69 } 70 } 71 72 if ((struct nss_dbm_dbt_node *)NULL == node) { 73 *pError = CKR_OK; 74 return (NSSCKMDObject *)NULL; 75 } 76 77 object = nss_ZNEW(arena, nss_dbm_object_t); 78 if ((nss_dbm_object_t *)NULL == object) { 79 *pError = CKR_HOST_MEMORY; 80 return (NSSCKMDObject *)NULL; 81 } 82 83 object->arena = arena; 84 object->handle = nss_ZNEW(arena, nss_dbm_dbt_t); 85 if ((nss_dbm_dbt_t *)NULL == object->handle) { 86 *pError = CKR_HOST_MEMORY; 87 return (NSSCKMDObject *)NULL; 88 } 89 90 object->handle->my_db = node->dbt->my_db; 91 object->handle->dbt.size = node->dbt->dbt.size; 92 object->handle->dbt.data = nss_ZAlloc(arena, node->dbt->dbt.size); 93 if ((void *)NULL == object->handle->dbt.data) { 94 *pError = CKR_HOST_MEMORY; 95 return (NSSCKMDObject *)NULL; 96 } 97 98 (void)memcpy(object->handle->dbt.data, node->dbt->dbt.data, node->dbt->dbt.size); 99 100 rv = nss_dbm_mdObject_factory(object, pError); 101 if ((NSSCKMDObject *)NULL == rv) { 102 return (NSSCKMDObject *)NULL; 103 } 104 105 return rv; 106 } 107 108 NSS_IMPLEMENT NSSCKMDFindObjects * 109 nss_dbm_mdFindObjects_factory( 110 nss_dbm_find_t *find, 111 CK_RV *pError) 112 { 113 NSSCKMDFindObjects *rv; 114 115 rv = nss_ZNEW(find->arena, NSSCKMDFindObjects); 116 if ((NSSCKMDFindObjects *)NULL == rv) { 117 *pError = CKR_HOST_MEMORY; 118 return (NSSCKMDFindObjects *)NULL; 119 } 120 121 rv->etc = (void *)find; 122 rv->Final = nss_dbm_mdFindObjects_Final; 123 rv->Next = nss_dbm_mdFindObjects_Next; 124 125 return rv; 126 }