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);