]> git.ipfire.org Git - thirdparty/openssl.git/blame - doc/man3/DEFINE_STACK_OF.pod
Move EC_METHOD to internal-only
[thirdparty/openssl.git] / doc / man3 / DEFINE_STACK_OF.pod
CommitLineData
739a1eb1
RS
1=pod
2
3=head1 NAME
4
5DEFINE_STACK_OF, DEFINE_STACK_OF_CONST, DEFINE_SPECIAL_STACK_OF,
91da5e77 6DEFINE_SPECIAL_STACK_OF_CONST,
1b3e2bbf
P
7sk_TYPE_num, sk_TYPE_value, sk_TYPE_new, sk_TYPE_new_null,
8sk_TYPE_reserve, sk_TYPE_free, sk_TYPE_zero, sk_TYPE_delete,
9sk_TYPE_delete_ptr, sk_TYPE_push, sk_TYPE_unshift, sk_TYPE_pop,
10sk_TYPE_shift, sk_TYPE_pop_free, sk_TYPE_insert, sk_TYPE_set,
11sk_TYPE_find, sk_TYPE_find_ex, sk_TYPE_sort, sk_TYPE_is_sorted,
3ceab379
PY
12sk_TYPE_dup, sk_TYPE_deep_copy, sk_TYPE_set_cmp_func, sk_TYPE_new_reserve
13- stack container
739a1eb1
RS
14
15=head1 SYNOPSIS
16
bb82531f 17=for openssl generic
b97fdb57 18
739a1eb1
RS
19 #include <openssl/safestack.h>
20
91da5e77
RS
21 STACK_OF(TYPE)
22 DEFINE_STACK_OF(TYPE)
23 DEFINE_STACK_OF_CONST(TYPE)
24 DEFINE_SPECIAL_STACK_OF(FUNCTYPE, TYPE)
25 DEFINE_SPECIAL_STACK_OF_CONST(FUNCTYPE, TYPE)
739a1eb1
RS
26
27 typedef int (*sk_TYPE_compfunc)(const TYPE *const *a, const TYPE *const *b);
28 typedef TYPE * (*sk_TYPE_copyfunc)(const TYPE *a);
29 typedef void (*sk_TYPE_freefunc)(TYPE *a);
30
31 int sk_TYPE_num(const STACK_OF(TYPE) *sk);
32 TYPE *sk_TYPE_value(const STACK_OF(TYPE) *sk, int idx);
33 STACK_OF(TYPE) *sk_TYPE_new(sk_TYPE_compfunc compare);
34 STACK_OF(TYPE) *sk_TYPE_new_null(void);
62f45e34 35 int sk_TYPE_reserve(STACK_OF(TYPE) *sk, int n);
739a1eb1
RS
36 void sk_TYPE_free(const STACK_OF(TYPE) *sk);
37 void sk_TYPE_zero(const STACK_OF(TYPE) *sk);
38 TYPE *sk_TYPE_delete(STACK_OF(TYPE) *sk, int i);
39 TYPE *sk_TYPE_delete_ptr(STACK_OF(TYPE) *sk, TYPE *ptr);
36639907
RS
40 int sk_TYPE_push(STACK_OF(TYPE) *sk, const TYPE *ptr);
41 int sk_TYPE_unshift(STACK_OF(TYPE) *sk, const TYPE *ptr);
739a1eb1
RS
42 TYPE *sk_TYPE_pop(STACK_OF(TYPE) *sk);
43 TYPE *sk_TYPE_shift(STACK_OF(TYPE) *sk);
44 void sk_TYPE_pop_free(STACK_OF(TYPE) *sk, sk_TYPE_freefunc freefunc);
45 int sk_TYPE_insert(STACK_OF(TYPE) *sk, TYPE *ptr, int idx);
36639907 46 TYPE *sk_TYPE_set(STACK_OF(TYPE) *sk, int idx, const TYPE *ptr);
739a1eb1
RS
47 int sk_TYPE_find(STACK_OF(TYPE) *sk, TYPE *ptr);
48 int sk_TYPE_find_ex(STACK_OF(TYPE) *sk, TYPE *ptr);
49 void sk_TYPE_sort(const STACK_OF(TYPE) *sk);
50 int sk_TYPE_is_sorted(const STACK_OF(TYPE) *sk);
c0c9c0c0
F
51 STACK_OF(TYPE) *sk_TYPE_dup(const STACK_OF(TYPE) *sk);
52 STACK_OF(TYPE) *sk_TYPE_deep_copy(const STACK_OF(TYPE) *sk,
739a1eb1
RS
53 sk_TYPE_copyfunc copyfunc,
54 sk_TYPE_freefunc freefunc);
e9b77246
BB
55 sk_TYPE_compfunc (*sk_TYPE_set_cmp_func(STACK_OF(TYPE) *sk,
56 sk_TYPE_compfunc compare));
3ceab379 57 STACK_OF(TYPE) *sk_TYPE_new_reserve(sk_TYPE_compfunc compare, int n);
739a1eb1
RS
58
59=head1 DESCRIPTION
60
61Applications can create and use their own stacks by placing any of the macros
c952780c
RS
62described below in a header file. These macros define typesafe inline
63functions that wrap around the utility B<OPENSSL_sk_> API.
bbecf04e
RL
64In the description here, B<I<TYPE>> is used
65as a placeholder for any of the OpenSSL datatypes, such as B<X509>.
739a1eb1 66
852c2ed2
RS
67The STACK_OF() macro returns the name for a stack of the specified B<I<TYPE>>.
68This is an opaque pointer to a structure declaration.
69This can be used in every header file that references the stack.
70There are several B<DEFINE...> macros that create static inline functions
71for all of the functions described on this page.
72This should normally be used in one source file, and the stack manipulation
73is wrapped with application-specific functions.
74
75DEFINE_STACK_OF() creates set of functions for a stack of B<I<TYPE>> elements.
76The type is referenced by
bbecf04e 77B<STACK_OF>(B<I<TYPE>>) and each function name begins with B<sk_I<TYPE>_>.
91da5e77 78DEFINE_STACK_OF_CONST() is identical to DEFINE_STACK_OF() except
852c2ed2 79each element is constant.
739a1eb1 80
852c2ed2
RS
81 /* DEFINE_STACK_OF(TYPE) */
82 TYPE *sk_TYPE_value(STACK_OF(TYPE) *sk, int idx);
83 /* DEFINE_STACK_OF_CONST(TYPE) */
739a1eb1
RS
84 const TYPE *sk_TYPE_value(STACK_OF(TYPE) *sk, int idx);
85
852c2ed2
RS
86DEFINE_SPECIAL_STACK_OF() and DEFINE_SPECIAL_STACK_OF_CONST() are similar
87except B<FUNCNAME> is used in the function names:
739a1eb1 88
852c2ed2 89 /* DEFINE_SPECIAL_STACK_OF(TYPE, FUNCNAME) */
739a1eb1 90 TYPE *sk_FUNCNAME_value(STACK_OF(TYPE) *sk, int idx);
852c2ed2 91 /* DEFINE_SPECIAL_STACK_OF(TYPE, FUNCNAME) */
91da5e77
RS
92 const TYPE *sk_FUNCNAME_value(STACK_OF(TYPE) *sk, int idx);
93
bbecf04e
RL
94B<sk_I<TYPE>_num>() returns the number of elements in I<sk> or -1 if I<sk> is
95NULL.
739a1eb1 96
bbecf04e
RL
97B<sk_I<TYPE>_value>() returns element I<idx> in I<sk>, where I<idx> starts at
98zero. If I<idx> is out of range then NULL is returned.
739a1eb1 99
bbecf04e
RL
100B<sk_I<TYPE>_new>() allocates a new empty stack using comparison function
101I<compare>. If I<compare> is NULL then no comparison function is used. This
102function is equivalent to B<sk_I<TYPE>_new_reserve>(I<compare>, 0).
739a1eb1 103
bbecf04e
RL
104B<sk_I<TYPE>_new_null>() allocates a new empty stack with no comparison
105function. This function is equivalent to B<sk_I<TYPE>_new_reserve>(NULL, 0).
739a1eb1 106
bbecf04e
RL
107B<sk_I<TYPE>_reserve>() allocates additional memory in the I<sk> structure
108such that the next I<n> calls to B<sk_I<TYPE>_insert>(), B<sk_I<TYPE>_push>()
109or B<sk_I<TYPE>_unshift>() will not fail or cause memory to be allocated
110or reallocated. If I<n> is zero, any excess space allocated in the
111I<sk> structure is freed. On error I<sk> is unchanged.
1b3e2bbf 112
bbecf04e
RL
113B<sk_I<TYPE>_new_reserve>() allocates a new stack. The new stack will have
114additional memory allocated to hold I<n> elements if I<n> is positive.
115The next I<n> calls to B<sk_I<TYPE>_insert>(), B<sk_I<TYPE>_push>() or
116B<sk_I<TYPE>_unshift>() will not fail or cause memory to be allocated or
117reallocated. If I<n> is zero or less than zero, no memory is allocated.
118B<sk_I<TYPE>_new_reserve>() also sets the comparison function I<compare>
119to the newly created stack. If I<compare> is NULL then no comparison
120function is used.
3ceab379 121
bbecf04e
RL
122B<sk_I<TYPE>_set_cmp_func>() sets the comparison function of I<sk> to
123I<compare>. The previous comparison function is returned or NULL if there
124was no previous comparison function.
739a1eb1 125
bbecf04e
RL
126B<sk_I<TYPE>_free>() frees up the I<sk> structure. It does I<not> free up any
127elements of I<sk>. After this call I<sk> is no longer valid.
739a1eb1 128
bbecf04e
RL
129B<sk_I<TYPE>_zero>() sets the number of elements in I<sk> to zero. It does not
130free I<sk> so after this call I<sk> is still valid.
739a1eb1 131
bbecf04e 132B<sk_I<TYPE>_pop_free>() frees up all elements of I<sk> and I<sk> itself. The
739a1eb1
RS
133free function freefunc() is called on each element to free it.
134
bbecf04e
RL
135B<sk_I<TYPE>_delete>() deletes element I<i> from I<sk>. It returns the deleted
136element or NULL if I<i> is out of range.
739a1eb1 137
bbecf04e
RL
138B<sk_I<TYPE>_delete_ptr>() deletes element matching I<ptr> from I<sk>. It
139returns the deleted element or NULL if no element matching I<ptr> was found.
739a1eb1 140
bbecf04e
RL
141B<sk_I<TYPE>_insert>() inserts I<ptr> into I<sk> at position I<idx>. Any
142existing elements at or after I<idx> are moved downwards. If I<idx> is out
143of range the new element is appended to I<sk>. B<sk_I<TYPE>_insert>() either
144returns the number of elements in I<sk> after the new element is inserted or
145zero if an error (such as memory allocation failure) occurred.
739a1eb1 146
bbecf04e 147B<sk_I<TYPE>_push>() appends I<ptr> to I<sk> it is equivalent to:
739a1eb1
RS
148
149 sk_TYPE_insert(sk, ptr, -1);
150
bbecf04e
RL
151B<sk_I<TYPE>_unshift>() inserts I<ptr> at the start of I<sk> it is equivalent
152to:
739a1eb1
RS
153
154 sk_TYPE_insert(sk, ptr, 0);
155
bbecf04e 156B<sk_I<TYPE>_pop>() returns and removes the last element from I<sk>.
739a1eb1 157
bbecf04e 158B<sk_I<TYPE>_shift>() returns and removes the first element from I<sk>.
739a1eb1 159
bbecf04e
RL
160B<sk_I<TYPE>_set>() sets element I<idx> of I<sk> to I<ptr> replacing the current
161element. The new element value is returned or NULL if an error occurred:
162this will only happen if I<sk> is NULL or I<idx> is out of range.
739a1eb1 163
bbecf04e 164B<sk_I<TYPE>_find>() searches I<sk> for the element I<ptr>. In the case
89b06ca7 165where no comparison function has been specified, the function performs
bbecf04e 166a linear search for a pointer equal to I<ptr>. The index of the first
89b06ca7 167matching element is returned or B<-1> if there is no match. In the case
bbecf04e
RL
168where a comparison function has been specified, I<sk> is sorted then
169B<sk_I<TYPE>_find>() returns the index of a matching element or B<-1> if there
89b06ca7
P
170is no match. Note that, in this case, the matching element returned is
171not guaranteed to be the first; the comparison function will usually
172compare the values pointed to rather than the pointers themselves and
bbecf04e 173the order of elements in I<sk> could change.
89b06ca7 174
bbecf04e
RL
175B<sk_I<TYPE>_find_ex>() operates like B<sk_I<TYPE>_find>() except when a
176comparison function has been specified and no matching element is found.
177Instead of returning B<-1>, B<sk_I<TYPE>_find_ex>() returns the index of the
178element either before or after the location where I<ptr> would be if it were
179present in I<sk>.
739a1eb1 180
bbecf04e 181B<sk_I<TYPE>_sort>() sorts I<sk> using the supplied comparison function.
739a1eb1 182
bbecf04e 183B<sk_I<TYPE>_is_sorted>() returns B<1> if I<sk> is sorted and B<0> otherwise.
739a1eb1 184
bbecf04e 185B<sk_I<TYPE>_dup>() returns a copy of I<sk>. Note the pointers in the copy
739a1eb1
RS
186are identical to the original.
187
bbecf04e
RL
188B<sk_I<TYPE>_deep_copy>() returns a new stack where each element has been
189copied. Copying is performed by the supplied copyfunc() and freeing by
190freefunc(). The function freefunc() is only called if an error occurs.
739a1eb1
RS
191
192=head1 NOTES
193
194Care should be taken when accessing stacks in multi-threaded environments.
bbecf04e
RL
195Any operation which increases the size of a stack such as B<sk_I<TYPE>_insert>()
196or B<sk_I<TYPE>_push>() can "grow" the size of an internal array and cause race
197conditions if the same stack is accessed in a different thread. Operations such
198as B<sk_I<TYPE>_find>() and B<sk_I<TYPE>_sort>() can also reorder the stack.
739a1eb1
RS
199
200Any comparison function supplied should use a metric suitable
201for use in a binary search operation. That is it should return zero, a
bbecf04e
RL
202positive or negative value if I<a> is equal to, greater than
203or less than I<b> respectively.
739a1eb1
RS
204
205Care should be taken when checking the return values of the functions
bbecf04e 206B<sk_I<TYPE>_find>() and B<sk_I<TYPE>_find_ex>(). They return an index to the
739a1eb1
RS
207matching element. In particular B<0> indicates a matching first element.
208A failed search is indicated by a B<-1> return value.
209
91da5e77
RS
210STACK_OF(), DEFINE_STACK_OF(), DEFINE_STACK_OF_CONST(), and
211DEFINE_SPECIAL_STACK_OF() are implemented as macros.
212
1f5e0f92
P
213The underlying utility B<OPENSSL_sk_> API should not be used directly.
214It defines these functions: OPENSSL_sk_deep_copy(),
215OPENSSL_sk_delete(), OPENSSL_sk_delete_ptr(), OPENSSL_sk_dup(),
216OPENSSL_sk_find(), OPENSSL_sk_find_ex(), OPENSSL_sk_free(),
217OPENSSL_sk_insert(), OPENSSL_sk_is_sorted(), OPENSSL_sk_new(),
218OPENSSL_sk_new_null(), OPENSSL_sk_num(), OPENSSL_sk_pop(),
219OPENSSL_sk_pop_free(), OPENSSL_sk_push(), OPENSSL_sk_reserve(),
220OPENSSL_sk_set(), OPENSSL_sk_set_cmp_func(), OPENSSL_sk_shift(),
221OPENSSL_sk_sort(), OPENSSL_sk_unshift(), OPENSSL_sk_value(),
222OPENSSL_sk_zero().
223
739a1eb1
RS
224=head1 RETURN VALUES
225
bbecf04e
RL
226B<sk_I<TYPE>_num>() returns the number of elements in the stack or B<-1> if the
227passed stack is NULL.
739a1eb1 228
bbecf04e 229B<sk_I<TYPE>_value>() returns a pointer to a stack element or NULL if the
739a1eb1
RS
230index is out of range.
231
bbecf04e
RL
232B<sk_I<TYPE>_new>(), B<sk_I<TYPE>_new_null>() and B<sk_I<TYPE>_new_reserve>()
233return an empty stack or NULL if an error occurs.
739a1eb1 234
bbecf04e
RL
235B<sk_I<TYPE>_reserve>() returns B<1> on successful allocation of the required
236memory or B<0> on error.
1b3e2bbf 237
bbecf04e 238B<sk_I<TYPE>_set_cmp_func>() returns the old comparison function or NULL if
739a1eb1
RS
239there was no old comparison function.
240
bbecf04e
RL
241B<sk_I<TYPE>_free>(), B<sk_I<TYPE>_zero>(), B<sk_I<TYPE>_pop_free>() and
242B<sk_I<TYPE>_sort>() do not return values.
739a1eb1 243
bbecf04e
RL
244B<sk_I<TYPE>_pop>(), B<sk_I<TYPE>_shift>(), B<sk_I<TYPE>_delete>() and
245B<sk_I<TYPE>_delete_ptr>() return a pointer to the deleted element or NULL
246on error.
739a1eb1 247
bbecf04e
RL
248B<sk_I<TYPE>_insert>(), B<sk_I<TYPE>_push>() and B<sk_I<TYPE>_unshift>() return
249the total number of elements in the stack and 0 if an error occurred.
739a1eb1 250
bbecf04e 251B<sk_I<TYPE>_set>() returns a pointer to the replacement element or NULL on
739a1eb1
RS
252error.
253
bbecf04e
RL
254B<sk_I<TYPE>_find>() and B<sk_I<TYPE>_find_ex>() return an index to the found
255element or B<-1> on error.
739a1eb1 256
bbecf04e 257B<sk_I<TYPE>_is_sorted>() returns B<1> if the stack is sorted and B<0> if it is
739a1eb1
RS
258not.
259
bbecf04e
RL
260B<sk_I<TYPE>_dup>() and B<sk_I<TYPE>_deep_copy>() return a pointer to the copy
261of the stack.
739a1eb1
RS
262
263=head1 HISTORY
264
265Before OpenSSL 1.1.0, this was implemented via macros and not inline functions
266and was not a public API.
267
bbecf04e
RL
268B<sk_I<TYPE>_reserve>() and B<sk_I<TYPE>_new_reserve>() were added in OpenSSL
2691.1.1.
3ceab379 270
739a1eb1
RS
271=head1 COPYRIGHT
272
454afd98 273Copyright 2000-2020 The OpenSSL Project Authors. All Rights Reserved.
739a1eb1 274
4746f25a 275Licensed under the Apache License 2.0 (the "License"). You may not use
739a1eb1
RS
276this file except in compliance with the License. You can obtain a copy
277in the file LICENSE in the source distribution or at
278L<https://www.openssl.org/source/license.html>.
279
280=cut