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 | #ifndef _SECITEM_H_ |
6 | #define _SECITEM_H_ |
7 | |
8 | #include "utilrename.h" |
9 | |
10 | /* |
11 | * secitem.h - public data structures and prototypes for handling |
12 | * SECItems |
13 | */ |
14 | |
15 | #include "plarena.h" |
16 | #include "plhash.h" |
17 | #include "seccomon.h" |
18 | |
19 | SEC_BEGIN_PROTOS |
20 | |
21 | /* |
22 | ** Allocate an item. If "arena" is not NULL, then allocate from there, |
23 | ** otherwise allocate from the heap. If "item" is not NULL, allocate |
24 | ** only the data buffer for the item, not the item itself. If "len" is |
25 | ** 0, do not allocate the data buffer for the item; simply set the data |
26 | ** field to NULL and the len field to 0. The item structure is allocated |
27 | ** zero-filled; the data buffer is not zeroed. The caller is responsible |
28 | ** for initializing the type field of the item. |
29 | ** |
30 | ** The resulting item is returned; NULL if any error occurs. |
31 | ** |
32 | ** XXX This probably should take a SECItemType, but since that is mostly |
33 | ** unused and our improved APIs (aka Stan) are looming, I left it out. |
34 | */ |
35 | extern SECItem *SECITEM_AllocItem(PLArenaPool *arena, SECItem *item, |
36 | unsigned int len); |
37 | |
38 | /* Allocate and make an item with the requested contents. |
39 | * |
40 | * We seem to have mostly given up on SECItemType, so the result is |
41 | * always siBuffer. |
42 | */ |
43 | extern SECStatus SECITEM_MakeItem(PLArenaPool *arena, SECItem *dest, |
44 | const unsigned char *data, unsigned int len); |
45 | |
46 | /* |
47 | ** This is a legacy function containing bugs. It doesn't update item->len, |
48 | ** and it has other issues as described in bug 298649 and bug 298938. |
49 | ** However, the function is kept unchanged for consumers that might depend |
50 | ** on the broken behaviour. New code should call SECITEM_ReallocItemV2. |
51 | ** |
52 | ** Reallocate the data for the specified "item". If "arena" is not NULL, |
53 | ** then reallocate from there, otherwise reallocate from the heap. |
54 | ** In the case where oldlen is 0, the data is allocated (not reallocated). |
55 | ** In any case, "item" is expected to be a valid SECItem pointer; |
56 | ** SECFailure is returned if it is not. If the allocation succeeds, |
57 | ** SECSuccess is returned. |
58 | */ |
59 | extern SECStatus SECITEM_ReallocItem(/* deprecated function */ |
60 | PLArenaPool *arena, SECItem *item, |
61 | unsigned int oldlen, unsigned int newlen); |
62 | |
63 | /* |
64 | ** Reallocate the data for the specified "item". If "arena" is not NULL, |
65 | ** then reallocate from there, otherwise reallocate from the heap. |
66 | ** If item->data is NULL, the data is allocated (not reallocated). |
67 | ** In any case, "item" is expected to be a valid SECItem pointer; |
68 | ** SECFailure is returned if it is not, and the item will remain unchanged. |
69 | ** If the allocation succeeds, the item is updated and SECSuccess is returned. |
70 | */ |
71 | extern SECStatus SECITEM_ReallocItemV2(PLArenaPool *arena, SECItem *item, |
72 | unsigned int newlen); |
73 | |
74 | /* |
75 | ** Compare two items returning the difference between them. |
76 | */ |
77 | extern SECComparison SECITEM_CompareItem(const SECItem *a, const SECItem *b); |
78 | |
79 | /* |
80 | ** Compare two items -- if they are the same, return true; otherwise false. |
81 | */ |
82 | extern PRBool SECITEM_ItemsAreEqual(const SECItem *a, const SECItem *b); |
83 | |
84 | /* |
85 | ** Copy "from" to "to" |
86 | */ |
87 | extern SECStatus SECITEM_CopyItem(PLArenaPool *arena, SECItem *to, |
88 | const SECItem *from); |
89 | |
90 | /* |
91 | ** Allocate an item and copy "from" into it. |
92 | */ |
93 | extern SECItem *SECITEM_DupItem(const SECItem *from); |
94 | |
95 | /* |
96 | ** Allocate an item and copy "from" into it. The item itself and the |
97 | ** data it points to are both allocated from the arena. If arena is |
98 | ** NULL, this function is equivalent to SECITEM_DupItem. |
99 | */ |
100 | extern SECItem *SECITEM_ArenaDupItem(PLArenaPool *arena, const SECItem *from); |
101 | |
102 | /* |
103 | ** Free "zap". If freeit is PR_TRUE then "zap" itself is freed. |
104 | */ |
105 | extern void SECITEM_FreeItem(SECItem *zap, PRBool freeit); |
106 | |
107 | /* |
108 | ** Zero and then free "zap". If freeit is PR_TRUE then "zap" itself is freed. |
109 | */ |
110 | extern void SECITEM_ZfreeItem(SECItem *zap, PRBool freeit); |
111 | |
112 | PLHashNumber PR_CALLBACK SECITEM_Hash(const void *key); |
113 | |
114 | PRIntn PR_CALLBACK SECITEM_HashCompare(const void *k1, const void *k2); |
115 | |
116 | extern SECItemArray *SECITEM_AllocArray(PLArenaPool *arena, |
117 | SECItemArray *array, |
118 | unsigned int len); |
119 | extern SECItemArray *SECITEM_DupArray(PLArenaPool *arena, |
120 | const SECItemArray *from); |
121 | extern void SECITEM_FreeArray(SECItemArray *array, PRBool freeit); |
122 | extern void SECITEM_ZfreeArray(SECItemArray *array, PRBool freeit); |
123 | |
124 | SEC_END_PROTOS |
125 | |
126 | #endif /* _SECITEM_H_ */ |
127 | |