cscg24-guacamole

CSCG 2024 Challenge 'Guacamole Mashup'
git clone https://git.sinitax.com/sinitax/cscg24-guacamole
Log | Files | Refs | sfeed.txt

lws-misc.h (37742B)


      1/*
      2 * libwebsockets - small server side websockets and web server implementation
      3 *
      4 * Copyright (C) 2010 - 2021 Andy Green <andy@warmcat.com>
      5 *
      6 * Permission is hereby granted, free of charge, to any person obtaining a copy
      7 * of this software and associated documentation files (the "Software"), to
      8 * deal in the Software without restriction, including without limitation the
      9 * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
     10 * sell copies of the Software, and to permit persons to whom the Software is
     11 * furnished to do so, subject to the following conditions:
     12 *
     13 * The above copyright notice and this permission notice shall be included in
     14 * all copies or substantial portions of the Software.
     15 *
     16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
     17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
     18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
     19 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
     20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
     21 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
     22 * IN THE SOFTWARE.
     23 */
     24
     25#if defined(LWS_WITH_SPAWN)
     26
     27#if defined(WIN32) || defined(_WIN32)
     28#else
     29#include <sys/wait.h>
     30#include <sys/times.h>
     31#endif
     32#endif
     33
     34#if defined(__OpenBSD__)
     35#include <sys/siginfo.h>
     36#endif
     37
     38/** \defgroup misc Miscellaneous APIs
     39* ##Miscellaneous APIs
     40*
     41* Various APIs outside of other categories
     42*/
     43///@{
     44
     45struct lws_buflist;
     46
     47/**
     48 * lws_buflist_append_segment(): add buffer to buflist at head
     49 *
     50 * \param head: list head
     51 * \param buf: buffer to stash
     52 * \param len: length of buffer to stash
     53 *
     54 * Returns -1 on OOM, 1 if this was the first segment on the list, and 0 if
     55 * it was a subsequent segment.
     56 */
     57LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT
     58lws_buflist_append_segment(struct lws_buflist **head, const uint8_t *buf,
     59			   size_t len);
     60/**
     61 * lws_buflist_next_segment_len(): number of bytes left in current segment
     62 *
     63 * \param head: list head
     64 * \param buf: if non-NULL, *buf is written with the address of the start of
     65 *		the remaining data in the segment
     66 *
     67 * Returns the number of bytes left in the current segment.  0 indicates
     68 * that the buflist is empty (there are no segments on the buflist).
     69 */
     70LWS_VISIBLE LWS_EXTERN size_t
     71lws_buflist_next_segment_len(struct lws_buflist **head, uint8_t **buf);
     72
     73/**
     74 * lws_buflist_use_segment(): remove len bytes from the current segment
     75 *
     76 * \param head: list head
     77 * \param len: number of bytes to mark as used
     78 *
     79 * If len is less than the remaining length of the current segment, the position
     80 * in the current segment is simply advanced and it returns.
     81 *
     82 * If len uses up the remaining length of the current segment, then the segment
     83 * is deleted and the list head moves to the next segment if any.
     84 *
     85 * Returns the number of bytes left in the current segment.  0 indicates
     86 * that the buflist is empty (there are no segments on the buflist).
     87 */
     88LWS_VISIBLE LWS_EXTERN size_t
     89lws_buflist_use_segment(struct lws_buflist **head, size_t len);
     90
     91/**
     92 * lws_buflist_total_len(): Get the total size of the buflist
     93 *
     94 * \param head: list head
     95 *
     96 * Returns the total number of bytes held on all segments of the buflist
     97 */
     98LWS_VISIBLE LWS_EXTERN size_t
     99lws_buflist_total_len(struct lws_buflist **head);
    100
    101/**
    102 * lws_buflist_linear_copy(): copy everything out as one without consuming
    103 *
    104 * \param head: list head
    105 * \param ofs: start offset into buflist in bytes
    106 * \param buf: buffer to copy linearly into
    107 * \param len: length of buffer available
    108 *
    109 * Returns -1 if len is too small, or bytes copied.  Happy to do partial
    110 * copies, returns 0 when there are no more bytes to copy.
    111 */
    112LWS_VISIBLE LWS_EXTERN int
    113lws_buflist_linear_copy(struct lws_buflist **head, size_t ofs, uint8_t *buf,
    114			size_t len);
    115
    116/**
    117 * lws_buflist_linear_use(): copy and consume from buflist head
    118 *
    119 * \param head: list head
    120 * \param buf: buffer to copy linearly into
    121 * \param len: length of buffer available
    122 *
    123 * Copies a possibly fragmented buflist from the head into the linear output
    124 * buffer \p buf for up to length \p len, and consumes the buflist content that
    125 * was copied out.
    126 *
    127 * Since it was consumed, calling again will resume copying out and consuming
    128 * from as far as it got the first time.
    129 *
    130 * Returns the number of bytes written into \p buf.
    131 */
    132LWS_VISIBLE LWS_EXTERN int
    133lws_buflist_linear_use(struct lws_buflist **head, uint8_t *buf, size_t len);
    134
    135/**
    136 * lws_buflist_fragment_use(): copy and consume <= 1 frag from buflist head
    137 *
    138 * \param head: list head
    139 * \param buf: buffer to copy linearly into
    140 * \param len: length of buffer available
    141 * \param frag_first: pointer to char written on exit to if this is start of frag
    142 * \param frag_fin: pointer to char written on exit to if this is end of frag
    143 *
    144 * Copies all or part of the fragment at the start of a buflist from the head
    145 * into the output buffer \p buf for up to length \p len, and consumes the
    146 * buflist content that was copied out.
    147 *
    148 * Since it was consumed, calling again will resume copying out and consuming
    149 * from as far as it got the first time.
    150 *
    151 * Returns the number of bytes written into \p buf.
    152 */
    153LWS_VISIBLE LWS_EXTERN int
    154lws_buflist_fragment_use(struct lws_buflist **head, uint8_t *buf,
    155			 size_t len, char *frag_first, char *frag_fin);
    156
    157/**
    158 * lws_buflist_destroy_all_segments(): free all segments on the list
    159 *
    160 * \param head: list head
    161 *
    162 * This frees everything on the list unconditionally.  *head is always
    163 * NULL after this.
    164 */
    165LWS_VISIBLE LWS_EXTERN void
    166lws_buflist_destroy_all_segments(struct lws_buflist **head);
    167
    168/**
    169 * lws_buflist_describe(): debug helper logging buflist status
    170 *
    171 * \param head: list head
    172 * \param id: pointer shown in debug list
    173 * \param reason: reason string show in debug list
    174 *
    175 * Iterates through the buflist segments showing position and size.
    176 * This only exists when lws was built in debug mode
    177 */
    178LWS_VISIBLE LWS_EXTERN void
    179lws_buflist_describe(struct lws_buflist **head, void *id, const char *reason);
    180
    181/**
    182 * lws_ptr_diff(): helper to report distance between pointers as an int
    183 *
    184 * \param head: the pointer with the larger address
    185 * \param tail: the pointer with the smaller address
    186 *
    187 * This helper gives you an int representing the number of bytes further
    188 * forward the first pointer is compared to the second pointer.
    189 */
    190#define lws_ptr_diff(head, tail) \
    191			((int)((char *)(head) - (char *)(tail)))
    192
    193#define lws_ptr_diff_size_t(head, tail) \
    194			((size_t)(ssize_t)((char *)(head) - (char *)(tail)))
    195
    196/**
    197 * lws_snprintf(): snprintf that truncates the returned length too
    198 *
    199 * \param str: destination buffer
    200 * \param size: bytes left in destination buffer
    201 * \param format: format string
    202 * \param ...: args for format
    203 *
    204 * This lets you correctly truncate buffers by concatenating lengths, if you
    205 * reach the limit the reported length doesn't exceed the limit.
    206 */
    207LWS_VISIBLE LWS_EXTERN int
    208lws_snprintf(char *str, size_t size, const char *format, ...) LWS_FORMAT(3);
    209
    210/**
    211 * lws_strncpy(): strncpy that guarantees NUL on truncated copy
    212 *
    213 * \param dest: destination buffer
    214 * \param src: source buffer
    215 * \param size: bytes left in destination buffer
    216 *
    217 * This lets you correctly truncate buffers by concatenating lengths, if you
    218 * reach the limit the reported length doesn't exceed the limit.
    219 */
    220LWS_VISIBLE LWS_EXTERN char *
    221lws_strncpy(char *dest, const char *src, size_t size);
    222
    223/*
    224 * Variation where we want to use the smaller of two lengths, useful when the
    225 * source string is not NUL terminated
    226 */
    227#define lws_strnncpy(dest, src, size1, destsize) \
    228	lws_strncpy(dest, src, (size_t)(size1 + 1) < (size_t)(destsize) ? \
    229				(size_t)(size1 + 1) : (size_t)(destsize))
    230
    231/**
    232 * lws_nstrstr(): like strstr for length-based strings without terminating NUL
    233 *
    234 * \param buf: the string to search
    235 * \param len: the length of the string to search
    236 * \param name: the substring to search for
    237 * \param nl: the length of name
    238 *
    239 * Returns NULL if \p name is not present in \p buf.  Otherwise returns the
    240 * address of the first instance of \p name in \p buf.
    241 *
    242 * Neither buf nor name need to be NUL-terminated.
    243 */
    244LWS_VISIBLE LWS_EXTERN const char *
    245lws_nstrstr(const char *buf, size_t len, const char *name, size_t nl);
    246
    247/**
    248 * lws_json_simple_find(): dumb JSON string parser
    249 *
    250 * \param buf: the JSON to search
    251 * \param len: the length of the JSON to search
    252 * \param name: the name field to search the JSON for, eg, "\"myname\":"
    253 * \param alen: set to the length of the argument part if non-NULL return
    254 *
    255 * Either returns NULL if \p name is not present in buf, or returns a pointer
    256 * to the argument body of the first instance of \p name, and sets *alen to the
    257 * length of the argument body.
    258 *
    259 * This can cheaply handle fishing out, eg, myarg from {"myname": "myarg"} by
    260 * searching for "\"myname\":".  It will return a pointer to myarg and set *alen
    261 * to 5.  It equally handles args like "myname": true, or "myname":false, and
    262 * null or numbers are all returned as delimited strings.
    263 *
    264 * Anything more complicated like the value is a subobject or array, you should
    265 * parse it using a full parser like lejp.  This is suitable is the JSON is
    266 * and will remain short and simple, and contains well-known names amongst other
    267 * extensible JSON members.
    268 */
    269LWS_VISIBLE LWS_EXTERN const char *
    270lws_json_simple_find(const char *buf, size_t len, const char *name, size_t *alen);
    271
    272/**
    273 * lws_json_simple_strcmp(): dumb JSON string comparison
    274 *
    275 * \param buf: the JSON to search
    276 * \param len: the length of the JSON to search
    277 * \param name: the name field to search the JSON for, eg, "\"myname\":"
    278 * \param comp: return a strcmp of this and the discovered argument
    279 *
    280 * Helper that combines lws_json_simple_find() with strcmp() if it was found.
    281 * If the \p name was not found, returns -1.  Otherwise returns a strcmp()
    282 * between what was found and \p comp, ie, return 0 if they match or something
    283 * else if they don't.
    284 *
    285 * If the JSON is relatively simple and you want to target constrained
    286 * devices, this can be a good choice.  If the JSON may be complex, you
    287 * should use a full JSON parser.
    288 */
    289LWS_VISIBLE LWS_EXTERN int
    290lws_json_simple_strcmp(const char *buf, size_t len, const char *name, const char *comp);
    291
    292
    293/**
    294 * lws_hex_to_byte_array(): convert hex string like 0123456789ab into byte data
    295 *
    296 * \param h: incoming NUL-terminated hex string
    297 * \param dest: array to fill with binary decodes of hex pairs from h
    298 * \param max: maximum number of bytes dest can hold, must be at least half
    299 *		the size of strlen(h)
    300 *
    301 * This converts hex strings into an array of 8-bit representations, ie the
    302 * input "abcd" produces two bytes of value 0xab and 0xcd.
    303 *
    304 * Returns number of bytes produced into \p dest, or -1 on error.
    305 *
    306 * Errors include non-hex chars and an odd count of hex chars in the input
    307 * string.
    308 */
    309LWS_VISIBLE LWS_EXTERN int
    310lws_hex_to_byte_array(const char *h, uint8_t *dest, int max);
    311
    312/**
    313 * lws_hex_from_byte_array(): render byte array as hex char string
    314 *
    315 * \param src: incoming binary source array
    316 * \param slen: length of src in bytes
    317 * \param dest: array to fill with hex chars representing src
    318 * \param len: max extent of dest
    319 *
    320 * This converts binary data of length slen at src, into a hex string at dest
    321 * of maximum length len.  Even if truncated, the result will be NUL-terminated.
    322 */
    323LWS_VISIBLE LWS_EXTERN void
    324lws_hex_from_byte_array(const uint8_t *src, size_t slen, char *dest, size_t len);
    325
    326/**
    327 * lws_hex_random(): generate len - 1 or - 2 characters of random ascii hex
    328 *
    329 * \param context: the lws_context used to get the random
    330 * \param dest: destination for hex ascii chars
    331 * \param len: the number of bytes the buffer dest points to can hold
    332 *
    333 * This creates random ascii-hex strings up to a given length, with a
    334 * terminating NUL.
    335 *
    336 * There will not be any characters produced that are not 0-9, a-f, so it's
    337 * safe to go straight into, eg, JSON.
    338 */
    339LWS_VISIBLE LWS_EXTERN int
    340lws_hex_random(struct lws_context *context, char *dest, size_t len);
    341
    342/*
    343 * lws_timingsafe_bcmp(): constant time memcmp
    344 *
    345 * \param a: first buffer
    346 * \param b: second buffer
    347 * \param len: count of bytes to compare
    348 *
    349 * Return 0 if the two buffers are the same, else nonzero.
    350 *
    351 * Always compares all of the buffer before returning, so it can't be used as
    352 * a timing oracle.
    353 */
    354
    355LWS_VISIBLE LWS_EXTERN int
    356lws_timingsafe_bcmp(const void *a, const void *b, uint32_t len);
    357
    358/**
    359 * lws_get_random(): fill a buffer with platform random data
    360 *
    361 * \param context: the lws context
    362 * \param buf: buffer to fill
    363 * \param len: how much to fill
    364 *
    365 * Fills buf with len bytes of random.  Returns the number of bytes set, if
    366 * not equal to len, then getting the random failed.
    367 */
    368LWS_VISIBLE LWS_EXTERN size_t
    369lws_get_random(struct lws_context *context, void *buf, size_t len);
    370/**
    371 * lws_daemonize(): make current process run in the background
    372 *
    373 * \param _lock_path: the filepath to write the lock file
    374 *
    375 * Spawn lws as a background process, taking care of various things
    376 */
    377LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT
    378lws_daemonize(const char *_lock_path);
    379/**
    380 * lws_get_library_version(): return string describing the version of lws
    381 *
    382 * On unix, also includes the git describe
    383 */
    384LWS_VISIBLE LWS_EXTERN const char * LWS_WARN_UNUSED_RESULT
    385lws_get_library_version(void);
    386
    387/**
    388 * lws_wsi_user() - get the user data associated with the connection
    389 * \param wsi: lws connection
    390 *
    391 * Not normally needed since it's passed into the callback
    392 */
    393LWS_VISIBLE LWS_EXTERN void *
    394lws_wsi_user(struct lws *wsi);
    395
    396/**
    397 * lws_wsi_tsi() - get the service thread index the wsi is bound to
    398 * \param wsi: lws connection
    399 *
    400 * Only useful is LWS_MAX_SMP > 1
    401 */
    402LWS_VISIBLE LWS_EXTERN int
    403lws_wsi_tsi(struct lws *wsi);
    404
    405/**
    406 * lws_set_wsi_user() - set the user data associated with the client connection
    407 * \param wsi: lws connection
    408 * \param user: user data
    409 *
    410 * By default lws allocates this and it's not legal to externally set it
    411 * yourself.  However client connections may have it set externally when the
    412 * connection is created... if so, this api can be used to modify it at
    413 * runtime additionally.
    414 */
    415LWS_VISIBLE LWS_EXTERN void
    416lws_set_wsi_user(struct lws *wsi, void *user);
    417
    418/**
    419 * lws_parse_uri:	cut up prot:/ads:port/path into pieces
    420 *			Notice it does so by dropping '\0' into input string
    421 *			and the leading / on the path is consequently lost
    422 *
    423 * \param p:			incoming uri string.. will get written to
    424 * \param prot:		result pointer for protocol part (https://)
    425 * \param ads:		result pointer for address part
    426 * \param port:		result pointer for port part
    427 * \param path:		result pointer for path part
    428 *
    429 * You may also refer to unix socket addresses, using a '+' at the start of
    430 * the address.  In this case, the address should end with ':', which is
    431 * treated as the separator between the address and path (the normal separator
    432 * '/' is a valid part of the socket path).  Eg,
    433 *
    434 * http://+/var/run/mysocket:/my/path
    435 *
    436 * If the first character after the + is '@', it's interpreted by lws client
    437 * processing as meaning to use linux abstract namespace sockets, the @ is
    438 * replaced with a '\0' before use.
    439 */
    440LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT
    441lws_parse_uri(char *p, const char **prot, const char **ads, int *port,
    442	      const char **path);
    443/**
    444 * lws_cmdline_option():	simple commandline parser
    445 *
    446 * \param argc:		count of argument strings
    447 * \param argv:		argument strings
    448 * \param val:		string to find
    449 *
    450 * Returns NULL if the string \p val is not found in the arguments.
    451 *
    452 * If it is found, then it returns a pointer to the next character after \p val.
    453 * So if \p val is "-d", then for the commandlines "myapp -d15" and
    454 * "myapp -d 15", in both cases the return will point to the "15".
    455 *
    456 * In the case there is no argument, like "myapp -d", the return will
    457 * either point to the '\\0' at the end of -d, or to the start of the
    458 * next argument, ie, will be non-NULL.
    459 */
    460LWS_VISIBLE LWS_EXTERN const char *
    461lws_cmdline_option(int argc, const char **argv, const char *val);
    462
    463/**
    464 * lws_cmdline_option_handle_builtin(): apply standard cmdline options
    465 *
    466 * \param argc:		count of argument strings
    467 * \param argv:		argument strings
    468 * \param info:		context creation info
    469 *
    470 * Applies standard options to the context creation info to save them having
    471 * to be (unevenly) copied into the minimal examples.
    472 *
    473 * Applies default log levels that can be overriden by -d
    474 */
    475LWS_VISIBLE LWS_EXTERN void
    476lws_cmdline_option_handle_builtin(int argc, const char **argv,
    477				  struct lws_context_creation_info *info);
    478
    479/**
    480 * lws_now_secs(): return seconds since 1970-1-1
    481 */
    482LWS_VISIBLE LWS_EXTERN unsigned long
    483lws_now_secs(void);
    484
    485/**
    486 * lws_now_usecs(): return useconds since 1970-1-1
    487 */
    488LWS_VISIBLE LWS_EXTERN lws_usec_t
    489lws_now_usecs(void);
    490
    491/**
    492 * lws_get_context - Allow getting lws_context from a Websocket connection
    493 * instance
    494 *
    495 * With this function, users can access context in the callback function.
    496 * Otherwise users may have to declare context as a global variable.
    497 *
    498 * \param wsi:	Websocket connection instance
    499 */
    500LWS_VISIBLE LWS_EXTERN struct lws_context * LWS_WARN_UNUSED_RESULT
    501lws_get_context(const struct lws *wsi);
    502
    503/**
    504 * lws_get_vhost_listen_port - Find out the port number a vhost is listening on
    505 *
    506 * In the case you passed 0 for the port number at context creation time, you
    507 * can discover the port number that was actually chosen for the vhost using
    508 * this api.
    509 *
    510 * \param vhost:	Vhost to get listen port from
    511 */
    512LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT
    513lws_get_vhost_listen_port(struct lws_vhost *vhost);
    514
    515/**
    516 * lws_get_count_threads(): how many service threads the context uses
    517 *
    518 * \param context: the lws context
    519 *
    520 * By default this is always 1, if you asked for more than lws can handle it
    521 * will clip the number of threads.  So you can use this to find out how many
    522 * threads are actually in use.
    523 */
    524LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT
    525lws_get_count_threads(struct lws_context *context);
    526
    527/**
    528 * lws_get_parent() - get parent wsi or NULL
    529 * \param wsi: lws connection
    530 *
    531 * Specialized wsi like cgi stdin/out/err are associated to a parent wsi,
    532 * this allows you to get their parent.
    533 */
    534LWS_VISIBLE LWS_EXTERN struct lws * LWS_WARN_UNUSED_RESULT
    535lws_get_parent(const struct lws *wsi);
    536
    537/**
    538 * lws_get_child() - get child wsi or NULL
    539 * \param wsi: lws connection
    540 *
    541 * Allows you to find a related wsi from the parent wsi.
    542 */
    543LWS_VISIBLE LWS_EXTERN struct lws * LWS_WARN_UNUSED_RESULT
    544lws_get_child(const struct lws *wsi);
    545
    546/**
    547 * lws_get_effective_uid_gid() - find out eventual uid and gid while still root
    548 *
    549 * \param context: lws context
    550 * \param uid: pointer to uid result
    551 * \param gid: pointer to gid result
    552 *
    553 * This helper allows you to find out what the uid and gid for the process will
    554 * be set to after the privileges are dropped, beforehand.  So while still root,
    555 * eg in LWS_CALLBACK_PROTOCOL_INIT, you can arrange things like cache dir
    556 * and subdir creation / permissions down /var/cache dynamically.
    557 */
    558LWS_VISIBLE LWS_EXTERN void
    559lws_get_effective_uid_gid(struct lws_context *context, uid_t *uid, gid_t *gid);
    560
    561/**
    562 * lws_get_udp() - get wsi's udp struct
    563 *
    564 * \param wsi: lws connection
    565 *
    566 * Returns NULL or pointer to the wsi's UDP-specific information
    567 */
    568LWS_VISIBLE LWS_EXTERN const struct lws_udp * LWS_WARN_UNUSED_RESULT
    569lws_get_udp(const struct lws *wsi);
    570
    571LWS_VISIBLE LWS_EXTERN void *
    572lws_get_opaque_parent_data(const struct lws *wsi);
    573
    574LWS_VISIBLE LWS_EXTERN void
    575lws_set_opaque_parent_data(struct lws *wsi, void *data);
    576
    577LWS_VISIBLE LWS_EXTERN void *
    578lws_get_opaque_user_data(const struct lws *wsi);
    579
    580LWS_VISIBLE LWS_EXTERN void
    581lws_set_opaque_user_data(struct lws *wsi, void *data);
    582
    583LWS_VISIBLE LWS_EXTERN int
    584lws_get_child_pending_on_writable(const struct lws *wsi);
    585
    586LWS_VISIBLE LWS_EXTERN void
    587lws_clear_child_pending_on_writable(struct lws *wsi);
    588
    589LWS_VISIBLE LWS_EXTERN int
    590lws_get_close_length(struct lws *wsi);
    591
    592LWS_VISIBLE LWS_EXTERN unsigned char *
    593lws_get_close_payload(struct lws *wsi);
    594
    595/**
    596 * lws_get_network_wsi() - Returns wsi that has the tcp connection for this wsi
    597 *
    598 * \param wsi: wsi you have
    599 *
    600 * Returns wsi that has the tcp connection (which may be the incoming wsi)
    601 *
    602 * HTTP/1 connections will always return the incoming wsi
    603 * HTTP/2 connections may return a different wsi that has the tcp connection
    604 */
    605LWS_VISIBLE LWS_EXTERN
    606struct lws *lws_get_network_wsi(struct lws *wsi);
    607
    608/**
    609 * lws_set_allocator() - custom allocator support
    610 *
    611 * \param realloc
    612 *
    613 * Allows you to replace the allocator (and deallocator) used by lws
    614 */
    615LWS_VISIBLE LWS_EXTERN void
    616lws_set_allocator(void *(*realloc)(void *ptr, size_t size, const char *reason));
    617
    618enum {
    619	/*
    620	 * Flags for enable and disable rxflow with reason bitmap and with
    621	 * backwards-compatible single bool
    622	 */
    623	LWS_RXFLOW_REASON_USER_BOOL		= (1 << 0),
    624	LWS_RXFLOW_REASON_HTTP_RXBUFFER		= (1 << 6),
    625	LWS_RXFLOW_REASON_H2_PPS_PENDING	= (1 << 7),
    626
    627	LWS_RXFLOW_REASON_APPLIES		= (1 << 14),
    628	LWS_RXFLOW_REASON_APPLIES_ENABLE_BIT	= (1 << 13),
    629	LWS_RXFLOW_REASON_APPLIES_ENABLE	= LWS_RXFLOW_REASON_APPLIES |
    630						  LWS_RXFLOW_REASON_APPLIES_ENABLE_BIT,
    631	LWS_RXFLOW_REASON_APPLIES_DISABLE	= LWS_RXFLOW_REASON_APPLIES,
    632	LWS_RXFLOW_REASON_FLAG_PROCESS_NOW	= (1 << 12),
    633
    634};
    635
    636/**
    637 * lws_rx_flow_control() - Enable and disable socket servicing for
    638 *				received packets.
    639 *
    640 * If the output side of a server process becomes choked, this allows flow
    641 * control for the input side.
    642 *
    643 * \param wsi:	Websocket connection instance to get callback for
    644 * \param enable:	0 = disable read servicing for this connection, 1 = enable
    645 *
    646 * If you need more than one additive reason for rxflow control, you can give
    647 * iLWS_RXFLOW_REASON_APPLIES_ENABLE or _DISABLE together with one or more of
    648 * b5..b0 set to idicate which bits to enable or disable.  If any bits are
    649 * enabled, rx on the connection is suppressed.
    650 *
    651 * LWS_RXFLOW_REASON_FLAG_PROCESS_NOW  flag may also be given to force any change
    652 * in rxflowbstatus to benapplied immediately, this should be used when you are
    653 * changing a wsi flow control state from outside a callback on that wsi.
    654 */
    655LWS_VISIBLE LWS_EXTERN int
    656lws_rx_flow_control(struct lws *wsi, int enable);
    657
    658/**
    659 * lws_rx_flow_allow_all_protocol() - Allow all connections with this protocol to receive
    660 *
    661 * When the user server code realizes it can accept more input, it can
    662 * call this to have the RX flow restriction removed from all connections using
    663 * the given protocol.
    664 * \param context:	lws_context
    665 * \param protocol:	all connections using this protocol will be allowed to receive
    666 */
    667LWS_VISIBLE LWS_EXTERN void
    668lws_rx_flow_allow_all_protocol(const struct lws_context *context,
    669			       const struct lws_protocols *protocol);
    670
    671/**
    672 * lws_remaining_packet_payload() - Bytes to come before "overall"
    673 *					      rx fragment is complete
    674 * \param wsi:		Websocket instance (available from user callback)
    675 *
    676 * This tracks how many bytes are left in the current ws fragment, according
    677 * to the ws length given in the fragment header.
    678 *
    679 * If the message was in a single fragment, and there is no compression, this
    680 * is the same as "how much data is left to read for this message".
    681 *
    682 * However, if the message is being sent in multiple fragments, this will
    683 * reflect the unread amount of the current **fragment**, not the message.  With
    684 * ws, it is legal to not know the length of the message before it completes.
    685 *
    686 * Additionally if the message is sent via the negotiated permessage-deflate
    687 * extension, this number only tells the amount of **compressed** data left to
    688 * be read, since that is the only information available at the ws layer.
    689 */
    690LWS_VISIBLE LWS_EXTERN size_t
    691lws_remaining_packet_payload(struct lws *wsi);
    692
    693#if defined(LWS_WITH_DIR)
    694
    695typedef enum {
    696	LDOT_UNKNOWN,
    697	LDOT_FILE,
    698	LDOT_DIR,
    699	LDOT_LINK,
    700	LDOT_FIFO,
    701	LDOTT_SOCKET,
    702	LDOT_CHAR,
    703	LDOT_BLOCK
    704} lws_dir_obj_type_t;
    705
    706struct lws_dir_entry {
    707	const char *name;
    708	lws_dir_obj_type_t type;
    709};
    710
    711typedef int
    712lws_dir_callback_function(const char *dirpath, void *user,
    713			  struct lws_dir_entry *lde);
    714
    715/**
    716 * lws_dir() - get a callback for everything in a directory
    717 *
    718 * \param dirpath: the directory to scan
    719 * \param user: pointer to give to callback
    720 * \param cb: callback to receive information on each file or dir
    721 *
    722 * Calls \p cb (with \p user) for every object in dirpath.
    723 *
    724 * This wraps whether it's using POSIX apis, or libuv (as needed for windows,
    725 * since it refuses to support POSIX apis for this).
    726 */
    727LWS_VISIBLE LWS_EXTERN int
    728lws_dir(const char *dirpath, void *user, lws_dir_callback_function cb);
    729
    730/**
    731 * lws_dir_rm_rf_cb() - callback for lws_dir that performs recursive rm -rf
    732 *
    733 * \param dirpath: directory we are at in lws_dir
    734 * \param user: ignored
    735 * \param lde: lws_dir info on the file or directory we are at
    736 *
    737 * This is a readymade rm -rf callback for use with lws_dir.  It recursively
    738 * removes everything below the starting dir and then the starting dir itself.
    739 * Works on linux, OSX and Windows at least.
    740 */
    741LWS_VISIBLE LWS_EXTERN int
    742lws_dir_rm_rf_cb(const char *dirpath, void *user, struct lws_dir_entry *lde);
    743
    744/*
    745 * We pass every file in the base dir through a filter, and call back on the
    746 * ones that match.  Directories are ignored.
    747 *
    748 * The original path filter string may look like, eg, "sai-*.deb" or "*.txt"
    749 */
    750
    751typedef int (*lws_dir_glob_cb_t)(void *data, const char *path);
    752
    753typedef struct lws_dir_glob {
    754	const char		*filter;
    755	lws_dir_glob_cb_t	cb;
    756	void			*user;
    757} lws_dir_glob_t;
    758
    759/**
    760 * lws_dir_glob_cb() - callback for lws_dir that performs filename globbing
    761 *
    762 * \param dirpath: directory we are at in lws_dir
    763 * \param user: pointer to your prepared lws_dir_glob_cb_t
    764 * \param lde: lws_dir info on the file or directory we are at
    765 *
    766 * \p user is prepared with an `lws_dir_glob_t` containing a callback for paths
    767 * that pass the filtering, a user pointer to pass to that callback, and a
    768 * glob string like "*.txt".  It may not contain directories, the lws_dir musr
    769 * be started at the correct dir.
    770 *
    771 * Only the base path passed to lws_dir is scanned, it does not look in subdirs.
    772 */
    773LWS_VISIBLE LWS_EXTERN int
    774lws_dir_glob_cb(const char *dirpath, void *user, struct lws_dir_entry *lde);
    775
    776#endif
    777
    778/**
    779 * lws_get_allocated_heap() - if the platform supports it, returns amount of
    780 *				heap allocated by lws itself
    781 *
    782 * On glibc currently, this reports the total amount of current logical heap
    783 * allocation, found by tracking the amount allocated by lws_malloc() and
    784 * friends and accounting for freed allocations via lws_free().
    785 *
    786 * This is useful for confirming where processwide heap allocations actually
    787 * come from... this number represents all lws internal allocations, for
    788 * fd tables, wsi allocations, ah, etc combined.  It doesn't include allocations
    789 * from user code, since lws_malloc() etc are not exported from the library.
    790 *
    791 * On other platforms, it always returns 0.
    792 */
    793size_t lws_get_allocated_heap(void);
    794
    795/**
    796 * lws_get_tsi() - Get thread service index wsi belong to
    797 * \param wsi:  websocket connection to check
    798 *
    799 * Returns more than zero (or zero if only one service thread as is the default).
    800 */
    801LWS_VISIBLE LWS_EXTERN int
    802lws_get_tsi(struct lws *wsi);
    803
    804/**
    805 * lws_is_ssl() - Find out if connection is using SSL
    806 * \param wsi:	websocket connection to check
    807 *
    808 * Returns nonzero if the wsi is inside a tls tunnel, else zero.
    809 */
    810LWS_VISIBLE LWS_EXTERN int
    811lws_is_ssl(struct lws *wsi);
    812/**
    813 * lws_is_cgi() - find out if this wsi is running a cgi process
    814 *
    815 * \param wsi: lws connection
    816 */
    817LWS_VISIBLE LWS_EXTERN int
    818lws_is_cgi(struct lws *wsi);
    819
    820/**
    821 * lws_tls_jit_trust_blob_queury_skid() - walk jit trust blob for skid
    822 *
    823 * \param _blob: the start of the blob in memory
    824 * \param blen: the length of the blob in memory
    825 * \param skid: the SKID we are looking for
    826 * \param skid_len: the length of the SKID we are looking for
    827 * \param prpder: result pointer to receive a pointer to the matching DER
    828 * \param prder_len: result pointer to receive matching DER length
    829 *
    830 * Helper to scan a JIT Trust blob in memory for a trusted CA cert matching
    831 * a given SKID.  Returns 0 if found and *prpder and *prder_len are set, else
    832 * nonzero.
    833 */
    834LWS_VISIBLE LWS_EXTERN int
    835lws_tls_jit_trust_blob_queury_skid(const void *_blob, size_t blen,
    836				   const uint8_t *skid, size_t skid_len,
    837				   const uint8_t **prpder, size_t *prder_len);
    838
    839/**
    840 * lws_open() - platform-specific wrapper for open that prepares the fd
    841 *
    842 * \param __file: the filepath to open
    843 * \param __oflag: option flags
    844 *
    845 * This is a wrapper around platform open() that sets options on the fd
    846 * according to lws policy.  Currently that is FD_CLOEXEC to stop the opened
    847 * fd being available to any child process forked by user code.
    848 */
    849LWS_VISIBLE LWS_EXTERN int
    850lws_open(const char *__file, int __oflag, ...);
    851
    852struct lws_wifi_scan { /* generic wlan scan item */
    853	struct lws_wifi_scan *next;
    854	char ssid[32];
    855	int32_t rssi; /* divide by .count to get db */
    856	uint8_t bssid[6];
    857	uint8_t count;
    858	uint8_t channel;
    859	uint8_t authmode;
    860};
    861
    862#if defined(LWS_WITH_TLS) && !defined(LWS_WITH_MBEDTLS)
    863/**
    864 * lws_get_ssl() - Return wsi's SSL context structure
    865 * \param wsi:	websocket connection
    866 *
    867 * Returns pointer to the SSL library's context structure
    868 */
    869LWS_VISIBLE LWS_EXTERN SSL*
    870lws_get_ssl(struct lws *wsi);
    871#endif
    872
    873LWS_VISIBLE LWS_EXTERN void
    874lws_explicit_bzero(void *p, size_t len);
    875
    876typedef struct lws_humanize_unit {
    877	const char *name; /* array ends with NULL name */
    878	uint64_t factor;
    879} lws_humanize_unit_t;
    880
    881LWS_VISIBLE extern const lws_humanize_unit_t humanize_schema_si[7];
    882LWS_VISIBLE extern const lws_humanize_unit_t humanize_schema_si_bytes[7];
    883LWS_VISIBLE extern const lws_humanize_unit_t humanize_schema_us[8];
    884
    885/**
    886 * lws_humanize() - Convert possibly large number to human-readable uints
    887 *
    888 * \param buf: result string buffer
    889 * \param len: remaining length in \p buf
    890 * \param value: the uint64_t value to represent
    891 * \param schema: and array of scaling factors and units
    892 *
    893 * This produces a concise string representation of \p value, referencing the
    894 * schema \p schema of scaling factors and units to find the smallest way to
    895 * render it.
    896 *
    897 * Three schema are exported from lws for general use, humanize_schema_si, which
    898 * represents as, eg, "  22.130Gi" or " 128      "; humanize_schema_si_bytes
    899 * which is the same but shows, eg, "  22.130GiB", and humanize_schema_us,
    900 * which represents a count of us as a human-readable time like "  14.350min",
    901 * or "  1.500d".
    902 *
    903 * You can produce your own schema.
    904 */
    905
    906LWS_VISIBLE LWS_EXTERN int
    907lws_humanize(char *buf, size_t len, uint64_t value,
    908	     const lws_humanize_unit_t *schema);
    909
    910LWS_VISIBLE LWS_EXTERN void
    911lws_ser_wu16be(uint8_t *b, uint16_t u);
    912
    913LWS_VISIBLE LWS_EXTERN void
    914lws_ser_wu32be(uint8_t *b, uint32_t u32);
    915
    916LWS_VISIBLE LWS_EXTERN void
    917lws_ser_wu64be(uint8_t *b, uint64_t u64);
    918
    919LWS_VISIBLE LWS_EXTERN uint16_t
    920lws_ser_ru16be(const uint8_t *b);
    921
    922LWS_VISIBLE LWS_EXTERN uint32_t
    923lws_ser_ru32be(const uint8_t *b);
    924
    925LWS_VISIBLE LWS_EXTERN uint64_t
    926lws_ser_ru64be(const uint8_t *b);
    927
    928LWS_VISIBLE LWS_EXTERN int
    929lws_vbi_encode(uint64_t value, void *buf);
    930
    931LWS_VISIBLE LWS_EXTERN int
    932lws_vbi_decode(const void *buf, uint64_t *value, size_t len);
    933
    934///@}
    935
    936#if defined(LWS_WITH_SPAWN)
    937
    938/* opaque internal struct */
    939struct lws_spawn_piped;
    940
    941#if defined(WIN32)
    942struct _lws_siginfo_t {
    943	int retcode;
    944};
    945typedef struct _lws_siginfo_t siginfo_t;
    946#endif
    947
    948typedef void (*lsp_cb_t)(void *opaque, lws_usec_t *accounting, siginfo_t *si,
    949			 int we_killed_him);
    950
    951
    952/**
    953 * lws_spawn_piped_info - details given to create a spawned pipe
    954 *
    955 * \p owner: lws_dll2_owner_t that lists all active spawns, or NULL
    956 * \p vh: vhost to bind stdwsi to... from opt_parent if given
    957 * \p opt_parent: optional parent wsi for stdwsi
    958 * \p exec_array: argv for process to spawn
    959 * \p env_array: environment for spawned process, NULL ends env list
    960 * \p protocol_name: NULL, or vhost protocol name to bind stdwsi to
    961 * \p chroot_path: NULL, or chroot patch for child process
    962 * \p wd: working directory to cd to after fork, NULL defaults to /tmp
    963 * \p plsp: NULL, or pointer to the outer lsp pointer so it can be set NULL when destroyed
    964 * \p opaque: pointer passed to the reap callback, if any
    965 * \p timeout: optional us-resolution timeout, or zero
    966 * \p reap_cb: callback when child process has been reaped and the lsp destroyed
    967 * \p tsi: tsi to bind stdwsi to... from opt_parent if given
    968 */
    969struct lws_spawn_piped_info {
    970	struct lws_dll2_owner		*owner;
    971	struct lws_vhost		*vh;
    972	struct lws			*opt_parent;
    973
    974	const char * const		*exec_array;
    975	const char			**env_array;
    976	const char			*protocol_name;
    977	const char			*chroot_path;
    978	const char			*wd;
    979
    980	struct lws_spawn_piped		**plsp;
    981
    982	void				*opaque;
    983
    984	lsp_cb_t			reap_cb;
    985
    986	lws_usec_t			timeout_us;
    987	int				max_log_lines;
    988	int				tsi;
    989
    990	const struct lws_role_ops	*ops; /* NULL is raw file */
    991
    992	uint8_t				disable_ctrlc;
    993};
    994
    995/**
    996 * lws_spawn_piped() - spawn a child process with stdxxx redirected
    997 *
    998 * \p lspi: info struct describing details of spawn to create
    999 *
   1000 * This spawns a child process managed in the lsp object and with attributes
   1001 * set in the arguments.  The stdin/out/err streams are redirected to pipes
   1002 * which are instantiated into wsi that become child wsi of \p parent if non-
   1003 * NULL.  .opaque_user_data on the stdwsi created is set to point to the
   1004 * lsp object, so this can be recovered easily in the protocol handler.
   1005 *
   1006 * If \p owner is non-NULL, successful spawns join the given dll2 owner in the
   1007 * original process.
   1008 *
   1009 * If \p timeout is non-zero, successful spawns register a sul with the us-
   1010 * resolution timeout to callback \p timeout_cb, in the original process.
   1011 *
   1012 * Returns 0 if the spawn went OK or nonzero if it failed and was cleaned up.
   1013 * The spawned process continues asynchronously and this will return after
   1014 * starting it if all went well.
   1015 */
   1016LWS_VISIBLE LWS_EXTERN struct lws_spawn_piped *
   1017lws_spawn_piped(const struct lws_spawn_piped_info *lspi);
   1018
   1019/*
   1020 * lws_spawn_piped_kill_child_process() - attempt to kill child process
   1021 *
   1022 * \p lsp: child object to kill
   1023 *
   1024 * Attempts to signal the child process in \p lsp to terminate.
   1025 */
   1026LWS_VISIBLE LWS_EXTERN int
   1027lws_spawn_piped_kill_child_process(struct lws_spawn_piped *lsp);
   1028
   1029/**
   1030 * lws_spawn_stdwsi_closed() - inform the spawn one of its stdxxx pipes closed
   1031 *
   1032 * \p lsp: the spawn object
   1033 * \p wsi: the wsi that is closing
   1034 *
   1035 * When you notice one of the spawn stdxxx pipes closed, inform the spawn
   1036 * instance using this api.  When it sees all three have closed, it will
   1037 * automatically try to reap the child process.
   1038 *
   1039 * This is the mechanism whereby the spawn object can understand its child
   1040 * has closed.
   1041 */
   1042LWS_VISIBLE LWS_EXTERN void
   1043lws_spawn_stdwsi_closed(struct lws_spawn_piped *lsp, struct lws *wsi);
   1044
   1045/**
   1046 * lws_spawn_get_stdfd() - return std channel index for stdwsi
   1047 *
   1048 * \p wsi: the wsi
   1049 *
   1050 * If you know wsi is a stdwsi from a spawn, you can determine its original
   1051 * channel index / fd before the pipes replaced the default fds.  It will return
   1052 * one of 0 (STDIN), 1 (STDOUT) or 2 (STDERR).  You can handle all three in the
   1053 * same protocol handler and then disambiguate them using this api.
   1054 */
   1055LWS_VISIBLE LWS_EXTERN int
   1056lws_spawn_get_stdfd(struct lws *wsi);
   1057
   1058#endif
   1059
   1060struct lws_fsmount {
   1061	const char	*layers_path;	/* where layers live */
   1062	const char	*overlay_path;	/* where overlay instantiations live */
   1063
   1064	char		mp[256];	/* mountpoint path */
   1065	char		ovname[64];	/* unique name for mount instance */
   1066	char		distro[64];	/* unique name for layer source */
   1067
   1068#if defined(__linux__)
   1069	const char	*layers[4];	/* distro layers, like "base", "env" */
   1070#endif
   1071};
   1072
   1073/**
   1074 * lws_fsmount_mount() - Mounts an overlayfs stack of layers
   1075 *
   1076 * \p fsm: struct lws_fsmount specifying the mount layout
   1077 *
   1078 * This api is able to assemble up to 4 layer directories on to a mountpoint
   1079 * using overlayfs mount (Linux only).
   1080 *
   1081 * Set fsm.layers_path to the base dir where the layers themselves live, the
   1082 * entries in fsm.layers[] specifies the relative path to the layer, comprising
   1083 * fsm.layers_path/fsm.distro/fsm.layers[], with [0] being the deepest, earliest
   1084 * layer and the rest being progressively on top of [0]; NULL indicates the
   1085 * layer is unused.
   1086 *
   1087 * fsm.overlay_path is the base path of the overlayfs instantiations... empty
   1088 * dirs must exist at
   1089 *
   1090 * fsm.overlay_path/overlays/fsm.ovname/work
   1091 * fsm.overlay_path/overlays/fsm.ovname/session
   1092 *
   1093 * Set fsm.mp to the path of an already-existing empty dir that will be the
   1094 * mountpoint, this can be whereever you like.
   1095 *
   1096 * Overlayfs merges the union of all the contributing layers at the mountpoint,
   1097 * the mount is writeable but the layer themselves are immutable, all additions
   1098 * and changes are stored in
   1099 *
   1100 * fsm.overlay_path/overlays/fsm.ovname/session
   1101 *
   1102 * Returns 0 if mounted OK, nonzero if errors.
   1103 *
   1104 * Retain fsm for use with unmounting.
   1105 */
   1106LWS_VISIBLE LWS_EXTERN int
   1107lws_fsmount_mount(struct lws_fsmount *fsm);
   1108
   1109/**
   1110 * lws_fsmount_unmount() - Unmounts an overlayfs dir
   1111 *
   1112 * \p fsm: struct lws_fsmount specifying the mount layout
   1113 *
   1114 * Unmounts the mountpoint in fsm.mp.
   1115 *
   1116 * Delete fsm.overlay_path/overlays/fsm.ovname/session to permanently eradicate
   1117 * all changes from the time the mountpoint was in use.
   1118 *
   1119 * Returns 0 if unmounted OK.
   1120 */
   1121LWS_VISIBLE LWS_EXTERN int
   1122lws_fsmount_unmount(struct lws_fsmount *fsm);