|
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 ( |
|
10 NSSCKMDFindObjects *mdFindObjects, |
|
11 NSSCKFWFindObjects *fwFindObjects, |
|
12 NSSCKMDSession *mdSession, |
|
13 NSSCKFWSession *fwSession, |
|
14 NSSCKMDToken *mdToken, |
|
15 NSSCKFWToken *fwToken, |
|
16 NSSCKMDInstance *mdInstance, |
|
17 NSSCKFWInstance *fwInstance |
|
18 ) |
|
19 { |
|
20 nss_dbm_find_t *find = (nss_dbm_find_t *)mdFindObjects->etc; |
|
21 |
|
22 /* Locks might have system resources associated */ |
|
23 (void)NSSCKFWMutex_Destroy(find->list_lock); |
|
24 (void)NSSArena_Destroy(find->arena); |
|
25 } |
|
26 |
|
27 |
|
28 static NSSCKMDObject * |
|
29 nss_dbm_mdFindObjects_Next |
|
30 ( |
|
31 NSSCKMDFindObjects *mdFindObjects, |
|
32 NSSCKFWFindObjects *fwFindObjects, |
|
33 NSSCKMDSession *mdSession, |
|
34 NSSCKFWSession *fwSession, |
|
35 NSSCKMDToken *mdToken, |
|
36 NSSCKFWToken *fwToken, |
|
37 NSSCKMDInstance *mdInstance, |
|
38 NSSCKFWInstance *fwInstance, |
|
39 NSSArena *arena, |
|
40 CK_RV *pError |
|
41 ) |
|
42 { |
|
43 nss_dbm_find_t *find = (nss_dbm_find_t *)mdFindObjects->etc; |
|
44 struct nss_dbm_dbt_node *node; |
|
45 nss_dbm_object_t *object; |
|
46 NSSCKMDObject *rv; |
|
47 |
|
48 while(1) { |
|
49 /* Lock */ |
|
50 { |
|
51 *pError = NSSCKFWMutex_Lock(find->list_lock); |
|
52 if( CKR_OK != *pError ) { |
|
53 return (NSSCKMDObject *)NULL; |
|
54 } |
|
55 |
|
56 node = find->found; |
|
57 if( (struct nss_dbm_dbt_node *)NULL != node ) { |
|
58 find->found = node->next; |
|
59 } |
|
60 |
|
61 *pError = NSSCKFWMutex_Unlock(find->list_lock); |
|
62 if( CKR_OK != *pError ) { |
|
63 /* screwed now */ |
|
64 return (NSSCKMDObject *)NULL; |
|
65 } |
|
66 } |
|
67 |
|
68 if( (struct nss_dbm_dbt_node *)NULL == node ) { |
|
69 break; |
|
70 } |
|
71 |
|
72 if( nss_dbm_db_object_still_exists(node->dbt) ) { |
|
73 break; |
|
74 } |
|
75 } |
|
76 |
|
77 if( (struct nss_dbm_dbt_node *)NULL == node ) { |
|
78 *pError = CKR_OK; |
|
79 return (NSSCKMDObject *)NULL; |
|
80 } |
|
81 |
|
82 object = nss_ZNEW(arena, nss_dbm_object_t); |
|
83 if( (nss_dbm_object_t *)NULL == object ) { |
|
84 *pError = CKR_HOST_MEMORY; |
|
85 return (NSSCKMDObject *)NULL; |
|
86 } |
|
87 |
|
88 object->arena = arena; |
|
89 object->handle = nss_ZNEW(arena, nss_dbm_dbt_t); |
|
90 if( (nss_dbm_dbt_t *)NULL == object->handle ) { |
|
91 *pError = CKR_HOST_MEMORY; |
|
92 return (NSSCKMDObject *)NULL; |
|
93 } |
|
94 |
|
95 object->handle->my_db = node->dbt->my_db; |
|
96 object->handle->dbt.size = node->dbt->dbt.size; |
|
97 object->handle->dbt.data = nss_ZAlloc(arena, node->dbt->dbt.size); |
|
98 if( (void *)NULL == object->handle->dbt.data ) { |
|
99 *pError = CKR_HOST_MEMORY; |
|
100 return (NSSCKMDObject *)NULL; |
|
101 } |
|
102 |
|
103 (void)memcpy(object->handle->dbt.data, node->dbt->dbt.data, node->dbt->dbt.size); |
|
104 |
|
105 rv = nss_dbm_mdObject_factory(object, pError); |
|
106 if( (NSSCKMDObject *)NULL == rv ) { |
|
107 return (NSSCKMDObject *)NULL; |
|
108 } |
|
109 |
|
110 return rv; |
|
111 } |
|
112 |
|
113 NSS_IMPLEMENT NSSCKMDFindObjects * |
|
114 nss_dbm_mdFindObjects_factory |
|
115 ( |
|
116 nss_dbm_find_t *find, |
|
117 CK_RV *pError |
|
118 ) |
|
119 { |
|
120 NSSCKMDFindObjects *rv; |
|
121 |
|
122 rv = nss_ZNEW(find->arena, NSSCKMDFindObjects); |
|
123 if( (NSSCKMDFindObjects *)NULL == rv ) { |
|
124 *pError = CKR_HOST_MEMORY; |
|
125 return (NSSCKMDFindObjects *)NULL; |
|
126 } |
|
127 |
|
128 rv->etc = (void *)find; |
|
129 rv->Final = nss_dbm_mdFindObjects_Final; |
|
130 rv->Next = nss_dbm_mdFindObjects_Next; |
|
131 |
|
132 return rv; |
|
133 } |