diff --git a/docs/README.md b/docs/README.md index 38725453..e00ad10e 100644 --- a/docs/README.md +++ b/docs/README.md @@ -419,7 +419,7 @@ Initialize event manager structure: - Set default DNS lookup timeout Parameters: -- `mgr` - a pointer to `struct mg_mgr` that needs to be initialised +- `mgr` - a pointer to `mg_mgr` structure that needs to be initialized Return value: none @@ -451,6 +451,12 @@ protocol-specific handler function that is set implicitly. For example, a protocol-specific handler is called before user-specific handler. It parses incoming data and may invoke protocol-specific events like `MG_EV_HTTP_MSG`. +Parameters: +- `mgr` - event manager to use +- `ms` - timeout (maximum time to block current thread), milliseconds + +Return value: none + Usage example: ```c @@ -465,6 +471,11 @@ void mg_mgr_free(struct mg_mgr *mgr); Close all connections, and free all resources. +Parameters: +- `mgr` - event manager to free + +Return value: none + Usage example: ```c @@ -482,6 +493,9 @@ struct mg_connection *mg_listen(struct mg_mgr *mgr, const char *url, ``` Create a listening connection, append this connection to `mgr->conns`. + +Parameters: +- `mgr` - event manager to use - `url` - specifies local IP address and port to listen on, e.g. `tcp://127.0.0.1:1234` or `udp://0.0.0.0:9000` - `fn` - an event handler function @@ -505,6 +519,9 @@ struct mg_connection *mg_connect(struct mg_mgr *mgr, const char *url, ``` Create an outbound connection, append this connection to `mgr->conns`. + +Parameters: +- `mgr` - event manager to use - `url` - specifies remote IP address/port to connect to, e.g. `http://a.com` - `fn` - an event handler function - `fn_data` - an arbitrary pointer, which will be passed as `fn_data` when an @@ -536,6 +553,13 @@ Note: this function does not push data to the network! It only appends data to the output buffer. The data is being sent when `mg_mgr_poll()` is called. If `mg_send()` is called multiple times, the output buffer grows. +Parameters: +- `c` - connection to use +- `data` - data to append +- `size` - size of data + +Return value: `true` if data appended successfully and `false` otherwise + Usage example: ```c @@ -551,6 +575,12 @@ int mg_printf(struct mg_connection *, const char *fmt, ...); Same as `mg_send()`, but formats data using `printf()` semantics. Return number of bytes appended to the output buffer. +Parameters: +- `c` - connection to use +- `fmt` - format string in `printf` semantics + +Return value: number of bytes appended to the output buffer. + Usage example: ```c @@ -565,6 +595,13 @@ int mg_vprintf(struct mg_connection *, const char *fmt, va_list ap); Same as `mg_printf()`, but takes `va_list` argument as a parameter. +Parameters: +- `c` - connection to use +- `fmt` - format string in `printf` semantics +- `ap` - arguments list + +Return value: number of bytes appended to the output buffer. + Usage example: ```c @@ -584,6 +621,13 @@ char *mg_straddr(struct mg_connection *c, char *buf, size_t len); Write stringified IP address, associated with given connection to `buf` (maximum size `len`) +Parameters: +- `c` - connection to use +- `buf` - buffer to write data +- `len` - buffer (`buf`) size + +Return value: `buf` value + Usage example: ```c @@ -617,6 +661,13 @@ Another task can wake up a sleeping event manager (in `mg_mgr_poll()` call) using `mg_mgr_wakeup()`. When an event manager is woken up, a pipe connection event handler function receives `MG_EV_READ` event. +Parameters: +- `mgr` - event manager to use +- `fn` - pointer to event handler function +- `ud` - user data, which will be passed to `fn` + +Return value: pointer to created connection or `NULL` in case of error + Usage example: see [examples/multi-threaded](../examples/multi-threaded). ### mg\_mgr\_wakeup() @@ -628,8 +679,11 @@ void mg_mgr_wakeup(struct mg_connection *pipe); Wake up an event manager that sleeps in `mg_mgr_poll()` call. This function must be called from a separate task/thread. Parameters: +Parameters: - `pipe` - a special connection created by the `mg_mkpipe()` call +Return value: none + Usage example: see [examples/multi-threaded](../examples/multi-threaded). @@ -665,18 +719,22 @@ Structure represents the HTTP message. ### mg\_http\_listen() ```c -struct mg_connection *mg_http_listen(struct mg_mgr *, const char *url, +struct mg_connection *mg_http_listen(struct mg_mgr *mgr, const char *url, mg_event_handler_t fn, void *fn_data); ``` Create HTTP listener. +Parameters: +- `mgr` - event manager to use - `url` - specifies local IP address and port to listen on, e.g. `http://0.0.0.0:8000` - `fn` - an event handler function - `fn_data` - an arbitrary pointer, which will be passed as `fn_data` when an event handler is called. This pointer is also stored in a connection structure as `c->fn_data` +Return value: pointer to created connection or `NULL` in case of error + Usage example: ```c @@ -692,15 +750,20 @@ struct mg_connection *mg_http_connect(struct mg_mgr *, const char *url, ``` Create HTTP client connection. + +Note: this function does not connect to peer, it allocates required resources and +starts connect process. Once peer is really connected `MG_EV_CONNECT` event is +sent to connection event handler. + +Parameters: +- `mgr` - event manager to use - `url` - specifies remote URL, e.g. `http://google.com` - `fn` - an event handler function - `fn_data` - an arbitrary pointer, which will be passed as `fn_data` when an event handler is called. This pointer is also stored in a connection structure as `c->fn_data` -Note: this function does not connect to peer, it allocates required resources and -starts connect process. Once peer is really connected `MG_EV_CONNECT` event is -sent to connection event handler. +Return value: pointer to created connection or `NULL` in case of error Usage example: @@ -716,10 +779,15 @@ if (c == NULL) fatal_error("Cannot create connection"); int mg_http_get_request_len(const unsigned char *buf, size_t buf_len); ``` -Return length of request in `buf` (with maximum len `buf_len`). +Get length of request. The length of request is a number of bytes till the end of HTTP headers. It does not include length of HTTP body. + +Parameters: +- `buf` - pointer to buffer with request +- `buf_len` - maximum request length + Return value: -1 on error, 0 if a message is incomplete, or the length of request. Usage example: @@ -737,8 +805,14 @@ int req_len = mg_http_get_request_len(buf, strlen(buf)); // req_len == 12 int mg_http_parse(const char *s, size_t len, struct mg_http_message *hm); ``` -Parse string `s` (with maximum size `len`) into a structure `hm`. Return request - length - see `mg_http_get_request_len()`. +Parse string request into `mg_http_message` structure + +Parameters: +- `s` - request string +- `len` - maximum request length +- `hm` - pointer to `mg_http_message` structure to receive result + +Return value: request length (see `mg_http_get_request_len()`). Usage example: @@ -756,6 +830,12 @@ void mg_http_printf_chunk(struct mg_connection *c, const char *fmt, ...); Write a chunk of data in chunked encoding format, using `printf()` semantic. +Parameters: +- `c` - connection to use +- `fmt` - format string in `printf` semantics + +Return value: none + Usage example: ```c @@ -770,6 +850,13 @@ void mg_http_write_chunk(struct mg_connection *c, const char *buf, size_t len); Write a chunk of data in chunked encoding format. +Parameters: +- `c` - connection to use +- `buf` - data to write +- `len` - number of bytes to write + +Return value: none + Usage example: ```c @@ -782,7 +869,13 @@ mg_http_write_chunk(c, "hi", 2); void mg_http_delete_chunk(struct mg_connection *c, struct mg_http_message *hm); ``` -Remove chunk specified by `hm` from input buffer. +Remove chunk specified from input buffer. + +Parameters: +- `c` - connection to use +- `hm` - chunk to delete + +Return value: none Usage example: @@ -804,13 +897,20 @@ struct mg_http_serve_opts { const char *ssi_pattern; // SSI file name pattern, e.g. #.shtml const char *extra_headers; // Extra HTTP headers to add in responses }; -void mg_http_serve_dir(struct mg_connection *, struct mg_http_message *hm, +void mg_http_serve_dir(struct mg_connection *c, struct mg_http_message *hm, const struct mg_http_serve_opts *opts); ``` Serve static files according to the given options. Note that in order to enable SSI, set a `-DMG_ENABLE_SSI=1` build flag. +Parameters: +- `c` - connection to use +- `hm` - http message, that should be served +- `opts` - serve options + +Return value: none + Usage example: ```c @@ -829,12 +929,20 @@ void fn(struct mg_connection *c, int ev, void *ev_data, void *fn_data) { ### mg\_http\_serve\_file() ```c -void mg_http_serve_file(struct mg_connection *, struct mg_http_message *hm, +void mg_http_serve_file(struct mg_connection *c, struct mg_http_message *hm, const char *path, struct mg_http_serve_opts *opts); ``` Serve static file. Note that the `extra_headers` must end with `\r\n`. +Parameters: +- `c` - connection to use +- `hm` - http message to serve +- `path` - path to file to serve +- `opts` - serve options + +Return value: none + Usage example: ```c @@ -860,10 +968,14 @@ Send simple HTTP response using `printf()` semantic. This function formats response body according to a `body_fmt`, and automatically appends a correct `Content-Length` header. Extra headers could be passed via `headers` parameter. +Parameters: +- `c` - connection to use - `status_code` - an HTTP response code - `headers` - extra headers, default NULL. If not NULL, must end with `\r\n` - `fmt` - a format string for the HTTP body, in a printf semantics +Return value: none + Usage examples: @@ -894,10 +1006,16 @@ mg_http_reply(c, 403, "", "%s", "Not Authorized\n"); ### mg\_http\_get\_header() ```c -struct mg_str *mg_http_get_header(struct mg_http_message *, const char *name); +struct mg_str *mg_http_get_header(struct mg_http_message *hm, const char *name); ``` -Return value of `name` HTTP header, or NULL if not found. +Get HTTP header value + +Parameters: +- `hm` - HTTP message to look for header +- `name` - header name + +Return value: HTTP header value or `NULL` if not found Usage example: @@ -919,11 +1037,18 @@ void fn(struct mg_connection *c, int ev, void *ev_data, void *fn_data) { ### mg\_http\_get\_var() ```c -int mg_http_get_var(const struct mg_str *, const char *name, char *buf, int len); +int mg_http_get_var(const struct mg_str *var, const char *name, char *buf, int len); ``` -Decode HTTP variable `name` into a given buffer. Return length of decoded -variable. Zero or negative value means error. +Decode HTTP variable + +Parameters: +- `var` - HTTP request body +- `name` - variable name +- `buf` - buffer to write decoded variable +- `len` - buffer size + +Return value: length of decoded variable. Zero or negative value means error. Usage example: @@ -935,7 +1060,7 @@ mg_http_get_var(&hm->body, "key1", buf, sizeof(buf)) { ### mg\_http\_creds() ```c -void mg_http_creds(struct mg_http_message *, char *user, size_t userlen, +void mg_http_creds(struct mg_http_message *hm, char *user, size_t userlen, char *pass, size_t passlen); ``` @@ -950,6 +1075,15 @@ up in the following order: If none is found, then both user and pass are set to empty nul-terminated strings. +Parameters: +- `hm` - HTTP message to look for credentials +- `user` - buffer to receive user name +- `userlen` - size of `user` buffer +- `pass` - buffer to receive password +- `passlen` - size of `pass` buffer + +Return value: none + Usage example: ```c @@ -966,10 +1100,16 @@ void fn(struct mg_connection *c, int ev, void *ev_data, void *fn_data) { ### mg\_http\_match\_uri() ```c -bool mg_http_match_uri(const struct mg_http_message *, const char *glob); +bool mg_http_match_uri(const struct mg_http_message *hm, const char *glob); ``` -Return true if HTTP request matches a given glob pattern; false otherwise. +Check if HTTP request matches a given glob pattern. + +Parameters: +- `hm` - HTTP message to match +- `glob` - pattern + +Return value: true if HTTP request matches a given glob pattern; false otherwise. Usage example: @@ -990,7 +1130,7 @@ void fn(struct mg_connection *c, int ev, void *ev_data, void *fn_data) { ### mg\_http\_upload() ```c -int mg_http_upload(struct mg_connection *, struct mg_http_message *hm, +int mg_http_upload(struct mg_connection *c, struct mg_http_message *hm, const char *dir); ``` @@ -1023,6 +1163,13 @@ So, the expected usage of this API function is this: - When the last chunk is POSTed, upload finishes - POST data must not be encoded in any way, it it saved as-is +Parameters: +- `c` - connection to use +- `hm` - POST message, containing parameters described above +- `dir` - path to directory + +Return value: request body len or negative value on error + Usage example: ```c @@ -1037,11 +1184,18 @@ void fn(struct mg_connection *c, int ev, void *ev_data, void *fn_data) { ### mg\_http\_bauth() ```c -void mg_http_bauth(struct mg_connection *, const char *user, const char *pass); +void mg_http_bauth(struct mg_connection *c, const char *user, const char *pass); ``` Write a Basic `Authorization` header to the output buffer. +Parameters: +- `c` - connection to use +- `user` - user name +- `pass` - password + +Return value: none + Usage example: ```c @@ -1069,6 +1223,13 @@ Parse the multipart chunk in the `body` at a given `offset`. An initial `offset` should be 0. Fill up parameters in the provided `part`, which could be NULL. Return offset to the next chunk, or 0 if there are no more chunks. +Parameters: +- `body`- message body +- `offset` - start offset +- `part` - pointer to `struct mg_http_part` to fill + +Return value: offset to the next chunk, or 0 if there are no more chunks. + See [examples/form-upload](../examples/form-upload) for full usage example. @@ -1098,12 +1259,19 @@ Structure represents the WebSocket message. ### mg\_ws\_connect() ```c -struct mg_connection *mg_ws_connect(struct mg_mgr *, const char *url, +struct mg_connection *mg_ws_connect(struct mg_mgr *mgr, const char *url, mg_event_handler_t fn, void *fn_data, const char *fmt, ...); ``` Create client Websocket connection. + +Note: this function does not connect to peer, it allocates required resources and + starts connect process. Once peer is really connected `MG_EV_CONNECT` event is + sent to connection event handler. + +Parameters: +- `mgr` - event manager to use - `url` - specifies remote URL, e.g. `http://google.com` - `opts` - MQTT options, with client ID, qos, etc - `fn` - an event handler function @@ -1112,9 +1280,7 @@ Create client Websocket connection. structure as `c->fn_data` - `fmt` - printf-like format string for additional HTTP headers, or NULL -Note: this function does not connect to peer, it allocates required resources and - starts connect process. Once peer is really connected `MG_EV_CONNECT` event is - sent to connection event handler. +Return value: pointer to created connection or `NULL` on error Usage example: @@ -1127,7 +1293,7 @@ if(c == NULL) fatal("Cannot create connection"); ### mg\_ws\_upgrade() ```c -void mg_ws_upgrade(struct mg_connection *, struct mg_http_message *, +void mg_ws_upgrade(struct mg_connection *c, struct mg_http_message *, const char *fmt, ...); ``` @@ -1135,6 +1301,13 @@ Upgrade given HTTP connection to Websocket. The `fmt` is a printf-like format string for the extra HTTP headers returned to the client in a Websocket handshake. Set `fmt` to `NULL` if no extra headers needs to be passed. +Parameters: +- `c` - connection to use +- `hm` - HTTP message +- `fmt` - printf-like format string for additional HTTP headers, or NULL + +Return value: none + Usage example: ```c @@ -1150,10 +1323,20 @@ void fn(struct mg_connection *c, int ev, void *ev_data, void *fn_data) { ### mg\_ws\_send() ```c -size_t mg_ws_send(struct mg_connection *, const char *buf, size_t len, int op); +size_t mg_ws_send(struct mg_connection *c, const char *buf, size_t len, int op); ``` -Send `buf` (`len` size) to the websocket peer. `op` is the Websocket message type: +Send data to websocket peer + +Parameters: +- `c` - connection to use +- `buf` - data to send +- `len` - data size +- `op` - Websocket message type + +Return value: sent bytes count + +Possible Websocket message type: ```c #define WEBSOCKET_OP_CONTINUE 0 @@ -1185,6 +1368,13 @@ size_t mg_ws_wrap(struct mg_connection *c, size_t len, int op) Convert data in output buffer to WebSocket format. Useful then implementing protocol over WebSocket See [examples/mqtt-over-ws-client](../examples/mqtt-over-ws-client) for full example. +Parameters: +- `c` - connection to use +- `len` - bytes count to convert +- `op` - Websocket message type (see `mg_ws_send`) + +Return value: new size of connection output buffer + Usage example: ```c @@ -1202,8 +1392,17 @@ struct mg_connection *mg_sntp_connect(struct mg_mgr *mgr, const char *url, mg_event_handler_t fn, void *fn_data) ``` -Connect SNTP server specified by `url` or `time.google.com` if NULL. -Return pointer to created connection or `NULL` on error. +Connect SNTP server. + +Parameters: +- `mgr` - event manager to use +- `url` - specifies remote URL, `time.google.com` if NULL. +- `fn` - an event handler function +- `fn_data` - an arbitrary pointer, which will be passed as `fn_data` when an + event handler is called. This pointer is also stored in a connection + structure as `c->fn_data` + +Return value: pointer to created connection or `NULL` on error. Usage example: @@ -1225,7 +1424,12 @@ void mg_sntp_send(struct mg_connection *c, unsigned long utc) ``` Send time request to SNTP server. Note, that app can't send SNTP request more often than every 1 hour. -`utc` is a current time, used to verify if new request is possible. + +Parameters: +- `c` - connection to use +- `utc` - current time, used to verify if new request is possible. + +Return value: none Usage example: @@ -1265,12 +1469,19 @@ Structure represents the MQTT message. ### mg\_mqtt\_connect() ```c -struct mg_connection *mg_mqtt_connect(struct mg_mgr *, const char *url, +struct mg_connection *mg_mqtt_connect(struct mg_mgr *mgr, const char *url, struct mg_mqtt_opts *opts, mg_event_handler_t fn, void *fn_data); ``` Create client MQTT connection. + +Note: this function does not connect to peer, it allocates required resources and +starts connect process. Once peer is really connected `MG_EV_CONNECT` event is +sent to connection event handler. + +Parameters: +- `mgr` - event manager to use - `url` - specifies remote URL, e.g. `http://google.com` - `opts` - MQTT options, with client ID, qos, etc - `fn` - an event handler function @@ -1278,9 +1489,7 @@ Create client MQTT connection. event handler is called. This pointer is also stored in a connection structure as `c->fn_data` -Note: this function does not connect to peer, it allocates required resources and -starts connect process. Once peer is really connected `MG_EV_CONNECT` event is -sent to connection event handler. +Return value: pointer to created connection or `NULL` on error Usage example: @@ -1304,12 +1513,16 @@ struct mg_connection *mg_mqtt_listen(struct mg_mgr *mgr, const char *url, Create MQTT listener. +Parameters: +- `mgr` - event manager to use - `url` - specifies local IP address and port to listen on, e.g. `mqtt://0.0.0.0:1883` - `fn` - an event handler function - `fn_data` - an arbitrary pointer, which will be passed as `fn_data` when an event handler is called. This pointer is also stored in a connection structure as `c->fn_data` +Return value: pointer to created connection or `NULL` on error + Usage example: ```c @@ -1326,6 +1539,13 @@ void mg_mqtt_login(struct mg_connection *c, const char *url, Send MQTT login request. +Parameters: +- `c` - connection to use +- `url` - url, containing user name and password to use +- `opts` - request options + +Return value: none + Usage example: ```c @@ -1344,11 +1564,20 @@ void fn(struct mg_connection *c, int ev, void *evd, void *fnd) { ### mg\_mqtt\_pub() ```c -void mg_mqtt_pub(struct mg_connection *, struct mg_str *topic, +void mg_mqtt_pub(struct mg_connection *c, struct mg_str *topic, struct mg_str *data, int qos, bool retain); ``` -Publish message `data` to the topic `topic` with given QoS and retain flag. +Publish message. + +Parameters: +- `c` - connection to use +- `topic` - topic to publish data +- `data` - data to publish +- `qos` - required QoS +- `retain` - retain flag + +Return value: none Usage example: @@ -1361,10 +1590,17 @@ mg_mqtt_pub(c, &topic, &data, 1, false); ### mg\_mqtt\_sub() ```c -void mg_mqtt_sub(struct mg_connection *, struct mg_str *topic, int qos); +void mg_mqtt_sub(struct mg_connection *c, struct mg_str *topic, int qos); ``` -Subscribe to topic `topic` with given QoS. +Subscribe to topic. + +Parameters: +- `c` - connection to use +- `topic` - topic to subscribe +- `qos` - required Qos + +Return value: none ```c struct mg_str topic = mg_str("topic"); @@ -1379,7 +1615,15 @@ size_t mg_mqtt_next_sub(struct mg_mqtt_message *msg, struct mg_str *topic, uint8 Traverse list of subscribed topics. Used to implement MQTT server when `MQTT_CMD_SUBSCRIBE` is received. -Return next position, or 0 when done. Initial position `pos` should be 4. Example: +Initial position `pos` should be 4. + +Parameters: +- `mgs` - MQTT message +- `topic` - pointer to `mg_str` to receive topic +- `qos` - pointer to `uint8_t` to receive qos +- `pos` - position to list from + +Return value: next position, or 0 when done. Usage example: @@ -1410,6 +1654,13 @@ size_t mg_mqtt_next_unsub(struct mg_mqtt_message *msg, struct mg_str *topic, siz Same as `mg_mqtt_next_sub()`, but for unsubscribed topics. The difference is that there is no QoS in unsubscribe request. +Parameters: +- `mgs` - MQTT message +- `topic` - pointer to `mg_str` to receive topic +- `pos` - position to list from + +Return value: next position, or 0 when done. + Usage example: ```c @@ -1434,7 +1685,7 @@ void fn(struct mg_connection *c, int ev, void *evd, void *fnd) { ### mg\_mqtt\_send_header() ```c -void mg_mqtt_send_header(struct mg_connection *, uint8_t cmd, uint8_t flags, uint32_t len); +void mg_mqtt_send_header(struct mg_connection *c, uint8_t cmd, uint8_t flags, uint32_t len); ``` Send MQTT command header. Useful in MQTT server implementation. Command can be one of the following value: @@ -1455,6 +1706,14 @@ Send MQTT command header. Useful in MQTT server implementation. Command can be o #define MQTT_CMD_DISCONNECT 14 ``` +Parameters: +- `c` - connection to use +- `cmd` - command (see above) +- `flags` - command flags +- `len` - size of the following command + +Return value: none + Usage example: ```c @@ -1474,11 +1733,16 @@ void fn(struct mg_connection *c, int ev, void *ev_data, void *fn_data) { ### mg\_mqtt\_ping() ```c -void mg_mqtt_ping(struct mg_connection *); +void mg_mqtt_ping(struct mg_connection *c); ``` Send `MQTT_CMD_PINGREQ` command via `mg_mqtt_send_header` +Parameters: +- `c` - connection to use + +Return value: none + Usage example: ```c @@ -1497,8 +1761,14 @@ static void timer_fn(void *arg) { int mg_mqtt_parse(const uint8_t *buf, size_t len, struct mg_mqtt_message *m); ``` -Parse buffer and fill `m` if buffer contain MQTT message. -Return `MQTT_OK` if message succesfully parsed, `MQTT_INCOMPLETE` if message +Parse buffer and fill `mg_mqtt_message` structure if buffer contain MQTT message. + +Parameters: +- `buf` - buffer with MQTT message to parse +- `len` - buffer size +- `m` - pointer to `mg_mqtt_message` structure to receive parsed message + +Return value: `MQTT_OK` if message successfully parsed, `MQTT_INCOMPLETE` if message isn't fully receives and `MQTT_MALFORMED` is message has wrong format. Usage example: @@ -1559,6 +1829,12 @@ Initialise TLS on a given connection. as RNG. The `mg_random` can be overridden by setting `MG_ENABLE_CUSTOM_RANDOM` and defining your own `mg_random()` implementation. +Parameters: +- `c` - connection, for which TLS should be initialized +- `opts` - TLS initialization parameters + +Return value: none + Usage example: ```c @@ -1590,17 +1866,20 @@ as the `mg_mgr_poll()` timeout argument in the main event loop. ### mg\_timer\_init() ```c -void mg_timer_init(struct mg_timer *, unsigned long ms, unsigned flags, +void mg_timer_init(struct mg_timer *t, unsigned long ms, unsigned flags, void (*fn)(void *), void *fn_data); ``` Setup a timer. + +Parameters: +- `t` - pointer to `mg_timer` that should be initialized - `ms` - an interval in milliseconds - `flags` - timer flags bitmask, `MG_TIMER_REPEAT` and `MG_TIMER_RUN_NOW` - `fn` - function to invoke - `fn_data` - function argument -A timer gets initialized and linked into the internal timers list: +Return value: none Usage example: ```c @@ -1610,16 +1889,21 @@ void timer_fn(void *data) { struct mg_timer timer; mg_timer_init(&timer, 1000 /* 1sec */, MG_TIMER_REPEAT, timer_fn, NULL); +// A timer gets initialized and linked into the internal timers list ``` ### mg\_timer\_free() ```c -void mg_timer_free(struct mg_timer *); +void mg_timer_free(struct mg_timer *t); ``` - Free timer, remove it from the internal timers list. +Parameters: +- `t` - timer to free + +Return value: none + Usage example: ```c struct mg_timer timer; @@ -1639,6 +1923,11 @@ past the timer's expiration time. Note, that `mg_mgr_poll` function internally calls `mg_timer_poll`, therefore, in most cases it is unnecessary to call it explicitly. +Parameters: +- `uptime_ms` - current timestamp + +Return value: none + Usage example: ```c @@ -1656,6 +1945,10 @@ double mg_time(void); Return current time as UNIX epoch, using `double` value for sub-second accuracy. +Parameters: none + +Return value: current time + Usage example: ```c @@ -1670,6 +1963,10 @@ unsigned long mg_millis(void); Return current uptime in milliseconds. +Parameters: none + +Return value: current uptime + Usage example: ```c @@ -1684,6 +1981,11 @@ void mg_usleep(unsigned long usecs); Block thread execution for a given number of microseconds. +Parameters: +- `usecs` - number of microseconds to block thread + +Return value: none + Usage example: ```c @@ -1717,6 +2019,11 @@ duplicate provided string, and stores pointer within created `mg_str` structure. Note, that is you have problems in C++ (constructor shadowing), there is `mg_str_s` synonym for this function. +Parameters: +- `s` - pointer to NULL-terminated string to store in created mg_str + +Return value: created Mongoose string + Usage example: ```c @@ -1732,6 +2039,12 @@ struct mg_str mg_str_n(const char *s, size_t n); Create Mongoose string from C-string `s` (can be non-NULL terminated, len is specified in `n`).
Note: this function doesn't duplicate provided string, but stores pointer within created `mg_str` structure. +Parameters: +- `s` - pointer to string to store in created `mg_str` +- `n` - string len + +Return value: created Mongoose string + Usage example: ```c @@ -1745,7 +2058,11 @@ int mg_casecmp(const char *s1, const char *s2); ``` Case insensitive compare two NULL-terminated strings. -Return value is 0 if strings are equal, more than zero if first argument is greater then second, and less than zero otherwise. + +Parameters: +- `s1`, `s2` - pointers to strings to compare + +Return value: 0 if strings are equal, more than zero if first argument is greater then second, and less than zero otherwise. Usage example: @@ -1763,7 +2080,11 @@ int mg_ncasecmp(const char *s1, const char *s2, size_t len); Case insensitive compare two C-strings, not more than `len` symbols or until meet `\0` symbol. -Return value is 0 if strings are equal, more than zero if first argument is +Parameters: +- `s1`, `s2` - pointers to strings to compare +- `len` - maximum length to compare + +Return value: 0 if strings are equal, more than zero if first argument is greater then second and less than zero otherwise. Usage example: @@ -1782,7 +2103,11 @@ int mg_vcmp(const struct mg_str *s1, const char *s2); Сompare mongoose string and C-string. -Return value is 0 if strings are equal, more than zero if first argument is +Parameters: +- `s1` - pointer to Mongoose string to compare +- `s2` - pointer to C-string to compare + +Return value: 0 if strings are equal, more than zero if first argument is greater then second and less than zero otherwise. Usage example: @@ -1802,7 +2127,11 @@ int mg_vcasecmp(const struct mg_str *str1, const char *str2); Case insensitive compare mongoose string and C-string. -Return value is 0 if strings are equal, more than zero if first argument is +Parameters: +- `str1` - Mongoose string to compare +- `str2` - C-string to compare + +Return value: 0 if strings are equal, more than zero if first argument is greater then second and less than zero otherwise. Usage example: @@ -1822,7 +2151,10 @@ int mg_strcmp(const struct mg_str str1, const struct mg_str str2); Сompare two mongoose strings. -Return value is 0 if strings are equal, more than zero if first argument is +Parameters: +- `str1`, `str2` - pointers to Mongoose strings to compare + +Return value: 0 if strings are equal, more than zero if first argument is greater then second and less than zero otherwise. Usage example: @@ -1844,6 +2176,11 @@ struct mg_str mg_strdup(const struct mg_str s); Duplicate provided string. Return new string or `MG_NULL_STR` on error. Note: this function allocates memory for returned string. You may need to free it using `free` function. +Parameters: +- `s` - Mongoose string to duplicate + +Return value: duplicated string + Usage example: ```c @@ -1860,7 +2197,13 @@ free(str1.ptr); const char *mg_strstr(const struct mg_str haystack, const struct mg_str needle) ``` -Search for `needle` substring in `haystack` string. Return pointer to `needle` +Search for `needle` substring in `haystack` string. + +Parameters: +- `haystack` - Mongoose sting to search for substring +- `needle` - Mongoose string to search + +Return value: pointer to `needle` occurrence within `haystack` or `NULL` if not found. Usage example: @@ -1882,6 +2225,11 @@ struct mg_str mg_strstrip(struct mg_str s) Remove heading and trailing whitespace from mongoose string `s`. +Paramaters: +- `s` - Mongoose string for trimming + +Return value: input string + Usage example: ```c @@ -1897,7 +2245,7 @@ if (mg_vcmp(str, "Hello, world") == 0) { bool mg_globmatch(const char *pattern, size_t p_len, const char *s, size_t s_len); ``` -Return true if string `s` (limited to `s_len` symbols) matches glob pattern `pattern`, (limited to `p_len` symbols). +Check if string `s` (limited to `s_len` symbols) matches glob pattern `pattern`, (limited to `p_len` symbols). The glob pattern matching rules are as follows: - `?` matches any single character @@ -1905,6 +2253,14 @@ The glob pattern matching rules are as follows: - `#` matches zero or more characters - any other character matches itself +Parameters: +- `pattern` - pattern to match for +- `p_len` - pattetn lenght +- `s` - string to match +- `s_len` - string lenght + +Return value: `true` is matches, `false` otherwise + Usage example: ```c @@ -1928,6 +2284,13 @@ gets stored in `k` and `v` respectively. IMPORTANT: this function modifies `s` by pointing to the next entry. +Parameters: +- `s` - string to search for entry +- `k` - pointer to `mg_str` to receive entry key +- `v` - pointer to `mg_str` to receive entry value + +Return value: `true` if entry is found, `false` otherwise + Usage example: @@ -1948,6 +2311,12 @@ char *mg_hexdump(const void *buf, int len); Hexdump binary data `buf`, `len` into malloc-ed buffer and return it. It is a caller's responsibility to free() returned pointer. +Parameters: +- `buf` - data to hexdump +- `len` - data lenght + +Return value: malloc-ed buffer with hexdumped data + Usage example: ```c @@ -1965,6 +2334,12 @@ char *mg_hex(const void *buf, size_t len, char *dst); Hex-encode binary data `buf`, `len` into a buffer `dst` and nul-terminate it. The output buffer must be at least 2 x `len` + 1 big. + +Parameters: +- `buf` - data to hex-encode +- `len` - data length +- `dst` - pointer to output buffer + Return value: `dst` pointer. The encoded characters are lowercase. Usage example: @@ -1986,6 +2361,13 @@ void mg_unhex(const char *buf, size_t len, unsigned char *to); Hex-decode string `buf`, `len` into a buffer `to`. The `to` buffer should be at least `lsn` / 2 big. +Parameters: +- `buf` - data to hex-decode +- `len` - data length +- `to` - pointer to output buffer + +Return value: none + Usage example: ```c @@ -2001,10 +2383,16 @@ free(hex); unsigned long mg_unhexn(const char *s, size_t len); ``` -Parse `len` characters of the hex-encoded string `s`, return parsed value. +Parse `len` characters of the hex-encoded string `s`. The maximum value of `len` is the width of the `long` x 2, for example on 32-bit platforms it is 8. +Parameters: +- `s` - string to parse +- `len` - string length + +Return value: return parsed value + Usage example: ```c @@ -2024,7 +2412,14 @@ Print message specified by printf-like format string `fmt` into a buffer pointed by `buf` of size `size`. If `size` is large enough to hold the whole message, then a message is stored in `*buf`. If it does not fit, then a large enough buffer is allocated to hold a message, and `buf` is changed to point to -that buffer. Return value: number of bytes printed. +that buffer. + +Parameters: +- `buf` - pointer to pointer to output buffer +- `size` - pre-allocated buffer size +- `fmt` - printf-like format string + +Return value: number of bytes printed. Usage example: @@ -2041,6 +2436,14 @@ int mg_vasprintf(char **buf, size_t size, const char *fmt, va_list ap); Same as `mg_asprintf()` but uses `va_list` argument. +Parameters: +- `buf` - pointer to pointer to output buffer +- `size` - pre-allocated buffer size +- `fmt` - printf-like format string +- `ap` - parameters list + +Return value: number of bytes printed. + Usage example: ```c void foo(const char *fmt, ...) { @@ -2067,6 +2470,11 @@ int64_t mg_to64(struct mg_str str); Parse 64-bit integer value held by string `s`. +Parameters: +- `str` - string to parse + +Return value: parsed value + Usage example: ```c @@ -2079,7 +2487,13 @@ int64_t val = mg_to64(mg_str("123")); // Val is now 123 bool mg_aton(struct mg_str str, struct mg_addr *addr); ``` -Parse IP address held by `str` and store it in `addr`. Return true on success. +Parse IP address held by `str` and store it in `addr`. + +Parameters: +- `str` - string to parse +- `addr` - pointer to `mg_addr` string to receive parsed value + +Return value: `true` on success, `false` otherwise. Usage example: @@ -2096,7 +2510,14 @@ if (mg_aton(mg_str("127.0.0.1"), &addr)) { char *mg_ntoa(const struct mg_addr *addr, char *buf, size_t len); ``` -Stringify IP address `ipaddr` into a buffer `buf`, `len`. Return `buf`. +Stringify IP address `ipaddr` into a buffer `buf`, `len`. + +Parameters: +- `addr` - address to stringify +- `buf` - pointer to output buffer +- `len` - output buffer size + +Return value: `buf` value Usage example: @@ -2116,6 +2537,13 @@ void mg_call(struct mg_connection *c, int ev, void *ev_data); Send `ev` event to `c` event handler. This function is useful then implementing your own protocol. +Parameters: +- `c` - connection to send event +- `ev` - event to send +- `ev_data` - additional event parameter + +Return value: none + Usage example: ```c @@ -2136,6 +2564,12 @@ void mg_error(struct mg_connection *c, const char *fmt, ...); Send `MG_EV_ERROR` to connection event handler with error message formatted using printf semantics. +Parameters: +- `c` - connection to send event +- `fmt` - format string in `printf` semantics + +Return value: none + Usage example: ```c @@ -2150,6 +2584,11 @@ void mg_md5_init(mg_md5_ctx *c); Initialize context for MD5 hashing. +Parameters: +- `c` - pointer to `mg_md5_ctx` structure to initialize + +Return value: none + Usage example: ```c @@ -2164,6 +2603,13 @@ void mg_md5_update(mg_md5_ctx *c, const unsigned char *data, size_t len); ``` Hash `len` bytes of data pointed by `data` using MD5 algorithm. +Parameters: +- `c` - md5 context +- `data` - data to hash +- `len` - data length + +Return value: none + Usage example: ```c @@ -2178,11 +2624,17 @@ mg_md5_update(&ctx, "more data", 9); // hash "more data" string ### mg\_md5\_final() ```c -void mg_md5_final(mg_md5_ctx *c, unsigned char[16]); +void mg_md5_final(mg_md5_ctx *c, unsigned char buf[16]); ``` Get current MD5 hash for context. +Parameters: +- `c` - md5 context +- `buf` - pointer to buffer to write MD5 hash value + +Return value: none + Usage example: ```c @@ -2197,11 +2649,16 @@ mg_md5_final(&ctx, buf); // `buf` is now MD5 hash ### mg\_sha1\_init() ```c -void mg_sha1_init(mg_sha1_ctx *); +void mg_sha1_init(mg_sha1_ctx *c); ``` Initialize context for calculating SHA1 hash +Parameters: +- `c` - pointer to `mg_sha1_ctx` structure to initialize + +Return value: none + Usage example: ```c @@ -2212,11 +2669,18 @@ mg_sha1_init(&ctx); ### mg\_sha1\_update() ```c -void mg_sha1_update(mg_sha1_ctx *, const unsigned char *data, size_t len); +void mg_sha1_update(mg_sha1_ctx *c, const unsigned char *data, size_t len); ``` Hash `len` bytes of `data` using SHA1 algorithm. +Parameters: +- `c` - sha1 context +- `data` - data to hash +- `len` - data length + +Return value: none + Usage example: ```c @@ -2231,11 +2695,17 @@ mg_sha1_update(&ctx, "more data", 9); // hash "more data" string ### mg\_sha1\_final() ```c -void mg_sha1_final(unsigned char digest[20], mg_sha1_ctx *); +void mg_sha1_final(unsigned char digest[20], mg_sha1_ctx *c); ``` Get current SHA1 hash for context. +Parameters: +- `c` - sha1 context +- `digest` - pointer to buffer to receive hash value + +Return value: none + Usage example: ```c @@ -2254,7 +2724,13 @@ int mg_base64_update(unsigned char p, char *out, int pos); ``` Encode `p` byte to base64 and write result into `out` buffer starting with `pos` position. -Return new position for futher operations. + +Parameters: +- `p` - byte to encode +- `out` - pointer to buffer to write result +- `pos` - position in output buffer to write result + +Return value: new position for futher operations. Usage example: @@ -2271,6 +2747,12 @@ int mg_base64_final(char *buf, int pos); Add base64 finish mark and `\0` symbol to `buf` at `pos` position. +Parameters: +- `buf` - pointer to buffer to write finish mark +- `pos` - position to write + +Return value: new position for futher operations. + ```c char buf[10]; int pos; @@ -2285,7 +2767,14 @@ mg_base64_final(buf, pos); int mg_base64_encode(const unsigned char *p, int n, char *to); ``` -Encode `n` bytes data pointed by `p` using base64 and write result into `to`. Return written symbols number. +Encode `n` bytes data pointed by `p` using base64 and write result into `to`. + +Parameters: +- `p` - pointer to data to encode +- `n` - data length +- `to` - pointer to buffer to write result + +Return value: written symbols number. Usage example: @@ -2300,7 +2789,14 @@ mg_base64_encode((uint8_t *) "abcde", 5, buf); // buf is now YWJjZGU= int mg_base64_decode(const char *src, int n, char *dst); ``` -Decode `n` bytes of base64-ed `src` and write it to `dst`. Return number of written symbols. +Decode `n` bytes of base64-ed `src` and write it to `dst`. + +Parameters: +- `src` - data to decode +- `n` - data length +- `dst` - pointer to output buffer + +Return value: number of written symbols. Usage example: @@ -2319,6 +2815,12 @@ Read file contents into a nul-terminated malloc-ed string. It is a caller's responsibility to free() a returned pointer. If `sizep` is not NULL, it will return a file size in bytes. Return `NULL` on error. +Parameters: +- `path` - path to file to read +- `sizep` - pointer to `size_t` to receive file size + +Return value: file contents, see function description + Usage example: ```c @@ -2335,10 +2837,16 @@ free(data); ```c bool mg_file_write(const char *path, const void *buf, size_t len); ``` - -Write data to a file, return `true` if written, `false` otherwise. +Write data to a file. The write is atomic, i.e. data gets written to a temporary file first, then `rename()-ed` to a destination file name. +Parameters: +- `path` - path to file +- `buf` - data to write +- `len` - data length + +Return value: `true` if written, `false` otherwise. + Usage example: ```c @@ -2355,9 +2863,15 @@ int mg_file_printf(const char *path, const char *fmt, ...); ``` Write into a file `path` using `printf()` semantics. -Return `true` on success, `false` otherwise. This function prints data to a +This function prints data to a temporary in-memory buffer first, then calls `mg_file_write()`. +Parameters: +- `path`- path to file +- `fmt` - format string in `printf()` semantics + +Return value: `true` on success, `false` otherwise. + ```c if (mg_file_printf("my_file.txt", "Hello, %s!", "world") { // File contains "Hello, world!" string @@ -2375,6 +2889,12 @@ function for TLS and some other routines that require RNG (random number generator). It is possible to override a built-in `mg_random()` by specifying a `MG_ENABLE_CUSTOM_RANDOM=1` build preprocessor constant. +Parameters: +- `buf` - pointer to buffer to receive random data +- `len` - buffer size + +Return value: none + Usage example: ```c char buf[10]; @@ -2389,6 +2909,11 @@ uint16_t mg_ntohs(uint16_t net); Convert `uint16_t` value to host order. +Parameters: +- `net` - 16-bit value in network order + +Return value: 16-bit value in host order + Usage example: ```c @@ -2403,6 +2928,11 @@ uint32_t mg_ntohl(uint32_t net); Convert `uint32_t` value to host order. +Parameters: +- `net` - 32-bit value in network order + +Return value: 32-bit value in host order + Usage example: ```c @@ -2412,11 +2942,16 @@ uint32_t val = mg_ntohl(0x12345678); ### mg\_ntohs() ```c -uint16_t mg_htons(uint16_t net); +uint16_t mg_htons(uint16_t h); ``` Convert `uint16_t` value to network order. +Parameters: +- `h` - 16-bit value in host order + +Return value: 16-bit value in network order + Usage example: ```c @@ -2426,11 +2961,16 @@ uint16_t val = mg_htons(0x1234); ### mg\_htonl() ```c -uint32_t mg_ntohl(uint32_t net); +uint32_t mg_ntohl(uint32_t h); ``` Convert `uint32_t` value to network order. +Parameters: +- `h` - 32-bit value in host order + +Return value: 32-bit value in network order + Usage example: ```c @@ -2445,6 +2985,13 @@ uint32_t mg_crc32(uint32_t crc, const char *buf, size_t len); Calculate CRC32 checksum for a given buffer. An initial `crc` value should be `0`. +Parameters: +- `crc` - initial crc value +- `buf` - data to calculate CRC32 +- `len` - data size + +Return value: calculated CRC32 checksum + Usage example: ```c @@ -2460,6 +3007,7 @@ int mg_check_ip_acl(struct mg_str acl, uint32_t remote_ip); Check IPv4 address `remote_ip` against the IP ACL `acl`. Parameters: +Parameters: - `acl` - an ACL string, e.g. `-0.0.0.0/0,+1.2.3.4` - `remote_ip` - IPv4 address in network byte order @@ -2480,7 +3028,15 @@ int mg_url_decode(const char *s, size_t n, char *to, size_t to_len, int form); ``` Decode URL-encoded string `s` and write it into `to` buffer. -If `form` is non-zero, then `+` is decoded as whitespace. + +Parameters: +- `s` - string to encode +- `n` - string to encode lenght +- `to` - pointer to output buffer +- `to_len` - output buffer size +- `form` - if non-zero, then `+` is decoded as whitespace. + +Return value: decoded bytes count or negative value on error Usage example: @@ -2497,7 +3053,14 @@ size_t mg_url_encode(const char *s, size_t n, char *buf, size_t len); ``` Encode `s` string to URL-encoding and write encoded string into `buf`. -Return number of characters written to `buf` + +Parameters: +- `s` - string to encode +- `n` - string to encode length +- `buf` - output buffer +- `len` - output buffer size + +Return value: number of characters written to `buf` Usage example: @@ -2534,7 +3097,13 @@ by `buf`, and `len` specifies number of bytes currently stored. int mg_iobuf_init(struct mg_iobuf *io, size_t size); ``` -Initialize IO buffer, allocate `size` bytes. Return 1 on success, 0 on allocation failure. +Initialize IO buffer, allocate `size` bytes. + +Parameters: +- `io` - pointer to `mg_iobuf` structure to initialize +- `size` - amount of bytes to allocate + +Return value: 1 on success, 0 on allocation failure. Usage example: @@ -2554,7 +3123,12 @@ int mg_iobuf_resize(struct mg_iobuf *io, size_t size); Resize IO buffer, set the new size to `size`. The `io->buf` pointer could change after this, for example if the buffer grows. If `size` is 0, then the `io->buf` is freed and set to NULL, and both `size` and `len` are set to 0. -Return 1 on success, 0 on allocation failure. + +Parameters: +- `io` - iobuf to resize +- `size` - new size + +Return value: 1 on success, 0 on allocation failure Usage example: @@ -2576,6 +3150,11 @@ void mg_iobuf_free(struct mg_iobuf *io); Free memory pointed by `io->buf` and set to NULL. Both `size` and `len` are set to 0. +Parameters: +- `io` - iobuf to free + +Return value: none + Usage example: ```c @@ -2597,6 +3176,15 @@ Insert data buffer `buf`, `len` at offset `offset`. The iobuf gets is expanded if required. The resulting `io->size` is always aligned to the `align` byte boundary - therefore, to avoid memory fragmentation and frequent reallocations, set `align` to a higher value. +Parameters: +- `io` - iobuf to add data +- `offset` - offswt to add data +- `buf` - data to add +- `len` - data lenth +- `align` - align boundary + +Return value: new `io` len + Usage example: ```c @@ -2616,6 +3204,13 @@ size_t mg_iobuf_del(struct mg_iobuf *io, size_t offset, size_t len); Delete `len` bytes starting from `offset`, and shift the remaining bytes. If `len` is greater than `io->len`, nothing happens, so such call is silently ignored. +Parameters: +- `io` - iobuf to delete data +- `offset` - start offset +- `len` - amount of bytes to delete + +Return value: new `io` len + Usage example: ```c @@ -2637,7 +3232,12 @@ mg_iobuf_del(&io, 0, "hi", 2, 512); // io->len is 0, io->size is still 512 unsigned short mg_url_port(const char *url); ``` -Return port for given `url` or `0` if url doesn't contain port and there isn't default port for url protocol. +Return port for given URL + +Parameters: +- `url` - URL to extract port + +Return value: port for given url or `0` if url doesn't contain port and there isn't default port for url protocol. Usage example: @@ -2652,7 +3252,12 @@ unsigned short port2 = mg_url_port("127.0.0.1:567") // port2 is now 567 int mg_url_is_ssl(const char *url); ``` -Return `0` is given URL uses encrypted scheme and non-zero otherwise. +Check if given URL uses encrypted scheme + +Parameters: +- `url` - URL to check + +Return value: `0` is given URL uses encrypted scheme and non-zero otherwise. Usage example: @@ -2670,6 +3275,11 @@ struct mg_str mg_url_host(const char *url); Extract host name from given URL. +Parameters: +- `url` - URL to extract host + +Return value: host name + Usage example: ```c @@ -2684,6 +3294,11 @@ struct mg_str mg_url_user(const char *url); Extract user name from given URL. +Parameters: +- `url` - URL to extract user name + +Return value: user name or empty string if not found + Usage example: ```c @@ -2696,7 +3311,12 @@ struct mg_str user_name = mg_url_user("https://user@password@my.example.org"); / struct mg_str mg_url_pass(const char *url); ``` -Extract user name from given URL. +Extract password from given URL. + +Parameters: +- `url` - URL to extract password + +Return value: password or empty string if not found Usage example: @@ -2710,9 +3330,14 @@ struct mg_str pwd = mg_url_user("https://user@password@my.example.org"); // pwd const char *mg_url_uri(const char *url); ``` -Extract URI from given URL. Return `/` if no URI found. +Extract URI from given URL. Note, that function returns pointer within `url`, no need to free() it explicitly. +Parameters: +- `url` - URL to extract URI + +Return value: URI or `\` if not found + Usage example: ```c @@ -2742,6 +3367,12 @@ Log levels defined as: enum { LL_NONE, LL_ERROR, LL_INFO, LL_DEBUG, LL_VERBOSE_DEBUG }; ``` +Parameters: +- `level` - log level, see levels above +- `args` - information to log + +Return value: none + Usage example: ```c LOG(LL_ERROR, ("Hello %s!", "world")); // Output "Hello, world" @@ -2753,7 +3384,10 @@ LOG(LL_ERROR, ("Hello %s!", "world")); // Output "Hello, world" void mg_log_set(const char *spec); ``` -Set mongoose logging level. `spec` is a string, containing log level, can be one of the following values: +Set mongoose logging level. + +Parameters: +- `spec` - string, containing log level, can be one of the following values: - `0` - disable logging - `1` - log errors only @@ -2761,6 +3395,8 @@ Set mongoose logging level. `spec` is a string, containing log level, can be one - `3` - log errors, into and debug messages - `4` - log everything +Return value: none + It is possible to override log level per source file basis. For example, if there is a file called `foo.c`, and you'd like to set a global level to `2` (info) but increase log level for file foo.c to `debug`. Then, a `spec` should @@ -2782,6 +3418,12 @@ By default, `LOG` writes to standard output stream (aka `stdout`), but this beha can be changes via `mg_log_set_callback`. This function allows to set callback, which called once mongoose (or host application) calls `LOG` +Parameters: +- `fn` - callback function, should be called on logging +- `fnd` - user parameter to pass to `fn` + +Return value: none + Usage example: ```c