diff options
Diffstat (limited to 'static/freebsd/man3/OPENSSL_LH_COMPFUNC.3')
| -rw-r--r-- | static/freebsd/man3/OPENSSL_LH_COMPFUNC.3 | 403 |
1 files changed, 403 insertions, 0 deletions
diff --git a/static/freebsd/man3/OPENSSL_LH_COMPFUNC.3 b/static/freebsd/man3/OPENSSL_LH_COMPFUNC.3 new file mode 100644 index 00000000..e1420d01 --- /dev/null +++ b/static/freebsd/man3/OPENSSL_LH_COMPFUNC.3 @@ -0,0 +1,403 @@ +.\" -*- mode: troff; coding: utf-8 -*- +.\" Automatically generated by Pod::Man v6.0.2 (Pod::Simple 3.45) +.\" +.\" Standard preamble: +.\" ======================================================================== +.de Sp \" Vertical space (when we can't use .PP) +.if t .sp .5v +.if n .sp +.. +.de Vb \" Begin verbatim text +.ft CW +.nf +.ne \\$1 +.. +.de Ve \" End verbatim text +.ft R +.fi +.. +.\" \*(C` and \*(C' are quotes in nroff, nothing in troff, for use with C<>. +.ie n \{\ +. ds C` "" +. ds C' "" +'br\} +.el\{\ +. ds C` +. ds C' +'br\} +.\" +.\" Escape single quotes in literal strings from groff's Unicode transform. +.ie \n(.g .ds Aq \(aq +.el .ds Aq ' +.\" +.\" If the F register is >0, we'll generate index entries on stderr for +.\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index +.\" entries marked with X<> in POD. Of course, you'll have to process the +.\" output yourself in some meaningful fashion. +.\" +.\" Avoid warning from groff about undefined register 'F'. +.de IX +.. +.nr rF 0 +.if \n(.g .if rF .nr rF 1 +.if (\n(rF:(\n(.g==0)) \{\ +. if \nF \{\ +. de IX +. tm Index:\\$1\t\\n%\t"\\$2" +.. +. if !\nF==2 \{\ +. nr % 0 +. nr F 2 +. \} +. \} +.\} +.rr rF +.\" +.\" Required to disable full justification in groff 1.23.0. +.if n .ds AD l +.\" ======================================================================== +.\" +.IX Title "OPENSSL_LH_COMPFUNC 3ossl" +.TH OPENSSL_LH_COMPFUNC 3ossl 2026-04-07 3.5.6 OpenSSL +.\" For nroff, turn off justification. Always turn off hyphenation; it makes +.\" way too many mistakes in technical documents. +.if n .ad l +.nh +.SH NAME +LHASH, LHASH_OF, DEFINE_LHASH_OF_EX, DEFINE_LHASH_OF, +OPENSSL_LH_COMPFUNC, OPENSSL_LH_HASHFUNC, OPENSSL_LH_DOALL_FUNC, +LHASH_DOALL_ARG_FN_TYPE, +IMPLEMENT_LHASH_HASH_FN, IMPLEMENT_LHASH_COMP_FN, +lh_TYPE_new, lh_TYPE_free, lh_TYPE_flush, +lh_TYPE_insert, lh_TYPE_delete, lh_TYPE_retrieve, +lh_TYPE_doall, lh_TYPE_doall_arg, lh_TYPE_num_items, lh_TYPE_get_down_load, +lh_TYPE_set_down_load, lh_TYPE_error, +OPENSSL_LH_new, OPENSSL_LH_free, OPENSSL_LH_flush, +OPENSSL_LH_insert, OPENSSL_LH_delete, OPENSSL_LH_retrieve, +OPENSSL_LH_doall, OPENSSL_LH_doall_arg, OPENSSL_LH_doall_arg_thunk, +OPENSSL_LH_set_thunks, OPENSSL_LH_num_items, +OPENSSL_LH_get_down_load, OPENSSL_LH_set_down_load, OPENSSL_LH_error +\&\- dynamic hash table +.SH SYNOPSIS +.IX Header "SYNOPSIS" +.Vb 1 +\& #include <openssl/lhash.h> +\& +\& LHASH_OF(TYPE) +\& +\& DEFINE_LHASH_OF_EX(TYPE); +\& +\& LHASH_OF(TYPE) *lh_TYPE_new(OPENSSL_LH_HASHFUNC hash, OPENSSL_LH_COMPFUNC compare); +\& void lh_TYPE_free(LHASH_OF(TYPE) *table); +\& void lh_TYPE_flush(LHASH_OF(TYPE) *table); +\& OPENSSL_LHASH *OPENSSL_LH_set_thunks(OPENSSL_LHASH *lh, +\& OPENSSL_LH_HASHFUNCTHUNK hw, +\& OPENSSL_LH_COMPFUNCTHUNK cw, +\& OPENSSL_LH_DOALL_FUNC_THUNK daw, +\& OPENSSL_LH_DOALL_FUNCARG_THUNK daaw) +\& +\& TYPE *lh_TYPE_insert(LHASH_OF(TYPE) *table, TYPE *data); +\& TYPE *lh_TYPE_delete(LHASH_OF(TYPE) *table, TYPE *data); +\& TYPE *lh_TYPE_retrieve(LHASH_OF(TYPE) *table, TYPE *data); +\& +\& void lh_TYPE_doall(LHASH_OF(TYPE) *table, OPENSSL_LH_DOALL_FUNC func); +\& void lh_TYPE_doall_arg(LHASH_OF(TYPE) *table, OPENSSL_LH_DOALL_FUNCARG func, +\& TYPE *arg); +\& void OPENSSL_LH_doall_arg_thunk(OPENSSL_LHASH *lh, +\& OPENSSL_LH_DOALL_FUNCARG_THUNK daaw, +\& OPENSSL_LH_DOALL_FUNCARG fn, void *arg) +\& +\& unsigned long lh_TYPE_num_items(OPENSSL_LHASH *lh); +\& unsigned long lh_TYPE_get_down_load(OPENSSL_LHASH *lh); +\& void lh_TYPE_set_down_load(OPENSSL_LHASH *lh, unsigned long dl); +\& +\& int lh_TYPE_error(LHASH_OF(TYPE) *table); +\& +\& typedef int (*OPENSSL_LH_COMPFUNC)(const void *, const void *); +\& typedef unsigned long (*OPENSSL_LH_HASHFUNC)(const void *); +\& typedef void (*OPENSSL_LH_DOALL_FUNC)(const void *); +\& typedef void (*LHASH_DOALL_ARG_FN_TYPE)(const void *, const void *); +\& +\& OPENSSL_LHASH *OPENSSL_LH_new(OPENSSL_LH_HASHFUNC h, OPENSSL_LH_COMPFUNC c); +\& void OPENSSL_LH_free(OPENSSL_LHASH *lh); +\& void OPENSSL_LH_flush(OPENSSL_LHASH *lh); +\& +\& void *OPENSSL_LH_insert(OPENSSL_LHASH *lh, void *data); +\& void *OPENSSL_LH_delete(OPENSSL_LHASH *lh, const void *data); +\& void *OPENSSL_LH_retrieve(OPENSSL_LHASH *lh, const void *data); +\& +\& void OPENSSL_LH_doall(OPENSSL_LHASH *lh, OPENSSL_LH_DOALL_FUNC func); +\& void OPENSSL_LH_doall_arg(OPENSSL_LHASH *lh, OPENSSL_LH_DOALL_FUNCARG func, void *arg); +\& +\& unsigned long OPENSSL_LH_num_items(OPENSSL_LHASH *lh); +\& unsigned long OPENSSL_LH_get_down_load(OPENSSL_LHASH *lh); +\& void OPENSSL_LH_set_down_load(OPENSSL_LHASH *lh, unsigned long dl); +\& +\& int OPENSSL_LH_error(OPENSSL_LHASH *lh); +\& +\& #define LH_LOAD_MULT /* integer constant */ +.Ve +.PP +The following macro is deprecated: +.PP +.Vb 1 +\& DEFINE_LHASH_OF(TYPE); +.Ve +.SH DESCRIPTION +.IX Header "DESCRIPTION" +This library implements type\-checked dynamic hash tables. The hash +table entries can be arbitrary structures. Usually they consist of key +and value fields. In the description here, \fR\f(BITYPE\fR\fB\fR is used a placeholder +for any of the OpenSSL datatypes, such as \fISSL_SESSION\fR. +.PP +To define a new type\-checked dynamic hash table, use \fBDEFINE_LHASH_OF_EX\fR(). +\&\fBDEFINE_LHASH_OF\fR() was previously used for this purpose, but is now +deprecated. The \fBDEFINE_LHASH_OF_EX\fR() macro provides all functionality of +\&\fBDEFINE_LHASH_OF\fR() except for certain deprecated statistics functions (see +\&\fBOPENSSL_LH_stats\fR\|(3)). +.PP +\&\fBlh_\fR\f(BITYPE\fR\fB_new\fR() creates a new \fBLHASH_OF\fR(\fR\f(BITYPE\fR\fB\fR) structure to store +arbitrary data entries, and specifies the \*(Aqhash\*(Aq and \*(Aqcompare\*(Aq +callbacks to be used in organising the table\*(Aqs entries. The \fIhash\fR +callback takes a pointer to a table entry as its argument and returns +an unsigned long hash value for its key field. The hash value is +normally truncated to a power of 2, so make sure that your hash +function returns well mixed low order bits. The \fIcompare\fR callback +takes two arguments (pointers to two hash table entries), and returns +0 if their keys are equal, nonzero otherwise. +.PP +If your hash table +will contain items of some particular type and the \fIhash\fR and +\&\fIcompare\fR callbacks hash/compare these types, then the +\&\fBIMPLEMENT_LHASH_HASH_FN\fR and \fBIMPLEMENT_LHASH_COMP_FN\fR macros can be +used to create callback wrappers of the prototypes required by +\&\fBlh_\fR\f(BITYPE\fR\fB_new\fR() as shown in this example: +.PP +.Vb 11 +\& /* +\& * Implement the hash and compare functions; "stuff" can be any word. +\& */ +\& static unsigned long stuff_hash(const TYPE *a) +\& { +\& ... +\& } +\& static int stuff_cmp(const TYPE *a, const TYPE *b) +\& { +\& ... +\& } +\& +\& /* +\& * Implement the wrapper functions. +\& */ +\& static IMPLEMENT_LHASH_HASH_FN(stuff, TYPE) +\& static IMPLEMENT_LHASH_COMP_FN(stuff, TYPE) +.Ve +.PP +If the type is going to be used in several places, the following macros +can be used in a common header file to declare the function wrappers: +.PP +.Vb 2 +\& DECLARE_LHASH_HASH_FN(stuff, TYPE) +\& DECLARE_LHASH_COMP_FN(stuff, TYPE) +.Ve +.PP +Then a hash table of \fR\f(BITYPE\fR\fB\fR objects can be created using this: +.PP +.Vb 1 +\& LHASH_OF(TYPE) *htable; +\& +\& htable = B<lh_I<TYPE>_new>(LHASH_HASH_FN(stuff), LHASH_COMP_FN(stuff)); +.Ve +.PP +\&\fBlh_\fR\f(BITYPE\fR\fB_free\fR() frees the \fBLHASH_OF\fR(\fR\f(BITYPE\fR\fB\fR) structure +\&\fItable\fR. Allocated hash table entries will not be freed; consider +using \fBlh_\fR\f(BITYPE\fR\fB_doall\fR() to deallocate any remaining entries in the +hash table (see below). If the argument is NULL, nothing is done. +.PP +\&\fBlh_\fR\f(BITYPE\fR\fB_flush\fR() empties the \fBLHASH_OF\fR(\fR\f(BITYPE\fR\fB\fR) structure \fItable\fR. New +entries can be added to the flushed table. Allocated hash table entries +will not be freed; consider using \fBlh_\fR\f(BITYPE\fR\fB_doall\fR() to deallocate any +remaining entries in the hash table (see below). +.PP +\&\fBlh_\fR\f(BITYPE\fR\fB_insert\fR() inserts the structure pointed to by \fIdata\fR into +\&\fItable\fR. If there already is an entry with the same key, the old +value is replaced. Note that \fBlh_\fR\f(BITYPE\fR\fB_insert\fR() stores pointers, the +data are not copied. +.PP +\&\fBlh_\fR\f(BITYPE\fR\fB_delete\fR() deletes an entry from \fItable\fR. +.PP +\&\fBlh_\fR\f(BITYPE\fR\fB_retrieve\fR() looks up an entry in \fItable\fR. Normally, \fIdata\fR +is a structure with the key field(s) set; the function will return a +pointer to a fully populated structure. +.PP +\&\fBlh_\fR\f(BITYPE\fR\fB_doall\fR() will, for every entry in the hash table, call +\&\fIfunc\fR with the data item as its parameter. +For example: +.PP +.Vb 2 +\& /* Cleans up resources belonging to \*(Aqa\*(Aq (this is implemented elsewhere) */ +\& void TYPE_cleanup_doall(TYPE *a); +\& +\& /* Implement a prototype\-compatible wrapper for "TYPE_cleanup" */ +\& IMPLEMENT_LHASH_DOALL_FN(TYPE_cleanup, TYPE) +\& +\& /* Call "TYPE_cleanup" against all items in a hash table. */ +\& lh_TYPE_doall(hashtable, LHASH_DOALL_FN(TYPE_cleanup)); +\& +\& /* Then the hash table itself can be deallocated */ +\& lh_TYPE_free(hashtable); +.Ve +.PP +\&\fBlh_\fR\f(BITYPE\fR\fB_doall_arg\fR() is the same as \fBlh_\fR\f(BITYPE\fR\fB_doall\fR() except that +\&\fIfunc\fR will be called with \fIarg\fR as the second argument and \fIfunc\fR +should be of type \fBLHASH_DOALL_ARG_FN\fR(\fR\f(BITYPE\fR\fB\fR) (a callback prototype +that is passed both the table entry and an extra argument). As with +\&\fBlh_doall()\fR, you can instead choose to declare your callback with a +prototype matching the types you are dealing with and use the +declare/implement macros to create compatible wrappers that cast +variables before calling your type\-specific callbacks. An example of +this is demonstrated here (printing all hash table entries to a BIO +that is provided by the caller): +.PP +.Vb 2 +\& /* Prints item \*(Aqa\*(Aq to \*(Aqoutput_bio\*(Aq (this is implemented elsewhere) */ +\& void TYPE_print_doall_arg(const TYPE *a, BIO *output_bio); +\& +\& /* Implement a prototype\-compatible wrapper for "TYPE_print" */ +\& static IMPLEMENT_LHASH_DOALL_ARG_FN(TYPE, const TYPE, BIO) +\& +\& /* Print out the entire hashtable to a particular BIO */ +\& lh_TYPE_doall_arg(hashtable, LHASH_DOALL_ARG_FN(TYPE_print), BIO, +\& logging_bio); +.Ve +.PP +Note that it is by default \fBnot\fR safe to use \fBlh_\fR\f(BITYPE\fR\fB_delete\fR() inside a +callback passed to \fBlh_\fR\f(BITYPE\fR\fB_doall\fR() or \fBlh_\fR\f(BITYPE\fR\fB_doall_arg\fR(). The +reason for this is that deleting an item from the hash table may result in the +hash table being contracted to a smaller size and rehashed. +\&\fBlh_\fR\f(BITYPE\fR\fB_doall\fR() and \fBlh_\fR\f(BITYPE\fR\fB_doall_arg\fR() are unsafe and will exhibit +undefined behaviour under these conditions, as these functions assume the hash +table size and bucket pointers do not change during the call. +.PP +If it is desired to use \fBlh_\fR\f(BITYPE\fR\fB_doall\fR() or \fBlh_\fR\f(BITYPE\fR\fB_doall_arg\fR() with +\&\fBlh_\fR\f(BITYPE\fR\fB_delete\fR(), it is essential that you call +\&\fBlh_\fR\f(BITYPE\fR\fB_set_down_load\fR() with a \fIdown_load\fR argument of 0 first. This +disables hash table contraction and guarantees that it will be safe to delete +items from a hash table during a call to \fBlh_\fR\f(BITYPE\fR\fB_doall\fR() or +\&\fBlh_\fR\f(BITYPE\fR\fB_doall_arg\fR(). +.PP +It is never safe to call \fBlh_\fR\f(BITYPE\fR\fB_insert\fR() during a call to +\&\fBlh_\fR\f(BITYPE\fR\fB_doall\fR() or \fBlh_\fR\f(BITYPE\fR\fB_doall_arg\fR(). +.PP +\&\fBlh_\fR\f(BITYPE\fR\fB_error\fR() can be used to determine if an error occurred in the last +operation. +.PP +\&\fBlh_\fR\f(BITYPE\fR\fB_num_items\fR() returns the number of items in the hash table. +.PP +\&\fBlh_\fR\f(BITYPE\fR\fB_get_down_load\fR() and \fBlh_\fR\f(BITYPE\fR\fB_set_down_load\fR() get and set the +factor used to determine when the hash table is contracted. The factor is the +load factor at or below which hash table contraction will occur, multiplied by +\&\fBLH_LOAD_MULT\fR, where the load factor is the number of items divided by the +number of nodes. Setting this value to 0 disables hash table contraction. +.PP +\&\fBOPENSSL_LH_new()\fR is the same as the \fBlh_\fR\f(BITYPE\fR\fB_new\fR() except that it is not +type specific. So instead of returning an \fBLHASH_OF(\fR\f(BITYPE\fR\fB)\fR value it returns +a \fBvoid *\fR. In the same way the functions \fBOPENSSL_LH_free()\fR, +\&\fBOPENSSL_LH_flush()\fR, \fBOPENSSL_LH_insert()\fR, \fBOPENSSL_LH_delete()\fR, +\&\fBOPENSSL_LH_retrieve()\fR, \fBOPENSSL_LH_doall()\fR, \fBOPENSSL_LH_doall_arg()\fR, +\&\fBOPENSSL_LH_num_items()\fR, \fBOPENSSL_LH_get_down_load()\fR, \fBOPENSSL_LH_set_down_load()\fR +and \fBOPENSSL_LH_error()\fR are equivalent to the similarly named \fBlh_\fR\f(BITYPE\fR +functions except that they return or use a \fBvoid *\fR where the equivalent +\&\fBlh_\fR\f(BITYPE\fR\fB\fR function returns or uses a \fB\fR\f(BITYPE\fR\fB *\fR or \fBLHASH_OF(\fR\f(BITYPE\fR\fB) *\fR. +\&\fBlh_\fR\f(BITYPE\fR\fB\fR functions are implemented as type checked wrappers around the +\&\fBOPENSSL_LH\fR functions. Most applications should not call the \fBOPENSSL_LH\fR +functions directly. +.PP +\&\fBOPENSSL_LH_set_thunks()\fR and \fBOPENSSL_LH_doall_arg_thunk()\fR, while public by +necessity, are actually internal functions and should not be used. +.SH "RETURN VALUES" +.IX Header "RETURN VALUES" +\&\fBlh_\fR\f(BITYPE\fR\fB_new\fR() and \fBOPENSSL_LH_new()\fR return NULL on error, otherwise a +pointer to the new \fBLHASH\fR structure. +.PP +When a hash table entry is replaced, \fBlh_\fR\f(BITYPE\fR\fB_insert\fR() or +\&\fBOPENSSL_LH_insert()\fR return the value being replaced. NULL is returned on normal +operation and on error. +.PP +\&\fBlh_\fR\f(BITYPE\fR\fB_delete\fR() and \fBOPENSSL_LH_delete()\fR return the entry being deleted. +NULL is returned if there is no such value in the hash table. +.PP +\&\fBlh_\fR\f(BITYPE\fR\fB_retrieve\fR() and \fBOPENSSL_LH_retrieve()\fR return the hash table entry +if it has been found, NULL otherwise. +.PP +\&\fBlh_\fR\f(BITYPE\fR\fB_error\fR() and \fBOPENSSL_LH_error()\fR return 1 if an error occurred in +the last operation, 0 otherwise. It\*(Aqs meaningful only after non\-retrieve +operations. +.PP +\&\fBlh_\fR\f(BITYPE\fR\fB_free\fR(), \fBOPENSSL_LH_free()\fR, \fBlh_\fR\f(BITYPE\fR\fB_flush\fR(), +\&\fBOPENSSL_LH_flush()\fR, \fBlh_\fR\f(BITYPE\fR\fB_doall\fR() \fBOPENSSL_LH_doall()\fR, +\&\fBlh_\fR\f(BITYPE\fR\fB_doall_arg\fR() and \fBOPENSSL_LH_doall_arg()\fR return no values. +.SH NOTE +.IX Header "NOTE" +The LHASH code is not thread safe. All updating operations, as well as +\&\fBlh_\fR\f(BITYPE\fR\fB_error\fR() or \fBOPENSSL_LH_error()\fR calls must be performed under +a write lock. All retrieve operations should be performed under a read lock, +\&\fIunless\fR accurate usage statistics are desired. In which case, a write lock +should be used for retrieve operations as well. For output of the usage +statistics, using the functions from \fBOPENSSL_LH_stats\fR\|(3), a read lock +suffices. +.PP +The LHASH code regards table entries as constant data. As such, it +internally represents \fBlh_insert()\fR\*(Aqd items with a "const void *" +pointer type. This is why callbacks such as those used by \fBlh_doall()\fR +and \fBlh_doall_arg()\fR declare their prototypes with "const", even for the +parameters that pass back the table items\*(Aq data pointers \- for +consistency, user\-provided data is "const" at all times as far as the +LHASH code is concerned. However, as callers are themselves providing +these pointers, they can choose whether they too should be treating +all such parameters as constant. +.PP +As an example, a hash table may be maintained by code that, for +reasons of encapsulation, has only "const" access to the data being +indexed in the hash table (i.e. it is returned as "const" from +elsewhere in their code) \- in this case the LHASH prototypes are +appropriate as\-is. Conversely, if the caller is responsible for the +life\-time of the data in question, then they may well wish to make +modifications to table item passed back in the \fBlh_doall()\fR or +\&\fBlh_doall_arg()\fR callbacks (see the "TYPE_cleanup" example above). If +so, the caller can either cast the "const" away (if they\*(Aqre providing +the raw callbacks themselves) or use the macros to declare/implement +the wrapper functions without "const" types. +.PP +Callers that only have "const" access to data they\*(Aqre indexing in a +table, yet declare callbacks without constant types (or cast the +"const" away themselves), are therefore creating their own risks/bugs +without being encouraged to do so by the API. On a related note, +those auditing code should pay special attention to any instances of +DECLARE/IMPLEMENT_LHASH_DOALL_[ARG_]_FN macros that provide types +without any "const" qualifiers. +.SH BUGS +.IX Header "BUGS" +\&\fBlh_\fR\f(BITYPE\fR\fB_insert\fR() and \fBOPENSSL_LH_insert()\fR return NULL both for success +and error. +.SH "SEE ALSO" +.IX Header "SEE ALSO" +\&\fBOPENSSL_LH_stats\fR\|(3) +.SH HISTORY +.IX Header "HISTORY" +In OpenSSL 1.0.0, the lhash interface was revamped for better +type checking. +.PP +In OpenSSL 3.1, \fBDEFINE_LHASH_OF_EX\fR() was introduced and \fBDEFINE_LHASH_OF\fR() +was deprecated. +.PP +\&\fBOPENSSL_LH_doall_arg_thunk()\fR, \fBOPENSSL_LH_set_thunks()\fR were added in +OpenSSL 3.3. +.SH COPYRIGHT +.IX Header "COPYRIGHT" +Copyright 2000\-2024 The OpenSSL Project Authors. All Rights Reserved. +.PP +Licensed under the Apache License 2.0 (the "License"). You may not use +this file except in compliance with the License. You can obtain a copy +in the file LICENSE in the source distribution or at +<https://www.openssl.org/source/license.html>. |
