diff options
Diffstat (limited to 'docs/man')
139 files changed, 9659 insertions, 0 deletions
diff --git a/docs/man/libnng.adoc b/docs/man/libnng.adoc new file mode 100644 index 00000000..72516705 --- /dev/null +++ b/docs/man/libnng.adoc @@ -0,0 +1,313 @@ += libnng(3) +// +// Copyright 2018 Staysail Systems, Inc. <info@staysail.tech> +// Copyright 2018 Capitar IT Group BV <info@capitar.com> +// +// This document is supplied under the terms of the MIT License, a +// copy of which should be located in the distribution where this +// file was obtained (LICENSE.txt). A copy of the license may also be +// found online at https://opensource.org/licenses/MIT. +// + +== NAME + +libnng - nanomsg next generation library + +== SYNOPSIS + +*cc* [_flags_] _files_ *-lnng* [_libraries_] + +== DESCRIPTION + +The <<nng#,nng(7)>> library provides a common messaging framework +intended to solve common communication problems in distributed applications. + +It provides a C language API. + +=== Common Functions + +The following common functions exist in _libnng_. + +|=== +|<<nng_alloc#,nng_alloc(3)>>|allocate memory +|<<nng_free#,nng_free(3)>>|free memory +|<<nng_strerror#,nng_strerror(3)>>|return an error description +|=== + +=== Socket Functions + +The following functions operate on sockets. + +|=== +|<<nng_close#,nng_close(3)>>|close socket +|<<nng_dial#,nng_dial(3)>>|create and start dialer +|<<nng_getopt#,nng_getopt(3)>>|get socket option +|<<nng_listen#,nng_listen(3)>>|create and start listener +|<<nng_recv#,nng_recv(3)>>|receive data +|<<nng_send#,nng_send(3)>>|send data +|<<nng_setopt#,nng_setopt(3)>>|set socket option +|=== + +=== Connection Management + +The following functions are used with either listeners, or dialers. +Listeners accept incoming connection requets, and dialers make them. + +|=== +|<<nng_dial#,nng_dial(3)>>|create and start dialer +|<<nng_dialer_close#,nng_dialer_close(3)>>|close dialer +|<<nng_dialer_create#,nng_dialer_create(3)>>|create dialer +|<<nng_dialer_getopt#,nng_dialer_getopt(3)>>|get dialer option +|<<nng_dialer_setopt#,nng_dialer_setopt(3)>>|set dialer option +|<<nng_dialer_start#,nng_dialer_start(3)>>|start dialer +|<<nng_listen#,nng_listen(3)>>|create and start listener +|<<nng_listener_close#,nng_listener_close(3)>>|close listener +|<<nng_listener_create#,nng_listener_create(3)>>|create listener +|<<nng_listener_getopt#,nng_listener_getopt(3)>>|get listener option +|<<nng_listener_setopt#,nng_listener_setopt(3)>>|set listener option +|<<nng_listener_start#,nng_listener_start(3)>>|start listener +|=== + +=== Message Handling Functions + +Applications desiring to use the richest part of _libnng_ will want to +use the message API, where a message structure is passed between functions. +This API provides the most power support for zero-copy. + +Messages are divided into a header and body, where the body generally carries +user-payload and the header carries protocol specific header information. +Most applications will only interact with the body. + +|=== +|<<nng_msg_alloc#,nng_msg_alloc(3)>>|allocate a message +|<<nng_msg_append#,nng_msg_append(3)>>|append to message body +|<<nng_msg_body#,nng_msg_body(3)>>|return message body +|<<nng_msg_chop#,nng_msg_chop(3)>>|remove data from end of message body +|<<nng_msg_clear#,nng_msg_clear(3)>>|clear message body +|<<nng_msg_dup#,nng_msg_len(3)>>|duplicate a message +|<<nng_msg_free#,nng_msg_free(3)>>|free a message +|<<nng_msg_insert#,nng_msg_insert(3)>>|prepend to message body +|<<nng_msg_len#,nng_msg_len(3)>>|return the message body length +|<<nng_msg_realloc#,nng_msg_realloc(3)>>|reallocate a message +|<<nng_msg_trim#,nng_msg_trim(3)>>|remove data from start of message body +|<<nng_recv_msg#,nng_recvmsg(3)>>|receive a message +|<<nng_sendmsg#,nng_sendmsg(3)>>|send a message +|=== + +==== Message Header Handling + +TIP: Few applications will need these functions, as message headers are only +used to carry protocol-specific content. However, applications which use raw +mode may need to access the header of messages. + +|=== +|<<nng_msg_header#,nng_msg_header(3)>>|return message header +|<<nng_msg_header_append#,nng_msg_header_append(3)>>|append to message header +|<<nng_msg_header_chop#,nng_msg_header_chop(3)>>|remove data from end of message header +|<<nng_msg_header_clear#,nng_msg_header_clear(3)>>|clear message header +|<<nng_msg_header_insert#,nng_msg_header_insert(3)>>|prepend to message header +|<<nng_msg_header_len#,nng_msg_header_len(3)>>|return the message header length +|<<nng_msg_header_trim#,nng_msg_header_trim(3)>>|remove data from start of message header +|=== + +=== Asynchronous Operations + +Most applications will interact with _nng_ synchronously; that is that +functions such as <<nng_send#,nng_send()>> will block the calling +thread until the operation has completed. + +NOTE: Synchronous operations which send messages may return before the +message has actually been received, or even transmitted. Instead, These +functions return as soon as the message was successfully queued for +delivery. + +Asynchronous operations behave differently. These operations are +initiated by the calling thread, but control returns immediately to +the calling thread. When the operation is subsequently completed (regardless +of whether this was successful or not), then a user supplied function +("callback") is executed. + +A context structure, called an _aio_, is allocated and associated for +each asynchronous operation. Only a single asynchronous operation may +be associated with an _aio_ at any time. + +The following functions are used in the asynchronous model: + +|=== +|<<nng_aio_abort#,nng_aio_abort(3)>>|abort asynchronous I/O operation +|<<nng_aio_alloc#,nng_aio_alloc(3)>>|allocate asynchronous I/O handle +|<<nng_aio_cancel#,nng_aio_cancel(3)>>|cancel asynchronous I/O operation +|<<nng_aio_count#,nng_aio_count(3)>>|return number of bytes transferred +|<<nng_aio_finish#,nng_aio_finish(3)>>|finish an asynchronous I/O operation +|<<nng_aio_free#,nng_aio_free(3)>>|free asynchronous I/O handle +|<<nng_aio_get_input#,nng_aio_get_input(3)>>|return input parameter +|<<nng_aio_get_msg#,nng_aio_get_msg(3)>>|get message from an asynchronous receive +|<<nng_aio_get_output#,nng_aio_get_output(3)>>|return output result +|<<nng_aio_result#,nng_aio_result(3)>>|return result of asynchronous operation +|<<nng_aio_set_input#,nng_aio_set_input(3)>>|set input parameter +|<<nng_aio_set_iov#,nng_aio_set_iov(3)>>|set scatter/gather vector +|<<nng_aio_set_msg#,nng_aio_set_msg(3)>>|set message for an asynchronous send +|<<nng_aio_set_output#,nng_aio_set_output(3)>>|set output result +|<<nng_aio_set_timeout#,nng_aio_set_timeout(3)>>|set asynchronous I/O timeout +|<<nng_aio_stop#,nng_aio_stop(3)>>|stop asynchronous I/O operation +|<<nng_aio_wait#,nng_aio_wait(3)>>|wait for asynchronous I/O operation +|<<nng_recv_aio#,nng_recv_aio(3)>>|receive message asynchronously +|<<nng_send_aio#,nng_send_aio(3)>>|send message asynchronously +|=== + +=== Protocols + +The following functions are used to construct a socket with a specific +protocol: + +|=== +|<<nng_bus#,nng_bus_open(3)>>|open a bus socket +|<<nng_pair#,nng_pair_open(3)>>|open a pair socket +|<<nng_pub#,nng_pub_open(3)>>|open a pub socket +|<<nng_pull#,nng_pull_open(3)>>|open a pull socket +|<<nng_push#,nng_push_open(3)>>|open a push socket +|<<nng_rep#,nng_rep_open(3)>>|open a rep socket +|<<nng_req#,nng_req_open(3)>>|open a req socket +|<<nng_respondent#,nng_respondent_open(3)>>|open a respondent socket +|<<nng_sub#,nng_sub_open(3)>>|open a sub socket +|<<nng_surveyor#,nng_surveyor_open(3)>>|open a surveyor socket +|=== + +=== Transports + +The following functions are used to register a transport for use. + +|=== +| <<nng_inproc#,nng_inproc_register(3)>>|register inproc transport +| <<nng_ipc#,nng_ipc_register(3)>>|register IPC transport +| <<nng_tcp#,nng_tcp_register(3)>>|register TCP transport +| <<nng_tls#,nng_tls_register(3)>>|register TLS transport +| <<nng_ws#,nng_ws_register(3)>>|register WebSocket transport +| <<nng_wss#,nng_wss_register(3)>>|register WebSocket Secure transport +| <<nng_zerotier#,nng_zerotier_register(3)>>|register ZeroTier transport +|=== + +=== URL Object + +Common functionality is supplied for parsing and handling +universal resource locators (URLS). + +|=== +|<<nng_url_clone#,nng_url_clone(3)>>|clone URL structure +|<<nng_url_free#,nng_url_free(3)>>|free URL structure +|<<nng_url_parse#,nng_url_parse(3)>>|create URL structure from string +|=== + + +=== HTTP Support + +The library may be configured with support for HTTP, and this will +be the case if WebSocket support is configured as well. In this case, +it is possible to access functionality to support the creation of +HTTP (and HTTP/S if TLS support is present) servers and clients. + +==== Common HTTP Functions + +The following functions are used to work with HTTP requests, responses, +and connections. + +|=== +|<<nng_http_conn_close#,nng_http_conn_close(3)>>|close HTTP connection +|<<nng_http_conn_read#,nng_http_conn_read(3)>>|read from HTTP connection +|<<nng_http_conn_read_all#,nng_http_conn_read_all(3)>>|read all from HTTP connection +|<<nng_http_conn_read_req#,nng_http_conn_read_req(3)>>|read HTTP request +|<<nng_http_conn_read_res#,nng_http_conn_read_req(3)>>|read HTTP response +|<<nng_http_conn_write#,nng_http_conn_write(3)>>|write to HTTP connection +|<<nng_http_conn_write_all#,nng_http_conn_write_all(3)>>|write all to HTTP connection +|<<nng_http_conn_write_req#,nng_http_conn_write(3)>>|write HTTP request +|<<nng_http_conn_write_res#,nng_http_conn_write(3)>>|write HTTP response +|<<nng_http_req_add_header#,nng_http_req_add_header(3)>>|add HTTP request header +|<<nng_http_req_alloc#,nng_http_req_alloc(3)>>|allocate HTTP request structure +|<<nng_http_req_copy_data#,nng_http_req_copy_data(3)>>|copy HTTP request body +|<<nng_http_req_del_header#,nng_http_req_del_header(3)>>|delete HTTP request header +|<<nng_http_req_free#,nng_http_req_free(3)>>|free HTTP request structure +|<<nng_http_req_get_header#,nng_http_req_get_header(3)>>|return HTTP request header +|<<nng_http_req_get_method#,nng_http_req_get_method(3)>>|return HTTP request method +|<<nng_http_req_get_uri#,nng_http_req_get_uri(3)>>|return HTTP request URI +|<<nng_http_req_get_version#,nng_http_req_get_version(3)>>|return HTTP request protocol version +|<<nng_http_req_set_data#,nng_http_req_set_data(3)>>|set HTTP request body +|<<nng_http_req_set_header#,nng_http_req_set_header(3)>>|set HTTP request header +|<<nng_http_req_set_method#,nng_http_req_set_method(3)>>|set HTTP request method +|<<nng_http_req_set_uri#,nng_http_req_set_uri(3)>>|set HTTP request URI +|<<nng_http_req_set_version#,nng_http_req_set_version(3)>>|set HTTP request protocol version +|<<nng_http_res_add_header#,nng_http_res_add_header(3)>>|add HTTP response header +|<<nng_http_res_alloc#,nng_http_res_alloc(3)>>|allocate HTTP response structure +|<<nng_http_res_alloc_error#,nng_http_res_alloc_error(3)>>|allocate HTTP error response +|<<nng_http_res_copy_data#,nng_http_res_copy_data(3)>>|copy HTTP response body +|<<nng_http_res_del_header#,nng_http_res_del_header(3)>>|delete HTTP response header +|<<nng_http_res_free#,nng_http_res_free(3)>>|free HTTP response structure +|<<nng_http_res_set_data#,nng_http_res_set_data(3)>>|set HTTP response body +|<<nng_http_res_get_header#,nng_http_res_get_header(3)>>|return HTTP response header +|<<nng_http_res_get_reason#,nng_http_res_get_reason(3)>>|return HTTP response reason +|<<nng_http_res_get_status#,nng_http_res_get_status(3)>>|return HTTP response status +|<<nng_http_res_get_version#,nng_http_res_get_version(3)>>|return HTTP response protocol version +|<<nng_http_res_set_header#,nng_http_res_set_header(3)>>|set HTTP response header +|<<nng_http_res_set_reason#,nng_http_res_set_reason(3)>>|set HTTP response reason +|<<nng_http_res_set_status#,nng_http_res_set_status(3)>>|set HTTP response status +|<<nng_http_res_set_version#,nng_http_res_set_version(3)>>|set HTTP response protocol version +|=== + +==== HTTP Client Functions + +These functions are intended for use with HTTP client applications. + +|=== +| <<nng_http_client_alloc#,nng_http_client_alloc(3)>>|allocate HTTP client +| <<nng_http_client_connect#,nng_http_client_connect(3)>>|establish HTTP client connection +| <<nng_http_client_free#,nng_http_client_free(3)>>|free HTTP client +| <<nng_http_client_get_tls#,nng_http_client_get_tls(3)>>|get HTTP client TLS configuration +| <<nng_http_client_set_tls#,nng_http_client_set_tls(3)>>|set HTTP client TLS configuration +|=== + +==== HTTP Server Functions + +These functions are intended for use with HTTP server applications. + +|=== +|<<nng_http_handler_alloc#,nng_http_handler_alloc(3)>>|allocate HTTP server handler +|<<nng_http_handler_free#,nng_http_handler_free(3)>>|free HTTP server handler +|<<nng_http_handler_get_data#,nng_http_handler_get_data(3)>>|return extra data for HTTP handler +|<<nng_http_handler_set_data#,nng_http_handler_set_data(3)>>|set extra data for HTTP handler +|<<nng_http_handler_set_host#,nng_http_handler_set_host(3)>>|set host for HTTP handler +|<<nng_http_handler_set_method#,nng_http_handler_set_method(3)>>|set HTTP handler method +|<<nng_http_handler_set_tree#,nng_http_handler_set_tree(3)>>|set HTTP handler to match trees +|<<nng_http_hijack#,nng_http_hijack(3)>>|hijack HTTP server connection +|<<nng_http_server_add_handler#,nng_http_server_add_handler(3)>>|add HTTP server handler +|<<nng_http_server_del_handler#,nng_http_server_del_handler(3)>>|delete HTTP server handler +|<<nng_http_server_get_tls#,nng_http_server_get_tls(3)>>|get HTTP server TLS configuration +|<<nng_http_server_hold#,nng_http_server_get_tls(3)>>|get and hold HTTP server instance +|<<nng_http_server_release#,nng_http_server_get_tls(3)>>|release HTTP server instance +|<<nng_http_server_set_tls#,nng_http_server_set_tls(3)>>|set HTTP server TLS configuration +|<<nng_http_server_start#,nng_http_server_start(3)>>|start HTTP server +|<<nng_http_server_stop#,nng_http_server_stop(3)>>|stop HTTP server +|=== + +=== TLS Configuration Objects + +The following functions are used to manipulate transport layer security +(TLS) configuration objects. + +NOTE: These functions will only be present if the library has been built +with TLS support. + +|=== +|<<nng_tls_config_auth_alloc#,nng_tls_config_alloc(3)>>|allocate TLS configuration +|<<nng_tls_config_auth_mode#,nng_tls_config_auth_mode(3)>>|set authentication mode +|<<nng_tls_config_ca_chain#,nng_tls_config_ca_chain(3)>>|set certificate authority chain +|<<nng_tls_config_ca_file#,nng_tls_config_ca_file(3)>>|load certificate authority from file +|<<nng_tls_config_cert_key_file#,nng_tls_config_cert_key_file_cert(3)>>|load own certificate and key from file +|<<nng_tls_config_own_cert#,nng_tls_config_own_cert(3)>>|set own certificate and key +|<<nng_tls_config_free#,nng_tls_config_free(3)>>|free TLS configuration +|<<nng_tls_config_server_name#,nng_tls_config_server_name(3)>>|set remote server name +|=== + + +== SEE ALSO + +<<nng#,nng(7)>>, +<<nng_compat#,nng_compat(3)>> diff --git a/docs/man/nng.adoc b/docs/man/nng.adoc new file mode 100644 index 00000000..2d0f6567 --- /dev/null +++ b/docs/man/nng.adoc @@ -0,0 +1,154 @@ += nng(7) +// +// Copyright 2018 Staysail Systems, Inc. <info@staysail.tech> +// Copyright 2018 Capitar IT Group BV <info@capitar.com> +// +// This document is supplied under the terms of the MIT License, a +// copy of which should be located in the distribution where this +// file was obtained (LICENSE.txt). A copy of the license may also be +// found online at https://opensource.org/licenses/MIT. +// + +== NAME + +nng - nanomsg next generation + +== SYNOPSIS + +*cc* ['flags'] 'files' *-lnng* ['libraries'] + +== DESCRIPTION + +The _nng_ library provides a common messaging framework intended to +solve common communication problems in distributed applications. +It offers a number of _protocols_, and also a number of _transports_. + +The _protocols_ implement the semantics associated with particular +communications scenarios, such as RPC style services, service discovery, +publish/subscribe, and so forth. + +The _transports_ provide support for underlying transport methods, such +as TCP, IPC, websockets, and so forth. + +The _nng_ library is designed to permit easy creation of new _transports_ and, +to a lesser extent, new _protocols_. + +The _nng_ library is wire compatible with the SP protocols described in +the nanomsg project; projects using +https://github.com/nanomsg/nanomsg[_libnanomsg_] can inter-operate with +nng as well as other conforming implementations. (One such implementation +is https://github.com/go-mangos/mangos[_mangos_].) Applications using _nng_ +which wish to communicate with older libraries must ensure that they only +use protocols or transports offered by the earlier library. + +The _nng_ library also offers a compatible API, permitting legacy code to +be recompiled or relinked against _nng_. When doing this, support for +certain enhancements or features will likely be absent, requiring the +application developer to use the new-style API. + +The _nng_ library is implemented in pure C; if you need bindings for +other languages please check the http://nanomsg.org/[website]. + +== Protocols + +* <<nng_bus#,nng_bus(7)>> - Bus protocol +* <<nng_pair#,nng_pair(7)>> - Pair protocol +* <<nng_pub#,nng_pub(7)>> - Publisher side of publish/subscribe protocol +* <<nng_pull#,nng_pull(7)>> - Pull side of pipeline protocol +* <<nng_push#,nng_push(7)>> - Push side of pipeline protocol +* <<nng_sub#,nng_sub(7)>> - Subscriber side of publish/subscribe protocol +* <<nng_rep#,nng_rep(7)>> - Reply side of request/reply protocol +* <<nng_req#,nng_req(7)>> - Request side of request/reply protocol +* <<nng_respondent#,nng_respondent(7)>> - Respondent side of survey protocol +* <<nng_surveyor#,nng_surveyor(7)>> - Surveyor side of survey protocol + +== Transports + +* <<nng_inproc#,nng_inproc(7)>> - Intra-process transport +* <<nng_ipc#,nng_ipc(7)>> - Inter-process transport +* <<nng_tls#,nng_tls(7)>> - TLSv1.2 over TCP transport +* <<nng_tcp#,nng_tcp(7)>> - TCP (and TCPv6) transport +* <<nng_ws#,nng_ws(7)>> - WebSocket transport +* <<nng_zerotier#,nng_zerotier(7)>> - ZeroTier transport + +== Conceptual Overview + +_nng_ presents a _socket_ view of networking. The sockets are constructed +using protocol-specific functions, as a given socket implements precisely +one _nng_ protocol. + +Each socket can be used to send and receive messages (if the protocol) +supports it, and implements the appropriate protocol semantics. For +example, <<nng_sub#,nng_sub(7)>> sockets automatically filter incoming +messages to discard those for topics that have not been subscribed. + +_nng_ sockets are message oriented, so that messages are either delivered +wholly, or not at all. Partial delivery is not possible. Furthermore, +_nng_ does not provide any other delivery or ordering guarantees; +messages may be dropped or reordered. (Some protocols, such as +<<nng_req#,nng_req(7)>> may offer stronger guarantees by +performing their own retry and validation schemes.) + +Each socket can have zero, one, or many "endpoints", which are either +_listeners_ or _dialers_. (A given socket may freely choose whether it uses +listeners, dialers, or both.) These "endpoints" provide access to +underlying transports, such as TCP, etc. + +Each endpoint is associated with a URL, which is a service address. For +dialers, this will be the service address that will be contacted, whereas +for listeners this is where the listener will bind and watch for new +connections. + +Endpoints do not themselves transport data. They are instead responsible +for the creation of _pipes_, which can be thought of as message-oriented, +connected, streams. Pipes frequently correspond to a single underlying +byte stream -- for example both IPC and TCP transports implement their +pipes using a 1:1 relationship with a connected socket. + +Endpoints create pipes as needed. Listeners will create them when a new +client connection request arrives, and dialers will generally create one, +then wait for it to disconnect before reconnecting. + +Most applications should not have to worry about endpoints or pipes at +all; the socket abstraction should provide all the functionality needed +other than in a few specific circumstances. + +=== URLs + +The _nng_ library uses universal resource locators (URLs) +following the format specified in +https://tools.ietf.org/html/rfc3986[RFC 3986], +including some schemes that are unique +to SP. +The URLs used in _nng_ are canonicalized as follows, mostly in +accordance with +https://tools.ietf.org/html/rfc3986#section-6.2.2[RFC 3986 6.2.2]: + + . The URL is parsed into scheme, userinfo, host, port, path, query and + fragment components. (Not all of these members are necessarily present.) + . The scheme, hostname, and port if present, are converted to lower case. + . Percent-encoded values for + https://tools.ietf.org/html/rfc3986#section-2.3[unreserved characters] + converted to their unencoded forms. + . Additionally URL percent-encoded values for characters in the path + and with numeric values larger than 127 (i.e. not ASCII) are decoded. + . The resulting path is checked for invalid UTF-8 sequences, consisting + of surrogate pairs, illegal byte sequences, or overlong encodings. + If this check fails, then the entire URL is considered invalid. + . Path segments consisting of `.` and `..` are resolved as per + https://tools.ietf.org/html/rfc3986#section-6.2.2.3[RFC 3986 6.2.2.3]. + . Further, empty path segments are removed, meaning that duplicate + slash (`/`) separators are removed from the path. + +Note that steps 4, 5, and 7 are not specified by RFC 3986, but performing +them is believed to improve both the usability and security of _nng_ +applications, without violating RFC 3986 itself. + +== API + +The library API is documented at <<libnng#,libnng(3)>>. + +== SEE ALSO + +<<libnng#,libnng(3)>>, +<<nng_compat#,nng_compat(3)>> diff --git a/docs/man/nng_aio_abort.adoc b/docs/man/nng_aio_abort.adoc new file mode 100644 index 00000000..51e1533d --- /dev/null +++ b/docs/man/nng_aio_abort.adoc @@ -0,0 +1,52 @@ += nng_aio_abort(3) +// +// Copyright 2018 Staysail Systems, Inc. <info@staysail.tech> +// Copyright 2018 Capitar IT Group BV <info@capitar.com> +// +// This document is supplied under the terms of the MIT License, a +// copy of which should be located in the distribution where this +// file was obtained (LICENSE.txt). A copy of the license may also be +// found online at https://opensource.org/licenses/MIT. +// + +== NAME + +nng_aio_abort - abort asynchronous I/O operation + +== SYNOPSIS + +[source, c] +----------- +#include <nng/nng.h> + +void nng_aio_abort(nng_aio *aio, int err); +----------- + +== DESCRIPTION + +The `nng_aio_abort()` function aborts an operation previously started +with the handle _aio_. If the operation is aborted, then the callback +for the handle will be called, and the function +<<nng_aio_result#,nng_aio_result(3)>> will return the error _err_. + +This function does not wait for the operation to be fully aborted, but +returns immediately. + +If no operation is currently in progress (either because it has already +finished, or no operation has been started yet), then this function +has no effect. + +== RETURN VALUES + +None. + +== ERRORS + +None. + +== SEE ALSO + +<<nng_aio_alloc#,nng_aio_alloc(3)>>, +<<nng_aio_cancel#,nng_aio_cancel(3)>>, +<<nng_aio_result#,nng_aio_result(3)>>, +<<nng#,nng(7)>> diff --git a/docs/man/nng_aio_alloc.adoc b/docs/man/nng_aio_alloc.adoc new file mode 100644 index 00000000..57054e04 --- /dev/null +++ b/docs/man/nng_aio_alloc.adoc @@ -0,0 +1,73 @@ += nng_aio_alloc(3) +// +// Copyright 2018 Staysail Systems, Inc. <info@staysail.tech> +// Copyright 2018 Capitar IT Group BV <info@capitar.com> +// +// This document is supplied under the terms of the MIT License, a +// copy of which should be located in the distribution where this +// file was obtained (LICENSE.txt). A copy of the license may also be +// found online at https://opensource.org/licenses/MIT. +// + +== NAME + +nng_aio_alloc - allocate asynchronous I/O handle + +== SYNOPSIS + +[source, c] +----------- +#include <nng/nng.h> + +int nng_aio_alloc(nng_aio **aiop, void (*callb)(void *), void *arg); +----------- + +== DESCRIPTION + +The `nng_aio_alloc()` function allocates a handle for asynchronous I/O +operations, and stores a pointer to it in __aiop__. The handle is initialized +with a completion callback of _callb_, which will be executed when an +associated asynchronous operation finishes. It will be called with the +argument _arg_. + +Asynchronous I/O operations all take an "aio" handle such as allocated by +this function. Such operations are usually started by a function that returns +immediately. The operation is then run asynchronously, and completes sometime +later. When that operation is complete, the callback supplied here is called, +and that callback is able to determine the result of the operation using +<<nng_aio_result#,nng_aio_result(3)>>, <<nng_aio_count#,nng_aio_count(3)>>, +and <<nng_aio_get_output#,nng_aio_get_output(3)>>. + +It is possible to wait synchronously for an otherwise asynchronous operation +by using the function <<nng_aio_wait#,nng_aio_wait(3)>>. In that case, +it is permissible for _callb_ and _arg_ to both be `NULL`. Note that if +these are `NULL`, then it will not be possible to determine when the +operation is complete except by calling the aforementioned +<<nng_aio_wait#,nng_aio_wait(3)>>. + +== RETURN VALUES + +This function returns 0 on success, and non-zero otherwise. + +== ERRORS + +`NNG_ENOMEM`:: Insufficient free memory to perform the operation. + +== SEE ALSO + +<<nng_aio_abort#,nng_aio_abort(3)>>, +<<nng_aio_cancel#,nng_aio_cancel(3)>>, +<<nng_aio_count#,nng_aio_count(3)>>, +<<nng_aio_free#,nng_aio_free(3)>>, +<<nng_aio_get_input#,nng_aio_get_input(3)>>, +<<nng_aio_get_msg#,nng_aio_get_msg(3)>>, +<<nng_aio_get_output#,nng_aio_get_output(3)>>, +<<nng_aio_result#,nng_aio_result(3)>>, +<<nng_aio_set_input#,nng_aio_set_input(3)>>, +<<nng_aio_set_iov#,nng_aio_set_iov(3)>>, +<<nng_aio_set_msg#,nng_aio_set_msg(3)>>, +<<nng_aio_set_timeout#,nng_aio_set_timeout(3)>>, +<<nng_aio_stop#,nng_aio_stop(3)>>, +<<nng_aio_wait#,nng_aio_wait(3)>>, +<<nng_strerror#,nng_strerror(3)>>, +<<nng#,nng(7)>> diff --git a/docs/man/nng_aio_cancel.adoc b/docs/man/nng_aio_cancel.adoc new file mode 100644 index 00000000..22ef0166 --- /dev/null +++ b/docs/man/nng_aio_cancel.adoc @@ -0,0 +1,55 @@ += nng_aio_cancel(3) +// +// Copyright 2018 Staysail Systems, Inc. <info@staysail.tech> +// Copyright 2018 Capitar IT Group BV <info@capitar.com> +// +// This document is supplied under the terms of the MIT License, a +// copy of which should be located in the distribution where this +// file was obtained (LICENSE.txt). A copy of the license may also be +// found online at https://opensource.org/licenses/MIT. +// + +== NAME + +nng_aio_cancel - cancel asynchronous I/O operation + +== SYNOPSIS + +[source, c] +----------- +#include <nng/nng.h> + +void nng_aio_cancel(nng_aio *aio); +----------- + +== DESCRIPTION + +The `nng_aio_cancel()` function aborts an operation previously started +with the handle _aio_. If the operation is aborted, then the callback +for the handle will be called, and the function +<<nng_aio_result#,nng_aio_result(3)>> will return the error `NNG_ECANCELED`. + +This function does not wait for the operation to be fully aborted, but +returns immediately. + +If no operation is currently in progress (either because it has already +finished, or no operation has been started yet), then this function +has no effect. + +NOTE: This function is the same as calling <<nng_aio_abort#,nng_aio_abort()>> +with the error `NNG_ECANCELED`. + +== RETURN VALUES + +None. + +== ERRORS + +None. + +== SEE ALSO + +<<nng_aio_abort#,nng_aio_abort(3)>>, +<<nng_aio_alloc#,nng_aio_alloc(3)>>, +<<nng_aio_result#,nng_aio_result(3)>>, +<<nng#,nng(7)>> diff --git a/docs/man/nng_aio_count.adoc b/docs/man/nng_aio_count.adoc new file mode 100644 index 00000000..6ea42bf9 --- /dev/null +++ b/docs/man/nng_aio_count.adoc @@ -0,0 +1,58 @@ += nng_aio_count(3) +// +// Copyright 2018 Staysail Systems, Inc. <info@staysail.tech> +// Copyright 2018 Capitar IT Group BV <info@capitar.com> +// +// This document is supplied under the terms of the MIT License, a +// copy of which should be located in the distribution where this +// file was obtained (LICENSE.txt). A copy of the license may also be +// found online at https://opensource.org/licenses/MIT. +// + +== NAME + +nng_aio_count - return number of bytes transferred + +== SYNOPSIS + +[source, c] +----------- +#include <nng/nng.h> + +size_t nng_aio_count(nng_aio *aio); +----------- + +== DESCRIPTION + +The `nng_aio_count()` returns the number of bytes transferred by the +asynchronous operation associated with the handle _aio_. + +Some asynchronous operations do not provide meaningful data for this +function; for example operations that establish connections do not +transfer user data (they may transfer protocol data though) -- in this case +this function will generally return zero. + +This function is most useful when used with operations that make use of +of a scatter/gather vector (set by <<nng_aio_set_iov#,nng_aio_set_iov(3)>>). + +NOTE: The return value from this function is undefined if the operation +has not completed yet. Either call this from the handle's completion +callback, or after waiting for the operation to complete with +<<nng_aio_wait#,nng_aio_wait(3)>>. + +== RETURN VALUES + +The number of bytes transferred by the operation. + +== ERRORS + +None. + +== SEE ALSO + +<<nng_aio_alloc#,nng_aio_alloc(3)>>, +<<nng_aio_result#,nng_aio_result(3)>>, +<<nng_aio_set_iov#,nng_aio_set_iov(3)>>, +<<nng_aio_wait#,nng_aio_wait(3)>>, +<<nng_strerror#,nng_strerror(3)>>, +<<nng#,nng(7)>> diff --git a/docs/man/nng_aio_finish.adoc b/docs/man/nng_aio_finish.adoc new file mode 100644 index 00000000..42c51970 --- /dev/null +++ b/docs/man/nng_aio_finish.adoc @@ -0,0 +1,54 @@ += nng_aio_finish(3) +// +// Copyright 2018 Staysail Systems, Inc. <info@staysail.tech> +// Copyright 2018 Capitar IT Group BV <info@capitar.com> +// +// This document is supplied under the terms of the MIT License, a +// copy of which should be located in the distribution where this +// file was obtained (LICENSE.txt). A copy of the license may also be +// found online at https://opensource.org/licenses/MIT. +// + +== NAME + +nng_aio_finish - finish asynchronous I/O operation + +== SYNOPSIS + +[source, c] +----------- +#include <nng/nng.h> + +void nng_aio_finish(nng_aio *aio, int err); +----------- + +== DESCRIPTION + +The `nng_aio_finish()` function marks operation associated with _aio_ as +complete, with the status _err_. This will be the result returned by +<<nng_aio_result#,nng_aio_result(3)>>. + +This function causes the callback associated with the _aio_ to called. + +WARNING: It is mandatory that operation "providers" call this function +*EXACTLY ONCE* when they are finished with the operation. After calling this +function they *MUST NOT* perform any further accesses the _aio_. + +WARNING: This function is only for I/O providers (those actually performing +the operation such as HTTP handler function or a transport provider); ordinary +users of the _aio_ should not have any need for this function. + +== RETURN VALUES + +None. + +== ERRORS + +None. + +== SEE ALSO + +<<nng_aio_alloc#,nng_aio_alloc(3)>>, +<<nng_aio_cancel#,nng_aio_cancel(3)>>, +<<nng_aio_result#,nng_aio_result(3)>>, +<<nng#,nng(7)>> diff --git a/docs/man/nng_aio_free.adoc b/docs/man/nng_aio_free.adoc new file mode 100644 index 00000000..20ece8ae --- /dev/null +++ b/docs/man/nng_aio_free.adoc @@ -0,0 +1,45 @@ += nng_aio_free(3) +// +// Copyright 2018 Staysail Systems, Inc. <info@staysail.tech> +// Copyright 2018 Capitar IT Group BV <info@capitar.com> +// +// This document is supplied under the terms of the MIT License, a +// copy of which should be located in the distribution where this +// file was obtained (LICENSE.txt). A copy of the license may also be +// found online at https://opensource.org/licenses/MIT. +// + +== NAME + +nng_aio_free - free asynchronous I/O handle + +== SYNOPSIS + +[source, c] +----------- +#include <nng/nng.h> + +void nng_aio_free(nng_aio *aio); +----------- + +== DESCRIPTION + +The `nng_aio_free()` function frees an allocated asynchronous I/O handle. +If any operation is in progress, the operation is canceled, and the +caller is blocked until the operation is completely canceled, to ensure +that it is safe to deallocate the handle and any associated resources. +(This is done by implicitly calling <<nng_aio_stop#,nng_aio_stop(3)>>.) + +== RETURN VALUES + +None. + +== ERRORS + +None. + +== SEE ALSO + +<<nng_aio_alloc#,nng_aio_alloc(3)>>, +<<nng_aio_stop#,nng_aio_stop(3)>>, +<<nng#,nng(7)>> diff --git a/docs/man/nng_aio_get_input.adoc b/docs/man/nng_aio_get_input.adoc new file mode 100644 index 00000000..73b0acd2 --- /dev/null +++ b/docs/man/nng_aio_get_input.adoc @@ -0,0 +1,50 @@ += nng_aio_get_input(3) +// +// Copyright 2018 Staysail Systems, Inc. <info@staysail.tech> +// Copyright 2018 Capitar IT Group BV <info@capitar.com> +// +// This document is supplied under the terms of the MIT License, a +// copy of which should be located in the distribution where this +// file was obtained (LICENSE.txt). A copy of the license may also be +// found online at https://opensource.org/licenses/MIT. +// + +== NAME + +nng_aio_set_input - return input parameter + +== SYNOPSIS + +[source, c] +----------- +#include <nng/nng.h> + +void *nng_aio_get_input(nng_aio *aio, unsigned int index); +----------- + +== DESCRIPTION + +The `nng_aio_get_input()` function returns the value of the input parameter +previously set at _index_ on _aio_ with the +<<nng_aio_set_input#,nng_aio_set_input(3)>> function. + +The valid values of _index_ range from zero (0) to three (3), as no operation +currently defined can accept more than four parameters. (This limit could +increase in the future.) If the index supplied is outside of this range, +or of the input parameter was not previously set, then `NULL` is returned. + +== RETURN VALUES + +Value previously set, or `NULL`. + +== ERRORS + +None. + +== SEE ALSO + +<<nng_aio_alloc#,nng_aio_alloc(3)>>, +<<nng_aio_get_output#,nng_aio_get_output(3)>>, +<<nng_aio_set_input#,nng_aio_set_input(3)>>, +<<nng_aio_result#,nng_aio_result(3)>>, +<<nng#,nng(7)>> diff --git a/docs/man/nng_aio_get_output.adoc b/docs/man/nng_aio_get_output.adoc new file mode 100644 index 00000000..a362e0ae --- /dev/null +++ b/docs/man/nng_aio_get_output.adoc @@ -0,0 +1,54 @@ += nng_aio_get_output(3) +// +// Copyright 2018 Staysail Systems, Inc. <info@staysail.tech> +// Copyright 2018 Capitar IT Group BV <info@capitar.com> +// +// This document is supplied under the terms of the MIT License, a +// copy of which should be located in the distribution where this +// file was obtained (LICENSE.txt). A copy of the license may also be +// found online at https://opensource.org/licenses/MIT. +// + +== NAME + +nng_aio_get_output - return output result + +== SYNOPSIS + +[source, c] +----------- +#include <nng/nng.h> + +void *nng_aio_get_output(nng_aio *aio, unsigned int index); +----------- + +== DESCRIPTION + +The `nng_aio_get_output()` function returns the output result at _index_ +resulting from the asynchronous operation associated with _aio_. + +The type and semantics of output parameters are determined by specific +operations. + +NOTE: If the _index_ does not correspond to a defined output for the operation, +or the operation did not succeed, then the return value will be `NULL`. + +CAUTION: It is an error to call this function while the _aio_ is currently +in use by an active asynchronous operation, or if no operation has been +performed using the _aio_ yet. + +== RETURN VALUES + +The __index__th result of the operation, or `NULL`. + +== ERRORS + +None. + +== SEE ALSO + +<<nng_aio_alloc#,nng_aio_alloc(3)>>, +<<nng_aio_get_output#,nng_aio_get_output(3)>>, +<<nng_aio_set_input#,nng_aio_set_input(3)>>, +<<nng_aio_result#,nng_aio_result(3)>>, +<<nng#,nng(7)>> diff --git a/docs/man/nng_aio_result.adoc b/docs/man/nng_aio_result.adoc new file mode 100644 index 00000000..1b55dc0e --- /dev/null +++ b/docs/man/nng_aio_result.adoc @@ -0,0 +1,56 @@ += nng_aio_result(3) +// +// Copyright 2018 Staysail Systems, Inc. <info@staysail.tech> +// Copyright 2018 Capitar IT Group BV <info@capitar.com> +// +// This document is supplied under the terms of the MIT License, a +// copy of which should be located in the distribution where this +// file was obtained (LICENSE.txt). A copy of the license may also be +// found online at https://opensource.org/licenses/MIT. +// + +== NAME + +nng_aio_result - return result of asynchronous operation + +== SYNOPSIS + +[source, c] +----------- +#include <nng/nng.h> + +int nng_aio_wait(nng_aio *aio); +----------- + + +== DESCRIPTION + +The `nng_aio_result()` returns the result of the operation associated +with the handle _aio_. +If the operation was successful, then 0 is returned. Otherwise a non-zero +error code is returned. + +NOTE: The return value from this function is undefined if the operation +has not completed yet. Either call this from the handle's completion +callback, or after waiting for the operation to complete with +<<nng_aio_wait#,nng_aio_wait(3)>>. + +== RETURN VALUES + +The result of the operation, either zero on success, or an error +number on failure. + +== ERRORS + +`NNG_ETIMEDOUT`:: The operation timed out. +`NNG_ECANCELED`:: The operation was canceled. + +Various other return values are possible dependending on the operation. + +== SEE ALSO + +<<nng_aio_abort#,nng_aio_abort(3)>>, +<<nng_aio_alloc#,nng_aio_alloc(3)>>, +<<nng_aio_wait#,nng_aio_wait(3)>>, +<<nng_strerror#,nng_strerror(3)>>, +<<nng#,nng(7)>> diff --git a/docs/man/nng_aio_set_input.adoc b/docs/man/nng_aio_set_input.adoc new file mode 100644 index 00000000..3a240c6a --- /dev/null +++ b/docs/man/nng_aio_set_input.adoc @@ -0,0 +1,62 @@ += nng_aio_set_input(3) +// +// Copyright 2018 Staysail Systems, Inc. <info@staysail.tech> +// Copyright 2018 Capitar IT Group BV <info@capitar.com> +// +// This document is supplied under the terms of the MIT License, a +// copy of which should be located in the distribution where this +// file was obtained (LICENSE.txt). A copy of the license may also be +// found online at https://opensource.org/licenses/MIT. +// + +== NAME + +nng_aio_set_input - set input parameter + +== SYNOPSIS + +[source, c] +----------- +#include <nng/nng.h> + +void nng_aio_set_input(nng_aio *aio, unsigned int index, void *param); +----------- + +== DESCRIPTION + +The `nng_aio_set_input()` function sets the input parameter at _index_ +to _param_ for the asynchronous operation associated with _aio_. + +The type and semantics of input parameters are determined by specific +operations; the caller must supply appropriate inputs for the operation +to be performed. + +The valid values of _index_ range from zero (0) to three (3), as no operation +currently defined can accept more than four parameters. (This limit could +increase in the future.) + +NOTE: If the _index_ does not correspond to a defined input for the operation, +then this function will have no effect. Note that attempts to set +parameters with an _index_ greater than three (3) will simply be ignored. + +CAUTION: It is an error to call this function while the _aio_ is currently +in use by an active asynchronous operation. + +An input parameter set with this function may be retrieved later with +the <<nng_aio_get_input#,nng_aio_get_input(3)>> function. + +== RETURN VALUES + +None. + +== ERRORS + +None. + +== SEE ALSO + +<<nng_aio_alloc#,nng_aio_alloc(3)>>, +<<nng_aio_get_input#,nng_aio_get_input(3)>>, +<<nng_aio_get_output#,nng_aio_get_output(3)>>, +<<nng_aio_result#,nng_aio_result(3)>>, +<<nng#,nng(7)>> diff --git a/docs/man/nng_aio_set_iov.adoc b/docs/man/nng_aio_set_iov.adoc new file mode 100644 index 00000000..d5991ed6 --- /dev/null +++ b/docs/man/nng_aio_set_iov.adoc @@ -0,0 +1,71 @@ += nng_aio_set_iov(3) +// +// Copyright 2018 Staysail Systems, Inc. <info@staysail.tech> +// Copyright 2018 Capitar IT Group BV <info@capitar.com> +// +// This document is supplied under the terms of the MIT License, a +// copy of which should be located in the distribution where this +// file was obtained (LICENSE.txt). A copy of the license may also be +// found online at https://opensource.org/licenses/MIT. +// + +== NAME + +nng_aio_set_iov - set scatter/gather vector + +== SYNOPSIS + +[source, c] +----------- +#include <nng/nng.h> + +int nng_aio_set_iov(nng_aio *aio, unsigned int niov, nng_iov *iov); +----------- + +== DESCRIPTION + +The `nng_aio_set_iov()` function sets a scatter/gather vector _iov_ on the +handle _aio_. + +The _iov_ is a pointer to an array of _niov_ `nng_iov` structures, which have +the following definition: + +[source, c] +---- + typedef struct nng_iov { + void * iov_buf; + size_t iov_len; + }; +---- + +The _iov_ is copied into storage in the _aio_ itself, so that callers +may use stack allocated `nng_iov` structures. The values pointed to +by the `iov_buf` members are *not* copied by this function though. + +Up to four `nng_iov` members may be supplied without causing any +allocations, and thus this operation is guaranteed to succeed for +values of _niov_ less than four. + +More than four (4) `nng_iov` members may be supplied, but this may require +heap allocations, and so the operation may fail with `NNG_ENOMEM`. +Additionally, not every operation can support longer vectors; the +actual limit is determined by the system, but is generally at least +sixteen (16). Furthermore, values for _niov_ larger than sixty-four (64) will +generally result in `NNG_EINVAL`. + +== RETURN VALUES + +This function returns 0 on success, and non-zero otherwise. + +== ERRORS + +`NNG_ENOMEM`:: Insufficient free memory to perform operation. +`NNG_EINVAL`:: Value of specified _niov_ is too large. + +== SEE ALSO + +<<nng_aio_alloc#,nng_aio_alloc(3)>>, +<<nng_aio_cancel#,nng_aio_cancel(3)>>, +<<nng_aio_count#,nng_aio_count(3)>>, +<<nng_aio_result#,nng_aio_result(3)>>, +<<nng#,nng(7)>> diff --git a/docs/man/nng_aio_set_output.adoc b/docs/man/nng_aio_set_output.adoc new file mode 100644 index 00000000..4c3d4a21 --- /dev/null +++ b/docs/man/nng_aio_set_output.adoc @@ -0,0 +1,58 @@ += nng_aio_set_output(3) +// +// Copyright 2018 Staysail Systems, Inc. <info@staysail.tech> +// Copyright 2018 Capitar IT Group BV <info@capitar.com> +// +// This document is supplied under the terms of the MIT License, a +// copy of which should be located in the distribution where this +// file was obtained (LICENSE.txt). A copy of the license may also be +// found online at https://opensource.org/licenses/MIT. +// + +== NAME + +nng_aio_set_output - set output result + +== SYNOPSIS + +[source, c] +----------- +#include <nng/nng.h> + +void nng_aio_set_output(nng_aio *aio, unsigned int index, void *result); +----------- + +== DESCRIPTION + +The `nng_aio_set_output()` function sets the output result at _index_ +to _result_ for the asynchronous operation associated with _aio_. + +The type and semantics of output results are determined by specific +operations; the operation must supply appropriate output results when +the operation completes successfully. + +The valid values of _index_ range from zero (0) to three (3), as no operation +currently defined can return more than four results. (This limit could +increase in the future.) + +NOTE: Note that attempts to set results with an _index_ greater than +three (3) will be ignored. + +An output result set with this function may be retrieved later with +the <<nng_aio_get_output#,nng_aio_get_output(3)>> function. + +== RETURN VALUES + +None. + +== ERRORS + +None. + +== SEE ALSO + +<<nng_aio_alloc#,nng_aio_alloc(3)>>, +<<nng_aio_finish#,nng_aio_finish(3)>>, +<<nng_aio_get_output#,nng_aio_get_output(3)>>, +<<nng_aio_result#,nng_aio_result(3)>>, +<<nng#,nng(7)>> diff --git a/docs/man/nng_aio_set_timeout.adoc b/docs/man/nng_aio_set_timeout.adoc new file mode 100644 index 00000000..ff1244d5 --- /dev/null +++ b/docs/man/nng_aio_set_timeout.adoc @@ -0,0 +1,60 @@ += nng_aio_set_timeout(3) +// +// Copyright 2018 Staysail Systems, Inc. <info@staysail.tech> +// Copyright 2018 Capitar IT Group BV <info@capitar.com> +// +// This document is supplied under the terms of the MIT License, a +// copy of which should be located in the distribution where this +// file was obtained (LICENSE.txt). A copy of the license may also be +// found online at https://opensource.org/licenses/MIT. +// + +== NAME + +nng_aio_set_timeout - set asynchronous I/O timeout + +== SYNOPSIS + +[source, c] +----------- +#include <nng/nng.h> + +typedef int nng_duration; +void nng_aio_set_timeout(nng_aio *aio, nng_duration timeout); +----------- + +== DESCRIPTION + +The `nng_aio_set_timeout()` function sets a _timeout_ for the asynchronous +operation associated with _aio_. This causes a timer to be started when the operation is actually +started. If the timer expires before the operation is completed, then it is +aborted with an error of `NNG_ETIMEDOUT`. The _timeout_ is specified as a +relative number of milliseconds. + +If the timeout is `NNG_DURATION_INFINITE`, then no timeout is used. +If the timeout is `NNG_DURATION_DEFAULT`, then a "default" or socket-specific +timeout is used. (This is frequently the same as `NNG_DURATION_INFINITE`.) + +TIP: As most operations involve some context switching, it is usually a good +idea to allow at least a few tens of milliseconds before timing them out -- +a too small timeout might not allow the operation to properly begin before +giving up! + +The value of _timeout_ set for the _aio_ is persistent, so that if the +handle is reused for multiple operations, they will have the same relative +timeout. + +== RETURN VALUES + +None. + +== ERRORS + +None. + +== SEE ALSO + +<<nng_aio_alloc#,nng_aio_alloc(3)>>, +<<nng_aio_cancel#,nng_aio_cancel(3)>>, +<<nng_aio_result#,nng_aio_result(3)>>, +<<nng#,nng(7)>> diff --git a/docs/man/nng_aio_stop.adoc b/docs/man/nng_aio_stop.adoc new file mode 100644 index 00000000..ae5c5bda --- /dev/null +++ b/docs/man/nng_aio_stop.adoc @@ -0,0 +1,54 @@ += nng_aio_stop(3) +// +// Copyright 2018 Staysail Systems, Inc. <info@staysail.tech> +// Copyright 2018 Capitar IT Group BV <info@capitar.com> +// +// This document is supplied under the terms of the MIT License, a +// copy of which should be located in the distribution where this +// file was obtained (LICENSE.txt). A copy of the license may also be +// found online at https://opensource.org/licenses/MIT. +// + +== NAME + +nng_aio_stop - stop asynchronous I/O operation + +== SYNOPSIS + +[source, c] +----------- +#include <nng/nng.h> + +void nng_aio_stop(nng_aio *aio); +----------- + +== DESCRIPTION + +The `nng_aio_stop()` function stops the asynchronous I/O operation +associated with _aio_ by aborting with `NNG_ECANCELED`, and then waits +for it to complete or to be completely aborted. + +This is logically the equivalent of <<nng_aio_cancel#,nng_aio_cancel(3)>> +followed by <<nng_aio_wait#,nng_aio_wait(3)>>, except that the asynchronous +I/O handle may not be used for any further operations. + +TIP: When multiple asynchronous I/O handles are in use and need to be +shut down, it is safest to stop all of them, before deallocating any of +this with <<nng_aio_free#,nng_aio_free(3)>>, particularly if the callbacks +might attempt to reschedule additional operations. + +== RETURN VALUES + +None. + +== ERRORS + +None. + +== SEE ALSO + +<<nng_aio_cancel#,nng_aio_cancel(3)>>, +<<nng_aio_free#,nng_aio_free(3)>>, +<<nng_aio_wait#,nng_aio_wait(3)>>, +<<nng_aio_alloc#,nng_aio_alloc(3)>>, +<<nng#,nng(7)>> diff --git a/docs/man/nng_aio_wait.adoc b/docs/man/nng_aio_wait.adoc new file mode 100644 index 00000000..fb0dad87 --- /dev/null +++ b/docs/man/nng_aio_wait.adoc @@ -0,0 +1,46 @@ += nng_aio_wait(3) +// +// Copyright 2018 Staysail Systems, Inc. <info@staysail.tech> +// Copyright 2018 Capitar IT Group BV <info@capitar.com> +// +// This document is supplied under the terms of the MIT License, a +// copy of which should be located in the distribution where this +// file was obtained (LICENSE.txt). A copy of the license may also be +// found online at https://opensource.org/licenses/MIT. +// + +== NAME + +nng_aio_wait - wait for asynchronous I/O operation + +== SYNOPSIS + +[source, c] +----------- +#include <nng/nng.h> + +void nng_aio_wait(nng_aio *aio); +----------- + +== DESCRIPTION + +The `nng_aio_wait()` function waits for an asynchronous I/O operation +to complete. If the operation has not been started, or has already +completed, then it returns immediately. + +If the a callback was set with _aio_ when it was allocated, then this +function will not be called until the callback has completed. + +== RETURN VALUES + +None. + +== ERRORS + +None. + +== SEE ALSO + +<<nng_aio_abort#,nng_aio_abort(3)>>, +<<nng_aio_alloc#,nng_aio_alloc(3)>>, +<<nng#,nng(7)>> diff --git a/docs/man/nng_bus.adoc b/docs/man/nng_bus.adoc new file mode 100644 index 00000000..18ba4664 --- /dev/null +++ b/docs/man/nng_bus.adoc @@ -0,0 +1,71 @@ += nng_bus(7) +// +// Copyright 2018 Staysail Systems, Inc. <info@staysail.tech> +// Copyright 2018 Capitar IT Group BV <info@capitar.com> +// +// This document is supplied under the terms of the MIT License, a +// copy of which should be located in the distribution where this +// file was obtained (LICENSE.txt). A copy of the license may also be +// found online at https://opensource.org/licenses/MIT. +// + +== NAME + +nng_bus - bus protocol + +== SYNOPSIS + +[source,c] +---------- +#include <nng/protocol/bus0/bus.h> + +int nng_bus0_open(nng_socket *s); +---------- + +== DESCRIPTION + +The _nng_bus_ protocol provides for building mesh networks where +every peer is connected to every other peer. In this protocol, +each message sent by a node is sent to every one of its directly +connected peers. + +TIP: Messages are only sent to directly connected peers. This means +that in the event that a peer is connected indirectly, it will not +receive messages. When using this protocol to build mesh networks, it +is therefore important that a _fully-connected_ mesh network be +constructed. + +All message delivery in this pattern is best-effort, which means that +peers may not receive messages. Furthermore, delivery may occur to some, +all, or none of the directly connected peers. (Messages are not delivered +when peer nodes are unable to receive.) Hence, send operations will never +block; instead if the message cannot be delivered for any reason it is +discarded. + +TIP: In order to minimize the likelihood of message loss, this protocol +should not be used for high throughput communications. Furthermore, the +more traffic _in aggregate_ that occurs across the topology, the more +likely that message loss is to occur. + +=== Socket Operations + +The `nng_bus0_open()` call creates a bus socket. This socket +may be used to send and receive messages. Sending messages will +attempt to deliver to each directly connected peer. + +=== Protocol Versions + +Only version 0 of this protocol is supported. (At the time of writing, +no other versions of this protocol have been defined.) + +=== Protocol Options + +The _nng_bus_ protocol has no protocol-specific options. + +=== Protocol Headers + +The _nng_bus_ protocol has no protocol-specific headers. + +== SEE ALSO + +<<nng#,nng(7)>> diff --git a/docs/man/nng_close.adoc b/docs/man/nng_close.adoc new file mode 100644 index 00000000..dfc1b0a6 --- /dev/null +++ b/docs/man/nng_close.adoc @@ -0,0 +1,48 @@ += nng_close(3) +// +// Copyright 2018 Staysail Systems, Inc. <info@staysail.tech> +// Copyright 2018 Capitar IT Group BV <info@capitar.com> +// +// This document is supplied under the terms of the MIT License, a +// copy of which should be located in the distribution where this +// file was obtained (LICENSE.txt). A copy of the license may also be +// found online at https://opensource.org/licenses/MIT. +// + +== NAME + +nng_close - close socket + +== SYNOPSIS + +[source, c] +----------- +#include <nng/nng.h> + +int nng_close(nng_socket s); +----------- + +== DESCRIPTION + +The `nng_close()` function closes the supplied socket, _s_. Messages +that have been submitted for sending may be flushed or delivered, +depending upon the transport and the setting of the `NNG_OPT_LINGER` +option. + +Further attempts to use the socket after this call returns will result +in `NNG_EBADF`. Threads waiting for operations on the socket when this +call is executed may also return with an `NNG_EBADF` result. + +== RETURN VALUES + +This function returns 0 on success, and non-zero otherwise. + +== ERRORS + +`NNG_EBADF`:: The socket _s_ is already closed or was never opened. + +== SEE ALSO + +<<nng_setopt#,nng_setopt(3)>>, +<<nng_strerror#,nng_strerror(3)>>, +<<nng#,nng(7)>> diff --git a/docs/man/nng_dial.adoc b/docs/man/nng_dial.adoc new file mode 100644 index 00000000..18d55137 --- /dev/null +++ b/docs/man/nng_dial.adoc @@ -0,0 +1,87 @@ += nng_dial(3) +// +// Copyright 2018 Staysail Systems, Inc. <info@staysail.tech> +// Copyright 2018 Capitar IT Group BV <info@capitar.com> +// +// This document is supplied under the terms of the MIT License, a +// copy of which should be located in the distribution where this +// file was obtained (LICENSE.txt). A copy of the license may also be +// found online at https://opensource.org/licenses/MIT. +// + +== NAME + +nng_dial - create and start dialer + +== SYNOPSIS + +[source, c] +----------- +#include <nng/nng.h> + +int nng_dial(nng_socket s, const char *url, nng_dialer *dp, int flags); +----------- + +== DESCRIPTION + +The `nng_dialer()` function creates a newly initialized +dialer, associated with socket _s_, and configured to listen at the +address specified by _url_. If the value of _dp_ is not `NULL`, then +the newly created dialer is stored at the address indicated by _dp_. + +Dialers initiate a remote connection to a listener. Upon a successful +connection being established, they create a pipe, add it to the socket, +and then wait for that pipe to be closed. When the pipe is closed, +they will re-initiate the connection. Dialer's will also periodically +retry a connection automatically if an attempt to connect asynchronously +fails. + +TIP: While it is convenient to think of dialers as "clients", the relationship +between the listener or dialer is orthogonal to any server or client status +that might be associated with a given protocol. For example, a <<nng_req#,REQ>> +socket might have associated dialers, but might also have associated listeners. +It may even have some of each at the same time! + +Normally, the first attempt to connect to the address indicated by _url_ is done +synchronously, including any necessary name resolution. As a result, +a failure, such as if the connection is refused, will be returned +immediately, and no further action will be taken. + +However, if the special value `NNG_FLAG_NONBLOCK` is +supplied in _flags_, then the connection attempt is made asynchronously. + +Furthermore, if the connection was closed for a synchronously dialed +connection, the dialer will still attempt to redial asynchronously. + +TIP: While `NNG_FLAG_NONBLOCK` can help an application be more resilient, +it also generally makes diagnosing failures somewhat more difficult. + +Because the dialer is started immediately, it is generally not possible +to apply extra configuration; if that is needed applications should consider +using <<nng_dialer_create#,nng_dialer_create(3)>> and +<<nng_dialer_start#,nng_dialer_start(3)>> instead. + +== RETURN VALUES + +This function returns 0 on success, and non-zero otherwise. + +== ERRORS + +`NNG_EADDRINVAL`:: An invalid _url_ was specified. +`NNG_ECLOSED`:: The socket _s_ is not open. +`NNG_ECONNREFUSED`:: The remote peer refused the connection. +`NNG_ECONNRESET`:: The remote peer reset the connection. +`NNG_EINVAL`:: An invalid set of _flags_ was specified. +`NNG_ENOMEM`:: Insufficient memory is available. +`NNG_EPEERAUTH`:: Authentication or authorization failure. +`NNG_EPROTO`:: A protocol error occurred. +`NNG_EUNREACHABLE`:: The remote address is not reachable. + +== SEE ALSO + +<<nng_dialer_close#,nng_dialer_close(3)>>, +<<nng_dialer_create#,nng_dialer_create(3)>> +<<nng_dialer_start#,nng_dialer_start(3)>>, +<<nng_listen#,nng_listen(3)>>, +<<nng_strerror#,nng_strerror(3)>>, +<<nng#,nng(7)>> diff --git a/docs/man/nng_dialer_close.adoc b/docs/man/nng_dialer_close.adoc new file mode 100644 index 00000000..82ca6fc3 --- /dev/null +++ b/docs/man/nng_dialer_close.adoc @@ -0,0 +1,52 @@ += nng_dialer_close(3) +// +// Copyright 2018 Staysail Systems, Inc. <info@staysail.tech> +// Copyright 2018 Capitar IT Group BV <info@capitar.com> +// +// This document is supplied under the terms of the MIT License, a +// copy of which should be located in the distribution where this +// file was obtained (LICENSE.txt). A copy of the license may also be +// found online at https://opensource.org/licenses/MIT. +// + +== NAME + +nng_listener_close - close listener + +== SYNOPSIS + +[source, c] +----------- +#include <nng/nng.h> + +int nng_dialer_close(nng_dialer d); +----------- + +== DESCRIPTION + +The `nng_dialer_close()` function closes the listener _d_. +This also closes any pipe that has been created by the dialer. + +Once this function returns, the dialer _d_ and any of its resources +are deallocated. Therefore it is an error to attempt to access _d_ +after this function has returned. (Attempts to do so will result in +`NNG_ECLOSED` errors.) + +Dialers are implicitly closed when the socket they are associated with +is closed. + +== RETURN VALUES + +This function returns 0 on success, and non-zero otherwise. + +== ERRORS + +`NNG_ECLOSED`:: Parameter _d_ does not refer to an open listener. + +== SEE ALSO + +<<nng_close#,nng_close(3)>>, +<<nng_dial#,nng_dial(3)>>, +<<nng_dialer_create#,nng_dialer_create(3)>> +<<nng_strerror#,nng_strerror(3)>>, +<<nng#,nng(7)>> diff --git a/docs/man/nng_dialer_create.adoc b/docs/man/nng_dialer_create.adoc new file mode 100644 index 00000000..02b7796b --- /dev/null +++ b/docs/man/nng_dialer_create.adoc @@ -0,0 +1,74 @@ += nng_dialer_create(3) +// +// Copyright 2018 Staysail Systems, Inc. <info@staysail.tech> +// Copyright 2018 Capitar IT Group BV <info@capitar.com> +// +// This document is supplied under the terms of the MIT License, a +// copy of which should be located in the distribution where this +// file was obtained (LICENSE.txt). A copy of the license may also be +// found online at https://opensource.org/licenses/MIT. +// + +== NAME + +nng_dialer_create - create dialer + +== SYNOPSIS + +[source, c] +----------- +#include <nng/nng.h> + +int nng_dialer_create(nng_dialer *dialerp, nng_socket s, const char *url); +----------- + +== DESCRIPTION + +The `nng_dialer_create()` function creates a newly initialized +dialer, associated with socket _s_, and configured to connect to the +address specified by _url_, and stores a pointer to at the location +referenced by _dialerp_. + +Dialers initiate a remote connection to a listener. Upon a successful +connection being established, they create a pipe, add it to the socket, +and then wait for that pipe to be closed. When the pipe is closed, +they will re-initiate the connection. Dialer's will also periodically +retry a connection automatically if an attempt to connect asynchronously +fails. + +TIP: While it is convenient to think of dialers as "clients", the relationship +between the listener or dialer is orthogonal to any server or client status +that might be associated with a given protocol. For example, a <<nng_req#,REQ>> +socket might have associated dialers, but might also have associated listeners. +It may even have some of each at the same time! + +The dialer is not started, but may be further configured with +the <<nng_dialer_setopt#,nng_dialer_setopt(3)>> family of +functions. + +Once it is fully configured, the dialer may be started using the +<<nng_dialer_start#,nng_dialer_start(3)>> function. + +TIP: If no specific configuration is required, consider using the +simpler <<nng_dial#,nng_dial(3)>> function instead. + +== RETURN VALUES + +This function returns 0 on success, and non-zero otherwise. + +== ERRORS + +`NNG_EADDRINVAL`:: An invalid _url_ was specified. +`NNG_ECLOSED`:: The socket _s_ is not open. +`NNG_ENOMEM`:: Insufficient memory is available. + +== SEE ALSO + +<<nng_dial#,nng_dial(3)>>, +<<nng_dialer_close#,nng_dialer_close(3)>>, +<<nng_dialer_getopt#,nng_dialer_getopt(3)>>, +<<nng_dialer_setopt#,nng_dialer_setopt(3)>>, +<<nng_dialer_start#,nng_dialer_start(3)>>, +<<nng_listener_create#,nng_listener_create(3)>> +<<nng_strerror#,nng_strerror(3)>>, +<<nng#,nng(7)>> diff --git a/docs/man/nng_dialer_getopt.adoc b/docs/man/nng_dialer_getopt.adoc new file mode 100644 index 00000000..7c6fc3ad --- /dev/null +++ b/docs/man/nng_dialer_getopt.adoc @@ -0,0 +1,105 @@ += nng_dialer_getopt(3) +// +// Copyright 2018 Staysail Systems, Inc. <info@staysail.tech> +// Copyright 2018 Capitar IT Group BV <info@capitar.com> +// +// This document is supplied under the terms of the MIT License, a +// copy of which should be located in the distribution where this +// file was obtained (LICENSE.txt). A copy of the license may also be +// found online at https://opensource.org/licenses/MIT. +// + +== NAME + +nng_dialer_getopt - get dialer option + +== SYNOPSIS + +[source, c] +----------- +#include <nng/nng.h> + +int nng_dialer_getopt(nng_dialer d, const char *opt, void *val, size_t *valszp); +int nng_dialer_getopt_int(nng_dialer d, const char *opt, int *ivalp); +int nng_dialer_getopt_ms(nng_dialer d, const char *opt, nng_duration *durp); +int nng_dialer_getopt_ptr(nng_dialer d, const char *opt, void **ptr); +int nng_dialer_setopt_size(nng_dialer d, const char *opt, size_t *zp); +int nng_dialer_getopt_uint64(nng_dialer d, const char *opt, uint64_t *u64p); +----------- + +== DESCRIPTION + +The `nng_dialer_getopt()` functions are used to retrieve option values for +the dialer _d_. The actual options that may be retrieved in this way +vary, and are documented in the <<nng_getopt#,nng_getopt(3)>> manual. +Additionally some transport-specific options are documented with the +transports themselves. + +In all of these forms, the option _opt_ is retrieved from the dialer _d_. + +The details of the type, size, and semantics of the option will depend +on the actual option, and will be documented with the option itself. + +The first form of this function, `nng_dialer_getopt()`, can be used to +retrieve the value of any option. It is untyped. The caller must store +a pointer to a buffer to receive the value in _val_, and the size of the +buffer shall be stored at the location referenced by _valszp_. + +When the function returns, the actual size of the data copied (or that +would have been copied if sufficient space were present) is stored at +the location referened by _valszp_. If the caller's buffer is not large +enough to hold the entire object, then the copy is truncated. Therefore +the caller should validate that the returned size in _valszp_ does not +exceed the original buffer size to check for truncation. + +It is acceptable to pass `NULL` for _val_ if the value in _valszp_ is zero. +This can be used to determine the size of the buffer needed to receive +the object. + +Generally, it will be easier to use one of the typed forms instead. Note +however that no validation that the option is actually of the associated +type is performed, so the caller must take care to use the *correct* typed +form. + +The second form, `nng_dialer_getopt_int()`, +is for options which take an integer (or boolean). The value will +be stored at _ivalp_. For booleans the value will be eiher 0 (false) or 1 (true). + +The third form, `nng_dialer_getopt_ms()`, is used to retrieve time durations +(such as timeouts), stored in _durp_ as a number of milliseconds. +(The special value `NNG_DUR_INFINITE` means an infinite amount of time, and +the special value `NNG_DUR_DEFAULT` means a context-specific default.) + +The fourth form, `nng_dialer_getopt_ptr()`, is used to retrieve a +pointer _ptr_ to structured data. The data referenced by _ptr_ is +generally managed using other functions. +Note that this form is somewhat special in that the object is generally +not copied, but instead the *pointer* to the object is copied. + +The fifth form, `nng_dialer_getopt_size()`, is used to retrieve a size +into the pointer _zp_, typically for buffer sizes, message maximum sizes, and +similar options. + +The sixth form, `nng_diale_getopt_uint64()`, is used to retrieve a +64-bit unsigned value into the value referenced by _u64p_. +This is typically used for options +related to identifiers, network numbers, and similar. + +== RETURN VALUES + +This function returns 0 on success, and non-zero otherwise. + +== ERRORS + +`NNG_ECLOSED`:: Parameter _d_ does not refer to an open dialer. +`NNG_ENOTSUP`:: The option _opt_ is not supported. +`NNG_EWRITEONLY`:: The option _opt_ is write-only. + +== SEE ALSO + +<<nng_listen#,nng_listen(3)>>, +<<nng_dialer_create#,nng_dialer_create(3)>> +<<nng_dialer_setopt#,nng_dialer_setopt(3)>> +<<nng_getopt#,nng_getopt(3)>>, +<<nng_strerror#,nng_strerror(3)>>, +<<nng#,nng(7)>> diff --git a/docs/man/nng_dialer_setopt.adoc b/docs/man/nng_dialer_setopt.adoc new file mode 100644 index 00000000..8bd6a04b --- /dev/null +++ b/docs/man/nng_dialer_setopt.adoc @@ -0,0 +1,104 @@ += nng_dialer_setopt(3) +// +// Copyright 2018 Staysail Systems, Inc. <info@staysail.tech> +// Copyright 2018 Capitar IT Group BV <info@capitar.com> +// +// This document is supplied under the terms of the MIT License, a +// copy of which should be located in the distribution where this +// file was obtained (LICENSE.txt). A copy of the license may also be +// found online at https://opensource.org/licenses/MIT. +// + +== NAME + +nng_dialer_setopt - set dialer option + +== SYNOPSIS + +[source, c] +----------- +#include <nng/nng.h> + +int nng_dialer_setopt(nng_dialer d, const char *opt, const void *val, + size_t valsz); +int nng_dialer_setopt_int(nng_dialer d, const char *opt, int ival); +int nng_dialer_setopt_ms(nng_dialer d, const char *opt, nng_duration dur); +int nng_dialer_setopt_ptr(nng_dialer d, const char *opt, void *ptr); +int nng_dialer_setopt_size(nng_dialer d, const char *opt, size_t z); +int nng_dialer_setopt_string(nng_dialer d, const char *opt, const char *str); +int nng_dialer_setopt_uint64(nng_dialer d, const char *opt, uint64_t u64); +----------- + +== DESCRIPTION + +The `nng_dialer_setopt()` functions are used to configure options for +the dialer _d_. The actual options that may be configured in this way +vary, and are documented in the <<nng_setopt#,nng_setopt(3)>> manual. +Additionally some transport-specific options are documented with the +transports themselves. + +In all of these forms, the option _opt_ is configured on the dialer _d_. + +The details of the type, size, and semantics of the option will depend +on the actual option, and will be documented with the option itself. + +The first form of this function, `nng_dialer_setopt()`, can be used to +configure any arbitrary data. +The _val_ pointer addresses the data to copy, and _valsz_ is the +size of the objected located at _val_. + +Generally, it will be easier to use one of the typed forms instead. + +The second form, `nng_dialer_setopt_int()`, +is for options which take an integer (or boolean). The _ival_ +is passed to the option. For booleans pass either 0 (false) or 1 (true). + +The third form, `nng_dialer_setopt_ms()`, is used to configure time durations +(such as timeouts). +The duration _dur_ is an integer number of milliseconds. (The special value +`NNG_DUR_INFINITE` means an infinite amount of time.) + +The fourth form, `nng_dialer_setopt_ptr()`, is used to pass a +pointer _ptr_ to structured data. The data referenced by _ptr_ is +generally managed by other functions. +For example, TLS configuration objects +(<<nng_tls_config_alloc#,nng_tls_config_alloc(3)>>) can be passed this way. +Note that this form is somewhat special in that the object is generally +not copied, but instead the *pointer* to the object is copied. + +The fifth form, `nng_dialer_setopt_size()`, is used to pass a size +specified by _z_, typically for buffer sizes, message maximum sizes, and +similar options. + +The sixth form, `nng_dialer_setopt_string()`, is used to pass a string +_str_. Strings passed this way must be legal UTF-8 or ASCII strings, terminated +with a `NUL` (`\0`) byte. (Other constraints may apply as well, see the +documentation for _opt_ for details.) + +The seventh form, `nng_dialer_setopt_uint64()`, is used to configure +the 64-bit unsigned value in _u64_. This is typically used for options +related to identifiers, network numbers, and similar. + +NOTE: Once a dialer has started, it is generally not possible to change +it's configuration. + +== RETURN VALUES + +This function returns 0 on success, and non-zero otherwise. + +== ERRORS + +`NNG_ECLOSED`:: Parameter _d_ does not refer to an open dialer. +`NNG_EINVAL`:: The value being passed is invalid. +`NNG_ENOTSUP`:: The option _opt_ is not supported. +`NNG_EREADONLY`:: The option _opt_ is read-only. +`NNG_ESTATE`:: The dialer _d_ is already started. + +== SEE ALSO + +<<nng_dial#,nng_dial(3)>>, +<<nng_dialer_create#,nng_dialer_create(3)>> +<<nng_dialer_getopt#,nng_dialer_getopt(3)>> +<<nng_setopt#,nng_setopt(3)>>, +<<nng_strerror#,nng_strerror(3)>>, +<<nng#,nng(7)>> diff --git a/docs/man/nng_dialer_start.adoc b/docs/man/nng_dialer_start.adoc new file mode 100644 index 00000000..db6d7c07 --- /dev/null +++ b/docs/man/nng_dialer_start.adoc @@ -0,0 +1,74 @@ += nng_dialer_start(3) +// +// Copyright 2018 Staysail Systems, Inc. <info@staysail.tech> +// Copyright 2018 Capitar IT Group BV <info@capitar.com> +// +// This document is supplied under the terms of the MIT License, a +// copy of which should be located in the distribution where this +// file was obtained (LICENSE.txt). A copy of the license may also be +// found online at https://opensource.org/licenses/MIT. +// + +== NAME + +nng_dialer_start - start dialer + +== SYNOPSIS + +[source, c] +----------- +#include <nng/nng.h> + +int nng_dialer_start(nng_dialer d, int flags); +----------- + +== DESCRIPTION + +The `nng_dialer_start()` function starts the dialer _d_. + +This causes the dialer to start connecting to the address with which it was +created. + +When a connection is established, it results in a pipe being created, +which will be attached to the dialer's socket. + +Normally, the first attempt to connect to the dialer's address is done +synchronously, including any necessary name resolution. As a result, +a failure, such as if the connection is refused, will be returned +immediately, and no further action will be taken. + +However, if the special value `NNG_FLAG_NONBLOCK` is +supplied in _flags_, then the connection attempt is made asynchronously. + +Furthermore, if the connection was closed for a synchronously dialed +connection, the dialer will still attempt to redial asynchronously. + +TIP: While `NNG_FLAG_NONBLOCK` can help an application be more resilient, +it also generally makes diagnosing failures somewhat more difficult. + +Once a dialer has started, it is generally not possible to change +it's configuration. + +== RETURN VALUES + +This function returns 0 on success, and non-zero otherwise. + +== ERRORS + +`NNG_EADDRINVAL`:: An invalid _url_ was specified. +`NNG_ECLOSED`:: The socket _s_ is not open. +`NNG_ECONNREFUSED`:: The remote peer refused the connection. +`NNG_ECONNRESET`:: The remote peer reset the connection. +`NNG_EINVAL`:: An invalid set of _flags_ was specified. +`NNG_ENOMEM`:: Insufficient memory is available. +`NNG_EPEERAUTH`:: Authentication or authorization failure. +`NNG_EPROTO`:: A protocol error occurred. +`NNG_ESTATE`:: The dialer _d_ is already started. +`NNG_EUNREACHABLE`:: The remote address is not reachable. + +== SEE ALSO + +<<nng_dial#,nng_dial(3)>>, +<<nng_dialer_create#,nng_dialer_create(3)>> +<<nng_strerror#,nng_strerror(3)>>, +<<nng#,nng(7)>> diff --git a/docs/man/nng_http_client_alloc.adoc b/docs/man/nng_http_client_alloc.adoc new file mode 100644 index 00000000..40499862 --- /dev/null +++ b/docs/man/nng_http_client_alloc.adoc @@ -0,0 +1,47 @@ += nng_http_client_alloc(3) +// +// Copyright 2018 Staysail Systems, Inc. <info@staysail.tech> +// Copyright 2018 Capitar IT Group BV <info@capitar.com> +// +// This document is supplied under the terms of the MIT License, a +// copy of which should be located in the distribution where this +// file was obtained (LICENSE.txt). A copy of the license may also be +// found online at https://opensource.org/licenses/MIT. +// + +== NAME + +nng_http_client_alloc - allocate HTTP client + +== SYNOPSIS + +[source, c] +----------- +#include <nng/nng.h> +#include <nng/supplemental/http/http.h> + +int nng_http_client_alloc(nng_http_client *clientp, const nng_url *url); +----------- + +== DESCRIPTION + +The `nng_http_client_alloc()` allocates an HTTP client suitable for +connecting to the server identifyed by _url_ and stores a pointer to +it in the location referenced by _clientp_. + +== RETURN VALUES + +This function returns 0 on success, and non-zero otherwise. + +== ERRORS + +`NNG_ENOMEM`:: Insufficient free memory exists. +`NNG_ENOTSUP`:: HTTP not supported. + +== SEE ALSO + +<<nng_http_client_connect#,nng_http_client_connect(3)>>, +<<nng_http_client_free#,nng_http_client_free(3)>>, +<<nng_url_parse#,nng_url_parse(3)>> +<<nng_strerror#,nng_strerror(3)>>, +<<nng#,nng(7)>> diff --git a/docs/man/nng_http_client_connect.adoc b/docs/man/nng_http_client_connect.adoc new file mode 100644 index 00000000..f5fef4eb --- /dev/null +++ b/docs/man/nng_http_client_connect.adoc @@ -0,0 +1,96 @@ += nng_http_client_connect(3) +// +// Copyright 2018 Staysail Systems, Inc. <info@staysail.tech> +// Copyright 2018 Capitar IT Group BV <info@capitar.com> +// +// This document is supplied under the terms of the MIT License, a +// copy of which should be located in the distribution where this +// file was obtained (LICENSE.txt). A copy of the license may also be +// found online at https://opensource.org/licenses/MIT. +// + +== NAME + +nng_http_client_connect - establish HTTP client connection + +== SYNOPSIS + +[source, c] +----------- +#include <nng/nng.h> +#include <nng/supplemental/http/http.h> + +void nng_http_client_connect(nng_http_client *client, nng_aio *aio); +----------- + +== DESCRIPTION + +The `nng_http_client_connect()` starts the process of establishing an HTTP +connection from _client_ to the server that was indicated in the URL that +_client_ was configured with. + +The result of the operation will be stored in the _aio_ when the operation +is complete, and will be obtainable via +<<nng_aio_result#,nng_aio_result(3)>>. + +On success, a pointer to the underlying HTTP client (type `nng_http_conn *`) +will be stored in the first output result of the _aio_, and can be +obtained by +<<nng_aio_get_output#,nng_aio_get_output(3)>> with an _index_ of zero (0). + +== RETURN VALUES + +None. + +== ERRORS + +`NNG_EADDRINVAL`:: The server is configured with an invalid address. +`NNG_ECANCELED`:: The operation was aborted. +`NNG_ECONNREFUSED`:: The TCP connection was refused by the server. +`NNG_ECONNRESET`:: The TCP connection was reset by the server. +`NNG_ENOMEM`:: Insufficient free memory exists. + +== EXAMPLE + +[source, c] +---- + nng_aio *aio; + nng_url *url; + nng_http_client *client; + nng_http_conn *conn; + int rv; + + // Error checks elided for clarity. + nng_url_parse(&url, "http://www.google.com"); + nng_aio_alloc(&aio, NULL, NULL); + nng_http_client_alloc(&client, url); + + nng_http_client_connect(client, aio); + + // Wait for connection to establish (or attempt to fail). + nng_aio_wait(aio); + + if ((rv = nng_aio_result(aio)) != 0) { + printf("Connection failed: %s\n", nng_strerror(rv)); + } else { + // Connection established, get it. + conn = nng_aio_get_output(aio, 0); + + // ... do something with it here + + // Close the connection when done to avoid leaking it. + nng_http_conn_close(conn); + } +---- + +== SEE ALSO + +<<nng_aio_get_output#,nng_aio_get_output(3)>>, +<<nng_aio_result#,nng_aio_result(3)>>, +<<nng_aio_wait#,nng_aio_wait(3)>>, +<<nng_http_client_alloc#,nng_http_client_alloc(3)>>, +<<nng_http_conn_close#,nng_http_conn_close(3)>>, +<<nng_http_conn_read#,nng_http_conn_read(3)>>, +<<nng_http_conn_write#,nng_http_conn_write(3)>>, +<<nng_strerror#,nng_strerror(3)>>, +<<nng#,nng(7)>> diff --git a/docs/man/nng_http_client_free.adoc b/docs/man/nng_http_client_free.adoc new file mode 100644 index 00000000..e54c7bd5 --- /dev/null +++ b/docs/man/nng_http_client_free.adoc @@ -0,0 +1,47 @@ += nng_http_client_free(3) +// +// Copyright 2018 Staysail Systems, Inc. <info@staysail.tech> +// Copyright 2018 Capitar IT Group BV <info@capitar.com> +// +// This document is supplied under the terms of the MIT License, a +// copy of which should be located in the distribution where this +// file was obtained (LICENSE.txt). A copy of the license may also be +// found online at https://opensource.org/licenses/MIT. +// + +== NAME + +nng_http_client_free - free HTTP client + +== SYNOPSIS + +[source, c] +----------- +#include <nng/nng.h> +#include <nng/supplemental/http/http.h> + +void nng_http_client_free(nng_http_client *client); +----------- + +== DESCRIPTION + +The `nng_http_client_free()` frees the HTTP client and any associated +resources referenced by _client_. + +NOTE: Any connections created by +<<nng_http_client_connect#,nng_http_client_connect(3)>> are unaffected, +and so the caller must close those explicitly if desired. + +== RETURN VALUES + +None. + +== ERRORS + +None. + +== SEE ALSO + +<<nng_http_client_alloc#,nng_http_client_alloc(3)>>, +<<nng_http_client_connect#,nng_http_client_connect(3)>>, +<<nng#,nng(7)>> diff --git a/docs/man/nng_http_client_get_tls.adoc b/docs/man/nng_http_client_get_tls.adoc new file mode 100644 index 00000000..7aa5fd27 --- /dev/null +++ b/docs/man/nng_http_client_get_tls.adoc @@ -0,0 +1,50 @@ += nng_http_client_get_tls(3) +// +// Copyright 2018 Staysail Systems, Inc. <info@staysail.tech> +// Copyright 2018 Capitar IT Group BV <info@capitar.com> +// +// This document is supplied under the terms of the MIT License, a +// copy of which should be located in the distribution where this +// file was obtained (LICENSE.txt). A copy of the license may also be +// found online at https://opensource.org/licenses/MIT. +// + +== NAME + +nng_http_client_get_tls - get HTTP client TLS configuration + +== SYNOPSIS + +[source, c] +----------- +#include <nng/nng.h> +#include <nng/supplemental/http/http.h> + +int nng_http_client_get_tls(nng_http_client *client, nng_tls_config **cfgp); +----------- + +== DESCRIPTION + +The `nng_http_client_get_tls()` obtains the TLS configuration of _client_ and +saves a pointer to it in the address referenced by _cfgp_. + +The configuration will be `NULL` if the HTTP client instance is not enabled +to use HTTPS. + +== RETURN VALUES + +This function returns 0 on success, and non-zero otherwise. + +== ERRORS + +`NNG_ENOMEM`:: Insufficient free memory exists. +`NNG_ENOTSUP`:: Either HTTP or TLS not supported. + +== SEE ALSO + +<<nng_http_client_alloc#,nng_http_client_alloc(3)>>, +<<nng_http_client_connect#,nng_http_client_connect(3)>>, +<<nng_http_client_set_tls#,nng_http_client_set_tls(3)>>, +<<nng_tls_config_alloc#,nng_tls_config_alloc(3)>>, +<<nng_strerror#,nng_strerror(3)>>, +<<nng#,nng(7)>> diff --git a/docs/man/nng_http_client_set_tls.adoc b/docs/man/nng_http_client_set_tls.adoc new file mode 100644 index 00000000..deed7e57 --- /dev/null +++ b/docs/man/nng_http_client_set_tls.adoc @@ -0,0 +1,56 @@ += nng_http_client_set_tls(3) +// +// Copyright 2018 Staysail Systems, Inc. <info@staysail.tech> +// Copyright 2018 Capitar IT Group BV <info@capitar.com> +// +// This document is supplied under the terms of the MIT License, a +// copy of which should be located in the distribution where this +// file was obtained (LICENSE.txt). A copy of the license may also be +// found online at https://opensource.org/licenses/MIT. +// + +== NAME + +nng_http_client_set_tls - set HTTP client TLS configuration + +== SYNOPSIS + +[source, c] +----------- +#include <nng/nng.h> +#include <nng/supplemental/http/http.h> + +int nng_http_client_set_tls(nng_http_client *client, nng_tls_config *cfg); +----------- + +== DESCRIPTION + +The `nng_http_client_set_tls()` sets the TLS configuration of _client_ to +_cfg_. + +This change overwrites any previous TLS configuration. + +WARNING: This also invalidates any previously obtained values from +<<nng_http_client_get_tls#,nng_http_client_get_tls(3)>>. + +NOTE: Any connections established with +<<nng_http_client_connect#,nng_http_client_connect(3)>> +will continue to use any TLS configuration that they were started with. + +== RETURN VALUES + +This function returns 0 on success, and non-zero otherwise. + +== ERRORS + +`NNG_ENOMEM`:: Insufficient free memory exists. +`NNG_ENOTSUP`:: Either HTTP or TLS not supported. + +== SEE ALSO + +<<nng_http_client_alloc#,nng_http_client_alloc(3)>>, +<<nng_http_client_connect#,nng_http_client_connect(3)>>, +<<nng_http_client_get_tls#,nng_http_client_get_tls(3)>>, +<<nng_tls_config_alloc#,nng_tls_config_alloc(3)>>, +<<nng_strerror#,nng_strerror(3)>>, +<<nng#,nng(7)>> diff --git a/docs/man/nng_http_conn_close.adoc b/docs/man/nng_http_conn_close.adoc new file mode 100644 index 00000000..0c512815 --- /dev/null +++ b/docs/man/nng_http_conn_close.adoc @@ -0,0 +1,46 @@ += nng_http_conn_close(3) +// +// Copyright 2018 Staysail Systems, Inc. <info@staysail.tech> +// Copyright 2018 Capitar IT Group BV <info@capitar.com> +// +// This document is supplied under the terms of the MIT License, a +// copy of which should be located in the distribution where this +// file was obtained (LICENSE.txt). A copy of the license may also be +// found online at https://opensource.org/licenses/MIT. +// + +== NAME + +nng_http_conn_close - close HTTP connection + +== SYNOPSIS + +[source, c] +----------- +#include <nng/nng.h> +#include <nng/supplemental/http/http.h> + +void nng_http_conn_close(nng_http_conn *conn); +----------- + +== DESCRIPTION + +The `nng_http_conn_close()` function closes the supplied HTTP connection _conn_, +including any disposing of any underlying file descriptors or related resources. + +Once this function, no further access to the _conn_ structure may be made. + +== RETURN VALUES + +None. + +== ERRORS + +None. + +== SEE ALSO + +<<nng_http_client_connect#,nng_http_client_connect(3)>>, +<<nng_http_alloc_handler#,nng_http_alloc_handler(3)>>, +<<nng_strerror#,nng_strerror(3)>>, +<<nng#,nng(7)>> diff --git a/docs/man/nng_http_conn_read.adoc b/docs/man/nng_http_conn_read.adoc new file mode 100644 index 00000000..92826682 --- /dev/null +++ b/docs/man/nng_http_conn_read.adoc @@ -0,0 +1,73 @@ += nng_http_conn_read(3) +// +// Copyright 2018 Staysail Systems, Inc. <info@staysail.tech> +// Copyright 2018 Capitar IT Group BV <info@capitar.com> +// +// This document is supplied under the terms of the MIT License, a +// copy of which should be located in the distribution where this +// file was obtained (LICENSE.txt). A copy of the license may also be +// found online at https://opensource.org/licenses/MIT. +// + +== NAME + +nng_http_conn_read - read from HTTP connection + +== SYNOPSIS + +[source, c] +----------- +#include <nng/nng.h> +#include <nng/supplemental/http/http.h> + +void nng_http_conn_read(nng_http_conn *conn, nng_aio *aio); +----------- + +== DESCRIPTION + +The `nng_http_conn_read()` function starts an asynchronous read from the +HTTP connection _conn_, into the scatter/gather vector located in the +asynchronous I/O structure _aio_. + +NOTE: The <<nng_aio_set_iov#,nng_aio_set_iov(3)>> function must have been +called first, to set the scatter/gather vector for _aio_. + +This function returns immediately, with no return value. Completion of +the operation is signaled via the _aio_, and the final result may be +obtained via <<nng_aio_result#,nng_aio_result>>. That result will +either be zero or an error code. + +The I/O operation completes as soon as at least one byte has been +read, or an error has occurred. +Therefore, the number of bytes read may be less than requested. The actual +number of bytes read can be determined with <<nng_aio_count#,nng_aio_count(3)>>. + +TIP: This function is intended to facilitate uses cases that involve changing +the protocol from HTTP -- such as WebSocket. Most applications will never need +to use this function. + +== RETURN VALUES + +None. + +== ERRORS + +`NNG_ECANCELED`:: The operation was canceled. +`NNG_ECLOSED`:: The connection was closed. +`NNG_ECONNRESET`:: The peer closed the connection. +`NNG_EINVAL`:: The _aio_ does not contain a valid scatter/gather vector. +`NNG_ENOMEM`:: Insufficient free memory to perform the operation. +`NNG_ENOTSUP`:: HTTP operations are not supported. +`NNG_ETIMEDOUT`:: Timeout waiting for data from the connection. + +== SEE ALSO + +<<nng_aio_alloc#,nng_aio_alloc(3)>>, +<<nng_aio_count#,nng_aio_count(3)>>, +<<nng_aio_result#,nng_aio_result(3)>>, +<<nng_aio_set_iov#,nng_aio_set_iov(3)>>, +<<nng_http_alloc_handler#,nng_http_alloc_handler(3)>>, +<<nng_http_client_connect#,nng_http_client_connect(3)>>, +<<nng_http_conn_read_all#,nng_http_conn_read_all(3)>>, +<<nng_strerror#,nng_strerror(3)>>, +<<nng#,nng(7)>> diff --git a/docs/man/nng_http_conn_read_all.adoc b/docs/man/nng_http_conn_read_all.adoc new file mode 100644 index 00000000..e5f89389 --- /dev/null +++ b/docs/man/nng_http_conn_read_all.adoc @@ -0,0 +1,76 @@ += nng_http_conn_read_all(3) +// +// Copyright 2018 Staysail Systems, Inc. <info@staysail.tech> +// Copyright 2018 Capitar IT Group BV <info@capitar.com> +// +// This document is supplied under the terms of the MIT License, a +// copy of which should be located in the distribution where this +// file was obtained (LICENSE.txt). A copy of the license may also be +// found online at https://opensource.org/licenses/MIT. +// + +== NAME + +nng_http_conn_read_all - read all from HTTP connection + +== SYNOPSIS + +[source, c] +----------- +#include <nng/nng.h> +#include <nng/supplemental/http/http.h> + +void nng_http_conn_read_all(nng_http_conn *conn, nng_aio *aio); +----------- + +== DESCRIPTION + +The `nng_http_conn_read_all()` function starts an asynchronous read from the +HTTP connection _conn_, into the scatter/gather vector located in the +asynchronous I/O structure _aio_. + +NOTE: The <<nng_aio_set_iov#,nng_aio_set_iov(3)>> function must have been +called first, to set the scatter/gather vector for _aio_. + +This function returns immediately, with no return value. Completion of +the operation is signaled via the _aio_, and the final result may be +obtained via <<nng_aio_result#,nng_aio_result>>. That result will +either be zero or an error code. + +The I/O operation completes only when the entire amount of data +requested has been read, or an error has occurred. If the operation +completes successfully, then the entire requested data has been read. + +It is still possible for a partial read to complete in the event of an +error. The actual number of bytes read can be determined with +<<nng_aio_count#,nng_aio_count(3)>>. + +TIP: The main purpose for this function is to faciliate reading HTTP +body content, after first determining the length of the body content +from the relevant HTTP headers (typically `Content-Length`). + +== RETURN VALUES + +None. + +== ERRORS + +`NNG_ECANCELED`:: The operation was canceled. +`NNG_ECLOSED`:: The connection was closed. +`NNG_ECONNRESET`:: The peer closed the connection. +`NNG_EINVAL`:: The _aio_ does not contain a valid scatter/gather vector. +`NNG_ENOMEM`:: Insufficient free memory to perform the operation. +`NNG_ENOTSUP`:: HTTP operations are not supported. +`NNG_ETIMEDOUT`:: Timeout waiting for data from the connection. + +== SEE ALSO + +<<nng_aio_alloc#,nng_aio_alloc(3)>>, +<<nng_aio_count#,nng_aio_count(3)>>, +<<nng_aio_result#,nng_aio_result(3)>>, +<<nng_aio_set_iov#,nng_aio_set_iov(3)>>, +<<nng_http_alloc_handler#,nng_http_alloc_handler(3)>>, +<<nng_http_client_connect#,nng_http_client_connect(3)>>, +<<nng_http_conn_read#,nng_http_conn_read(3)>>, +<<nng_strerror#,nng_strerror(3)>>, +<<nng#,nng(7)>> diff --git a/docs/man/nng_http_conn_read_req.adoc b/docs/man/nng_http_conn_read_req.adoc new file mode 100644 index 00000000..bf1c1289 --- /dev/null +++ b/docs/man/nng_http_conn_read_req.adoc @@ -0,0 +1,64 @@ += nng_http_conn_read_req(3) +// +// Copyright 2018 Staysail Systems, Inc. <info@staysail.tech> +// Copyright 2018 Capitar IT Group BV <info@capitar.com> +// +// This document is supplied under the terms of the MIT License, a +// copy of which should be located in the distribution where this +// file was obtained (LICENSE.txt). A copy of the license may also be +// found online at https://opensource.org/licenses/MIT. +// + +== NAME + +nng_http_conn_read_req - read HTTP request + +== SYNOPSIS + +[source, c] +----------- +#include <nng/nng.h> +#include <nng/supplemental/http/http.h> + +void nng_http_conn_read_req(nng_http_conn *conn, nng_http_req *req, + nng_aio *aio); +----------- + +== DESCRIPTION + +The `nng_http_conn_read_req()` function starts an asynchronous read from the +HTTP connection _conn_, reading an HTTP request into the _req_, including all +of the related headers. + +NOTE: Any HTTP entity/body data associated with the request is *not* read +automatically. The caller should use +<<nng_http_conn_read_all#,nng_http_conn_read_all(3)>> to read the entity +data, based on the details of the request itself. + +This function returns immediately, with no return value. Completion of +the operation is signaled via the _aio_, and the final result may be +obtained via <<nng_aio_result#,nng_aio_result>>. That result will +either be zero or an error code. + +== RETURN VALUES + +None. + +== ERRORS + +`NNG_ECANCELED`:: The operation was canceled. +`NNG_ECLOSED`:: The connection was closed. +`NNG_ECONNRESET`:: The peer closed the connection. +`NNG_ENOMEM`:: Insufficient free memory to perform the operation. +`NNG_ENOTSUP`:: HTTP operations are not supported. +`NNG_ETIMEDOUT`:: Timeout waiting for data from the connection. + +== SEE ALSO + +<<nng_aio_alloc#,nng_aio_alloc(3)>>, +<<nng_aio_result#,nng_aio_result(3)>>, +<<nng_http_alloc_handler#,nng_http_alloc_handler(3)>>, +<<nng_http_client_connect#,nng_http_client_connect(3)>>, +<<nng_http_conn_read_all#,nng_http_conn_read_all(3)>>, +<<nng_strerror#,nng_strerror(3)>>, +<<nng#,nng(7)>> diff --git a/docs/man/nng_http_conn_read_res.adoc b/docs/man/nng_http_conn_read_res.adoc new file mode 100644 index 00000000..4a1f6aaa --- /dev/null +++ b/docs/man/nng_http_conn_read_res.adoc @@ -0,0 +1,64 @@ += nng_http_conn_read_res(3) +// +// Copyright 2018 Staysail Systems, Inc. <info@staysail.tech> +// Copyright 2018 Capitar IT Group BV <info@capitar.com> +// +// This document is supplied under the terms of the MIT License, a +// copy of which should be located in the distribution where this +// file was obtained (LICENSE.txt). A copy of the license may also be +// found online at https://opensource.org/licenses/MIT. +// + +== NAME + +nng_http_conn_read_res - read HTTP response + +== SYNOPSIS + +[source, c] +----------- +#include <nng/nng.h> +#include <nng/supplemental/http/http.h> + +void nng_http_conn_read_res(nng_http_conn *conn, nng_http_res *res, + nng_aio *aio); +----------- + +== DESCRIPTION + +The `nng_http_conn_read_res()` function starts an asynchronous read from the +HTTP connection _conn_, reading an HTTP response into the _res_, including all +of the related headers. + +NOTE: Any HTTP entity/body data associated with the response is *not* read +automatically. The caller should use +<<nng_http_conn_read_all#,nng_http_conn_read_all(3)>> to read the entity +data, based on the details of the response itself. + +This function returns immediately, with no return value. Completion of +the operation is signaled via the _aio_, and the final result may be +obtained via <<nng_aio_result#,nng_aio_result>>. That result will +either be zero or an error code. + +== RETURN VALUES + +None. + +== ERRORS + +`NNG_ECANCELED`:: The operation was canceled. +`NNG_ECLOSED`:: The connection was closed. +`NNG_ECONNRESET`:: The peer closed the connection. +`NNG_ENOMEM`:: Insufficient free memory to perform the operation. +`NNG_ENOTSUP`:: HTTP operations are not supported. +`NNG_ETIMEDOUT`:: Timeout waiting for data from the connection. + +== SEE ALSO + +<<nng_aio_alloc#,nng_aio_alloc(3)>>, +<<nng_aio_result#,nng_aio_result(3)>>, +<<nng_http_alloc_handler#,nng_http_alloc_handler(3)>>, +<<nng_http_client_connect#,nng_http_client_connect(3)>>, +<<nng_http_conn_read_all#,nng_http_conn_read_all(3)>>, +<<nng_strerror#,nng_strerror(3)>>, +<<nng#,nng(7)>> diff --git a/docs/man/nng_http_conn_write.adoc b/docs/man/nng_http_conn_write.adoc new file mode 100644 index 00000000..df9be033 --- /dev/null +++ b/docs/man/nng_http_conn_write.adoc @@ -0,0 +1,74 @@ += nng_http_conn_write(3) +// +// Copyright 2018 Staysail Systems, Inc. <info@staysail.tech> +// Copyright 2018 Capitar IT Group BV <info@capitar.com> +// +// This document is supplied under the terms of the MIT License, a +// copy of which should be located in the distribution where this +// file was obtained (LICENSE.txt). A copy of the license may also be +// found online at https://opensource.org/licenses/MIT. +// + +== NAME + +nng_http_conn_write - write to HTTP connection + +== SYNOPSIS + +[source, c] +----------- +#include <nng/nng.h> +#include <nng/supplemental/http/http.h> + +void nng_http_conn_write(nng_http_conn *conn, nng_aio *aio); +----------- + +== DESCRIPTION + +The `nng_http_conn_write()` function starts an asynchronous write to the +HTTP connection _conn_ from the scatter/gather vector located in the +asynchronous I/O structure _aio_. + +NOTE: The <<nng_aio_set_iov#,nng_aio_set_iov(3)>> function must have been +called first, to set the scatter/gather vector for _aio_. + +This function returns immediately, with no return value. Completion of +the operation is signaled via the _aio_, and the final result may be +obtained via <<nng_aio_result#,nng_aio_result>>. That result will +either be zero or an error code. + +The I/O operation completes as soon as at least one byte has been +written, or an error has occurred. +Therefore, the number of bytes written may be less than requested. The actual +number of bytes written can be determined with +<<nng_aio_count#,nng_aio_count(3)>>. + +TIP: This function is intended to facilitate uses cases that involve changing +the protocol from HTTP -- such as WebSocket. Most applications will never need +to use this function. + +== RETURN VALUES + +None. + +== ERRORS + +`NNG_ECANCELED`:: The operation was canceled. +`NNG_ECLOSED`:: The connection was closed. +`NNG_ECONNRESET`:: The peer closed the connection. +`NNG_EINVAL`:: The _aio_ does not contain a valid scatter/gather vector. +`NNG_ENOMEM`:: Insufficient free memory to perform the operation. +`NNG_ENOTSUP`:: HTTP operations are not supported. +`NNG_ETIMEDOUT`:: Timeout waiting for data from the connection. + +== SEE ALSO + +<<nng_aio_alloc#,nng_aio_alloc(3)>>, +<<nng_aio_count#,nng_aio_count(3)>>, +<<nng_aio_result#,nng_aio_result(3)>>, +<<nng_aio_set_iov#,nng_aio_set_iov(3)>>, +<<nng_http_alloc_handler#,nng_http_alloc_handler(3)>>, +<<nng_http_client_connect#,nng_http_client_connect(3)>>, +<<nng_http_conn_write_all#,nng_http_conn_write_all(3)>>, +<<nng_strerror#,nng_strerror(3)>>, +<<nng#,nng(7)>> diff --git a/docs/man/nng_http_conn_write_all.adoc b/docs/man/nng_http_conn_write_all.adoc new file mode 100644 index 00000000..3f112540 --- /dev/null +++ b/docs/man/nng_http_conn_write_all.adoc @@ -0,0 +1,94 @@ += nng_http_conn_write_all(3) +// +// Copyright 2018 Staysail Systems, Inc. <info@staysail.tech> +// Copyright 2018 Capitar IT Group BV <info@capitar.com> +// +// This document is supplied under the terms of the MIT License, a +// copy of which should be located in the distribution where this +// file was obtained (LICENSE.txt). A copy of the license may also be +// found online at https://opensource.org/licenses/MIT. +// + +== NAME + +nng_http_conn_write_all - write all to HTTP connection + +== SYNOPSIS + +[source, c] +----------- +#include <nng/nng.h> +#include <nng/supplemental/http/http.h> + +void nng_http_conn_write_all(nng_http_conn *conn, nng_aio *aio); +----------- + +== DESCRIPTION + +The `nng_http_conn_write_all()` function starts an asynchronous write to the +HTTP connection _conn_, into the scatter/gather vector located in the +asynchronous I/O structure _aio_. + +NOTE: The <<nng_aio_set_iov#,nng_aio_set_iov(3)>> function must have been +called first, to set the scatter/gather vector for _aio_. + +This function returns immediately, with no return value. Completion of +the operation is signaled via the _aio_, and the final result may be +obtained via <<nng_aio_result#,nng_aio_result>>. That result will +either be zero or an error code. + +The I/O operation completes only when the entire amount of data +requested has been written, or an error has occurred. If the operation +completes successfully, then the entire requested data has been written. + +It is still possible for a partial write to complete in the event of an +error. The actual number of bytes written can be determined with +<<nng_aio_count#,nng_aio_count(3)>>. + +TIP: The main purpose for this function is to faciliate writing HTTP +body content. + +TIP: Usually an HTTP request or response will have been written immediately +prior to this with <<nng_http_conn_write_req#,http_conn_write_req(3)>> or +<<nng_http_conn_write_res#,http_conn_write_res(3)>>. In that case the +request or response should have also contained an `Content-Length` header, +and possibly a `Content-Type` header. + +TIP: An easier solution to sending HTTP content data, is to include the +conten with the request or reply using a function like +<<nng_http_req_copy_data#,nng_http_req_copy_data(3)>>. In that case, +the body data will be written automatically by the +<<nng_http_conn_write_req#,http_conn_write_req(3)>> or +<<nng_http_conn_write_req#,http_conn_write_res(3)>> function. + +== RETURN VALUES + +None. + +== ERRORS + +`NNG_ECANCELED`:: The operation was canceled. +`NNG_ECLOSED`:: The connection was closed. +`NNG_ECONNRESET`:: The peer closed the connection. +`NNG_EINVAL`:: The _aio_ does not contain a valid scatter/gather vector. +`NNG_ENOMEM`:: Insufficient free memory to perform the operation. +`NNG_ENOTSUP`:: HTTP operations are not supported. +`NNG_ETIMEDOUT`:: Timeout waiting for data from the connection. + +== SEE ALSO + +<<nng_aio_alloc#,nng_aio_alloc(3)>>, +<<nng_aio_count#,nng_aio_count(3)>>, +<<nng_aio_result#,nng_aio_result(3)>>, +<<nng_aio_set_iov#,nng_aio_set_iov(3)>>, +<<nng_http_alloc_handler#,nng_http_alloc_handler(3)>>, +<<nng_http_client_connect#,nng_http_client_connect(3)>>, +<<nng_http_conn_write#,nng_http_conn_write(3)>>, +<<nng_http_conn_write_req#,http_conn_write_req(3)>>, +<<nng_http_conn_write_res#,http_conn_write_res(3)>>, +<<nng_http_req_copy_data#,nng_http_req_copy_data(3)>>, +<<nng_http_req_set_data#,nng_http_req_set_data(3)>>, +<<nng_http_res_copy_data#,nng_http_res_copy_data(3)>>, +<<nng_http_res_set_data#,nng_http_res_set_data(3)>>, +<<nng_strerror#,nng_strerror(3)>>, +<<nng#,nng(7)>> diff --git a/docs/man/nng_http_conn_write_req.adoc b/docs/man/nng_http_conn_write_req.adoc new file mode 100644 index 00000000..040764ca --- /dev/null +++ b/docs/man/nng_http_conn_write_req.adoc @@ -0,0 +1,62 @@ += nng_http_conn_write_req(3) +// +// Copyright 2018 Staysail Systems, Inc. <info@staysail.tech> +// Copyright 2018 Capitar IT Group BV <info@capitar.com> +// +// This document is supplied under the terms of the MIT License, a +// copy of which should be located in the distribution where this +// file was obtained (LICENSE.txt). A copy of the license may also be +// found online at https://opensource.org/licenses/MIT. +// + +== NAME + +nng_http_conn_write_req - write HTTP request + +== SYNOPSIS + +[source, c] +----------- +#include <nng/nng.h> +#include <nng/supplemental/http/http.h> + +void nng_http_conn_write_req(nng_http_conn *conn, nng_http_req *req, + nng_aio *aio); +----------- + +== DESCRIPTION + +The `nng_http_conn_write_req()` function starts an asynchronous write of +the HTTP request _req_ to the connection _conn_. The entire request is sent, +including headers, and if present, the request body data. (The +request body can be set with +<<nng_http_req_set_data#,nng_http_req_set_data>> or +<<nng_http_req_copy_data#,nng_http_req_copy_data>>.) + +This function returns immediately, with no return value. Completion of +the operation is signaled via the _aio_, and the final result may be +obtained via <<nng_aio_result#,nng_aio_result>>. That result will +either be zero or an error code. + +== RETURN VALUES + +None. + +== ERRORS + +`NNG_ECANCELED`:: The operation was canceled. +`NNG_ECLOSED`:: The connection was closed. +`NNG_ECONNRESET`:: The peer closed the connection. +`NNG_ENOMEM`:: Insufficient free memory to perform the operation. +`NNG_ENOTSUP`:: HTTP operations are not supported. +`NNG_ETIMEDOUT`:: Timeout waiting for data from the connection. + +== SEE ALSO + +<<nng_aio_alloc#,nng_aio_alloc(3)>>, +<<nng_aio_result#,nng_aio_result(3)>>, +<<nng_http_alloc_handler#,nng_http_alloc_handler(3)>>, +<<nng_http_client_connect#,nng_http_client_connect(3)>>, +<<nng_http_conn_read_all#,nng_http_conn_read_all(3)>>, +<<nng_strerror#,nng_strerror(3)>>, +<<nng#,nng(7)>> diff --git a/docs/man/nng_http_conn_write_res.adoc b/docs/man/nng_http_conn_write_res.adoc new file mode 100644 index 00000000..f2df3c72 --- /dev/null +++ b/docs/man/nng_http_conn_write_res.adoc @@ -0,0 +1,71 @@ += nng_http_conn_write_res(3) +// +// Copyright 2018 Staysail Systems, Inc. <info@staysail.tech> +// Copyright 2018 Capitar IT Group BV <info@capitar.com> +// +// This document is supplied under the terms of the MIT License, a +// copy of which should be located in the distribution where this +// file was obtained (LICENSE.txt). A copy of the license may also be +// found online at https://opensource.org/licenses/MIT. +// + +== NAME + +nng_http_conn_write_res - write HTTP response + +== SYNOPSIS + +[source, c] +----------- +#include <nng/nng.h> +#include <nng/supplemental/http/http.h> + +void nng_http_conn_write_res(nng_http_conn *conn, nng_http_res *res, + nng_aio *aio); +----------- + +== DESCRIPTION + +The `nng_http_conn_write_res()` function starts an asynchronous write of +the HTTP response _res_ to the connection _conn_. The entire response is sent, +including headers, and if present, the response body data. (The +response body can be set with +<<nng_http_res_set_data#,nng_http_res_set_data>> or +<<nng_http_res_copy_data#,nng_http_res_copy_data>>.) + +This function returns immediately, with no return value. Completion of +the operation is signaled via the _aio_, and the final result may be +obtained via <<nng_aio_result#,nng_aio_result>>. That result will +either be zero or an error code. + +=== Persistent Connections + +By default, for `HTTP/1.1` connections, the connection is kept open, and +will be reused to receive new requests. + +If however the _res_ contains a header of `Connection:` with a value +of `Close` (case-insensitive) or the response corresponds to `HTTP/1.0`, +then the connection is immediately after sending the response. + +== RETURN VALUES + +None. + +== ERRORS + +`NNG_ECANCELED`:: The operation was canceled. +`NNG_ECLOSED`:: The connection was closed. +`NNG_ECONNRESET`:: The peer closed the connection. +`NNG_ENOMEM`:: Insufficient free memory to perform the operation. +`NNG_ENOTSUP`:: HTTP operations are not supported. +`NNG_ETIMEDOUT`:: Timeout waiting for data from the connection. + +== SEE ALSO + +<<nng_aio_alloc#,nng_aio_alloc(3)>>, +<<nng_aio_result#,nng_aio_result(3)>>, +<<nng_http_alloc_handler#,nng_http_alloc_handler(3)>>, +<<nng_http_client_connect#,nng_http_client_connect(3)>>, +<<nng_http_conn_read_all#,nng_http_conn_read_all(3)>>, +<<nng_strerror#,nng_strerror(3)>>, +<<nng#,nng(7)>> diff --git a/docs/man/nng_http_handler_alloc.adoc b/docs/man/nng_http_handler_alloc.adoc new file mode 100644 index 00000000..023d0400 --- /dev/null +++ b/docs/man/nng_http_handler_alloc.adoc @@ -0,0 +1,139 @@ += nng_http_handler_alloc(3) +// +// Copyright 2018 Staysail Systems, Inc. <info@staysail.tech> +// Copyright 2018 Capitar IT Group BV <info@capitar.com> +// +// This document is supplied under the terms of the MIT License, a +// copy of which should be located in the distribution where this +// file was obtained (LICENSE.txt). A copy of the license may also be +// found online at https://opensource.org/licenses/MIT. +// + +== NAME + +nng_http_handler_alloc - allocate HTTP server handler + +== SYNOPSIS + +[source, c] +----------- +#include <nng/nng.h> +#include <nng/supplemental/http/http.h> + +typedef struct nng_http_handler nng_http_handler; + +int nng_http_handler_alloc(nng_http_handler **hp, const char *path, + void (*func)(nng_aio *); +int nng_http_handler_alloc_directory(nng_http_handler **hp, const char *path, + const char *dirname); +int nng_http_handler_alloc_file(nng_http_handler **hp, const char *path, + const char *filename); +int nng_http_handler_alloc_static(nng_http_handler **hp, const char *path, + const void *data, size_t size, const char *content_type); +----------- + +== DESCRIPTION + +The `nng_http_handler_alloc()` family of functions allocate a handler +which will be used to process requests coming into an HTTP server. +On success, a pointer to the handler is stored at the located pointed to +by _hp_. + +Every handler has a Request-URI to which it refers, which is determined +by the _path_ argument. Only the path component of the Request URI is +considered when determining whether the handler should be called. + +Additionally each handler has a method it is registered to handle +(the default is "GET", see +<<nng_http_handler_set_method#,nng_http_handler_set_method(3)), and +optionally a 'Host' header it can be matched against (see +<<nng_http_handler_set_host#,nng_http_handler_set_host(3)). + +In some cases, a handler may reference a logical tree rather (directory) +rather than just a single element. +(See <<nng_http_handler_set_tree#,nng_http_handler_set_tree(3)>>). + +=== Custom Handler + +The generic (first) form of this creates a handler that uses a user-supplied +function to process HTTP requests. This function uses the asynchronous I/O +framework. The function takes a pointer to an `nng_aio` structure. That +structure will be passed with the following input values (retrieved with +<<nng_aio_get_input#,nng_aio_get_input(3)>>): + + 0: ``nng_http_req *`` __request__:: The client's HTTP request. + 1: ``nng_http_handler *``__handler__:: Pointer to the handler object. + 2: ``nng_http_conn *``__conn__:: The underlying HTTP connection. + +The handler should create an `nng_http_res *` response (such as via +<<nng_http_res_alloc#,nng_http_res_alloc(3)>> or +<<nng_http_res_alloc_error#,nng_http_res_alloc_error(3)>>) and store that +in as the first output (index 0) with +<<nng_aio_set_output#,nng_aio_set_output(3)>>. + +Alternatively, the handler may send the HTTP response (and any associated +body data) itself using the connection. In that case the output at index +0 of the _aio_ should be NULL. + +Finally, using the <<nng_aio_finish#,nng_aio_finish(3)>> function, the +_aio_ should be completed successfully. If any non-zero status is returned +back to the caller instead, then a generic 500 response will be created and +sent, if possible, and the connection will be closed. + +=== Directory Handler + +The second member of this family, `nng_http_handler_alloc_directory()`, creates +a handler configured to serve a directory tree. The _uri_ is taken as +the root, and files are served from the directory tree rooted at _path_. + +When the client Request-URI resolves to a directory in the filesystem, +the handler looks first for a file named `index.html` or `index.htm`. If +one is found, then that file is returned back to the client. If no such +index file exists, then an `NNG_HTTP_STATUS_NOT_FOUND` (404) error is +sent back to the client. + +The `Content-Type` will be set automatically based upon the extension +of the requsted file name. If a content type cannot be determined from +the extension, then `application/octet-stream` is used. + +=== File Handler + +The third member of this family, `nng_http_handler_alloc_file()`, creates +a handler to serve up a single file; it does not traverse directories +or search for `index.html` or `index.htm` files. + +The `Content-Type` will be set automatically based upon the extension +of the requsted file name. If a content type cannot be determined from +the extension, then `application/octet-stream` is used. + +=== Static Handler + +The fourth member of this family, `nng_http_handler_alloc_static()`, creates +a handler to serve up fixed content located in program data. The client is +sent the _data_, with `Content-Length` of _size_ bytes, and `Content-Type` of +__content_type__. + +== RETURN VALUES + +This function returns 0 on success, and non-zero otherwise. + +== ERRORS + +`NNG_EINVAL`:: An invalid _path_ was specified. +`NNG_ENOMEM`:: Insufficient free memory exists to allocate a message. +`NNG_ENOTSUP`:: No support for HTTP in the library. + +== SEE ALSO + +<<nng_aio_finish#,nng_aio_finish(3)>>, +<<nng_aio_get_input#,nng_aio_get_input(3)>>, +<<nng_aio_set_output#,nng_aio_set_output(3)>>, +<<nng_http_handler_free#,nng_http_handler_free(3)>>, +<<nng_http_handler_set_host#,nng_http_handler_set_host(3)>>, +<<nng_http_handler_set_method#,nng_http_handler_set_method(3)>>, +<<nng_http_handler_set_tree#,nng_http_handler_set_tree(3)>>, +<<nng_http_res_alloc#,nng_http_res_alloc(3)>>, +<<nng_http_res_alloc_error#,nng_http_res_alloc_error(3)>>, +<<nng_http_server_add_handler#,nng_http_server_add_handler(3)>>, +<<nng_strerror#,nng_strerror(3)>>, +<<nng#,nng(7)>> diff --git a/docs/man/nng_http_handler_free.adoc b/docs/man/nng_http_handler_free.adoc new file mode 100644 index 00000000..fe568513 --- /dev/null +++ b/docs/man/nng_http_handler_free.adoc @@ -0,0 +1,46 @@ += nng_http_handler_free(3) +// +// Copyright 2018 Staysail Systems, Inc. <info@staysail.tech> +// Copyright 2018 Capitar IT Group BV <info@capitar.com> +// +// This document is supplied under the terms of the MIT License, a +// copy of which should be located in the distribution where this +// file was obtained (LICENSE.txt). A copy of the license may also be +// found online at https://opensource.org/licenses/MIT. +// + +== NAME + +nng_http_handler_free - free HTTP server handler + +== SYNOPSIS + +[source, c] +----------- +#include <nng/nng.h> +#include <nng/supplemental/http/http.h> + +void nng_http_handler_free(nng_http_handler *h); +----------- + +== DESCRIPTION + +The `nng_http_handler_free()` function frees an allocated HTTP server handler. + +CAUTION: It is an error to free a handler that is registered with a server. +Any handlers that are registered with servers are automatically freed +when the server itself is deallocated. + +== RETURN VALUES + +None. + +== ERRORS + +None. + +== SEE ALSO + +<<nng_http_handler_alloc#,nng_http_handler_alloc(3)>>, +<<nng_http_server_add_handler#,nng_http_server_add_handler(3)>>, +<<nng#,nng(7)>> diff --git a/docs/man/nng_http_handler_get_data.adoc b/docs/man/nng_http_handler_get_data.adoc new file mode 100644 index 00000000..de139053 --- /dev/null +++ b/docs/man/nng_http_handler_get_data.adoc @@ -0,0 +1,46 @@ += nng_http_handler_get_data(3) +// +// Copyright 2018 Staysail Systems, Inc. <info@staysail.tech> +// Copyright 2018 Capitar IT Group BV <info@capitar.com> +// +// This document is supplied under the terms of the MIT License, a +// copy of which should be located in the distribution where this +// file was obtained (LICENSE.txt). A copy of the license may also be +// found online at https://opensource.org/licenses/MIT. +// + +== NAME + +nng_http_handler_get_data - return extra data for HTTP handler + +== SYNOPSIS + +[source, c] +----------- +#include <nng/nng.h> +#include <nng/supplemental/http/http.h> + +int nng_http_handler_get_data(nng_http_handler *handler, void *data, + void (*dtor)(void *)); +----------- + +== DESCRIPTION + +The `nng_http_handler_get_data()` function returns the data previously +stored on _handler_ using the function +<<nng_http_handler_set_data#,nng_http_handler_set_data(3)>>. + +== RETURN VALUES + +None. + +== ERRORS + +None. + +== SEE ALSO + +<<nng_http_handler_alloc#,nng_http_handler_alloc(3)>>, +<<nng_http_handler_set_data#,nng_http_server_set_data(3)>>, +<<nng_http_server_add_handler#,nng_http_server_add_handler(3)>>, +<<nng#,nng(7)>> diff --git a/docs/man/nng_http_handler_set_data.adoc b/docs/man/nng_http_handler_set_data.adoc new file mode 100644 index 00000000..f1b74211 --- /dev/null +++ b/docs/man/nng_http_handler_set_data.adoc @@ -0,0 +1,52 @@ += nng_http_handler_set_data(3) +// +// Copyright 2018 Staysail Systems, Inc. <info@staysail.tech> +// Copyright 2018 Capitar IT Group BV <info@capitar.com> +// +// This document is supplied under the terms of the MIT License, a +// copy of which should be located in the distribution where this +// file was obtained (LICENSE.txt). A copy of the license may also be +// found online at https://opensource.org/licenses/MIT. +// + +== NAME + +nng_http_handler_get_data - set extra data for HTTP handler + +== SYNOPSIS + +[source, c] +----------- +#include <nng/nng.h> +#include <nng/supplemental/http/http.h> + +void *nng_http_handler_get_data(nng_http_handler *handler, void *data, + void (*dtor)(void *)); +----------- + +== DESCRIPTION + +The `nng_http_handler_set_data()` function is used to set an additional +_data_ for the _handler_. The stored _data_ can be retrieved later +in the handler function using +<<nng_http_handler_get_data#,nng_http_handler_get_data(3)>>. + +Additionally, when the handler is deallocated, if _dtor_ is not `NULL`, +then it will be called with _data_ as its argument. The intended use of +this function is deallocate any resources associated with _data_. + +== RETURN VALUES + +This function returns 0 on success, and non-zero otherwise. + +== ERRORS + +`NNG_ENOMEM`:: Insufficient free memory to perform the operation. +`NNG_ENOTSUP`:: No support for HTTP in the library. + +== SEE ALSO + +<<nng_http_handler_alloc#,nng_http_handler_alloc(3)>>, +<<nng_http_handler_get_data#,nng_http_server_get_data(3)>>, +<<nng_http_server_add_handler#,nng_http_server_add_handler(3)>>, +<<nng#,nng(7)>> diff --git a/docs/man/nng_http_handler_set_host.adoc b/docs/man/nng_http_handler_set_host.adoc new file mode 100644 index 00000000..d3e464e3 --- /dev/null +++ b/docs/man/nng_http_handler_set_host.adoc @@ -0,0 +1,56 @@ += nng_http_handler_set_host(3) +// +// Copyright 2018 Staysail Systems, Inc. <info@staysail.tech> +// Copyright 2018 Capitar IT Group BV <info@capitar.com> +// +// This document is supplied under the terms of the MIT License, a +// copy of which should be located in the distribution where this +// file was obtained (LICENSE.txt). A copy of the license may also be +// found online at https://opensource.org/licenses/MIT. +// + +== NAME + +nng_http_handler_set_host - set host for HTTP handler + +== SYNOPSIS + +[source, c] +----------- +#include <nng/nng.h> +#include <nng/supplemental/http/http.h> + +int nng_http_handler_set_host(nng_http_handler *handler, const char *host); +----------- + +== DESCRIPTION + +The `nng_http_handler_set_host()` function is used to limit the scope of the +_handler_ so that it will only be called when the specified _host_ matches +the value of the `Host:` HTTP header. + +TIP: This can be used to create servers with multiple handlers for virtual +hosting. + +The value of the _host_ can include a colon and port, and should match +exactly the value of the `Host` header sent by the client. (Canonicaliztion +of the host name is performed though.) + +TIP: As the server framework does not support listening on multiple +ports, the port number can be elided. The matching test only considers +the hostname or IP address, and ignores any trailing port number. + +== RETURN VALUES + +This function returns 0 on success, and non-zero otherwise. + +== ERRORS + +`NNG_ENOMEM`:: Insufficient free memory to perform the operation. +`NNG_ENOTSUP`:: No support for HTTP in the library. + +== SEE ALSO + +<<nng_http_handler_alloc#,nng_http_handler_alloc(3)>>, +<<nng_http_server_add_handler#,nng_http_server_add_handler(3)>>, +<<nng#,nng(7)>> diff --git a/docs/man/nng_http_handler_set_method.adoc b/docs/man/nng_http_handler_set_method.adoc new file mode 100644 index 00000000..8769ffc8 --- /dev/null +++ b/docs/man/nng_http_handler_set_method.adoc @@ -0,0 +1,58 @@ += nng_http_handler_set_method(3) +// +// Copyright 2018 Staysail Systems, Inc. <info@staysail.tech> +// Copyright 2018 Capitar IT Group BV <info@capitar.com> +// +// This document is supplied under the terms of the MIT License, a +// copy of which should be located in the distribution where this +// file was obtained (LICENSE.txt). A copy of the license may also be +// found online at https://opensource.org/licenses/MIT. +// + +== NAME + +nng_http_handler_set_method - set HTTP handler method + +== SYNOPSIS + +[source, c] +----------- +#include <nng/nng.h> +#include <nng/supplemental/http/http.h> + +int nng_http_handler_set_method(nng_http_handler *handler, const char *method); +----------- + +== DESCRIPTION + +The `nng_http_handler_set_method()` function sets the _method_ that the +_handler_ will be called for, such as "GET" or "POST". (By default the +"GET" method is handled.) If _method_ is `NULL`, then the request method +is not examined, and the handler will be executed regardless of the +method. + +NOTE: The server will automatically call "GET" handlers if the client +sends a "HEAD" request, and will suppress HTTP body data in the responses +sent for such requests. + +NOTE: No validation of the _method_ is performed, but HTTP specifications +insist that the actual method sent over the wire be capitalized. + +The handler may always examine the actual method used using the +<<nng_http_req_get_method#,nng_http_req_get_method(3)>> function. + +== RETURN VALUES + +This function returns 0 on success, and non-zero otherwise. + +== ERRORS + +`NNG_ENOMEM`:: Insufficient free memory exists. +`NNG_ENOTSUP`:: No support for HTTP in the library. + +== SEE ALSO + +<<nng_http_handler_alloc#,nng_http_handler_alloc(3)>>, +<<nng_http_server_add_handler#,nng_http_server_add_handler(3)>>, +<<nng_http_req_get_method#,nng_http_req_get_method(3)>>, +<<nng#,nng(7)>> diff --git a/docs/man/nng_http_handler_set_tree.adoc b/docs/man/nng_http_handler_set_tree.adoc new file mode 100644 index 00000000..a21a6681 --- /dev/null +++ b/docs/man/nng_http_handler_set_tree.adoc @@ -0,0 +1,49 @@ += nng_http_handler_set_tree(3) +// +// Copyright 2018 Staysail Systems, Inc. <info@staysail.tech> +// Copyright 2018 Capitar IT Group BV <info@capitar.com> +// +// This document is supplied under the terms of the MIT License, a +// copy of which should be located in the distribution where this +// file was obtained (LICENSE.txt). A copy of the license may also be +// found online at https://opensource.org/licenses/MIT. +// + +== NAME + +nng_http_handler_set_tree - set HTTP handler to match trees + +== SYNOPSIS + +[source, c] +----------- +#include <nng/nng.h> +#include <nng/supplemental/http/http.h> + +int nng_http_handler_set_tree(nng_http_handler *handler); +----------- + +== DESCRIPTION + +The `nng_http_handler_set_tree()` function causes the _handler_ to be +matched if the Request URI sent by the client is a logical child of +the path for _handler_. + +TIP: This method is useful when constructing API handlers where a single +service address (path) supports dynamically generated children. + +== RETURN VALUES + +This function returns 0 on success, and non-zero otherwise. + +== ERRORS + +`NNG_ENOMEM`:: Insufficient free memory exists. +`NNG_ENOTSUP`:: No support for HTTP in the library. + +== SEE ALSO + +<<nng_http_handler_alloc#,nng_http_handler_alloc(3)>>, +<<nng_http_server_add_handler#,nng_http_server_add_handler(3)>>, +<<nng_http_req_get_method#,nng_http_req_get_method(3)>>, +<<nng#,nng(7)>> diff --git a/docs/man/nng_http_hijack.adoc b/docs/man/nng_http_hijack.adoc new file mode 100644 index 00000000..8a08751f --- /dev/null +++ b/docs/man/nng_http_hijack.adoc @@ -0,0 +1,63 @@ += nng_http_hijack(3) +// +// Copyright 2018 Staysail Systems, Inc. <info@staysail.tech> +// Copyright 2018 Capitar IT Group BV <info@capitar.com> +// +// This document is supplied under the terms of the MIT License, a +// copy of which should be located in the distribution where this +// file was obtained (LICENSE.txt). A copy of the license may also be +// found online at https://opensource.org/licenses/MIT. +// + +== NAME + +nng_http_hijack - hijack HTTP server connection + +== SYNOPSIS + +[source, c] +----------- +#include <nng/nng.h> +#include <nng/supplemental/http/http.h> + +void nng_http_hijack(nng_http_conn *conn); +----------- + +== DESCRIPTION + +The `nng_http_hijack()` function hijacks the connection _conn_, causing it +to be disassociated from the HTTP server where it was created. + +The purpose of this function is the creation of HTTP upgraders (such as +WebSocket), where the underlying HTTP connection will be taken over for +some other purpose, and should not be used any further by the server. + +This function is most useful when called from a handler function. +(See <<nng_http_alloc_handler#,nng_http_alloc_handler(3).) + +NOTE: It is the responsibility of the caller to dispose of the underlying +connection when it is no longer needed. Furthermore, the HTTP server will +no longer send any responses to the hijacked connection, so the caller should +do that as well if appropriate. (See +<<nng_http_conn_write_res#,nng_http_conn_write_res(3)>>.) + +TIP: This function is intended to facilitate uses cases that involve changing +the protocol from HTTP -- such as WebSocket. Most applications will never need +to use this function. + +== RETURN VALUES + +None. + +== ERRORS + +`NNG_ECLOSED`:: The connection was closed. +`NNG_ENOMEM`:: Insufficient free memory exists. +`NNG_ENOTSUP`:: HTTP not supported. + +== SEE ALSO + +<<nng_http_alloc_handler#,nng_http_alloc_handler(3)>>, +<<nng_http_conn_write_res#,nng_http_conn_write_res(3)>>, +<<nng_strerror#,nng_strerror(3)>>, +<<nng#,nng(7)>> diff --git a/docs/man/nng_http_req_add_header.adoc b/docs/man/nng_http_req_add_header.adoc new file mode 100644 index 00000000..eb403334 --- /dev/null +++ b/docs/man/nng_http_req_add_header.adoc @@ -0,0 +1,62 @@ += nng_http_req_add_header(3) +// +// Copyright 2018 Staysail Systems, Inc. <info@staysail.tech> +// Copyright 2018 Capitar IT Group BV <info@capitar.com> +// +// This document is supplied under the terms of the MIT License, a +// copy of which should be located in the distribution where this +// file was obtained (LICENSE.txt). A copy of the license may also be +// found online at https://opensource.org/licenses/MIT. +// + +== NAME + +nng_http_req_add_header - add HTTP request header + +== SYNOPSIS + +[source, c] +----------- +#include <nng/nng.h> +#include <nng/supplemental/http/http.h> + +int nng_http_req_add_header(nng_http_req *req, const char *key, + const char *val); +----------- + +== DESCRIPTION + +The `nng_http_req_add_header()` adds an HTTP header for the request +_req_ and the _key_ to the _val_. The _key_ and _val_ are copied. + +If a header with the value of _key_ already exists, then a comma +and whitespace separate are appended to it, followed by _val_. + +If no such header already exists, then one is created with the value _val_. + +TIP: The HTTP specification requires that duplicate headers be treated +identically to a single header with multiple comma-delimited values. + +TIP: See <<nng_http_req_set_header#,nng_http_req_set_header(3)>> if +replacement of an existing header rather than appending to it is desired. + +The value of _key_ is case insensitive, and should not include the final +colon in an HTTP header. For example, specifying `Host` or `hOSt` are +equivalent, whereas the value `Host:` is not a legal header key. + +== RETURN VALUES + +This function returns 0 on success, and non-zero otherwise. + +== ERRORS + +`NNG_ENOMEM`:: Insufficient memory to perform the operation. +`NNG_ENOTSUP`:: No support for HTTP in the library. + +== SEE ALSO + +<<nng_http_req_alloc#,nng_http_req_alloc(3)>>, +<<nng_http_req_del_header#,nng_http_req_del_header(3)>>, +<<nng_http_req_get_header#,nng_http_req_get_header(3)>>, +<<nng_http_req_set_header#,nng_http_req_set_header(3)>>, +<<nng#,nng(7)>> diff --git a/docs/man/nng_http_req_alloc.adoc b/docs/man/nng_http_req_alloc.adoc new file mode 100644 index 00000000..f3aead52 --- /dev/null +++ b/docs/man/nng_http_req_alloc.adoc @@ -0,0 +1,60 @@ += nng_http_req_alloc(3) +// +// Copyright 2018 Staysail Systems, Inc. <info@staysail.tech> +// Copyright 2018 Capitar IT Group BV <info@capitar.com> +// +// This document is supplied under the terms of the MIT License, a +// copy of which should be located in the distribution where this +// file was obtained (LICENSE.txt). A copy of the license may also be +// found online at https://opensource.org/licenses/MIT. +// + +== NAME + +nng_http_req_alloc - allocate HTTP request structure + +== SYNOPSIS + +[source, c] +----------- +#include <nng/nng.h> +#include <nng/supplemental/http/http.h> + +int nng_http_req_alloc(nng_http_req **reqp, const nng_url *url); +----------- + +== DESCRIPTION + +The `nng_http_req_alloc()` function allocates a new HTTP request structure +and stores a pointer to it in __reqp__. The request will be initialized +to perform an HTTP/1.1 `GET` operation using the URL specified in __url__. + +== RETURN VALUES + +This function returns 0 on success, and non-zero otherwise. + +== ERRORS + +`NNG_ENOMEM`:: Insufficient free memory exists to allocate a message. +`NNG_ENOTSUP`:: HTTP support not configured. + +== SEE ALSO + +<<nng_http_conn_read_req#,nng_http_conn_read_req(3)>>, +<<nng_http_conn_write_req#,nng_http_conn_write_req(3)>>, +<<nng_http_req_add_header#,nng_http_req_add_header(3)>>, +<<nng_http_req_copy_data#,nng_http_req_copy_data(3)>>, +<<nng_http_req_del_header#,nng_http_req_del_header(3)>>, +<<nng_http_req_free#,nng_http_req_free(3)>>, +<<nng_http_req_get_header#,nng_http_req_get_header(3)>>, +<<nng_http_req_get_method#,nng_http_req_get_method(3)>>, +<<nng_http_req_get_uri#,nng_http_req_get_uri(3)>>, +<<nng_http_req_get_version#,nng_http_req_get_version(3)>>, +<<nng_http_req_set_data#,nng_http_req_set_data(3)>>, +<<nng_http_req_set_method#,nng_http_req_set_method(3)>>, +<<nng_http_req_set_uri#,nng_http_req_set_uri(3)>>, +<<nng_http_req_set_version#,nng_http_req_set_version(3)>>, +<<nng_http_res_alloc#,nng_http_res_alloc(3)>>, +<<nng_url_parse#,nng_url_parse(3)>> +<<nng_strerror#,nng_strerror(3)>>, +<<nng#,nng(7)>> diff --git a/docs/man/nng_http_req_copy_data.adoc b/docs/man/nng_http_req_copy_data.adoc new file mode 100644 index 00000000..184eaaa5 --- /dev/null +++ b/docs/man/nng_http_req_copy_data.adoc @@ -0,0 +1,60 @@ += nng_http_req_copy_data(3) +// +// Copyright 2018 Staysail Systems, Inc. <info@staysail.tech> +// Copyright 2018 Capitar IT Group BV <info@capitar.com> +// +// This document is supplied under the terms of the MIT License, a +// copy of which should be located in the distribution where this +// file was obtained (LICENSE.txt). A copy of the license may also be +// found online at https://opensource.org/licenses/MIT. +// + +== NAME + +nng_http_req_copy_data - copy HTTP request body + +== SYNOPSIS + +[source, c] +----------- +#include <nng/nng.h> +#include <nng/supplemental/http/http.h> + +int nng_http_req_copy_data(nng_http_req *req, const void *body, size_t size); +----------- + +== DESCRIPTION + +The `nng_http_req_copy_data()` makes a copy of _body_ (of size __size__) +and sets the HTTP body for the request _req_ to it. The copy will be +deallocated automatically when _req_ is freed. + +The copied body data will be automatically sent with the request when it +is sent using <<nng_http_conn_write_req#,nni_http_conn_write_req(3)>>. + +This also updates the relevant `Content-Length` header of _req_. + +NOTE: The current framework does not support sending data via chunked +transfer-encoding. + +TIP: To avoid copying data, the +<<nng_http_req_set_data#,nng_http_req_set_data(3)>> may be used instead. + +TIP: It is a good idea to also set the `Content-Type` header. + +== RETURN VALUES + +This function returns 0 on success, and non-zero otherwise. + +== ERRORS + +`NNG_ENOMEM`:: Insufficient memory to perform the operation. +`NNG_ENOTSUP`:: No support for HTTP in the library. + +== SEE ALSO + +<<nng_http_conn_write_req#,nng_http_conn_write_req(3)>>, +<<nng_http_req_alloc#,nng_http_req_alloc(3)>>, +<<nng_http_req_set_data#,nng_http_req_set_data(3)>>, +<<nng_http_req_set_header#,nng_http_req_set_header(3)>>, +<<nng#,nng(7)>> diff --git a/docs/man/nng_http_req_del_header.adoc b/docs/man/nng_http_req_del_header.adoc new file mode 100644 index 00000000..3306e8c9 --- /dev/null +++ b/docs/man/nng_http_req_del_header.adoc @@ -0,0 +1,50 @@ += nng_http_req_set_header(3) +// +// Copyright 2018 Staysail Systems, Inc. <info@staysail.tech> +// Copyright 2018 Capitar IT Group BV <info@capitar.com> +// +// This document is supplied under the terms of the MIT License, a +// copy of which should be located in the distribution where this +// file was obtained (LICENSE.txt). A copy of the license may also be +// found online at https://opensource.org/licenses/MIT. +// + +== NAME + +nng_http_req_set_header - set HTTP request header + +== SYNOPSIS + +[source, c] +----------- +#include <nng/nng.h> +#include <nng/supplemental/http/http.h> + +int nng_http_req_set_header(nng_http_req *req, const char *key); +----------- + +== DESCRIPTION + +The `nng_http_req_del_header()` removes all HTTP headers with the +associated _key_ from the request structure _req_. + +The value of _key_ is case insensitive, and should not include the final +colon in an HTTP header. For example, specifying `Host` or `hOSt` are +equivalent, whereas the value `Host:` is not a legal header key. + +== RETURN VALUES + +This function returns 0 on success, and non-zero otherwise. + +== ERRORS + +`NNG_ENOENT`:: No header with the key _key_ was present. +`NNG_ENOTSUP`:: No support for HTTP in the library. + +== SEE ALSO + +<<nng_http_req_alloc#,nng_http_req_alloc(3)>>, +<<nng_http_req_add_header#,nng_http_req_add_header(3)>>, +<<nng_http_req_del_header#,nng_http_req_del_header(3)>>, +<<nng_http_req_get_header#,nng_http_req_get_header(3)>>, +<<nng#,nng(7)>> diff --git a/docs/man/nng_http_req_free.adoc b/docs/man/nng_http_req_free.adoc new file mode 100644 index 00000000..8fe0b31c --- /dev/null +++ b/docs/man/nng_http_req_free.adoc @@ -0,0 +1,42 @@ += nng_http_req_free(3) +// +// Copyright 2018 Staysail Systems, Inc. <info@staysail.tech> +// Copyright 2018 Capitar IT Group BV <info@capitar.com> +// +// This document is supplied under the terms of the MIT License, a +// copy of which should be located in the distribution where this +// file was obtained (LICENSE.txt). A copy of the license may also be +// found online at https://opensource.org/licenses/MIT. +// + +== NAME + +nng_http_req_free - free HTTP request structure + +== SYNOPSIS + +[source, c] +----------- +#include <nng/nng.h> +#include <nng/supplemental/http/http.h> + +void nng_http_req_free(nng_http_req *req); +----------- + +== DESCRIPTION + +The `nng_http_req_free()` function deallocates the HTTP request structure +_req_ entirely. + +== RETURN VALUES + +None. + +== ERRORS + +None. + +== SEE ALSO + +<<nng_http_req_alloc#,nng_http_req_alloc(3)>>, +<<nng#,nng(7)>> diff --git a/docs/man/nng_http_req_get_header.adoc b/docs/man/nng_http_req_get_header.adoc new file mode 100644 index 00000000..b8ddafd3 --- /dev/null +++ b/docs/man/nng_http_req_get_header.adoc @@ -0,0 +1,50 @@ += nng_http_req_get_header(3) +// +// Copyright 2018 Staysail Systems, Inc. <info@staysail.tech> +// Copyright 2018 Capitar IT Group BV <info@capitar.com> +// +// This document is supplied under the terms of the MIT License, a +// copy of which should be located in the distribution where this +// file was obtained (LICENSE.txt). A copy of the license may also be +// found online at https://opensource.org/licenses/MIT. +// + +== NAME + +nng_http_req_get_header - return HTTP request header + +== SYNOPSIS + +[source, c] +----------- +#include <nng/nng.h> +#include <nng/supplemental/http/http.h> + +const char *nng_http_req_get_header(nng_http_req *req, const char *key); +----------- + +== DESCRIPTION + +The `nng_http_req_get_header()` looks for an HTTP header _key_ in +the request _req_, and returns the associated value if found, +or `NULL` if not found. + +The value of _key_ is case insensitive, and should not include the final +colon in an HTTP header. For example, specifying `Host` or `hOSt` are +equivalent, whereas the value `Host:` will not find anything. + + +== RETURN VALUES + +HTTP header value for _key_, if it exists, or NULL otherwise. + +== ERRORS + +None. + +== SEE ALSO + +<<nng_http_req_alloc#,nng_http_req_alloc(3)>>, +<<nng_http_req_add_header#,nng_http_req_add_header(3)>>, +<<nng_http_req_set_header#,nng_http_req_set_header(3)>>, +<<nng#,nng(7)>> diff --git a/docs/man/nng_http_req_get_method.adoc b/docs/man/nng_http_req_get_method.adoc new file mode 100644 index 00000000..2788a39d --- /dev/null +++ b/docs/man/nng_http_req_get_method.adoc @@ -0,0 +1,44 @@ += nng_http_req_get_method(3) +// +// Copyright 2018 Staysail Systems, Inc. <info@staysail.tech> +// Copyright 2018 Capitar IT Group BV <info@capitar.com> +// +// This document is supplied under the terms of the MIT License, a +// copy of which should be located in the distribution where this +// file was obtained (LICENSE.txt). A copy of the license may also be +// found online at https://opensource.org/licenses/MIT. +// + +== NAME + +nng_http_req_get_method - return HTTP request method + +== SYNOPSIS + +[source, c] +----------- +#include <nng/nng.h> +#include <nng/supplemental/http/http.h> + +const char *nng_http_req_get_method(nng_http_req *req); +----------- + +== DESCRIPTION + +The `nng_http_req_get_method()` returns the HTTP method associated with +the request _req_. The value will be a string, such as "GET" or "POST". + + +== RETURN VALUES + +Request method as a string. + +== ERRORS + +None. + +== SEE ALSO + +<<nng_http_req_alloc#,nng_http_req_alloc(3)>>, +<<nng_http_req_set_method#,nng_http_req_set_method(3)>>, +<<nng#,nng(7)>> diff --git a/docs/man/nng_http_req_get_uri.adoc b/docs/man/nng_http_req_get_uri.adoc new file mode 100644 index 00000000..a5d7f46a --- /dev/null +++ b/docs/man/nng_http_req_get_uri.adoc @@ -0,0 +1,45 @@ += nng_http_req_get_method(3) +// +// Copyright 2018 Staysail Systems, Inc. <info@staysail.tech> +// Copyright 2018 Capitar IT Group BV <info@capitar.com> +// +// This document is supplied under the terms of the MIT License, a +// copy of which should be located in the distribution where this +// file was obtained (LICENSE.txt). A copy of the license may also be +// found online at https://opensource.org/licenses/MIT. +// + +== NAME + +nng_http_req_get_uri - return HTTP request URI + +== SYNOPSIS + +[source, c] +----------- +#include <nng/nng.h> +#include <nng/supplemental/http/http.h> + +const char *nng_http_req_get_method(nng_http_req *req); +----------- + +== DESCRIPTION + +The `nng_http_req_get_uri()` returns the URI (path) associated with the HTTP +the request _req_. The value returned includes the path, as well as any +query information or fragment. The value will look like a filesystem path +with those optional components appened, such as `/api/get_info.cgi?name=garrett`. + +== RETURN VALUES + +Request URI as a string. + +== ERRORS + +None. + +== SEE ALSO + +<<nng_http_req_alloc#,nng_http_req_alloc(3)>>, +<<nng_http_req_set_uri#,nng_http_req_set_uri(3)>>, +<<nng#,nng(7)>> diff --git a/docs/man/nng_http_req_get_version.adoc b/docs/man/nng_http_req_get_version.adoc new file mode 100644 index 00000000..958fd2c5 --- /dev/null +++ b/docs/man/nng_http_req_get_version.adoc @@ -0,0 +1,44 @@ += nng_http_req_get_version(3) +// +// Copyright 2018 Staysail Systems, Inc. <info@staysail.tech> +// Copyright 2018 Capitar IT Group BV <info@capitar.com> +// +// This document is supplied under the terms of the MIT License, a +// copy of which should be located in the distribution where this +// file was obtained (LICENSE.txt). A copy of the license may also be +// found online at https://opensource.org/licenses/MIT. +// + +== NAME + +nng_http_req_get_version - return HTTP request protocol version + +== SYNOPSIS + +[source, c] +----------- +#include <nng/nng.h> +#include <nng/supplemental/http/http.h> + +const char *nng_http_req_get_version(nng_http_req *req); +----------- + +== DESCRIPTION + +The `nng_http_req_get_version()` returns a string representing the HTTP +protocol version associated with the request _req_, such as "HTTP/1.1". + + +== RETURN VALUES + +Request version as a string. + +== ERRORS + +None. + +== SEE ALSO + +<<nng_http_req_alloc#,nng_http_req_alloc(3)>>, +<<nng_http_req_set_version#,nng_http_req_set_version(3)>>, +<<nng#,nng(7)>> diff --git a/docs/man/nng_http_req_set_data.adoc b/docs/man/nng_http_req_set_data.adoc new file mode 100644 index 00000000..005106a0 --- /dev/null +++ b/docs/man/nng_http_req_set_data.adoc @@ -0,0 +1,62 @@ += nng_http_req_set_data(3) +// +// Copyright 2018 Staysail Systems, Inc. <info@staysail.tech> +// Copyright 2018 Capitar IT Group BV <info@capitar.com> +// +// This document is supplied under the terms of the MIT License, a +// copy of which should be located in the distribution where this +// file was obtained (LICENSE.txt). A copy of the license may also be +// found online at https://opensource.org/licenses/MIT. +// + +== NAME + +nng_http_req_set_data - set HTTP request body + +== SYNOPSIS + +[source, c] +----------- +#include <nng/nng.h> +#include <nng/supplemental/http/http.h> + +int nng_http_req_set_data(nng_http_req *req, const void *body, size_t size); +----------- + +== DESCRIPTION + +The `nng_http_req_set_data()` sets the HTTP body associated with +the request _req_ to _body_, and the size of the body to _size_. +This body data will be automatically sent with the request when it +is sent using <<nng_http_conn_write_req#,nni_http_conn_write_req(3)>>. + +This also updates the relevant `Content-Length` header of _req_. + +NOTE: The current framework does not support sending data via chunked +transfer-encoding. + +The _body_ is *not* copied, and the caller must ensure that it is available +until the _req_ is deallocated. + +TIP: To have a local copy allocated with _req_ that will be automatically +deallocated when _req_ is freed, +see <<nng_http_req_copy_data#,nng_http_req_copy_data(3)>>. + +TIP: It is a good idea to also set the `Content-Type` header. + +== RETURN VALUES + +This function returns 0 on success, and non-zero otherwise. + +== ERRORS + +`NNG_ENOMEM`:: Insufficient memory to perform the operation. +`NNG_ENOTSUP`:: No support for HTTP in the library. + +== SEE ALSO + +<<nng_http_conn_write_req#,nng_http_conn_write_req(3)>>, +<<nng_http_req_alloc#,nng_http_req_alloc(3)>>, +<<nng_http_req_copy_data#,nng_http_req_copy_data(3)>>, +<<nng_http_req_set_header#,nng_http_req_set_header(3)>>, +<<nng#,nng(7)>> diff --git a/docs/man/nng_http_req_set_header.adoc b/docs/man/nng_http_req_set_header.adoc new file mode 100644 index 00000000..8d125c4a --- /dev/null +++ b/docs/man/nng_http_req_set_header.adoc @@ -0,0 +1,55 @@ += nng_http_req_set_header(3) +// +// Copyright 2018 Staysail Systems, Inc. <info@staysail.tech> +// Copyright 2018 Capitar IT Group BV <info@capitar.com> +// +// This document is supplied under the terms of the MIT License, a +// copy of which should be located in the distribution where this +// file was obtained (LICENSE.txt). A copy of the license may also be +// found online at https://opensource.org/licenses/MIT. +// + +== NAME + +nng_http_req_set_header - set HTTP request header + +== SYNOPSIS + +[source, c] +----------- +#include <nng/nng.h> +#include <nng/supplemental/http/http.h> + +int nng_http_req_set_header(nng_http_req *req, const char *key, + const char *val); +----------- + +== DESCRIPTION + +The `nng_http_req_set_header()` sets the HTTP header for the request +_req_ and the _key_ to the _val_. The _key_ and _val_ are copied. +Any previous header with the same _key_ is replaced. + +TIP: See <<nng_http_req_add_header#,nng_http_req_add_header(3)>> to +add additional headers with the same _key_ without replacing them. + +The value of _key_ is case insensitive, and should not include the final +colon in an HTTP header. For example, specifying `Host` or `hOSt` are +equivalent, whereas the value `Host:` is not a legal header key. + +== RETURN VALUES + +This function returns 0 on success, and non-zero otherwise. + +== ERRORS + +`NNG_ENOMEM`:: Insufficient memory to perform the operation. +`NNG_ENOTSUP`:: No support for HTTP in the library. + +== SEE ALSO + +<<nng_http_req_alloc#,nng_http_req_alloc(3)>>, +<<nng_http_req_add_header#,nng_http_req_add_header(3)>>, +<<nng_http_req_del_header#,nng_http_req_del_header(3)>>, +<<nng_http_req_get_header#,nng_http_req_get_header(3)>>, +<<nng#,nng(7)>> diff --git a/docs/man/nng_http_req_set_method.adoc b/docs/man/nng_http_req_set_method.adoc new file mode 100644 index 00000000..76a6a18d --- /dev/null +++ b/docs/man/nng_http_req_set_method.adoc @@ -0,0 +1,50 @@ += nng_http_req_set_method(3) +// +// Copyright 2018 Staysail Systems, Inc. <info@staysail.tech> +// Copyright 2018 Capitar IT Group BV <info@capitar.com> +// +// This document is supplied under the terms of the MIT License, a +// copy of which should be located in the distribution where this +// file was obtained (LICENSE.txt). A copy of the license may also be +// found online at https://opensource.org/licenses/MIT. +// + +== NAME + +nng_http_req_set_method - set HTTP request method + +== SYNOPSIS + +[source, c] +----------- +#include <nng/nng.h> +#include <nng/supplemental/http/http.h> + +int nng_http_req_set_method(nng_http_req *req, const char *method); +----------- + +== DESCRIPTION + +The `nng_http_req_set_method()` sets the HTTP method associated with +the request _req_ to _method_. The _method_ must be a string, +such as "GET" or "POST", and the HTTP specifications indicate that it must +be upper case. + +The default value method for newly allocated requests is "GET". + +A local copy of the _method_ is made in the request _req_. + +== RETURN VALUES + +This function returns 0 on success, and non-zero otherwise. + +== ERRORS + +`NNG_ENOMEM`:: Insufficient memory to perform the operation. +`NNG_ENOTSUP`:: No support for HTTP in the library. + +== SEE ALSO + +<<nng_http_req_alloc#,nng_http_req_alloc(3)>>, +<<nng_http_req_get_method#,nng_http_req_get_method(3)>>, +<<nng#,nng(7)>> diff --git a/docs/man/nng_http_req_set_uri.adoc b/docs/man/nng_http_req_set_uri.adoc new file mode 100644 index 00000000..9431b1da --- /dev/null +++ b/docs/man/nng_http_req_set_uri.adoc @@ -0,0 +1,55 @@ += nng_http_req_set_uri(3) +// +// Copyright 2018 Staysail Systems, Inc. <info@staysail.tech> +// Copyright 2018 Capitar IT Group BV <info@capitar.com> +// +// This document is supplied under the terms of the MIT License, a +// copy of which should be located in the distribution where this +// file was obtained (LICENSE.txt). A copy of the license may also be +// found online at https://opensource.org/licenses/MIT. +// + +== NAME + +nng_http_req_set_uri - set HTTP request URI + +== SYNOPSIS + +[source, c] +----------- +#include <nng/nng.h> +#include <nng/supplemental/http/http.h> + +int nng_http_req_set_uri(nng_http_req *req, const char *uri); +----------- + +== DESCRIPTION + +The `nng_http_req_set_uri()` sets the Request-URI associated with +the request _req_ to _uri_. The _uri_ should contain precisely the +string that will be sent to the HTTP server in the request, including +any query information or fragment. + +A local copy of the _uri_ is made in the request _req_. + +NOTE: No validation or canonicalization of the _uri_ is performed. + +TIP: The <<nng_url_parse#,nng_url_parse(3)>> function can be used to +perform validation and canonicalization. The `u_requri` member will +contain a suitable value that can be used with this function. + +== RETURN VALUES + +This function returns 0 on success, and non-zero otherwise. + +== ERRORS + +`NNG_ENOMEM`:: Insufficient memory to perform the operation. +`NNG_ENOTSUP`:: No support for HTTP in the library. + +== SEE ALSO + +<<nng_http_req_alloc#,nng_http_req_alloc(3)>>, +<<nng_http_req_get_uri#,nng_http_req_get_uri(3)>>, +<<nng_url_parse#,nng_url_parse(3)>>, +<<nng#,nng(7)>> diff --git a/docs/man/nng_http_req_set_version.adoc b/docs/man/nng_http_req_set_version.adoc new file mode 100644 index 00000000..969e8afa --- /dev/null +++ b/docs/man/nng_http_req_set_version.adoc @@ -0,0 +1,55 @@ += nng_http_req_set_version(3) +// +// Copyright 2018 Staysail Systems, Inc. <info@staysail.tech> +// Copyright 2018 Capitar IT Group BV <info@capitar.com> +// +// This document is supplied under the terms of the MIT License, a +// copy of which should be located in the distribution where this +// file was obtained (LICENSE.txt). A copy of the license may also be +// found online at https://opensource.org/licenses/MIT. +// + +== NAME + +nng_http_req_set_version - set HTTP request protocol version + +== SYNOPSIS + +[source, c] +----------- +#include <nng/nng.h> +#include <nng/supplemental/http/http.h> + +int nng_http_req_set_version(nng_http_req *req, const char *version); +----------- + +== DESCRIPTION + +The `nng_http_req_set_version()` sets the HTTP protocol version associated with +the request _req_ to _version_. The _version_ must be a string containing +a valid HTTP protocol version, such as "HTTP/1.0". The default value is +"HTTP/1.1". + +A local copy of the _version_ is made in the request _req_. + +NOTE: No validation of the version supplied is performed. + +NOTE: The library does not contain support for versions of HTTP other than +"HTTP/1.0" and "HTTP/1.1". Specifying any other version may result in +unspecified behavior. + + +== RETURN VALUES + +This function returns 0 on success, and non-zero otherwise. + +== ERRORS + +`NNG_ENOMEM`:: Insufficient memory to perform the operation. +`NNG_ENOTSUP`:: No support for HTTP in the library. + +== SEE ALSO + +<<nng_http_req_alloc#,nng_http_req_alloc(3)>>, +<<nng_http_req_get_version#,nng_http_req_get_version(3)>>, +<<nng#,nng(7)>> diff --git a/docs/man/nng_http_res_add_header.adoc b/docs/man/nng_http_res_add_header.adoc new file mode 100644 index 00000000..75a4f206 --- /dev/null +++ b/docs/man/nng_http_res_add_header.adoc @@ -0,0 +1,62 @@ += nng_http_res_add_header(3) +// +// Copyright 2018 Staysail Systems, Inc. <info@staysail.tech> +// Copyright 2018 Capitar IT Group BV <info@capitar.com> +// +// This document is supplied under the terms of the MIT License, a +// copy of which should be located in the distribution where this +// file was obtained (LICENSE.txt). A copy of the license may also be +// found online at https://opensource.org/licenses/MIT. +// + +== NAME + +nng_http_res_add_header - add HTTP response header + +== SYNOPSIS + +[source, c] +----------- +#include <nng/nng.h> +#include <nng/supplemental/http/http.h> + +int nng_http_res_add_header(nng_http_res *res, const char *key, + const char *val); +----------- + +== DESCRIPTION + +The `nng_http_res_add_header()` adds an HTTP header for the response +_res_ and the _key_ to the _val_. The _key_ and _val_ are copied. + +If a header with the value of _key_ already exists, then a comma +and whitespace separate are appended to it, followed by _val_. + +If no such header already exists, then one is created with the value _val_. + +TIP: The HTTP specification requires that duplicate headers be treated +identically to a single header with multiple comma-delimited values. + +TIP: See <<nng_http_res_set_header#,nng_http_res_set_header(3)>> if +replacement of an existing header rather than appending to it is desired. + +The value of _key_ is case insensitive, and should not include the final +colon in an HTTP header. For example, specifying `Host` or `hOSt` are +equivalent, whereas the value `Host:` is not a legal header key. + +== RETURN VALUES + +This function returns 0 on success, and non-zero otherwise. + +== ERRORS + +`NNG_ENOMEM`:: Insufficient memory to perform the operation. +`NNG_ENOTSUP`:: No support for HTTP in the library. + +== SEE ALSO + +<<nng_http_res_alloc#,nng_http_res_alloc(3)>>, +<<nng_http_res_del_header#,nng_http_res_del_header(3)>>, +<<nng_http_res_get_header#,nng_http_res_get_header(3)>>, +<<nng_http_res_set_header#,nng_http_res_set_header(3)>>, +<<nng#,nng(7)>> diff --git a/docs/man/nng_http_res_alloc.adoc b/docs/man/nng_http_res_alloc.adoc new file mode 100644 index 00000000..9de3d012 --- /dev/null +++ b/docs/man/nng_http_res_alloc.adoc @@ -0,0 +1,64 @@ += nng_http_res_alloc(3) +// +// Copyright 2018 Staysail Systems, Inc. <info@staysail.tech> +// Copyright 2018 Capitar IT Group BV <info@capitar.com> +// +// This document is supplied under the terms of the MIT License, a +// copy of which should be located in the distribution where this +// file was obtained (LICENSE.txt). A copy of the license may also be +// found online at https://opensource.org/licenses/MIT. +// + +== NAME + +nng_http_res_alloc - allocate HTTP response structure + +== SYNOPSIS + +[source, c] +----------- +#include <nng/nng.h> +#include <nng/supplemental/http/http.h> + +int nng_http_res_alloc(nng_http_res **resp); +----------- + +== DESCRIPTION + +The `nng_http_res_alloc()` function allocates a new HTTP response structure +and stores a pointer to it in __resp__. The response will be initialized +with status code 200 (`NNG_HTTP_STATUS_OK`), and a reason phrase of "OK", +and HTTP protocol version "HTTP/1.1". + +TIP: When an error response is needed, consider using +<<nng_http_res_alloc_error#,nng_http_res_alloc_error(3)>> instead. + +== RETURN VALUES + +This function returns 0 on success, and non-zero otherwise. + +== ERRORS + +`NNG_ENOMEM`:: Insufficient free memory exists to allocate a message. +`NNG_ENOTSUP`:: HTTP support not configured. + +== SEE ALSO + +<<nng_http_conn_read_res#,nng_http_conn_read_res(3)>>, +<<nng_http_conn_write_res#,nng_http_conn_write_res(3)>>, +<<nng_http_req_alloc#,nng_http_req_alloc(3)>>, +<<nng_http_res_alloc_errror#,nng_http_res_alloc_error(3)>>, +<<nng_http_res_add_header#,nng_http_res_add_header(3)>>, +<<nng_http_res_copy_data#,nng_http_res_copy_data(3)>>, +<<nng_http_res_del_header#,nng_http_res_del_header(3)>>, +<<nng_http_res_free#,nng_http_res_free(3)>>, +<<nng_http_res_get_header#,nng_http_res_get_header(3)>>, +<<nng_http_res_get_reason#,nng_http_res_get_reason(3)>>, +<<nng_http_res_get_status#,nng_http_res_get_status(3)>>, +<<nng_http_res_get_version#,nng_http_res_get_version(3)>>, +<<nng_http_res_set_data#,nng_http_res_set_data(3)>>, +<<nng_http_res_set_reason#,nng_http_res_set_reason(3)>>, +<<nng_http_res_set_status#,nng_http_res_set_status(3)>>, +<<nng_http_res_set_version#,nng_http_res_set_version(3)>>, +<<nng_strerror#,nng_strerror(3)>>, +<<nng#,nng(7)>> diff --git a/docs/man/nng_http_res_alloc_error.adoc b/docs/man/nng_http_res_alloc_error.adoc new file mode 100644 index 00000000..720871b1 --- /dev/null +++ b/docs/man/nng_http_res_alloc_error.adoc @@ -0,0 +1,54 @@ += nng_http_res_alloc_error(3) +// +// Copyright 2018 Staysail Systems, Inc. <info@staysail.tech> +// Copyright 2018 Capitar IT Group BV <info@capitar.com> +// +// This document is supplied under the terms of the MIT License, a +// copy of which should be located in the distribution where this +// file was obtained (LICENSE.txt). A copy of the license may also be +// found online at https://opensource.org/licenses/MIT. +// + +== NAME + +nng_http_res_alloc_error - allocate HTTP error response + +== SYNOPSIS + +[source, c] +----------- +#include <nng/nng.h> +#include <nng/supplemental/http/http.h> + +int nng_http_res_alloc_error(nng_http_res **resp, uint16_t status); +----------- + +== DESCRIPTION + +The `nng_http_res_alloc_error()` function allocates a new HTTP response structure +and stores a pointer to it in __resp__. The response will be initialized +with the status code _status_, a corresponding reason phrase, and +a simple HTML page containing the same information will be generated and +attached to the response. (Relevant HTTP headers will be set as well, +such as `Content-Type` and `Content-Length`.) The HTTP protocol version +is also set to "HTTP/1.1". + +TIP: This is the simplest way to generate an error response. + +== RETURN VALUES + +This function returns 0 on success, and non-zero otherwise. + +== ERRORS + +`NNG_ENOMEM`:: Insufficient free memory exists to allocate a message. +`NNG_ENOTSUP`:: HTTP support not configured. + +== SEE ALSO + +<<nng_http_res_alloc#,nng_http_res_alloc(3)>>, +<<nng_http_res_free#,nng_http_res_free(3)>>, +<<nng_http_res_set_reason#,nng_http_res_set_reason(3)>>, +<<nng_http_res_set_status#,nng_http_res_set_status(3)>>, +<<nng_strerror#,nng_strerror(3)>>, +<<nng#,nng(7)>> diff --git a/docs/man/nng_http_res_copy_data.adoc b/docs/man/nng_http_res_copy_data.adoc new file mode 100644 index 00000000..56d10222 --- /dev/null +++ b/docs/man/nng_http_res_copy_data.adoc @@ -0,0 +1,60 @@ += nng_http_res_copy_data(3) +// +// Copyright 2018 Staysail Systems, Inc. <info@staysail.tech> +// Copyright 2018 Capitar IT Group BV <info@capitar.com> +// +// This document is supplied under the terms of the MIT License, a +// copy of which should be located in the distribution where this +// file was obtained (LICENSE.txt). A copy of the license may also be +// found online at https://opensource.org/licenses/MIT. +// + +== NAME + +nng_http_res_copy_data - copy HTTP response body + +== SYNOPSIS + +[source, c] +----------- +#include <nng/nng.h> +#include <nng/supplemental/http/http.h> + +int nng_http_res_copy_data(nng_http_res *res, const void *body, size_t size); +----------- + +== DESCRIPTION + +The `nng_http_res_copy_data()` makes a copy of _body_ (of size __size__) +and sets the HTTP body for the response _res_ to it. The copy will be +deallocated automatically when _res_ is freed. + +The copied body data will be automatically sent with the response when it +is sent using <<nng_http_conn_write_res#,nni_http_conn_write_res(3)>>. + +This also updates the relevant `Content-Length` header of _res_. + +NOTE: The current framework does not support sending data via chunked +transfer-encoding. + +TIP: To avoid copying data, the +<<nng_http_res_set_data#,nng_http_res_set_data(3)>> may be used instead. + +TIP: It is a good idea to also set the `Content-Type` header. + +== RETURN VALUES + +This function returns 0 on success, and non-zero otherwise. + +== ERRORS + +`NNG_ENOMEM`:: Insufficient memory to perform the operation. +`NNG_ENOTSUP`:: No support for HTTP in the library. + +== SEE ALSO + +<<nng_http_conn_write_res#,nng_http_conn_write_res(3)>>, +<<nng_http_res_alloc#,nng_http_res_alloc(3)>>, +<<nng_http_res_set_data#,nng_http_res_set_data(3)>>, +<<nng_http_res_set_header#,nng_http_res_set_header(3)>>, +<<nng#,nng(7)>> diff --git a/docs/man/nng_http_res_del_header.adoc b/docs/man/nng_http_res_del_header.adoc new file mode 100644 index 00000000..82a2387e --- /dev/null +++ b/docs/man/nng_http_res_del_header.adoc @@ -0,0 +1,50 @@ += nng_http_res_set_header(3) +// +// Copyright 2018 Staysail Systems, Inc. <info@staysail.tech> +// Copyright 2018 Capitar IT Group BV <info@capitar.com> +// +// This document is supplied under the terms of the MIT License, a +// copy of which should be located in the distribution where this +// file was obtained (LICENSE.txt). A copy of the license may also be +// found online at https://opensource.org/licenses/MIT. +// + +== NAME + +nng_http_res_set_header - set HTTP response header + +== SYNOPSIS + +[source, c] +----------- +#include <nng/nng.h> +#include <nng/supplemental/http/http.h> + +int nng_http_res_set_header(nng_http_res *res, const char *key); +----------- + +== DESCRIPTION + +The `nng_http_res_del_header()` removes all HTTP headers with the +associated _key_ from the response structure _res_. + +The value of _key_ is case insensitive, and should not include the final +colon in an HTTP header. For example, specifying `Host` or `hOSt` are +equivalent, whereas the value `Host:` is not a legal header key. + +== RETURN VALUES + +This function returns 0 on success, and non-zero otherwise. + +== ERRORS + +`NNG_ENOENT`:: No header with the key _key_ was present. +`NNG_ENOTSUP`:: No support for HTTP in the library. + +== SEE ALSO + +<<nng_http_res_alloc#,nng_http_res_alloc(3)>>, +<<nng_http_res_add_header#,nng_http_res_add_header(3)>>, +<<nng_http_res_del_header#,nng_http_res_del_header(3)>>, +<<nng_http_res_get_header#,nng_http_res_get_header(3)>>, +<<nng#,nng(7)>> diff --git a/docs/man/nng_http_res_free.adoc b/docs/man/nng_http_res_free.adoc new file mode 100644 index 00000000..ade3e151 --- /dev/null +++ b/docs/man/nng_http_res_free.adoc @@ -0,0 +1,42 @@ += nng_http_res_free(3) +// +// Copyright 2018 Staysail Systems, Inc. <info@staysail.tech> +// Copyright 2018 Capitar IT Group BV <info@capitar.com> +// +// This document is supplied under the terms of the MIT License, a +// copy of which should be located in the distribution where this +// file was obtained (LICENSE.txt). A copy of the license may also be +// found online at https://opensource.org/licenses/MIT. +// + +== NAME + +nng_http_res_free - free HTTP response structure + +== SYNOPSIS + +[source, c] +----------- +#include <nng/nng.h> +#include <nng/supplemental/http/http.h> + +void nng_http_res_free(nng_http_res *req); +----------- + +== DESCRIPTION + +The `nng_http_res_free()` function deallocates the HTTP response structure +_res_ entirely. + +== RETURN VALUES + +None. + +== ERRORS + +None. + +== SEE ALSO + +<<nng_http_res_alloc#,nng_http_req_alloc(3)>>, +<<nng#,nng(7)>> diff --git a/docs/man/nng_http_res_get_header.adoc b/docs/man/nng_http_res_get_header.adoc new file mode 100644 index 00000000..0d3afbd6 --- /dev/null +++ b/docs/man/nng_http_res_get_header.adoc @@ -0,0 +1,50 @@ += nng_http_res_get_header(3) +// +// Copyright 2018 Staysail Systems, Inc. <info@staysail.tech> +// Copyright 2018 Capitar IT Group BV <info@capitar.com> +// +// This document is supplied under the terms of the MIT License, a +// copy of which should be located in the distribution where this +// file was obtained (LICENSE.txt). A copy of the license may also be +// found online at https://opensource.org/licenses/MIT. +// + +== NAME + +nng_http_res_get_header - return HTTP response header + +== SYNOPSIS + +[source, c] +----------- +#include <nng/nng.h> +#include <nng/supplemental/http/http.h> + +const char *nng_http_res_get_header(nng_http_res *res, const char *key); +----------- + +== DESCRIPTION + +The `nng_http_res_get_header()` looks for an HTTP header _key_ in +the response _res_, and returns the associated value if found, +or `NULL` if not found. + +The value of _key_ is case insensitive, and should not include the final +colon in an HTTP header. For example, specifying `Host` or `hOSt` are +equivalent, whereas the value `Host:` will not find anything. + + +== RETURN VALUES + +HTTP header value for _key_, if it exists, or NULL otherwise. + +== ERRORS + +None. + +== SEE ALSO + +<<nng_http_res_alloc#,nng_http_res_alloc(3)>>, +<<nng_http_res_add_header#,nng_http_res_add_header(3)>>, +<<nng_http_res_set_header#,nng_http_res_set_header(3)>>, +<<nng#,nng(7)>> diff --git a/docs/man/nng_http_res_get_reason.adoc b/docs/man/nng_http_res_get_reason.adoc new file mode 100644 index 00000000..7fe1f079 --- /dev/null +++ b/docs/man/nng_http_res_get_reason.adoc @@ -0,0 +1,46 @@ += nng_http_res_get_reason(3) +// +// Copyright 2018 Staysail Systems, Inc. <info@staysail.tech> +// Copyright 2018 Capitar IT Group BV <info@capitar.com> +// +// This document is supplied under the terms of the MIT License, a +// copy of which should be located in the distribution where this +// file was obtained (LICENSE.txt). A copy of the license may also be +// found online at https://opensource.org/licenses/MIT. +// + +== NAME + +nng_http_res_get_reason - return HTTP response reason + +== SYNOPSIS + +[source, c] +----------- +#include <nng/nng.h> +#include <nng/supplemental/http/http.h> + +const char *nng_http_res_get_reason(nng_http_res *res); +----------- + +== DESCRIPTION + +The `nng_http_res_get_reason()` returns a string representing the "reason +phrase" associated with the response _res_. This is a human-readable +explanation of the status code that would be obtained from +<<nng_http_res_get_status#,nng_http_res_get_status(3)>>. + +== RETURN VALUES + +Reason as a string. + +== ERRORS + +None. + +== SEE ALSO + +<<nng_http_res_alloc#,nng_http_res_alloc(3)>>, +<<nng_http_res_get_status#,nng_http_res_get_status(3)>>, +<<nng_http_res_set_reason#,nng_http_res_set_reason(3)>>, +<<nng#,nng(7)>> diff --git a/docs/man/nng_http_res_get_status.adoc b/docs/man/nng_http_res_get_status.adoc new file mode 100644 index 00000000..2056e2ce --- /dev/null +++ b/docs/man/nng_http_res_get_status.adoc @@ -0,0 +1,116 @@ += nng_http_res_get_status(3) +// +// Copyright 2018 Staysail Systems, Inc. <info@staysail.tech> +// Copyright 2018 Capitar IT Group BV <info@capitar.com> +// +// This document is supplied under the terms of the MIT License, a +// copy of which should be located in the distribution where this +// file was obtained (LICENSE.txt). A copy of the license may also be +// found online at https://opensource.org/licenses/MIT. +// + +== NAME + +nng_http_res_get_status - return HTTP status code + +== SYNOPSIS + +[source, c] +----------- +#include <nng/nng.h> +#include <nng/supplemental/http/http.h> + +uint16_t nng_http_res_get_status(nng_http_res *res); +----------- + +== DESCRIPTION + +The `nng_http_res_get_status()` returns a numeric code corresponding to +the HTTP status of the response _res_. + +For convenience, a number of predefined symbols corresponding to well-known +HTTP status codes are available. + +[source, c] +---- +enum { + NNG_HTTP_STATUS_CONTINUE = 100, + NNG_HTTP_STATUS_SWITCHING = 101, + NNG_HTTP_STATUS_PROCESSING = 102, + NNG_HTTP_STATUS_OK = 200, + NNG_HTTP_STATUS_CREATED = 201, + NNG_HTTP_STATUS_ACCEPTED = 202, + NNG_HTTP_STATUS_NOT_AUTHORITATIVE = 203, + NNG_HTTP_STATUS_NO_CONTENT = 204, + NNG_HTTP_STATUS_RESET_CONTENT = 205, + NNG_HTTP_STATUS_PARTIAL_CONTENT = 206, + NNG_HTTP_STATUS_MULTI_STATUS = 207, + NNG_HTTP_STATUS_ALREADY_REPORTED = 208, + NNG_HTTP_STATUS_IM_USED = 226, + NNG_HTTP_STATUS_MULTIPLE_CHOICES = 300, + NNG_HTTP_STATUS_STATUS_MOVED_PERMANENTLY = 301, + NNG_HTTP_STATUS_FOUND = 302, + NNG_HTTP_STATUS_SEE_OTHER = 303, + NNG_HTTP_STATUS_NOT_MODIFIED = 304, + NNG_HTTP_STATUS_USE_PROXY = 305, + NNG_HTTP_STATUS_TEMPORARY_REDIRECT = 307, + NNG_HTTP_STATUS_PERMANENT_REDIRECT = 308, + NNG_HTTP_STATUS_BAD_REQUEST = 400, + NNG_HTTP_STATUS_UNAUTHORIZED = 401, + NNG_HTTP_STATUS_PAYMENT_REQUIRED = 402, + NNG_HTTP_STATUS_FORBIDDEN = 403, + NNG_HTTP_STATUS_NOT_FOUND = 404, + NNG_HTTP_STATUS_METHOD_NOT_ALLOWED = 405, + NNG_HTTP_STATUS_NOT_ACCEPTABLE = 406, + NNG_HTTP_STATUS_PROXY_AUTH_REQUIRED = 407, + NNG_HTTP_STATUS_REQUEST_TIMEOUT = 408, + NNG_HTTP_STATUS_CONFLICT = 409, + NNG_HTTP_STATUS_GONE = 410, + NNG_HTTP_STATUS_LENGTH_REQUIRED = 411, + NNG_HTTP_STATUS_PRECONDITION_FAILED = 412, + NNG_HTTP_STATUS_PAYLOAD_TOO_LARGE = 413, + NNG_HTTP_STATUS_ENTITY_TOO_LONG = 414, + NNG_HTTP_STATUS_UNSUPPORTED_MEDIA_TYPE = 415, + NNG_HTTP_STATUS_RANGE_NOT_SATISFIABLE = 416, + NNG_HTTP_STATUS_EXPECTATION_FAILED = 417, + NNG_HTTP_STATUS_TEAPOT = 418, + NNG_HTTP_STATUS_UNPROCESSABLE_ENTITY = 422, + NNG_HTTP_STATUS_LOCKED = 423, + NNG_HTTP_STATUS_FAILED_DEPENDENCY = 424, + NNG_HTTP_STATUS_UPGRADE_REQUIRED = 426, + NNG_HTTP_STATUS_PRECONDITION_REQUIRED = 428, + NNG_HTTP_STATUS_TOO_MANY_REQUESTS = 429, + NNG_HTTP_STATUS_HEADERS_TOO_LARGE = 431, + NNG_HTTP_STATUS_UNAVAIL_LEGAL_REASONS = 451, + NNG_HTTP_STATUS_INTERNAL_SERVER_ERROR = 500, + NNG_HTTP_STATUS_NOT_IMPLEMENTED = 501, + NNG_HTTP_STATUS_BAD_GATEWAY = 502, + NNG_HTTP_STATUS_SERVICE_UNAVAILABLE = 503, + NNG_HTTP_STATUS_GATEWAY_TIMEOUT = 504, + NNG_HTTP_STATUS_HTTP_VERSION_NOT_SUPP = 505, + NNG_HTTP_STATUS_VARIANT_ALSO_NEGOTIATES = 506, + NNG_HTTP_STATUS_INSUFFICIENT_STORAGE = 507, + NNG_HTTP_STATUS_LOOP_DETECTED = 508, + NNG_HTTP_STATUS_NOT_EXTENDED = 510, + NNG_HTTP_STATUS_NETWORK_AUTH_REQUIRED = 511, +} +---- + +TIP: When displaying status information to users (or logging such information), +consider also including the "reason phrase" obtained with +<<nng_http_res_get_reason#,nng_http_res_get_reason(3)>>. + +== RETURN VALUES + +HTTP status code. + +== ERRORS + +None. + +== SEE ALSO + +<<nng_http_res_alloc#,nng_http_res_alloc(3)>>, +<<nng_http_res_get_reason#,nng_http_res_get_reason(3)>>, +<<nng_http_res_set_status#,nng_http_res_set_status(3)>>, +<<nng#,nng(7)>> diff --git a/docs/man/nng_http_res_get_version.adoc b/docs/man/nng_http_res_get_version.adoc new file mode 100644 index 00000000..199bd95c --- /dev/null +++ b/docs/man/nng_http_res_get_version.adoc @@ -0,0 +1,44 @@ += nng_http_res_get_version(3) +// +// Copyright 2018 Staysail Systems, Inc. <info@staysail.tech> +// Copyright 2018 Capitar IT Group BV <info@capitar.com> +// +// This document is supplied under the terms of the MIT License, a +// copy of which should be located in the distribution where this +// file was obtained (LICENSE.txt). A copy of the license may also be +// found online at https://opensource.org/licenses/MIT. +// + +== NAME + +nng_http_res_get_version - return HTTP response protocol version + +== SYNOPSIS + +[source, c] +----------- +#include <nng/nng.h> +#include <nng/supplemental/http/http.h> + +const char *nng_http_res_get_version(nng_http_res *res); +----------- + +== DESCRIPTION + +The `nng_http_res_get_version()` returns a string representing the HTTP +protocol version associated with the request _res_, such as "HTTP/1.1". + + +== RETURN VALUES + +Response version as a string. + +== ERRORS + +None. + +== SEE ALSO + +<<nng_http_res_alloc#,nng_http_res_alloc(3)>>, +<<nng_http_res_set_version#,nng_http_res_set_version(3)>>, +<<nng#,nng(7)>> diff --git a/docs/man/nng_http_res_set_data.adoc b/docs/man/nng_http_res_set_data.adoc new file mode 100644 index 00000000..aae0d076 --- /dev/null +++ b/docs/man/nng_http_res_set_data.adoc @@ -0,0 +1,62 @@ += nng_http_res_set_data(3) +// +// Copyright 2018 Staysail Systems, Inc. <info@staysail.tech> +// Copyright 2018 Capitar IT Group BV <info@capitar.com> +// +// This document is supplied under the terms of the MIT License, a +// copy of which should be located in the distribution where this +// file was obtained (LICENSE.txt). A copy of the license may also be +// found online at https://opensource.org/licenses/MIT. +// + +== NAME + +nng_http_res_set_data - set HTTP response body + +== SYNOPSIS + +[source, c] +----------- +#include <nng/nng.h> +#include <nng/supplemental/http/http.h> + +int nng_http_res_set_data(nng_http_res *res, const void *body, size_t size); +----------- + +== DESCRIPTION + +The `nng_http_res_set_data()` sets the HTTP body associated with +the response _res_ to _body_, and the size of the body to _size_. +This body data will be automatically sent with the response when it +is sent using <<nng_http_conn_write_res#,nni_http_conn_write_res(3)>>. + +This also updates the relevant `Content-Length` header of _res_. + +NOTE: The current framework does not support sending data via chunked +transfer-encoding. + +The _body_ is *not* copied, and the caller must ensure that it is available +until the _res_ is deallocated. + +TIP: To have a local copy allocated with _res_ that will be automatically +deallocated when _res_ is freed, +see <<nng_http_res_copy_data#,nng_http_res_copy_data(3)>>. + +TIP: It is a good idea to also set the `Content-Type` header. + +== RETURN VALUES + +This function returns 0 on success, and non-zero otherwise. + +== ERRORS + +`NNG_ENOMEM`:: Insufficient memory to perform the operation. +`NNG_ENOTSUP`:: No support for HTTP in the library. + +== SEE ALSO + +<<nng_http_conn_write_res#,nng_http_conn_write_res(3)>>, +<<nng_http_res_alloc#,nng_http_res_alloc(3)>>, +<<nng_http_res_copy_data#,nng_http_res_copy_data(3)>>, +<<nng_http_res_set_header#,nng_http_res_set_header(3)>>, +<<nng#,nng(7)>> diff --git a/docs/man/nng_http_res_set_header.adoc b/docs/man/nng_http_res_set_header.adoc new file mode 100644 index 00000000..7c2a649e --- /dev/null +++ b/docs/man/nng_http_res_set_header.adoc @@ -0,0 +1,55 @@ += nng_http_res_set_header(3) +// +// Copyright 2018 Staysail Systems, Inc. <info@staysail.tech> +// Copyright 2018 Capitar IT Group BV <info@capitar.com> +// +// This document is supplied under the terms of the MIT License, a +// copy of which should be located in the distribution where this +// file was obtained (LICENSE.txt). A copy of the license may also be +// found online at https://opensource.org/licenses/MIT. +// + +== NAME + +nng_http_res_set_header - set HTTP response header + +== SYNOPSIS + +[source, c] +----------- +#include <nng/nng.h> +#include <nng/supplemental/http/http.h> + +int nng_http_res_set_header(nng_http_res *res, const char *key, + const char *val); +----------- + +== DESCRIPTION + +The `nng_http_res_set_header()` sets the HTTP header for the response +_res_ and the _key_ to the _val_. The _key_ and _val_ are copied. +Any previous header with the same _key_ is replaced. + +TIP: See <<nng_http_res_add_header#,nng_http_res_add_header(3)>> to +add additional headers with the same _key_ without replacing them. + +The value of _key_ is case insensitive, and should not include the final +colon in an HTTP header. For example, specifying `Host` or `hOSt` are +equivalent, whereas the value `Host:` is not a legal header key. + +== RETURN VALUES + +This function returns 0 on success, and non-zero otherwise. + +== ERRORS + +`NNG_ENOMEM`:: Insufficient memory to perform the operation. +`NNG_ENOTSUP`:: No support for HTTP in the library. + +== SEE ALSO + +<<nng_http_res_alloc#,nng_http_res_alloc(3)>>, +<<nng_http_res_add_header#,nng_http_res_add_header(3)>>, +<<nng_http_res_del_header#,nng_http_res_del_header(3)>>, +<<nng_http_res_get_header#,nng_http_res_get_header(3)>>, +<<nng#,nng(7)>> diff --git a/docs/man/nng_http_res_set_reason.adoc b/docs/man/nng_http_res_set_reason.adoc new file mode 100644 index 00000000..150b8166 --- /dev/null +++ b/docs/man/nng_http_res_set_reason.adoc @@ -0,0 +1,54 @@ += nng_http_res_set_reason(3) +// +// Copyright 2018 Staysail Systems, Inc. <info@staysail.tech> +// Copyright 2018 Capitar IT Group BV <info@capitar.com> +// +// This document is supplied under the terms of the MIT License, a +// copy of which should be located in the distribution where this +// file was obtained (LICENSE.txt). A copy of the license may also be +// found online at https://opensource.org/licenses/MIT. +// + +== NAME + +nng_http_res_set_reason - set HTTP response reason + +== SYNOPSIS + +[source, c] +----------- +#include <nng/nng.h> +#include <nng/supplemental/http/http.h> + +int nng_http_res_set_reason(nng_http_res *res, const char *reason); +----------- + +== DESCRIPTION + +The `nng_http_res_set_reason()` sets the human readable "reason phrase" +associated with the response _res_ to _reason_. + +If the value of _reason_ is `NULL` (the default), then a default reason +phrase is supplied based upon the value of the status code (see +<<nng_http_res_set_status#,nng_http_res_set_status(3)>>). + +TIP: The _reason_ is never parsed automatically, but it can be a hint for humans + to help them understand the nature of any erroroneous result. + +A local copy of the _reason_ is made in the response _res_. + +== RETURN VALUES + +This function returns 0 on success, and non-zero otherwise. + +== ERRORS + +`NNG_ENOMEM`:: Insufficient memory to perform the operation. +`NNG_ENOTSUP`:: No support for HTTP in the library. + +== SEE ALSO + +<<nng_http_res_alloc#,nng_http_res_alloc(3)>>, +<<nng_http_res_get_reason#,nng_http_req_get_reason(3)>>, +<<nng_http_res_set_status#,nng_http_req_set_status(3)>>, +<<nng#,nng(7)>> diff --git a/docs/man/nng_http_res_set_status.adoc b/docs/man/nng_http_res_set_status.adoc new file mode 100644 index 00000000..f5e45cc4 --- /dev/null +++ b/docs/man/nng_http_res_set_status.adoc @@ -0,0 +1,122 @@ += nng_http_res_set_status(3) +// +// Copyright 2018 Staysail Systems, Inc. <info@staysail.tech> +// Copyright 2018 Capitar IT Group BV <info@capitar.com> +// +// This document is supplied under the terms of the MIT License, a +// copy of which should be located in the distribution where this +// file was obtained (LICENSE.txt). A copy of the license may also be +// found online at https://opensource.org/licenses/MIT. +// + +== NAME + +nng_http_res_set_status - set HTTP response status + +== SYNOPSIS + +[source, c] +----------- +#include <nng/nng.h> +#include <nng/supplemental/http/http.h> + +int nng_http_res_set_status(nng_http_res *res, uint16_t status); +----------- + +== DESCRIPTION + +The `nng_http_res_set_status()` sets the numeric HTTP status code +associated with the response _res_ to _status_. The default value +for a newly allocated response is 200 (`NNG_HTTP_STATUS_OK`). + +The _status_ is not verified, so the caller should take care to ensure +that only a valid code is supplied. + +For convenience, a number of predefined symbols are available. + +[source, c] +---- +enum { + NNG_HTTP_STATUS_CONTINUE = 100, + NNG_HTTP_STATUS_SWITCHING = 101, + NNG_HTTP_STATUS_PROCESSING = 102, + NNG_HTTP_STATUS_OK = 200, + NNG_HTTP_STATUS_CREATED = 201, + NNG_HTTP_STATUS_ACCEPTED = 202, + NNG_HTTP_STATUS_NOT_AUTHORITATIVE = 203, + NNG_HTTP_STATUS_NO_CONTENT = 204, + NNG_HTTP_STATUS_RESET_CONTENT = 205, + NNG_HTTP_STATUS_PARTIAL_CONTENT = 206, + NNG_HTTP_STATUS_MULTI_STATUS = 207, + NNG_HTTP_STATUS_ALREADY_REPORTED = 208, + NNG_HTTP_STATUS_IM_USED = 226, + NNG_HTTP_STATUS_MULTIPLE_CHOICES = 300, + NNG_HTTP_STATUS_STATUS_MOVED_PERMANENTLY = 301, + NNG_HTTP_STATUS_FOUND = 302, + NNG_HTTP_STATUS_SEE_OTHER = 303, + NNG_HTTP_STATUS_NOT_MODIFIED = 304, + NNG_HTTP_STATUS_USE_PROXY = 305, + NNG_HTTP_STATUS_TEMPORARY_REDIRECT = 307, + NNG_HTTP_STATUS_PERMANENT_REDIRECT = 308, + NNG_HTTP_STATUS_BAD_REQUEST = 400, + NNG_HTTP_STATUS_UNAUTHORIZED = 401, + NNG_HTTP_STATUS_PAYMENT_REQUIRED = 402, + NNG_HTTP_STATUS_FORBIDDEN = 403, + NNG_HTTP_STATUS_NOT_FOUND = 404, + NNG_HTTP_STATUS_METHOD_NOT_ALLOWED = 405, + NNG_HTTP_STATUS_NOT_ACCEPTABLE = 406, + NNG_HTTP_STATUS_PROXY_AUTH_REQUIRED = 407, + NNG_HTTP_STATUS_REQUEST_TIMEOUT = 408, + NNG_HTTP_STATUS_CONFLICT = 409, + NNG_HTTP_STATUS_GONE = 410, + NNG_HTTP_STATUS_LENGTH_REQUIRED = 411, + NNG_HTTP_STATUS_PRECONDITION_FAILED = 412, + NNG_HTTP_STATUS_PAYLOAD_TOO_LARGE = 413, + NNG_HTTP_STATUS_ENTITY_TOO_LONG = 414, + NNG_HTTP_STATUS_UNSUPPORTED_MEDIA_TYPE = 415, + NNG_HTTP_STATUS_RANGE_NOT_SATISFIABLE = 416, + NNG_HTTP_STATUS_EXPECTATION_FAILED = 417, + NNG_HTTP_STATUS_TEAPOT = 418, + NNG_HTTP_STATUS_UNPROCESSABLE_ENTITY = 422, + NNG_HTTP_STATUS_LOCKED = 423, + NNG_HTTP_STATUS_FAILED_DEPENDENCY = 424, + NNG_HTTP_STATUS_UPGRADE_REQUIRED = 426, + NNG_HTTP_STATUS_PRECONDITION_REQUIRED = 428, + NNG_HTTP_STATUS_TOO_MANY_REQUESTS = 429, + NNG_HTTP_STATUS_HEADERS_TOO_LARGE = 431, + NNG_HTTP_STATUS_UNAVAIL_LEGAL_REASONS = 451, + NNG_HTTP_STATUS_INTERNAL_SERVER_ERROR = 500, + NNG_HTTP_STATUS_NOT_IMPLEMENTED = 501, + NNG_HTTP_STATUS_BAD_GATEWAY = 502, + NNG_HTTP_STATUS_SERVICE_UNAVAILABLE = 503, + NNG_HTTP_STATUS_GATEWAY_TIMEOUT = 504, + NNG_HTTP_STATUS_HTTP_VERSION_NOT_SUPP = 505, + NNG_HTTP_STATUS_VARIANT_ALSO_NEGOTIATES = 506, + NNG_HTTP_STATUS_INSUFFICIENT_STORAGE = 507, + NNG_HTTP_STATUS_LOOP_DETECTED = 508, + NNG_HTTP_STATUS_NOT_EXTENDED = 510, + NNG_HTTP_STATUS_NETWORK_AUTH_REQUIRED = 511, +} +---- + +Please see the relevant HTTP RFCs for the semantics and correct +use of these status codes. + +TIP: It is a good idea to also set the "reason phrase" with +<<nng_http_res_set_reason#,nng_http_set_reason(3)>>. This +will help any humans who may have to diagnose any failure. + +== RETURN VALUES + +This function returns 0 on success, and non-zero otherwise. + +== ERRORS + +`NNG_ENOTSUP`:: No support for HTTP in the library. + +== SEE ALSO + +<<nng_http_res_alloc#,nng_http_res_alloc(3)>>, +<<nng_http_res_get_status#,nng_http_req_get_status(3)>>, +<<nng_http_res_set_reason#,nng_http_req_set_reason(3)>>, +<<nng#,nng(7)>> diff --git a/docs/man/nng_http_res_set_version.adoc b/docs/man/nng_http_res_set_version.adoc new file mode 100644 index 00000000..cb8f29a7 --- /dev/null +++ b/docs/man/nng_http_res_set_version.adoc @@ -0,0 +1,55 @@ += nng_http_res_set_version(3) +// +// Copyright 2018 Staysail Systems, Inc. <info@staysail.tech> +// Copyright 2018 Capitar IT Group BV <info@capitar.com> +// +// This document is supplied under the terms of the MIT License, a +// copy of which should be located in the distribution where this +// file was obtained (LICENSE.txt). A copy of the license may also be +// found online at https://opensource.org/licenses/MIT. +// + +== NAME + +nng_http_res_set_version - set HTTP response protocol version + +== SYNOPSIS + +[source, c] +----------- +#include <nng/nng.h> +#include <nng/supplemental/http/http.h> + +int nng_http_res_set_version(nng_http_res *res, const char *version); +----------- + +== DESCRIPTION + +The `nng_http_res_set_version()` sets the HTTP protocol version associated with +the response _res_ to _version_. The _version_ must be a string containing +a valid HTTP protocol version, such as "HTTP/1.0". The default value is +"HTTP/1.1". + +A local copy of the _version_ is made in the response _res_. + +NOTE: No validation of the version supplied is performed. + +NOTE: The library does not contain support for versions of HTTP other than +"HTTP/1.0" and "HTTP/1.1". Specifying any other version may result in +unspecified behavior. + + +== RETURN VALUES + +This function returns 0 on success, and non-zero otherwise. + +== ERRORS + +`NNG_ENOMEM`:: Insufficient memory to perform the operation. +`NNG_ENOTSUP`:: No support for HTTP in the library. + +== SEE ALSO + +<<nng_http_res_alloc#,nng_http_res_alloc(3)>>, +<<nng_http_req_get_version#,nng_http_req_get_version(3)>>, +<<nng#,nng(7)>> diff --git a/docs/man/nng_http_server_add_handler.adoc b/docs/man/nng_http_server_add_handler.adoc new file mode 100644 index 00000000..333187a7 --- /dev/null +++ b/docs/man/nng_http_server_add_handler.adoc @@ -0,0 +1,57 @@ += nng_http_server_add_handler(3) +// +// Copyright 2018 Staysail Systems, Inc. <info@staysail.tech> +// Copyright 2018 Capitar IT Group BV <info@capitar.com> +// +// This document is supplied under the terms of the MIT License, a +// copy of which should be located in the distribution where this +// file was obtained (LICENSE.txt). A copy of the license may also be +// found online at https://opensource.org/licenses/MIT. +// + +== NAME + +nng_http_server_add_handler - add HTTP server handler + +== SYNOPSIS + +[source, c] +----------- +#include <nng/nng.h> +#include <nng/supplemental/http/http.h> + +int nng_http_server_add_handler(nng_http_server *s, nng_http_handler *h); +----------- + +== DESCRIPTION + +The `nng_http_server_add_handler()` adds the handler _h_ to the server +instance _s_. + +If another handler is already added to the server that would conflict +with handler _h_, then the operation will fail with `NNG_EADDRINUSE`. + +If a handler is added to a server, and the server is subsequently +deallocated, the handler and any of its resources will also be deallocated. + +Handlers that are added to a server may be subsequently removed using the +<<nng_http_server_del_handler#,nng_http_server_del_handler(3)>> function. + +== RETURN VALUES + +This function returns 0 on success, and non-zero otherwise. + +== ERRORS + +`NNG_EADDRINUSE`:: Handler conflicts with another handler. +`NNG_ENOMEM`:: Insufficient free memory exists. +`NNG_ENOTSUP`:: HTTP not supported. + +== SEE ALSO + + +<<nng_http_handler_alloc#,nng_http_handler_alloc(3)>>, +<<nng_http_server_del_handler#,nng_http_server_del_handler(3)>>, +<<nng_http_server_hold#,nng_http_server_hold(3)>>, +<<nng_strerror#,nng_strerror(3)>>, +<<nng#,nng(7)>> diff --git a/docs/man/nng_http_server_del_handler.adoc b/docs/man/nng_http_server_del_handler.adoc new file mode 100644 index 00000000..6dd72d8a --- /dev/null +++ b/docs/man/nng_http_server_del_handler.adoc @@ -0,0 +1,48 @@ += nng_http_server_del_handler(3) +// +// Copyright 2018 Staysail Systems, Inc. <info@staysail.tech> +// Copyright 2018 Capitar IT Group BV <info@capitar.com> +// +// This document is supplied under the terms of the MIT License, a +// copy of which should be located in the distribution where this +// file was obtained (LICENSE.txt). A copy of the license may also be +// found online at https://opensource.org/licenses/MIT. +// + +== NAME + +nng_http_server_del_handler - delete HTTP server handler + +== SYNOPSIS + +[source, c] +----------- +#include <nng/nng.h> +#include <nng/supplemental/http/http.h> + +int nng_http_server_del_hanlder(nng_http_server *s, nng_http_handler *h); +----------- + +== DESCRIPTION + +The `nng_http_server_del_handler()` removes the handler _h_ from the server +instance _s_. + +Once a handler has been deleted from a server, it is the responsibility +of the caller to dispose of the handler, or add it to another server instance. + +== RETURN VALUES + +This function returns 0 on success, and non-zero otherwise. + +== ERRORS + +`NNG_ENOENT`:: Handler is not registered with server. +`NNG_ENOTSUP`:: HTTP not supported. + +== SEE ALSO + +<<nng_http_handler_free#,nng_http_handler_free(3)>>, +<<nng_http_server_add_handler#,nng_http_server_add_handler(3)>>, +<<nng_strerror#,nng_strerror(3)>>, +<<nng#,nng(7)>> diff --git a/docs/man/nng_http_server_get_tls.adoc b/docs/man/nng_http_server_get_tls.adoc new file mode 100644 index 00000000..c19fb4d9 --- /dev/null +++ b/docs/man/nng_http_server_get_tls.adoc @@ -0,0 +1,50 @@ += nng_http_server_get_tls(3) +// +// Copyright 2018 Staysail Systems, Inc. <info@staysail.tech> +// Copyright 2018 Capitar IT Group BV <info@capitar.com> +// +// This document is supplied under the terms of the MIT License, a +// copy of which should be located in the distribution where this +// file was obtained (LICENSE.txt). A copy of the license may also be +// found online at https://opensource.org/licenses/MIT. +// + +== NAME + +nng_http_server_get_tls - get HTTP server TLS configuration + +== SYNOPSIS + +[source, c] +----------- +#include <nng/nng.h> +#include <nng/supplemental/http/http.h> + +int nng_http_server_get_tls(nng_http_server *s, nng_tls_config **cfgp); +----------- + +== DESCRIPTION + +The `nng_http_server_get_tls()` obtains the TLS configuration of server _s_ and +saves a pointer to it in the address referenced by _cfgp_. + +The configuration will be `NULL` if the HTTP server instance is not enabled +to use HTTPS. + +== RETURN VALUES + +This function returns 0 on success, and non-zero otherwise. + +== ERRORS + +`NNG_ENOMEM`:: Insufficient free memory exists. +`NNG_ENOTSUP`:: Either HTTP or TLS not supported. + +== SEE ALSO + +<<nng_http_server_hold#,nng_http_server_hold(3)>>, +<<nng_http_server_set_tls#,nng_http_server_set_tls(3)>>, +<<nng_http_server_start#,nng_http_server_start(3)>>, +<<nng_tls_config_alloc#,nng_tls_config_alloc(3)>>, +<<nng_strerror#,nng_strerror(3)>>, +<<nng#,nng(7)>> diff --git a/docs/man/nng_http_server_hold.adoc b/docs/man/nng_http_server_hold.adoc new file mode 100644 index 00000000..61e5b068 --- /dev/null +++ b/docs/man/nng_http_server_hold.adoc @@ -0,0 +1,62 @@ += nng_http_server_hold(3) +// +// Copyright 2018 Staysail Systems, Inc. <info@staysail.tech> +// Copyright 2018 Capitar IT Group BV <info@capitar.com> +// +// This document is supplied under the terms of the MIT License, a +// copy of which should be located in the distribution where this +// file was obtained (LICENSE.txt). A copy of the license may also be +// found online at https://opensource.org/licenses/MIT. +// + +== NAME + +nng_http_server_hold - get and hold HTTP server instance + +== SYNOPSIS + +[source, c] +----------- +#include <nng/nng.h> +#include <nng/supplemental/http/http.h> + +int nng_http_server_hold(nng_http_server **serverp, const nng_url *url); +----------- + +== DESCRIPTION + +The `nng_http_server_hold()` acquires an instance of an HTTP server suitable +for use in serving the URL identified by _url_, and stores a pointer to it +at the location pointed to by _serverp_. + +This function first looks to see if an existing HTTP server instance exists, +that is suitable for this. If so, it increments the reference count on it +and uses that. Otherwise, it will attempt to create a new server instance +with an initial reference count of one (1). + +The server instance is not started, and can have additional configuration +applied to it before it is later started with +<<nng_http_server_start#,nng_http_server_start(3)>>. + +NOTE: The URL matching logic in determining servers is unable to distinguish +between different aliases for the same local IP address. This may create +problems when using URLs for virtual hosting. It is recommended to use +canonical IP addresses or names in the _url_ to avoid confusion. + +== RETURN VALUES + +This function returns 0 on success, and non-zero otherwise. + +== ERRORS + +`NNG_ENOMEM`:: Insufficient free memory exists. +`NNG_ENOTSUP`:: HTTP not supported. + +== SEE ALSO + +<<nng_http_server_add_handler#,nng_http_server_add_handler(3)>>, +<<nng_http_server_release#,nng_http_server_release(3)>>, +<<nng_http_server_stop#,nng_http_server_stop(3)>>, +<<nng_url_parse#,nng_url_parse(3)>> +<<nng_strerror#,nng_strerror(3)>>, +<<nng#,nng(7)>> diff --git a/docs/man/nng_http_server_release.adoc b/docs/man/nng_http_server_release.adoc new file mode 100644 index 00000000..16c28227 --- /dev/null +++ b/docs/man/nng_http_server_release.adoc @@ -0,0 +1,53 @@ += nng_http_server_release(3) +// +// Copyright 2018 Staysail Systems, Inc. <info@staysail.tech> +// Copyright 2018 Capitar IT Group BV <info@capitar.com> +// +// This document is supplied under the terms of the MIT License, a +// copy of which should be located in the distribution where this +// file was obtained (LICENSE.txt). A copy of the license may also be +// found online at https://opensource.org/licenses/MIT. +// + +== NAME + +nng_http_server_release - release HTTP server instance + +== SYNOPSIS + +[source, c] +----------- +#include <nng/nng.h> +#include <nng/supplemental/http/http.h> + +void nng_http_server_release(nng_http_server *server); +----------- + +== DESCRIPTION + +The `nng_http_server_release()` releases an instance of an HTTP _server_ +that was previously held with +<<nng_http_server_hold#,nng_http_server_hold(3)>>. + +This effectively drops the reference count on the server instance. When +the reference count drops to zero, then the _server_ and all resources +associated with it (e.g. HTTP handlers, connections, etc.) are deallocated. +(If the server is "running" when this occurs, then the server is stopped.) + +WARNING: It is an error to release an instance of a server that has +not previously been held, or to attempt to release an instance more +times than it has been held. + +== RETURN VALUES + +None. + +== ERRORS + +None. + +== SEE ALSO + +<<nng_http_server_hold#,nng_http_server_hold(3)>>, +<<nng_http_server_stop#,nng_http_server_stop(3)>>, +<<nng#,nng(7)>> diff --git a/docs/man/nng_http_server_set_tls.adoc b/docs/man/nng_http_server_set_tls.adoc new file mode 100644 index 00000000..50039e49 --- /dev/null +++ b/docs/man/nng_http_server_set_tls.adoc @@ -0,0 +1,60 @@ += nng_http_server_set_tls(3) +// +// Copyright 2018 Staysail Systems, Inc. <info@staysail.tech> +// Copyright 2018 Capitar IT Group BV <info@capitar.com> +// +// This document is supplied under the terms of the MIT License, a +// copy of which should be located in the distribution where this +// file was obtained (LICENSE.txt). A copy of the license may also be +// found online at https://opensource.org/licenses/MIT. +// + +== NAME + +nng_http_server_set_tls - set HTTP server TLS configuration + +== SYNOPSIS + +[source, c] +----------- +#include <nng/nng.h> +#include <nng/supplemental/http/http.h> + +int nng_http_server_set_tls(nng_http_server *s, nng_tls_config *cfg); +----------- + +== DESCRIPTION + +The `nng_http_server_set_tls()` sets the TLS configuration of server _s_ to +_cfg_. + +This change overwrites any previous TLS configuration. + +WARNING: This also invalidates any previously obtained values from +<<nng_http_server_get_tls#,nng_http_server_get_tls(3)>>. + +If the server is already running (i.e. it has been started with +<<nng_http_server_start#,nng_http_server_start(3)>>) then this will +fail with `NNG_EBUSY`. + +TIP: Generally, the _cfg_ must have a configured private key, set with +<<nng_tls_config_own_cert#,nng_tls_config_own_cert(3)>> or similar. + +== RETURN VALUES + +This function returns 0 on success, and non-zero otherwise. + +== ERRORS + +`NNG_EBUSY`:: Server instance is running. +`NNG_ENOMEM`:: Insufficient free memory exists. +`NNG_ENOTSUP`:: Either HTTP or TLS not supported. + +== SEE ALSO + +<<nng_http_server_get_tls#,nng_http_server_get_tls(3)>>, +<<nng_http_server_hold#,nng_http_server_hold(3)>>, +<<nng_http_server_start#,nng_http_server_start(3)>>, +<<nng_tls_config_alloc#,nng_tls_config_alloc(3)>>, +<<nng_strerror#,nng_strerror(3)>>, +<<nng#,nng(7)>> diff --git a/docs/man/nng_http_server_start.adoc b/docs/man/nng_http_server_start.adoc new file mode 100644 index 00000000..4b7b1a4f --- /dev/null +++ b/docs/man/nng_http_server_start.adoc @@ -0,0 +1,50 @@ += nng_http_server_start(3) +// +// Copyright 2018 Staysail Systems, Inc. <info@staysail.tech> +// Copyright 2018 Capitar IT Group BV <info@capitar.com> +// +// This document is supplied under the terms of the MIT License, a +// copy of which should be located in the distribution where this +// file was obtained (LICENSE.txt). A copy of the license may also be +// found online at https://opensource.org/licenses/MIT. +// + +== NAME + +nng_http_server_start - start HTTP server + +== SYNOPSIS + +[source, c] +----------- +#include <nng/nng.h> +#include <nng/supplemental/http/http.h> + +int nng_http_server_start(nng_http_server *server); +----------- + +== DESCRIPTION + +The `nng_http_server_start()` starts the HTTP server instance _server_. +This causes it to bind to the appropriate TCP port, and start accepting +connections and handling HTTP requests. + +== RETURN VALUES + +This function returns 0 on success, and non-zero otherwise. + +== ERRORS + +`NNG_EADDRINUSE`:: The TCP port is unavaialble. +`NNG_EADDRINVAL`:: The server is configured with an invalid address. +`NNG_ENOMEM`:: Insufficient free memory exists. +`NNG_ENOTSUP`:: HTTP not supported. + +== SEE ALSO + +<<nng_http_server_hold#,nng_http_server_hold(3)>>, +<<nng_http_server_release#,nng_http_server_release(3)>>, +<<nng_http_server_stop#,nng_http_server_stop(3)>>, +<<nng_url_parse#,nng_url_parse(3)>> +<<nng_strerror#,nng_strerror(3)>>, +<<nng#,nng(7)>> diff --git a/docs/man/nng_http_server_stop.adoc b/docs/man/nng_http_server_stop.adoc new file mode 100644 index 00000000..8b2e0884 --- /dev/null +++ b/docs/man/nng_http_server_stop.adoc @@ -0,0 +1,44 @@ += nng_http_server_stop(3) +// +// Copyright 2018 Staysail Systems, Inc. <info@staysail.tech> +// Copyright 2018 Capitar IT Group BV <info@capitar.com> +// +// This document is supplied under the terms of the MIT License, a +// copy of which should be located in the distribution where this +// file was obtained (LICENSE.txt). A copy of the license may also be +// found online at https://opensource.org/licenses/MIT. +// + +== NAME + +nng_http_server_stop - stop HTTP server + +== SYNOPSIS + +[source, c] +----------- +#include <nng/nng.h> +#include <nng/supplemental/http/http.h> + +void nng_http_server_stop(nng_http_server *server); +----------- + +== DESCRIPTION + +The `nng_http_server_stop()` stops the HTTP server instance _server_. +This will cause it to close any underlying TCP sockets, and to terminate +any HTTP connections associated with it. + +== RETURN VALUES + +None. + +== ERRORS + +None. + +== SEE ALSO + +<<nng_http_server_hold#,nng_http_server_hold(3)>>, +<<nng_http_server_start#,nng_http_server_start(3)>>, +<<nng#,nng(7)>> diff --git a/docs/man/nng_inproc.adoc b/docs/man/nng_inproc.adoc new file mode 100644 index 00000000..c0dc270d --- /dev/null +++ b/docs/man/nng_inproc.adoc @@ -0,0 +1,84 @@ += nng_inproc(7) +// +// Copyright 2018 Staysail Systems, Inc. <info@staysail.tech> +// Copyright 2018 Capitar IT Group BV <info@capitar.com> +// +// This document is supplied under the terms of the MIT License, a +// copy of which should be located in the distribution where this +// file was obtained (LICENSE.txt). A copy of the license may also be +// found online at https://opensource.org/licenses/MIT. +// + +== NAME + +nng_inproc - intra-process transport for nng + +== SYNOPSIS + +[source,c] +---------- +#include <nng/transport/inproc/inproc.h> + +int nng_inproc_register(void); +---------- + +== DESCRIPTION + +The _nng_inproc_ transport provides communication support between +_nng_ sockets within the same process. This may be used as an alternative +to slower transports when data must be moved within the same process. + +This transport tries hard to avoid copying data, and thus is very +light-weight. + +Registration +~~~~~~~~~~~~ + +The _inproc_ transport is generally built-in to the _nng_ core, so +no extra steps to use it should be necessary. + +=== URI Format + +This transport uses URIs using the scheme `inproc://`, followed by +an arbitrary string of text, terminated by a `NUL` byte. + +Multiple URIs can be used within the +same application, and they will not interfere with one another. + +Two applications may also use the same URI without interfering with each +other, and they will be unable to communicate with each other using +that URI. + +=== Socket Address + +When using an `nng_sockaddr` structure, the actual structure is of type +`struct nng_sockaddr_inproc`. This type has the following definition: + +[source,c] +-------- +#define NNG_AF_INPROC 1 <1> +#define NNG_MAXADDRLEN 128 + +typedef nng_sockaddr_inproc { + // <2> + uint16_t sa_family; // must be NNG_AF_INPROC + char sa_path[NNG_MAXADDRLEN]; // arbitrary "path" + // +} +-------- +<1> The values of these macros may change, so applications +should avoid depending upon their values and instead use them symbolically. +<2> Other members may be present, but only those listed here +are suitable for application use. + +The `sa_family` member will have the value `NNG_AF_INPROC`. +The `sa_path` member is an ASCIIZ string, and may contain any characters, +terminated by a `NUL` byte. + +=== Transport Options + +The _inproc_ transport has no special options. + +== SEE ALSO + +<<nng#,nng(7)>> diff --git a/docs/man/nng_ipc.adoc b/docs/man/nng_ipc.adoc new file mode 100644 index 00000000..e212cf0f --- /dev/null +++ b/docs/man/nng_ipc.adoc @@ -0,0 +1,83 @@ += nng_ipc(7) +// +// Copyright 2018 Staysail Systems, Inc. <info@staysail.tech> +// Copyright 2018 Capitar IT Group BV <info@capitar.com> +// +// This document is supplied under the terms of the MIT License, a +// copy of which should be located in the distribution where this +// file was obtained (LICENSE.txt). A copy of the license may also be +// found online at https://opensource.org/licenses/MIT. +// + +== NAME + +nng_ipc - IPC transport for nng + +== SYNOPSIS + +[source,c] +---------- +#include <nng/transport/ipc/ipc.h> + +int nng_ipc_register(void); +---------- + +== DESCRIPTION + +The _nng_ipc_ transport provides communication support between +_nng_ sockets within different processes on the same host. For POSIX +platforms, this is implemented using UNIX domain sockets. For Windows, +this is implemented using Windows Named Pipes. Other platforms may +have different implementation strategies. + +// We need to insert a reference to the nanomsg RFC. + +=== Registration + +The _ipc_ transport is generally built-in to the _nng_ core, so +no extra steps to use it should be necessary. + +=== URI Format + +This transport uses URIs using the scheme `ipc://`, followed by +a an absolute path name in the file system where the socket or named pipe +should be created. + +TIP: On Windows, all names are prefixed by `\.\pipe\` and do not +occupy the normal file system. On POSIX platforms, the path is +taken literally, and is relative to the root directory. + +=== Socket Address + +When using an `nng_sockaddr` structure, the actual structure is of type +`nng_sockaddr_ipc`. This is a `struct` type with the following definition: + +[source,c] +-------- +#define NNG_AF_IPC 2 <1> +#define NNG_MAXADDRLEN 128 + +typedef struct { + // ... <2> + uint16_t sa_family; // must be NNG_AF_IPC + char sa_path[NNG_MAXADDRLEN]; // arbitrary "path" + // ... +} nng_sockaddr_ipc; +-------- +<1> The values of these macros may change, so applications +should avoid depending upon their values and instead use them symbolically. +<2> Other members may be present, but only those listed here +are suitable for application use. + +The `sa_family` member will have the value `NNG_AF_IPC`. +The `sa_path` member is an ASCIIZ string, and may contain any legal +path name (platform-dependent), terminated by a `NUL` byte. + +=== Transport Options + +The _ipc_ transport has no special +options.footnote:[Options for security attributes and credentials are planned.] + +== SEE ALSO + +<<nng#,nng(7)>> diff --git a/docs/man/nng_listen.adoc b/docs/man/nng_listen.adoc new file mode 100644 index 00000000..4e403f3f --- /dev/null +++ b/docs/man/nng_listen.adoc @@ -0,0 +1,80 @@ += nng_listen(3) +// +// Copyright 2018 Staysail Systems, Inc. <info@staysail.tech> +// Copyright 2018 Capitar IT Group BV <info@capitar.com> +// +// This document is supplied under the terms of the MIT License, a +// copy of which should be located in the distribution where this +// file was obtained (LICENSE.txt). A copy of the license may also be +// found online at https://opensource.org/licenses/MIT. +// + +== NAME + +nng_listen - create and start listener + +== SYNOPSIS + +[source, c] +----------- +#include <nng/nng.h> + +int nng_listen(nng_socket s, const char *url, nng_listener *lp, int flags); +----------- + +== DESCRIPTION + +The `nng_listener()` function creates a newly initialized +listener, associated with socket _s_, and configured to listen at the +address specified by _url_. If the value of _lp_ is not `NULL`, then +the newly created listener is stored at the address indicated by _lp_. + +Listeners are used to accept connections initiated by remote dialers. An +incoming connection generally results in a pipe being created and attached +to the socket _s_. Unlike dialers, listeners generally can create many +pipes, which may be open concurrently. + +TIP: While it is convenient to think of listeners as "servers", the relationship +between the listener or dialer is orthogonal to any server or client status +that might be associated with a given protocol. For example, a <<nng_req#,REQ>> +socket might have associated dialers, but might also have associated listeners. +It may even have some of each at the same time! + +Normally, the act of "binding" to the address indicated by _url_ is done +synchronously, including any necessary name resolution. As a result, +a failure, such as if the address is already in use, will be returned +immediately. However, if the special value `NNG_FLAG_NONBLOCK` is +supplied in _flags_, then this is done asynchronously; furthermore any +failure to bind will be periodically reattempted in the background. + +TIP: While `NNG_FLAG_NONBLOCK` can help an application be more resilient, +it also generally makes diagnosing failures somewhat more difficult. + +Because the listener is started immediately, it is generally not possible +to apply extra configuration; if that is needed applications should consider +using <<nng_listener_create#,nng_listener_create(3)>> and +<<nng_listener_start#,nng_listener_start(3)>> instead. + +The created listener will continue to accept new connections, associating +their pipes with the socket, until either it or the socket _s_ is closed. + +== RETURN VALUES + +This function returns 0 on success, and non-zero otherwise. + +== ERRORS + +`NNG_EADDRINUSE`:: The address specified by _url_ is already in use. +`NNG_EADDRINVAL`:: An invalid _url_ was specified. +`NNG_ECLOSED`:: The socket _s_ is not open. +`NNG_EINVAL`:: An invalid set of _flags_ was specified. +`NNG_ENOMEM`:: Insufficient memory is available. + +== SEE ALSO + +<<nng_dial#,nng_dial(3)>>, +<<nng_listener_close#,nng_listener_close(3)>>, +<<nng_listener_create#,nng_listener_create(3)>> +<<nng_listener_start#,nng_listener_start(3)>>, +<<nng_strerror#,nng_strerror(3)>>, +<<nng#,nng(7)>> diff --git a/docs/man/nng_listener_close.adoc b/docs/man/nng_listener_close.adoc new file mode 100644 index 00000000..396a354d --- /dev/null +++ b/docs/man/nng_listener_close.adoc @@ -0,0 +1,52 @@ += nng_listener_close(3) +// +// Copyright 2018 Staysail Systems, Inc. <info@staysail.tech> +// Copyright 2018 Capitar IT Group BV <info@capitar.com> +// +// This document is supplied under the terms of the MIT License, a +// copy of which should be located in the distribution where this +// file was obtained (LICENSE.txt). A copy of the license may also be +// found online at https://opensource.org/licenses/MIT. +// + +== NAME + +nng_listener_close - close listener + +== SYNOPSIS + +[source, c] +----------- +#include <nng/nng.h> + +int nng_listener_close(nng_listener l); +----------- + +== DESCRIPTION + +The `nng_listener_close()` function closes the listener _l_. +This also closes any pipes that have been created by the listener. + +Once this function returns, the listener _l_ and any of its resources +are deallocated. Therefore it is an error to attempt to access _l_ +after this function has returned. (Attempts to do so will result in +`NNG_ECLOSED` errors.) + +Listeners are implicitly closed when the socket they are associated with +is closed. + +== RETURN VALUES + +This function returns 0 on success, and non-zero otherwise. + +== ERRORS + +`NNG_ECLOSED`:: Parameter _l_ does not refer to an open listener. + +== SEE ALSO + +<<nng_close#,nng_close(3)>>, +<<nng_listen#,nng_listen(3)>>, +<<nng_listener_create#,nng_listener_create(3)>> +<<nng_strerror#,nng_strerror(3)>>, +<<nng#,nng(7)>> diff --git a/docs/man/nng_listener_create.adoc b/docs/man/nng_listener_create.adoc new file mode 100644 index 00000000..0ddcd685 --- /dev/null +++ b/docs/man/nng_listener_create.adoc @@ -0,0 +1,72 @@ += nng_listener_create(3) +// +// Copyright 2018 Staysail Systems, Inc. <info@staysail.tech> +// Copyright 2018 Capitar IT Group BV <info@capitar.com> +// +// This document is supplied under the terms of the MIT License, a +// copy of which should be located in the distribution where this +// file was obtained (LICENSE.txt). A copy of the license may also be +// found online at https://opensource.org/licenses/MIT. +// + +== NAME + +nng_listener_create - create listener + +== SYNOPSIS + +[source, c] +----------- +#include <nng/nng.h> + +int nng_listener_create(nng_listener *listenerp, nng_socket s, const char *url); +----------- + +== DESCRIPTION + +The `nng_listener_create()` function creates a newly initialized +listener, associated with socket _s_, and configured to listen at the +address specified by _url_, and stores a pointer to at the location +referenced by _listenerp_. + +Listeners are used to accept connections initiated by remote dialers. An +incoming connection generally results in a pipe being created and attached +to the socket _s_. Unlike dialers, listeners generally can create many +pipes, which may be open concurrently. + +TIP: While it is convenient to think of listeners as "servers", the relationship +between the listener or dialer is orthogonal to any server or client status +that might be associated with a given protocol. For example, a <<nng_req#,REQ>> +socket might have associated dialers, but might also have associated listeners. +It may even have some of each at the same time! + +The listener is not started, but may be further configured with +the <<nng_listener_setopt#,nng_listener_setopt(3)>> family of +functions. + +Once it is fully configured, the listener may be started using the +<<nng_listener_start#,nng_listener_start(3)>> function. + +TIP: If no specific configuration is required, consider using the +simpler <<nng_listen#,nng_listen(3)>> function instead. + +== RETURN VALUES + +This function returns 0 on success, and non-zero otherwise. + +== ERRORS + +`NNG_EADDRINVAL`:: An invalid _url_ was specified. +`NNG_ECLOSED`:: The socket _s_ is not open. +`NNG_ENOMEM`:: Insufficient memory is available. + +== SEE ALSO + +<<nng_dialer_create#,nng_dialer_create(3)>> +<<nng_listen#,nng_listen(3)>>, +<<nng_listener_close#,nng_listener_close(3)>>, +<<nng_listener_getopt#,nng_listener_getopt(3)>>, +<<nng_listener_setopt#,nng_listener_setopt(3)>>, +<<nng_listener_start#,nng_listener_start(3)>>, +<<nng_strerror#,nng_strerror(3)>>, +<<nng#,nng(7)>> diff --git a/docs/man/nng_listener_getopt.adoc b/docs/man/nng_listener_getopt.adoc new file mode 100644 index 00000000..1218feeb --- /dev/null +++ b/docs/man/nng_listener_getopt.adoc @@ -0,0 +1,106 @@ += nng_listener_getopt(3) +// +// Copyright 2018 Staysail Systems, Inc. <info@staysail.tech> +// Copyright 2018 Capitar IT Group BV <info@capitar.com> +// +// This document is supplied under the terms of the MIT License, a +// copy of which should be located in the distribution where this +// file was obtained (LICENSE.txt). A copy of the license may also be +// found online at https://opensource.org/licenses/MIT. +// + +== NAME + +nng_listener_getopt - get listener option + +== SYNOPSIS + +[source, c] +----------- +#include <nng/nng.h> + +int nng_listener_getopt(nng_listener l, const char *opt, void *val, + size_t *valszp); +int nng_listener_getopt_int(nng_listener l, const char *opt, int *ivalp); +int nng_listener_getopt_ms(nng_listener l, const char *opt, nng_duration *durp); +int nng_listener_getopt_ptr(nng_listener l, const char *opt, void **ptr); +int nng_listener_setopt_size(nng_listener l, const char *opt, size_t *zp); +int nng_listener_getopt_uint64(nng_listener l, const char *opt, uint64_t *u64p); +----------- + +== DESCRIPTION + +The `nng_listener_getopt()` functions are used to retrieve option values for +the listener _l_. The actual options that may be retrieved in this way +vary, and are documented in the <<nng_getopt#,nng_getopt(3)>> manual. +Additionally some transport-specific options are documented with the +transports themselves. + +In all of these forms, the option _opt_ is retrieved from the listener _l_. + +The details of the type, size, and semantics of the option will depend +on the actual option, and will be documented with the option itself. + +The first form of this function, `nng_listener_getopt()`, can be used to +retrieve the value of any option. It is untyped. The caller must store +a pointer to a buffer to receive the value in _val_, and the size of the +buffer shall be stored at the location referenced by _valszp_. + +When the function returns, the actual size of the data copied (or that +would have been copied if sufficient space were present) is stored at +the location referened by _valszp_. If the caller's buffer is not large +enough to hold the entire object, then the copy is truncated. Therefore +the caller should validate that the returned size in _valszp_ does not +exceed the original buffer size to check for truncation. + +It is acceptable to pass `NULL` for _val_ if the value in _valszp_ is zero. +This can be used to determine the size of the buffer needed to receive +the object. + +Generally, it will be easier to use one of the typed forms instead. Note +however that no validation that the option is actually of the associated +type is performed, so the caller must take care to use the *correct* typed +form. + +The second form, `nng_listener_getopt_int()`, +is for options which take an integer (or boolean). The value will +be stored at _ivalp_. For booleans the value will be eiher 0 (false) or 1 (true). + +The third form, `nng_listener_getopt_ms()`, is used to retrieve time durations +(such as timeouts), stored in _durp_ as a number of milliseconds. +(The special value `NNG_DUR_INFINITE` means an infinite amount of time, and +the special value `NNG_DUR_DEFAULT` means a context-specific default.) + +The fourth form, `nng_listener_getopt_ptr()`, is used to retrieve a +pointer _ptr_ to structured data. The data referenced by _ptr_ is +generally managed using other functions. +Note that this form is somewhat special in that the object is generally +not copied, but instead the *pointer* to the object is copied. + +The fifth form, `nng_listener_getopt_size()`, is used to retrieve a size +into the pointer _zp_, typically for buffer sizes, message maximum sizes, and +similar options. + +The sixth form, `nng_listener_getopt_uint64()`, is used to retrieve a +64-bit unsigned value into the value referenced by _u64p_. +This is typically used for options +related to identifiers, network numbers, and similar. + +== RETURN VALUES + +This function returns 0 on success, and non-zero otherwise. + +== ERRORS + +`NNG_ECLOSED`:: Parameter _l_ does not refer to an open listener. +`NNG_ENOTSUP`:: The option _opt_ is not supported. +`NNG_EWRITEONLY`:: The option _opt_ is write-only. + +== SEE ALSO + +<<nng_listen#,nng_listen(3)>>, +<<nng_listener_create#,nng_listener_create(3)>> +<<nng_listener_setopt#,nng_listener_setopt(3)>> +<<nng_getopt#,nng_getopt(3)>>, +<<nng_strerror#,nng_strerror(3)>>, +<<nng#,nng(7)>> diff --git a/docs/man/nng_listener_setopt.adoc b/docs/man/nng_listener_setopt.adoc new file mode 100644 index 00000000..c231070e --- /dev/null +++ b/docs/man/nng_listener_setopt.adoc @@ -0,0 +1,104 @@ += nng_listener_setopt(3) +// +// Copyright 2018 Staysail Systems, Inc. <info@staysail.tech> +// Copyright 2018 Capitar IT Group BV <info@capitar.com> +// +// This document is supplied under the terms of the MIT License, a +// copy of which should be located in the distribution where this +// file was obtained (LICENSE.txt). A copy of the license may also be +// found online at https://opensource.org/licenses/MIT. +// + +== NAME + +nng_listener_setopt - set listener option + +== SYNOPSIS + +[source, c] +----------- +#include <nng/nng.h> + +int nng_listener_setopt(nng_listener l, const char *opt, const void *val, + size_t valsz); +int nng_listener_setopt_int(nng_listener l, const char *opt, int ival); +int nng_listener_setopt_ms(nng_listener l, const char *opt, nng_duration dur); +int nng_listener_setopt_ptr(nng_listener l, const char *opt, void *ptr); +int nng_listener_setopt_size(nng_listener l, const char *opt, size_t z); +int nng_listener_setopt_string(nng_listener l, const char *opt, const char *str); +int nng_listener_setopt_uint64(nng_listener l, const char *opt, uint64_t u64); +----------- + +== DESCRIPTION + +The `nng_listener_setopt()` functions are used to configure options for +the listener _l_. The actual options that may be configured in this way +vary, and are documented in the <<nng_setopt#,nng_setopt(3)>> manual. +Additionally some transport-specific options are documented with the +transports themselves. + +In all of these forms, the option _opt_ is configured on the listener _l_. + +The details of the type, size, and semantics of the option will depend +on the actual option, and will be documented with the option itself. + +The first form of this function, `nng_listener_setopt()`, can be used to +configure any arbitrary data. +The _val_ pointer addresses the data to copy, and _valsz_ is the +size of the objected located at _val_. + +Generally, it will be easier to use one of the typed forms instead. + +The second form, `nng_listener_setopt_int()`, +is for options which take an integer (or boolean). The _ival_ +is passed to the option. For booleans pass either 0 (false) or 1 (true). + +The third form, `nng_listener_setopt_ms()`, is used to configure time durations +(such as timeouts). +The duration _dur_ is an integer number of milliseconds. (The special value +`NNG_DUR_INFINITE` means an infinite amount of time.) + +The fourth form, `nng_listener_setopt_ptr()`, is used to pass a +pointer _ptr_ to structured data. The data referenced by _ptr_ is +generally managed by other functions. +For example, TLS configuration objects +(<<nng_tls_config_alloc#,nng_tls_config_alloc(3)>>) can be passed this way. +Note that this form is somewhat special in that the object is generally +not copied, but instead the *pointer* to the object is copied. + +The fifth form, `nng_listener_setopt_size()`, is used to pass a size +specified by _z_, typically for buffer sizes, message maximum sizes, and +similar options. + +The sixth form, `nng_listener_setopt_string()`, is used to pass a string +_str_. Strings passed this way must be legal UTF-8 or ASCII strings, terminated +with a `NUL` (`\0`) byte. (Other constraints may apply as well, see the +documentation for _opt_ for details.) + +The seventh form, `nng_listener_setopt_uint64()`, is used to configure +the 64-bit unsigned value in _u64_. This is typically used for options +related to identifiers, network numbers, and similar. + +NOTE: Once a listener has started, it is generally not possible to change +it's configuration. + +== RETURN VALUES + +This function returns 0 on success, and non-zero otherwise. + +== ERRORS + +`NNG_ECLOSED`:: Parameter _l_ does not refer to an open listener. +`NNG_EINVAL`:: The value being passed is invalid. +`NNG_ENOTSUP`:: The option _opt_ is not supported. +`NNG_EREADONLY`:: The option _opt_ is read-only. +`NNG_ESTATE`:: The listener _l_ is already started. + +== SEE ALSO + +<<nng_listen#,nng_listen(3)>>, +<<nng_listener_create#,nng_listener_create(3)>> +<<nng_listener_getopt#,nng_listener_getopt(3)>> +<<nng_setopt#,nng_setopt(3)>>, +<<nng_strerror#,nng_strerror(3)>>, +<<nng#,nng(7)>> diff --git a/docs/man/nng_listener_start.adoc b/docs/man/nng_listener_start.adoc new file mode 100644 index 00000000..42175598 --- /dev/null +++ b/docs/man/nng_listener_start.adoc @@ -0,0 +1,61 @@ += nng_listener_start(3) +// +// Copyright 2018 Staysail Systems, Inc. <info@staysail.tech> +// Copyright 2018 Capitar IT Group BV <info@capitar.com> +// +// This document is supplied under the terms of the MIT License, a +// copy of which should be located in the distribution where this +// file was obtained (LICENSE.txt). A copy of the license may also be +// found online at https://opensource.org/licenses/MIT. +// + +== NAME + +nng_listener_start - start listener + +== SYNOPSIS + +[source, c] +----------- +#include <nng/nng.h> + +int nng_listener_start(nng_listener l, int flags); +----------- + +== DESCRIPTION + +The `nng_listener_start()` function starts the listener _l_. + +This causes the listener to bind to the address it was created with, +and to start accepting connections from remote +dialers. Each new connection results in a pipe, which will be attached +to the listener's socket. + +Normally, the act of "binding" to it's address is done +synchronously, including any necessary name resolution. As a result, +a failure, such as if the address is already in use, will be returned +immediately. However, if the special value `NNG_FLAG_NONBLOCK` is +supplied in _flags_, then this is done asynchronously; furthermore any +failure to bind will be periodically reattempted in the background. + +TIP: While `NNG_FLAG_NONBLOCK` can help an application be more resilient, +it also generally makes diagnosing failures somewhat more difficult. + +Once a listener has started, it is generally not possible to change +it's configuration. + +== RETURN VALUES + +This function returns 0 on success, and non-zero otherwise. + +== ERRORS + +`NNG_ECLOSED`:: Parameter _l_ does not refer to an open listener. +`NNG_ESTATE`:: The listener _l_ is already started. + +== SEE ALSO + +<<nng_listen#,nng_listen(3)>>, +<<nng_listener_create#,nng_listener_create(3)>> +<<nng_strerror#,nng_strerror(3)>>, +<<nng#,nng(7)>> diff --git a/docs/man/nng_msg_alloc.adoc b/docs/man/nng_msg_alloc.adoc new file mode 100644 index 00000000..40f31552 --- /dev/null +++ b/docs/man/nng_msg_alloc.adoc @@ -0,0 +1,50 @@ += nng_msg_alloc(3) +// +// Copyright 2018 Staysail Systems, Inc. <info@staysail.tech> +// Copyright 2018 Capitar IT Group BV <info@capitar.com> +// +// This document is supplied under the terms of the MIT License, a +// copy of which should be located in the distribution where this +// file was obtained (LICENSE.txt). A copy of the license may also be +// found online at https://opensource.org/licenses/MIT. +// + +== NAME + +nng_msg_alloc - allocate a message + +== SYNOPSIS + +[source, c] +----------- +#include <nng/nng.h> + +int nng_msg_alloc(nng_msg **msgp, size_t size); +----------- + +== DESCRIPTION + +The `nng_msg_alloc()` function allocates a new message with body length _size_ +and stores the result in __msgp__. +Messages allocated with this function contain a body and optionally a header. +They are used with receive and transmit functions. + +== RETURN VALUES + +This function returns 0 on success, and non-zero otherwise. + +== ERRORS + +`NNG_ENOMEM`:: Insufficient free memory exists to allocate a message. + +== SEE ALSO + +<<nng_msg_free#,nng_msg_free(3)>>, +<<nng_msg_body#,nng_msg_body(3)>>, +<<nng_msg_dup#,nng_msg_dup(3)>>, +<<nng_msg_header#,nng_msg_header(3)>>, +<<nng_msg_header_len#,nng_msg_header_len(3)>>, +<<nng_msg_len#,nng_msg_len(3)>>, +<<nng_msg_realloc#,nng_msg_realloc(3)>>, +<<nng_strerror#,nng_strerror(3)>>, +<<nng#,nng(7)>> diff --git a/docs/man/nng_msg_append.adoc b/docs/man/nng_msg_append.adoc new file mode 100644 index 00000000..6bdf689d --- /dev/null +++ b/docs/man/nng_msg_append.adoc @@ -0,0 +1,52 @@ += nng_msg_append(3) +// +// Copyright 2018 Staysail Systems, Inc. <info@staysail.tech> +// Copyright 2018 Capitar IT Group BV <info@capitar.com> +// +// This document is supplied under the terms of the MIT License, a +// copy of which should be located in the distribution where this +// file was obtained (LICENSE.txt). A copy of the license may also be +// found online at https://opensource.org/licenses/MIT. +// + +== NAME + +nng_msg_append, nng_msg_append_u32 - append to message body + +== SYNOPSIS + +[source, c] +----------- +#include <nng/nng.h> + +int nng_msg_append(nng_msg *msg, const void *val, size_t size); +int nng_msg_append_u32(nng_msg *msg, uint32_t val32); +----------- + +== DESCRIPTION + +The `nng_msg_append()` and `nng_msg_append_u32()` functions append data to +the end of the body of message _msg_, reallocating it if necessary. +The first function appends _size_ bytes, copying them from _val_. The +second function appends the value _val32_ in network-byte order (big-endian). + +== RETURN VALUES + +This function returns 0 on success, and non-zero otherwise. + +== ERRORS + +`NNG_ENOMEM`:: Insufficient free memory exists. + +== SEE ALSO + +<<nng_msg_alloc#,nng_msg_alloc(3)>>, +<<nng_msg_body#,nng_msg_body(3)>>, +<<nng_msg_chop#,nng_msg_chop(3)>>, +<<nng_msg_free#,nng_msg_free(3)>>, +<<nng_msg_insert#,nng_msg_insert(3)>>, +<<nng_msg_len#,nng_msg_len(3)>>, +<<nng_msg_realloc#,nng_msg_realloc(3)>>, +<<nng_msg_trim#,nng_msg_trim(3)>>, +<<nng_strerror#,nng_strerror(3)>>, +<<nng#,nng(7)>> diff --git a/docs/man/nng_msg_body.adoc b/docs/man/nng_msg_body.adoc new file mode 100644 index 00000000..507c0e0d --- /dev/null +++ b/docs/man/nng_msg_body.adoc @@ -0,0 +1,55 @@ += nng_msg_body(3) +// +// Copyright 2018 Staysail Systems, Inc. <info@staysail.tech> +// Copyright 2018 Capitar IT Group BV <info@capitar.com> +// +// This document is supplied under the terms of the MIT License, a +// copy of which should be located in the distribution where this +// file was obtained (LICENSE.txt). A copy of the license may also be +// found online at https://opensource.org/licenses/MIT. +// + +== NAME + +nng_msg_body - return message body + +== SYNOPSIS + +[source, c] +----------- +#include <nng/nng.h> + +void *nng_msg_body(nng_msg *msg); +----------- + +== DESCRIPTION + +The `nng_msg_body()` function returns a pointer to the start of the body +content of the message _msg_. + +NOTE: The value returned by this is invalidated by a call to any of the +functions that modify the message itself. Such functions are +<<nng_msg_free#,nng_msg_free(3)>>, <<nng_msg_realloc#,nng_msg_realloc(3)>>, +any of the <<nng_msg_trim#,nng_msg_trim(3)>>, +<<nng_msg_chop#,nng_msg_chop(3)>>, <<nng_msg_append#,nng_msg_append(3)>>, +or <<nng_msg_insert#,nng_msg_insert(3)>> variants. + +== RETURN VALUES + +Pointer to start of message body. + +== ERRORS + +None. + +== SEE ALSO + +<<nng_msg_alloc#,nng_msg_alloc(3)>>, +<<nng_msg_append#,nng_msg_append(3)>>, +<<nng_msg_chop#,nng_msg_chop(3)>>, +<<nng_msg_free#,nng_msg_free(3)>>, +<<nng_msg_insert#,nng_msg_insert(3)>>, +<<nng_msg_len#,nng_msg_len(3)>>, +<<nng_msg_realloc#,nng_msg_realloc(3)>>, +<<nng_msg_trim#,nng_msg_trim(3)>>, +<<nng#,nng(7)>> diff --git a/docs/man/nng_msg_chop.adoc b/docs/man/nng_msg_chop.adoc new file mode 100644 index 00000000..f2acff4b --- /dev/null +++ b/docs/man/nng_msg_chop.adoc @@ -0,0 +1,54 @@ += nng_msg_chop(3) +// +// Copyright 2018 Staysail Systems, Inc. <info@staysail.tech> +// Copyright 2018 Capitar IT Group BV <info@capitar.com> +// +// This document is supplied under the terms of the MIT License, a +// copy of which should be located in the distribution where this +// file was obtained (LICENSE.txt). A copy of the license may also be +// found online at https://opensource.org/licenses/MIT. +// + +== NAME + +nng_msg_chop, nng_msg_chop_u32 - remove data from end of message body + +== SYNOPSIS + +[source, c] +----------- +#include <nng/nng.h> + +int nng_msg_chop(nng_msg *msg, size_t size); +int nng_msg_chop_u32(nng_msg *msg, uint32_t *val32); +----------- + +== DESCRIPTION + +The `nng_msg_chop()` and `nng_msg_chop_u32()` functions remove data from +the end of the body of message _msg_. +The first function removes _size_ bytes. +The second function removes 4 bytes, and stores them in the value _val32_, +after converting them from network-byte order (big-endian) to native +byte order. + +== RETURN VALUES + +This function returns 0 on success, and non-zero otherwise. + +== ERRORS + +`NNG_EINVAL`:: The message body is too short to remove the requested data. + +== SEE ALSO + +<<nng_msg_alloc#,nng_msg_alloc(3)>>, +<<nng_msg_append#,nng_msg_append(3)>>, +<<nng_msg_body#,nng_msg_body(3)>>, +<<nng_msg_free#,nng_msg_free(3)>>, +<<nng_msg_insert#,nng_msg_insert(3)>>, +<<nng_msg_len#,nng_msg_len(3)>>, +<<nng_msg_realloc#,nng_msg_realloc(3)>>, +<<nng_msg_trim#,nng_msg_trim(3)>>, +<<nng_strerror#,nng_strerror(3)>>, +<<nng#,nng(7)>> diff --git a/docs/man/nng_msg_clear.adoc b/docs/man/nng_msg_clear.adoc new file mode 100644 index 00000000..aa6e8e64 --- /dev/null +++ b/docs/man/nng_msg_clear.adoc @@ -0,0 +1,41 @@ += nng_msg_clear(3) +// +// Copyright 2018 Staysail Systems, Inc. <info@staysail.tech> +// Copyright 2018 Capitar IT Group BV <info@capitar.com> +// +// This document is supplied under the terms of the MIT License, a +// copy of which should be located in the distribution where this +// file was obtained (LICENSE.txt). A copy of the license may also be +// found online at https://opensource.org/licenses/MIT. +// + +== NAME + +nng_msg_clear - clear message body content + +== SYNOPSIS + +[source, c] +----------- +#include <nng/nng.h> + +void nng_msg_clear(nng_msg *msg); +----------- + +== DESCRIPTION + +The `nng_msg_clear()` function resets the body length of _msg_ to zero. + +== RETURN VALUES + +None. + +== ERRORS + +None. + +== SEE ALSO + +<<nng_msg_alloc#,nng_msg_alloc(3)>>, +<<nng_msg_free#,nng_msg_free(3)>>, +<<nng#,nng(7)>> diff --git a/docs/man/nng_msg_dup.adoc b/docs/man/nng_msg_dup.adoc new file mode 100644 index 00000000..426fba29 --- /dev/null +++ b/docs/man/nng_msg_dup.adoc @@ -0,0 +1,45 @@ += nng_msg_dup(3) +// +// Copyright 2018 Staysail Systems, Inc. <info@staysail.tech> +// Copyright 2018 Capitar IT Group BV <info@capitar.com> +// +// This document is supplied under the terms of the MIT License, a +// copy of which should be located in the distribution where this +// file was obtained (LICENSE.txt). A copy of the license may also be +// found online at https://opensource.org/licenses/MIT. +// + +== NAME + +nng_msg_dup - duplicate a message + +== SYNOPSIS + +[source, c] +----------- +#include <nng/nng.h> + +int nng_msg_dup(nng_msg **dup, nng_msg_t *orig); +----------- + +== DESCRIPTION + +The `nng_msg_dup()` makes a duplicate of the original message _orig_, and +saves the result in the location pointed by _dup_. The actual message +body and header content is copied, but the duplicate may contain a +different amount of unused space than the original message. + +== RETURN VALUES + +This function returns 0 on success, and non-zero otherwise. + +== ERRORS + +`NNG_ENOMEM`:: Insufficient free memory exists to duplicate a message. + +== SEE ALSO + +<<nng_msg_alloc#,nng_msg_alloc(3)>>, +<<nng_msg_free#,nng_msg_free(3)>>, +<<nng_strerror#,nng_strerror(3)>>, +<<nng#,nng(7)>> diff --git a/docs/man/nng_msg_free.adoc b/docs/man/nng_msg_free.adoc new file mode 100644 index 00000000..dd9c39c6 --- /dev/null +++ b/docs/man/nng_msg_free.adoc @@ -0,0 +1,41 @@ += nng_msg_free(3) +// +// Copyright 2018 Staysail Systems, Inc. <info@staysail.tech> +// Copyright 2018 Capitar IT Group BV <info@capitar.com> +// +// This document is supplied under the terms of the MIT License, a +// copy of which should be located in the distribution where this +// file was obtained (LICENSE.txt). A copy of the license may also be +// found online at https://opensource.org/licenses/MIT. +// + +== NAME + +nng_msg_free - free a message + +== SYNOPSIS + +[source, c] +----------- +#include <nng/nng.h> + +void nng_msg_free(nng_msg *msg); +----------- + +== DESCRIPTION + +The `nng_msg_free()` function deallocates the message _msg_ entirely. + +== RETURN VALUES + +None. + +== ERRORS + +None. + +== SEE ALSO + +<<nng_msg_alloc#,nng_msg_alloc(3)>>, +<<nng_msg_realloc#,nng_msg_realloc(3)>>, +<<nng#,nng(7)>> diff --git a/docs/man/nng_msg_header.adoc b/docs/man/nng_msg_header.adoc new file mode 100644 index 00000000..7d85db5e --- /dev/null +++ b/docs/man/nng_msg_header.adoc @@ -0,0 +1,56 @@ += nng_msg_header(3) +// +// Copyright 2018 Staysail Systems, Inc. <info@staysail.tech> +// Copyright 2018 Capitar IT Group BV <info@capitar.com> +// +// This document is supplied under the terms of the MIT License, a +// copy of which should be located in the distribution where this +// file was obtained (LICENSE.txt). A copy of the license may also be +// found online at https://opensource.org/licenses/MIT. +// + +== NAME + +nng_msg_header - return message header + +== SYNOPSIS + +[source, c] +----------- +#include <nng/nng.h> + +void *nng_msg_header(nng_msg *msg); +----------- + +== DESCRIPTION + +The `nng_msg_header()` function returns a pointer to the start of the header +content of the message _msg_. + +NOTE: The message header contains protocol-specific header content. Most +applications should not need to access this content, but it is available +for raw mode sockets (set with the `NNG_OPT_RAW` option -- see +<<nng_setopt#,nng_setopt(3)>> for more details.) + +NOTE: The value returned by this is invalidated by a call to any of the +functions that modify the message or the header content. + +== RETURN VALUES + +Pointer to start of message header. + +== ERRORS + +None. + +== SEE ALSO + +<<nng_msg_alloc#,nng_msg_alloc(3)>>, +<<nng_msg_body#,nng_msg_body(3)>>, +<<nng_msg_free#,nng_msg_free(3)>>, +<<nng_msg_header_append#,nng_msg_header_append(3)>>, +<<nng_msg_header_chop#,nng_msg_header_chop(3)>>, +<<nng_msg_header_insert#,nng_msg_header_insert(3)>> +<<nng_msg_header_len#,nng_msg_header_len(3)>>, +<<nng_msg_header_trim#,nng_msg_header_trim(3)>>, +<<nng#,nng(7)>> diff --git a/docs/man/nng_msg_header_append.adoc b/docs/man/nng_msg_header_append.adoc new file mode 100644 index 00000000..a21da6dc --- /dev/null +++ b/docs/man/nng_msg_header_append.adoc @@ -0,0 +1,53 @@ += nng_msg_header_append(3) +// +// Copyright 2018 Staysail Systems, Inc. <info@staysail.tech> +// Copyright 2018 Capitar IT Group BV <info@capitar.com> +// +// This document is supplied under the terms of the MIT License, a +// copy of which should be located in the distribution where this +// file was obtained (LICENSE.txt). A copy of the license may also be +// found online at https://opensource.org/licenses/MIT. +// + +== NAME + +nng_msg_header_append, nng_msg_header_append_u32 - append to message header + +== SYNOPSIS + +[source, c] +----------- +#include <nng/nng.h> + +int nng_msg_header_append(nng_msg *msg, const void *val, size_t size); +int nng_msg_header_append_u32(nng_msg *msg, uint32_t val32); +----------- + +== DESCRIPTION + +The `nng_msg_header_append()` and `nng_msg_header_append_u32()` +functions append data to +the end of the headers of message _msg_, reallocating it if necessary. +The first function appends _size_ bytes, copying them from _val_. The +second function appends the value _val32_ in network-byte order (big-endian). + + +== RETURN VALUES + +This function returns 0 on success, and non-zero otherwise. + +== ERRORS + +`NNG_ENOMEM`:: Insufficient free memory exists. + +== SEE ALSO + +<<nng_msg_alloc#,nng_msg_alloc(3)>>, +<<nng_msg_header#,nng_msg_header(3)>>, +<<nng_msg_header_chop#,nng_msg_header_chop(3)>>, +<<nng_msg_header_insert#,nng_msg_header_insert(3)>>, +<<nng_msg_header_len#,nng_msg_header_len(3)>>, +<<nng_msg_header_trim#,nng_msg_header_trim(3)>>, +<<nng_msg_free#,nng_msg_free(3)>>, +<<nng_strerror#,nng_strerror(3)>>, +<<nng#,nng(7)>> diff --git a/docs/man/nng_msg_header_chop.adoc b/docs/man/nng_msg_header_chop.adoc new file mode 100644 index 00000000..f9c9f547 --- /dev/null +++ b/docs/man/nng_msg_header_chop.adoc @@ -0,0 +1,53 @@ += nng_msg_header_chop(3) +// +// Copyright 2018 Staysail Systems, Inc. <info@staysail.tech> +// Copyright 2018 Capitar IT Group BV <info@capitar.com> +// +// This document is supplied under the terms of the MIT License, a +// copy of which should be located in the distribution where this +// file was obtained (LICENSE.txt). A copy of the license may also be +// found online at https://opensource.org/licenses/MIT. +// + +== NAME + +nng_msg_header_chop, nng_msg_header_chop_u32 - remove data from end of message header + +== SYNOPSIS + +[source, c] +----------- +#include <nng/nng.h> + +int nng_msg_header_chop(nng_msg *msg, size_t size); +int nng_msg_header_chop_u32(nng_msg *msg, uint32_t *val32); +----------- + +== DESCRIPTION + +The `nng_msg_header_chop()` and `nng_msg_header_chop_u32()` functions remove +data from the end of the header of message _msg_. +The first function removes _size_ bytes. +The second function removes 4 bytes, and stores them in the value _val32_, +after converting them from network-byte order (big-endian) to native +byte order. + +== RETURN VALUES + +This function returns 0 on success, and non-zero otherwise. + +== ERRORS + +`NNG_EINVAL`:: The message header is too short to remove the requested data. + +== SEE ALSO + +<<nng_msg_alloc#,nng_msg_alloc(3)>>, +<<nng_msg_header#,nng_msg_header(3)>>, +<<nng_msg_header_append#,nng_msg_header_append(3)>>, +<<nng_msg_header_insert#,nng_msg_header_insert(3)>>, +<<nng_msg_header_len#,nng_msg_header_len(3)>>, +<<nng_msg_header_trim#,nng_msg_header_trim(3)>>, +<<nng_msg_free#,nng_msg_free(3)>>, +<<nng_strerror#,nng_strerror(3)>>, +<<nng#,nng(7)>> diff --git a/docs/man/nng_msg_header_clear.adoc b/docs/man/nng_msg_header_clear.adoc new file mode 100644 index 00000000..03fbdccb --- /dev/null +++ b/docs/man/nng_msg_header_clear.adoc @@ -0,0 +1,41 @@ += nng_msg_header_clear(3) +// +// Copyright 2018 Staysail Systems, Inc. <info@staysail.tech> +// Copyright 2018 Capitar IT Group BV <info@capitar.com> +// +// This document is supplied under the terms of the MIT License, a +// copy of which should be located in the distribution where this +// file was obtained (LICENSE.txt). A copy of the license may also be +// found online at https://opensource.org/licenses/MIT. +// + +== NAME + +nng_msg_header_clear - clear message header + +== SYNOPSIS + +[source, c] +----------- +#include <nng/nng.h> + +void nng_msg_header_clear(nng_msg *msg); +----------- + +== DESCRIPTION + +The `nng_msg_clear()` function resets the header length of _msg_ to zero. + +== RETURN VALUES + +None. + +== ERRORS + +None. + +== SEE ALSO + +<<nng_msg_alloc#,nng_msg_alloc(3)>>, +<<nng_msg_free#,nng_msg_free(3)>>, +<<nng#,nng(7)>> diff --git a/docs/man/nng_msg_header_insert.adoc b/docs/man/nng_msg_header_insert.adoc new file mode 100644 index 00000000..4cc5016c --- /dev/null +++ b/docs/man/nng_msg_header_insert.adoc @@ -0,0 +1,53 @@ += nng_msg_header_insert(3) +// +// Copyright 2018 Staysail Systems, Inc. <info@staysail.tech> +// Copyright 2018 Capitar IT Group BV <info@capitar.com> +// +// This document is supplied under the terms of the MIT License, a +// copy of which should be located in the distribution where this +// file was obtained (LICENSE.txt). A copy of the license may also be +// found online at https://opensource.org/licenses/MIT. +// + +== NAME + +nng_msg_header_insert, nng_msg_header_insert_u32 - prepend to message header + +== SYNOPSIS + +[source, c] +----------- +#include <nng/nng.h> + +int nng_msg_header_insert(nng_msg *msg, const void *val, size_t size); +int nng_msg_header_insert_u32(nng_msg *msg, uint32_t val32); +----------- + +== DESCRIPTION + +The `nng_msg_header_insert()` and `nng_msg_header_insert_u32()` functions +prepend data to the front of the headers of message _msg_, reallocating +if necessary. +The first function prepends _size_ bytes, copying them from _val_. The +second function prepends the value _val32_ in network-byte order (big-endian). + +== RETURN VALUES + +This function returns 0 on success, and non-zero otherwise. + +== ERRORS + +`NNG_ENOMEM`:: Insufficient free memory exists. + +== SEE ALSO + +<<nng_msg_alloc#,nng_msg_alloc(3)>>, +<<nng_msg_header_append#,nng_msg_header_append(3)>>, +<<nng_msg_header_body#,nng_msg_header_body(3)>>, +<<nng_msg_header_chop#,nng_msg_header_chop(3)>>, +<<nng_msg_header_len#,nng_msg_header_len(3)>>, +<<nng_msg_header_trim#,nng_msg_header_trim(3)>>, +<<nng_msg_free#,nng_msg_free(3)>>, +<<nng_msg_realloc#,nng_msg_realloc(3)>>, +<<nng_strerror#,nng_strerror(3)>>, +<<nng#,nng(7)>> diff --git a/docs/man/nng_msg_header_len.adoc b/docs/man/nng_msg_header_len.adoc new file mode 100644 index 00000000..68dfbcff --- /dev/null +++ b/docs/man/nng_msg_header_len.adoc @@ -0,0 +1,41 @@ += nng_msg_header_len(3) +// +// Copyright 2018 Staysail Systems, Inc. <info@staysail.tech> +// Copyright 2018 Capitar IT Group BV <info@capitar.com> +// +// This document is supplied under the terms of the MIT License, a +// copy of which should be located in the distribution where this +// file was obtained (LICENSE.txt). A copy of the license may also be +// found online at https://opensource.org/licenses/MIT. +// + +== NAME + +nng_msg_header_len - return message header length + +== SYNOPSIS + +[source, c] +----------- +#include <nng/nng.h> + +size_t nng_msg_header_len(nng_msg *msg); +----------- + +== DESCRIPTION + +The `nng_msg_header_len()` returns the length of message header of _msg_. + +== RETURN VALUES + +Length of message header. + +== ERRORS + +None. + +== SEE ALSO + +<<nng_msg_alloc#,nng_msg_alloc(3)>>, +<<nng_msg_header#,nng_msg_header(3)>>, +<<nng#,nng(7)>> diff --git a/docs/man/nng_msg_header_trim.adoc b/docs/man/nng_msg_header_trim.adoc new file mode 100644 index 00000000..44496c13 --- /dev/null +++ b/docs/man/nng_msg_header_trim.adoc @@ -0,0 +1,53 @@ += nng_msg_header_trim(3) +// +// Copyright 2018 Staysail Systems, Inc. <info@staysail.tech> +// Copyright 2018 Capitar IT Group BV <info@capitar.com> +// +// This document is supplied under the terms of the MIT License, a +// copy of which should be located in the distribution where this +// file was obtained (LICENSE.txt). A copy of the license may also be +// found online at https://opensource.org/licenses/MIT. +// + +== NAME + +nng_msg_header_trim, nng_msg_header_trim_u32 - remove data from start of message header + +== SYNOPSIS + +[source, c] +----------- +#include <nng/nng.h> + +int nng_msg_header_trim(nng_msg *msg, size_t size); +int nng_msg_header_trim_u32(nng_msg *msg, uint32_t *val32); +----------- + +== DESCRIPTION + +The `nng_msg_header_trim()` and `nng_msg_header_trim_u32()` functions remove +data from the start of the header of message _msg_. +The first function removes _size_ bytes. +The second function removes 4 bytes, and stores them in the value _val32_, +after converting them from network-byte order (big-endian) to native +byte order. + +== RETURN VALUES + +This function returns 0 on success, and non-zero otherwise. + +== ERRORS + +`NNG_EINVAL`:: The message header is too short to remove the requested data. + +== SEE ALSO + +<<nng_msg_alloc#,nng_msg_alloc(3)>>, +<<nng_msg_header#,nng_msg_header(3)>>, +<<nng_msg_header_append#,nng_msg_header_append(3)>>, +<<nng_msg_header_chop#,nng_msg_header_chop(3)>>, +<<nng_msg_header_insert#,nng_msg_header_insert(3)>>, +<<nng_msg_header_len#,nng_msg_header_len(3)>>, +<<nng_msg_free#,nng_msg_free(3)>>, +<<nng_strerror#,nng_strerror(3)>>, +<<nng#,nng(7)>> diff --git a/docs/man/nng_msg_insert.adoc b/docs/man/nng_msg_insert.adoc new file mode 100644 index 00000000..2a1f6d12 --- /dev/null +++ b/docs/man/nng_msg_insert.adoc @@ -0,0 +1,57 @@ += nng_msg_insert(3) +// +// Copyright 2018 Staysail Systems, Inc. <info@staysail.tech> +// Copyright 2018 Capitar IT Group BV <info@capitar.com> +// +// This document is supplied under the terms of the MIT License, a +// copy of which should be located in the distribution where this +// file was obtained (LICENSE.txt). A copy of the license may also be +// found online at https://opensource.org/licenses/MIT. +// + +== NAME + +nng_msg_insert, nng_msg_insert_u32 - prepend to message body + +== SYNOPSIS + +[source, c] +----------- +#include <nng/nng.h> + +int nng_msg_insert(nng_msg *msg, const void *val, size_t size); +int nng_msg_insert(nng_msg *msg, uint32_t val32); +----------- + +== DESCRIPTION + +The `nng_msg_insert()` and `nng_msg_insert_u32()` functions prepend data to +the front of the body of message _msg_, reallocating it if necessary. +The first function prepends _size_ bytes, copying them from _val_. The +second function prepends the value _val32_ in network-byte order (big-endian). + +TIP: This function makes use of pre-allocated "headroom" in the message if +available, so it can often avoid performing any reallocation. Applications +should use this instead of reallocating and copying message content themselves, +in order to benefit from this capabilitiy. + +== RETURN VALUES + +This function returns 0 on success, and non-zero otherwise. + +== ERRORS + +`NNG_ENOMEM`:: Insufficient free memory exists. + +== SEE ALSO + +<<nng_msg_alloc#,nng_msg_alloc(3)>>, +<<nng_msg_append#,nng_msg_append(3)>>, +<<nng_msg_body#,nng_msg_body(3)>>, +<<nng_msg_chop#,nng_msg_chop(3)>>, +<<nng_msg_free#,nng_msg_free(3)>>, +<<nng_msg_len#,nng_msg_len(3)>>, +<<nng_msg_realloc#,nng_msg_realloc(3)>>, +<<nng_msg_trim#,nng_msg_trim(3)>>, +<<nng_strerror#,nng_strerror(3)>>, +<<nng#,nng(7)>> diff --git a/docs/man/nng_msg_len.adoc b/docs/man/nng_msg_len.adoc new file mode 100644 index 00000000..260be306 --- /dev/null +++ b/docs/man/nng_msg_len.adoc @@ -0,0 +1,41 @@ += nng_msg_len(3) +// +// Copyright 2018 Staysail Systems, Inc. <info@staysail.tech> +// Copyright 2018 Capitar IT Group BV <info@capitar.com> +// +// This document is supplied under the terms of the MIT License, a +// copy of which should be located in the distribution where this +// file was obtained (LICENSE.txt). A copy of the license may also be +// found online at https://opensource.org/licenses/MIT. +// + +== NAME + +nng_msg_len - return message body length + +== SYNOPSIS + +[source, c] +----------- +#include <nng/nng.h> + +size_t nng_msg_len(nng_msg *msg); +----------- + +== DESCRIPTION + +The `nng_msg_len()` returns the length of the body of message _msg_. + +== RETURN VALUES + +Length of message body. + +== ERRORS + +None. + +== SEE ALSO + +<<nng_msg_alloc#,nng_msg_alloc(3)>>, +<<nng_msg_body#,nng_msg_body(3)>>, +<<nng#,nng(7)>> diff --git a/docs/man/nng_msg_realloc.adoc b/docs/man/nng_msg_realloc.adoc new file mode 100644 index 00000000..47c9540b --- /dev/null +++ b/docs/man/nng_msg_realloc.adoc @@ -0,0 +1,61 @@ += nng_msg_alloc(3) +// +// Copyright 2018 Staysail Systems, Inc. <info@staysail.tech> +// Copyright 2018 Capitar IT Group BV <info@capitar.com> +// +// This document is supplied under the terms of the MIT License, a +// copy of which should be located in the distribution where this +// file was obtained (LICENSE.txt). A copy of the license may also be +// found online at https://opensource.org/licenses/MIT. +// + +== NAME + +nng_msg_alloc - allocate a message + +== SYNOPSIS + +[source, c] +----------- +#include <nng/nng.h> + +int nng_msg_realloc(nng_msg *msg, size_t size); +----------- + +== DESCRIPTION + +The `nng_msg_realloc()` function re-allocates a message so that it has +a body of length _size_. This message attempts to avoid extra allocations, +and will reuse the existing memory when possible. + +TIP: One way to further reduce message allocations is to allocate a message +larger than needed, then use this function or <<nng_msg_chop#,nng_msg_chop(3)>> +to reduce the message size to that actually needed. The extra space left +over will still be present in the message, so that when the message size +needs to grow due to this function or <<nng_msg_append#,nng_msg_append(3)>> +no actual memory allocations need to take place. + +NOTE: Pointers to message body and header content obtained prior to this +function must not be in use, as the underlying memory used for the message +may have changed, particularly if the message size is increasing. + +== RETURN VALUES + +This function returns 0 on success, and non-zero otherwise. + +== ERRORS + +`NNG_ENOMEM`:: Insufficient free memory exists to reallocate a message. + +== SEE ALSO + +<<nng_msg_alloc#,nng_msg_alloc(3)>>, +<<nng_msg_append#,nng_msg_append(3)>>, +<<nng_msg_body#,nng_msg_body(3)>>, +<<nng_msg_chop#,nng_msg_chop(3)>>, +<<nng_msg_free#,nng_msg_free(3)>>, +<<nng_msg_insert#,nng_msg_insert(3)>>, +<<nng_msg_len#,nng_msg_len(3)>>, +<<nng_msg_trim#,nng_msg_trim(3)>>, +<<nng_strerror#,nng_strerror(3)>>, +<<nng#,nng(7)>> diff --git a/docs/man/nng_msg_trim.adoc b/docs/man/nng_msg_trim.adoc new file mode 100644 index 00000000..ff6f8431 --- /dev/null +++ b/docs/man/nng_msg_trim.adoc @@ -0,0 +1,54 @@ += nng_msg_trim(3) +// +// Copyright 2018 Staysail Systems, Inc. <info@staysail.tech> +// Copyright 2018 Capitar IT Group BV <info@capitar.com> +// +// This document is supplied under the terms of the MIT License, a +// copy of which should be located in the distribution where this +// file was obtained (LICENSE.txt). A copy of the license may also be +// found online at https://opensource.org/licenses/MIT. +// + +== NAME + +nng_msg_trim, nng_msg_trim_u32 - remove data from start of message body + +== SYNOPSIS + +[source, c] +----------- +#include <nng/nng.h> + +int nng_msg_trim(nng_msg *msg, size_t size); +int nng_msg_trim_u32(nng_msg *msg, uint32_t *val32); +----------- + +== DESCRIPTION + +The `nng_msg_trim()` and `nng_msg_trim_u32()` functions remove data from +the start of the body of message _msg_. +The first function removes _size_ bytes. +The second function removes 4 bytes, and stores them in the value _val32_, +after converting them from network-byte order (big-endian) to native +byte order. + +== RETURN VALUES + +This function returns 0 on success, and non-zero otherwise. + +== ERRORS + +`NNG_EINVAL`:: The message body is too short to remove the requested data. + +== SEE ALSO + +<<nng_msg_alloc#,nng_msg_alloc(3)>>, +<<nng_msg_append#,nng_msg_append(3)>>, +<<nng_msg_body#,nng_msg_body(3)>>, +<<nng_msg_chop#,nng_msg_chop(3)>>, +<<nng_msg_free#,nng_msg_free(3)>>, +<<nng_msg_insert#,nng_msg_insert(3)>>, +<<nng_msg_len#,nng_msg_len(3)>>, +<<nng_msg_realloc#,nng_msg_realloc(3)>>, +<<nng_strerror#,nng_strerror(3)>>, +<<nng#,nng(7)>> diff --git a/docs/man/nng_pair.adoc b/docs/man/nng_pair.adoc new file mode 100644 index 00000000..b826f5fc --- /dev/null +++ b/docs/man/nng_pair.adoc @@ -0,0 +1,132 @@ += nng_pair(7) +// +// Copyright 2018 Staysail Systems, Inc. <info@staysail.tech> +// Copyright 2018 Capitar IT Group BV <info@capitar.com> +// +// This document is supplied under the terms of the MIT License, a +// copy of which should be located in the distribution where this +// file was obtained (LICENSE.txt). A copy of the license may also be +// found online at https://opensource.org/licenses/MIT. +// + +== NAME + +nng_pair - pair protocol + +== SYNOPSIS + +.Version 0 +[source,c] +---------- +#include <nng/protocol/pair0/pair.h> + +int nng_pair0_open(nng_socket *s); +---------- + +.Version 1 +[source,c] +---------- +#include <nng/protocol/pair1/pair.h> + +int nng_pair1_open(nng_socket *s); +---------- + +== DESCRIPTION + +The _nng_pair_ protocol implements a peer-to-peer pattern, where +relationships between peers are one-to-one. + +Version 1 of this protocol supports an optional _polyamorous_ mode where a +peer can maintain multiple partnerships. Using this mode requires +some additional sophistication in the application. + +=== Socket Operations + +The `nng_pair_open()` call creates a _pair_ socket. Normally, this +pattern will block when attempting to send a message, if no peer is +able to receive the message. + +NOTE: Even though this mode may appear to be "reliable", because back-pressure +prevents discarding messages most of the time, there are topologies involving +_devices_ (see <<nng_device#,nng_device(3)>>) or raw mode sockets where +messages may be discarded. Applications that require reliable delivery +semantics should consider using <<nng_req#,nng_req(7)>> sockets, or +implement their own acknowledgement layer on top of pair sockets. + +In order to avoid head-of-line blocking conditions, _polyamorous_ mode pair +sockets (version 1 only) discard messages if they are unable to deliver them +to a peer. + +=== Protocol Versions + +Version 0 is the legacy version of this protocol. It lacks any header +information, and is suitable when building simple one-to-one topologies. + +TIP: Use version 0 if you need to communicate with other implementations, +including the legacy https://github.com/nanomsg/nanomsg[nanomsg] library or +https://github.com/go-mangos/mangos[mangos]. + +Version 1 of the protocol offers improved protection against loops when +used with <<nng_device#,nng_device(3)>>. It also offers _polyamorous_ +mode for forming multiple partnerships on a single socket. + +NOTE: Version 1 of this protocol is considered experimental at this time. + +=== Polyamorous Mode + +Normally pair sockets are for one-to-one communication, and a given peer +will reject new connections if it already has an active connection to another +peer. + +In _polyamorous_ mode, which is only available with version 1, a socket can +support many one-to-one connections. In this mode, the application must +choose the remote peer to receive an ougoing message by setting the value +of the pipe ID on the outgoing message using +the <<nng_msg_set_pipe#,nng_msg_set_pipe(3)>> function. + +Most often the value of the outgoing pipe ID will be obtained from an incoming +message using the <<nng_msg_get_pipe#,nng_msg_get_pipe(3)>> function, +such as when replying to an incoming message. + +In order to prevent head-of-line blocking, if the peer on the given pipe +is not able to receive (or the pipe is no longer available, such as if the +peer has disconnected), then the message will be discarded with no notification +to the sender. + +=== Protocol Options + +The following protocol-specific options are available. + +`NNG_OPT_PAIR1_POLY`:: + + (Version 1 only). This option enables the use of _polyamorous_ mode. + The value is read-write, and takes an integer boolean value. The default + false value (0) indicates that legacy monogamous mode should be used. + +`NNG_OPT_MAXTTL`:: + + (Version 1 only). Maximum time-to-live. This option is an integer value + between 0 and 255, + inclusive, and is the maximum number of "hops" that a message may + pass through until it is discarded. The default value is 8. A value + of 0 may be used to disable the loop protection, allowing an infinite + number of hops. ++ +TIP: Each node along a forwarding path may have it's own value for the +maximum time-to-live, and performs its own checks before forwarding a message. +Therefore it is helpful if all nodes in the topology use the same value for +this option. + +=== Protocol Headers + +Version 0 of the pair protocol has no protocol-specific headers. + +Version 1 of the pair protocol uses a single 32-bit unsigned value. The +low-order (big-endian) byte of this value contains a "hop" count, and is +used in conjuction with the `NNG_OPT_MAXTTL` option to guard against +device forwarding loops. This value is initialized to 1, and incremented +each time the message is received by a new node. + +== SEE ALSO + +<<nng#,nng(7)>> diff --git a/docs/man/nng_pub.adoc b/docs/man/nng_pub.adoc new file mode 100644 index 00000000..a8acb2c1 --- /dev/null +++ b/docs/man/nng_pub.adoc @@ -0,0 +1,66 @@ += nng_pub(7) +// +// Copyright 2018 Staysail Systems, Inc. <info@staysail.tech> +// Copyright 2018 Capitar IT Group BV <info@capitar.com> +// +// This document is supplied under the terms of the MIT License, a +// copy of which should be located in the distribution where this +// file was obtained (LICENSE.txt). A copy of the license may also be +// found online at https://opensource.org/licenses/MIT. +// + +== NAME + +nng_pub - publisher protocol + +== SYNOPSIS + +[source,c] +---------- +#include <nng/protocol/pubsub0/pub.h> + +int nng_pub0_open(nng_socket *s); +---------- + +== DESCRIPTION + +The _nng_pub_ protocol is one half of a publisher/subscriber pattern. +In this pattern, a publisher sends data, which is broadcast to all +subscribers. The subscribing applications only see the data to which +they have subscribed. + +The _nng_pub_ protocol is the publisher side, and the +<<nng_sub#,nng_sub(7)>> protocol is the subscriber side. + +NOTE: In this implementation, the publisher delivers all messages to all +subscribers. The subscribers maintain their own subscriptions, and filter +them locally. Thus, this pattern should not be used in an attempt to +reduce bandwidth consumption. + +The topics that subscribers subscribe to is just the first part of +the message body. Applications should construct their messages +accordingly. + +=== Socket Operations + +The `nng_pub0_open()` call creates a publisher socket. This socket +may be used to send messages, but is unable to receive them. Attempts +to receive messages will result in `NNG_ENOTSUP`. + +=== Protocol Versions + +Only version 0 of this protocol is supported. (At the time of writing, +no other versions of this protocol have been defined.) + +=== Protocol Options + +The _nng_pub_ protocol has no protocol-specific options. + +=== Protocol Headers + +The _nng_pub_ protocol has no protocol-specific headers. + +== SEE ALSO + +<<nng#,nng(7)>>, +<<nng_sub#,nng_sub(7)>> diff --git a/docs/man/nng_pull.adoc b/docs/man/nng_pull.adoc new file mode 100644 index 00000000..f56afb5e --- /dev/null +++ b/docs/man/nng_pull.adoc @@ -0,0 +1,63 @@ += nng_pull(7) +// +// Copyright 2018 Staysail Systems, Inc. <info@staysail.tech> +// Copyright 2018 Capitar IT Group BV <info@capitar.com> +// +// This document is supplied under the terms of the MIT License, a +// copy of which should be located in the distribution where this +// file was obtained (LICENSE.txt). A copy of the license may also be +// found online at https://opensource.org/licenses/MIT. +// + +== NAME + +nng_pull - pull protocol + +== SYNOPSIS + +[source,c] +---------- +#include <nng/protocol/pipeline0/pull.h> + +int nng_pull0_open(nng_socket *s); +---------- + +== DESCRIPTION + +The _nng_pull_ protocol is one half of a pipeline pattern. The other half +is the <<nng_push#,nng_push(7)>> protocol. + +In the pipeline pattern, pushers distribute messages to pullers. +Each message sent +by a pusher will be sent to one of its peer pullers, +chosen in a round-robin fashion +from the set of connected peers available for receiving. +This property makes this pattern useful in load-balancing scenarios. + +=== Socket Operations + +The `nng_pull0_open()` call creates a puller socket. This socket +may be used to receive messages, but is unable to send them. Attempts +to send messages will result in `NNG_ENOTSUP`. + +When receiving messages, the _nng_pull_ protocol accepts messages as +they arrive from peers. If two peers both have a message ready, the +order in which messages are handled is undefined. + +=== Protocol Versions + +Only version 0 of this protocol is supported. (At the time of writing, +no other versions of this protocol have been defined.) + +=== Protocol Options + +The _nng_pull_ protocol has no protocol-specific options. + +=== Protocol Headers + +The _nng_pull_ protocol has no protocol-specific headers. + +== SEE ALSO + +<<nng#,nng(7)>>, +<<nng_push#,nng_push(7)>> diff --git a/docs/man/nng_push.adoc b/docs/man/nng_push.adoc new file mode 100644 index 00000000..42cc2dd5 --- /dev/null +++ b/docs/man/nng_push.adoc @@ -0,0 +1,71 @@ += nng_push(7) +// +// Copyright 2018 Staysail Systems, Inc. <info@staysail.tech> +// Copyright 2018 Capitar IT Group BV <info@capitar.com> +// +// This document is supplied under the terms of the MIT License, a +// copy of which should be located in the distribution where this +// file was obtained (LICENSE.txt). A copy of the license may also be +// found online at https://opensource.org/licenses/MIT. +// + +== NAME + +nng_push - push protocol + +== SYNOPSIS + +[source,c] +---------- +#include <nng/protocol/pipeline0/push.h> + +int nng_push0_open(nng_socket *s); +---------- + +== DESCRIPTION + +The _nng_push_ protocol is one half of a pipeline pattern. The +other side is the <<nng_pull#,nng_pull(7)>> protocol. + +In the pipeline pattern, pushers distribute messages to pullers. +Each message sent +by a pusher will be sent to one of its peer pullers, +chosen in a round-robin fashion +from the set of connected peers available for receiving. +This property makes this pattern useful in load-balancing scenarios. + +=== Socket Operations + +The `nng_push0_open()` call creates a pusher socket. This socket +may be used to send messages, but is unable to receive them. Attempts +to receive messages will result in `NNG_ENOTSUP`. + +Send operations will observe flow control (back-pressure), so that +only peers capable of accepting a message will be considered. If no +peer is available to receive a message, then the send operation will +wait until one is available, or the operation times out. + +NOTE: Although the pipeline protocol honors flow control, and attempts +to avoid dropping messages, no guarantee of delivery is made. Furthermore, +as there is no capability for message acknowledgement, applications that +need reliable delivery are encouraged to consider the +<<nng_req#,nng_req(7)>> protocol instead. + +=== Protocol Versions + +Only version 0 of this protocol is supported. (At the time of writing, +no other versions of this protocol have been defined.) + +=== Protocol Options + +The _nng_push_ protocol has no protocol-specific options. + +=== Protocol Headers + +The _nng_push_ protocol has no protocol-specific headers. + +== SEE ALSO + +<<nng#,nng(7)>>, +<<nng_pull#,nng_pull(7)>>, +<<nng_req#,nng_req(7)>> diff --git a/docs/man/nng_recv.adoc b/docs/man/nng_recv.adoc new file mode 100644 index 00000000..e12d0b53 --- /dev/null +++ b/docs/man/nng_recv.adoc @@ -0,0 +1,79 @@ += nng_recv(3) +// +// Copyright 2018 Staysail Systems, Inc. <info@staysail.tech> +// Copyright 2018 Capitar IT Group BV <info@capitar.com> +// +// This document is supplied under the terms of the MIT License, a +// copy of which should be located in the distribution where this +// file was obtained (LICENSE.txt). A copy of the license may also be +// found online at https://opensource.org/licenses/MIT. +// + +== NAME + +nng_recv - recv data + +== SYNOPSIS + +[source, c] +----------- +#include <nng/nng.h> + +int nng_recv(nng_socket s, void *data, size_t *sizep int flags); +----------- + +== DESCRIPTION + +The `nng_recv()` receives a message. + +If the special flag `NNG_FLAG_ALLOC` is not specified, then the caller must +set _data_ to a buffer to receive the message body content, and must store +the size of that buffer at the location pointed to by _sizep_. When the +function returns, if it is successful, the size at _sizep_ will be updated with +the actual message body length copied into _data_. + +If the special flag `NNG_FLAG_ALLOC` is present, then a "zero-copy" mode is +used. In this case the caller must set the value of _data_ to the location +of another pointer (of type `void *`), and the _sizep_ pointer must be set +to a location to receive the size of the message body. The function will then +allocate a message buffer (as if by <<nng_alloc#,nng_alloc(3)>>), fill it with +the message body, and store it at the address referenced by _data_, and update +the size referenced by _sizep_. When this flag is present, the caller assumes +responsibility for disposing of the received buffer either by the function +<<nng_free#,nng_free(3)>> or reusing the message for sending (with the same +size) via <<nng_send#,nng_send(3)>>. + +NOTE: The semantics of what receiving a message means vary from protocol to +protocol, so examination of the protocol documentation is encouraged. (For +example, with an <<nng_req#,nng_req(3)>> socket a message may only be received +after a request has been sent, and an <<nng_sub#,nng_sub(3)>> socket +may only receive messages corresponding to topics to which it has subscribed.) +Furthermore, some protocols may not support receiving data at all, such as +<<nng_pub#,nng_pub(3)>>. + +TIP: The `NNG_FLAG_ALLOC` flag can be used to reduce data copies, thereby +increasing performance, particularly if the buffer is reused to send +a response using the same flag. + +== RETURN VALUES + +This function returns 0 on success, and non-zero otherwise. + +== ERRORS + +`NNG_EAGAIN`:: The socket _s_ cannot accept data for sending. +`NNG_ECLOSED`:: The socket _s_ is not open. +`NNG_EINVAL`:: An invalid set of _flags_ was specified. +`NNG_EMSGSIZE`:: The received message did not fit in the size provided. +`NNG_ENOMEM`:: Insufficient memory is available. +`NNG_ENOTSUP`:: The protocol for socket _s_ does not support receiving. +`NNG_ESTATE`:: The socket _s_ cannot receive data in this state. + +== SEE ALSO + +<<nng_alloc#,nng_alloc(3)>>, +<<nng_free#,nng_free(3)>>, +<<nng_recvmsg#,nng_recvmsg(3)>>, +<<nng_send#,nng_send(3)>>, +<<nng_strerror#,nng_strerror(3)>>, +<<nng#,nng(7)>> diff --git a/docs/man/nng_rep.adoc b/docs/man/nng_rep.adoc new file mode 100644 index 00000000..dcc7e6fb --- /dev/null +++ b/docs/man/nng_rep.adoc @@ -0,0 +1,83 @@ += nng_rep(7) +// +// Copyright 2018 Staysail Systems, Inc. <info@staysail.tech> +// Copyright 2018 Capitar IT Group BV <info@capitar.com> +// +// This document is supplied under the terms of the MIT License, a +// copy of which should be located in the distribution where this +// file was obtained (LICENSE.txt). A copy of the license may also be +// found online at https://opensource.org/licenses/MIT. +// + +NAME +---- +nng_rep - reply protocol + +SYNOPSIS +-------- + +[source,c] +---------- +#include <nng/protocol/reqrep0/rep.h> + +int nng_rep0_open(nng_socket *s); +---------- + +DESCRIPTION +----------- + +The _nng_rep_ protocol is one half of a request/reply pattern. +In this pattern, a requester sends a message to one replier, who +is expected to reply. The request is resent if no reply arrives, +until a reply is received or the request times out. + +TIP: This protocol is useful in setting up RPC-like services. It +is also "reliable", in that a the requester will keep retrying until +a reply is received. + +The _nng_rep_ protocol is the replier side, and the +<<nng_req#,nng_req(7)>> protocol is the requester side. + +Socket Operations +~~~~~~~~~~~~~~~~~ + +The `nng_rep0_open()` call creates a requester socket. This socket +may be used to receive messages (requests), and then to send replies. Generally +a reply can only be sent after receiving a request. (Attempts to receive +a message will result in `NNG_ESTATE` if there is no outstanding request.) + +Attempts to send on a socket with no outstanding requests will result +in `NNG_ESTATE`. + +Raw mode sockets (set with `NNG_OPT_RAW`) ignore all these restrictions. + +Protocol Versions +~~~~~~~~~~~~~~~~~ + +Only version 0 of this protocol is supported. (At the time of writing, +no other versions of this protocol have been defined.) + +Protocol Options +~~~~~~~~~~~~~~~~ + +The following protocol-specific options are available. + +`NNG_OPT_MAXTTL`:: + + Maximum time-to-live. This option is an integer value + between 0 and 255, + inclusive, and is the maximum number of "hops" that a message may + pass through until it is discarded. The default value is 8. A value + of 0 may be used to disable the loop protection, allowing an infinite + number of hops. + +Protocol Headers +~~~~~~~~~~~~~~~~ + +The _nng_rep_ protocol uses a _backtrace_ in the header. This is +more fully documented in the <<nng_req#,nng_req(7)>> manual. + +SEE ALSO +-------- +<<nng#,nng(7)>>, +<<nng_req#,nng_req(7)>> diff --git a/docs/man/nng_req.adoc b/docs/man/nng_req.adoc new file mode 100644 index 00000000..550c90c4 --- /dev/null +++ b/docs/man/nng_req.adoc @@ -0,0 +1,136 @@ += nng_req(7) +// +// Copyright 2018 Staysail Systems, Inc. <info@staysail.tech> +// Copyright 2018 Capitar IT Group BV <info@capitar.com> +// +// This document is supplied under the terms of the MIT License, a +// copy of which should be located in the distribution where this +// file was obtained (LICENSE.txt). A copy of the license may also be +// found online at https://opensource.org/licenses/MIT. +// + +== NAME + +nng_req - request protocol + +== SYNOPSIS + +[source,c] +---------- +#include <nng/protocol/reqrep0/req.h> + +int nng_req0_open(nng_socket *s); +---------- + +== DESCRIPTION + +The _nng_req_ protocol is one half of a request/reply pattern. +In this pattern, a requester sends a message to one replier, who +is expected to reply. The request is resent if no reply arrives, +until a reply is received or the request times out. + +TIP: This protocol is useful in setting up RPC-like services. It +is also "reliable", in that a the requester will keep retrying until +a reply is received. + +NOTE: Because requests are resent, it is important that they be idempotent +to ensure predictable and repeatable behavior even in the face of duplicated +requests, which can occur (for example if a reply message is lost for +some reason.) + +The requester generally only has one outstanding request at a time unless +in "raw" mode (via `NNG_OPT_RAW`), and it will generally attempt to spread +work requests to different peer repliers. + +TIP: This property, when combined with a <<nng_device#,device>> can +help provide a degree of load-balancing. + +The _nng_req_ protocol is the requester side, and the +<<nng_rep#,nng_rep(7)>> protocol is the replier side. + +=== Socket Operations + +The `nng_req0_open()` call creates a requester socket. This socket +may be used to send messages (requests), and then to receive replies. Generally +a reply can only be received after sending a request. (Attempts to receive +a message will result in `NNG_ESTATE` if there is no outstanding request.) + +Requests may be canceled by sending a different request. This will +cause the requester to discard any reply from the earlier request, +but it will not stop a replier +from processing a request it has already received or terminate a request +that has already been placed on the wire. + +Attempts to receive on a socket with no outstanding requests will result +in `NNG_ESTATE`. + +Raw mode sockets (set with `NNG_OPT_RAW`) ignore all these restrictions. + +=== Protocol Versions + +Only version 0 of this protocol is supported. (At the time of writing, +no other versions of this protocol have been defined.) + +=== Protocol Options + +The following protocol-specific options are available. + +`NNG_OPT_REQ_RESENDTIME`:: + + This read/write option is a duration (32-bit unsigned integer) representing + a relative number of milliseconds. + When a new request is started, a timer of this duration is also started. + If no reply is received before this timer expires, then the request will + be resent. (Requests are also automatically resent if the peer to whom + the original request was sent disconnects, or if a peer becomes available + while the requester is waiting for an available peer.) + +`NNG_OPT_MAXTTL`:: + + Maximum time-to-live. This option is an integer value + between 0 and 255, + inclusive, and is the maximum number of "hops" that a message may + pass through until it is discarded. The default value is 8. A value + of 0 may be used to disable the loop protection, allowing an infinite + number of hops. + +=== Protocol Headers + +This protocol uses a _backtrace_ in the header. This +form uses a "stack" of 32-bit big-endian identifiers. There *must* be +at least one identifier, the __request ID__, which will be the last +element in the array, and *must* have the most significant bit set. + +There may be additional __peer ID__s preceeding the request ID. These +will be distinguishable from the request ID by having their most +significant bit clear. + +When a request message is received by a forwarding node (see +<<nng_device#,nng_device(3)>>), the forwarding node prepends a +32-bit peer ID (which *must* have the most significant bit clear), +which is the forwarder's way of identifying the directly connected +peer from which it received the message. (This peer ID, except for the +most significant bit, has meaning only to the forwarding node itself.) + +It may help to think of prepending a peer ID as "pushing" a peer ID onto the +front of the stack of headers for the message. (It will use the peer ID +it popped from the front to determine the next intermediate destination +for the reply.) + +When a reply message is created, it is created using the same headers +that the request contained. + +A forwarding node can "pop" the peer ID it originally pushed on the +message, stripping it from the front of the message as it does so. + +When the reply finally arrives back at the initiating requestor, it +should have only a single element in the message, which will be the +request ID it originally used for the request. + +// TODO: Insert reference to RFC. + +== SEE ALSO + +<<nng_device(3)#,nng_device(3)>>, +<<nng#,nng(7)>>, +<<nng_rep#,nng_rep(7)>> diff --git a/docs/man/nng_respondent.adoc b/docs/man/nng_respondent.adoc new file mode 100644 index 00000000..9cc6519e --- /dev/null +++ b/docs/man/nng_respondent.adoc @@ -0,0 +1,90 @@ += nng_respondent(7) +// +// Copyright 2018 Staysail Systems, Inc. <info@staysail.tech> +// Copyright 2018 Capitar IT Group BV <info@capitar.com> +// +// This document is supplied under the terms of the MIT License, a +// copy of which should be located in the distribution where this +// file was obtained (LICENSE.txt). A copy of the license may also be +// found online at https://opensource.org/licenses/MIT. +// + +== NAME + +nng_respondent - respondent protocol + +== SYNOPSIS + +[source,c] +---------- +#include <nng/protocol/survey0/respond.h> + +int nng_respondent0_open(nng_socket *s); +---------- + +== DESCRIPTION + +The _nng_respondent_ protocol is one half of a survey pattern. +In this pattern, a surveyor sends a survey, which is broadcast to all +peer respondents. The respondents then have a chance to reply (but after +not obliged to). The survey itself is a timed event, so that responses +received after the survey has finished are discarded. + +TIP: This protocol is useful in solving voting problems, such as leader +election in cluster configurations, as well as certain kinds of service +discovery problems. + +The _nng_respondent_ protocol is the respondent side, and the +<<nng_surveyor#,nng_surveyor(7)>> protocol is the surveyor side. + +=== Socket Operations + +The `nng_respondent0_open()` call creates a respondent socket. This socket +may be used to receive messages, and then to send replies. Generally +a reply can only be sent after receiving a survey, and generally the +reply will be sent to surveyor from whom the last survey was received. + +Respondents may discard a survey by simply not replying to it. + +Raw mode sockets (set with `NNG_OPT_RAW`) ignore all these restrictions. + +=== Protocol Versions + +Only version 0 of this protocol is supported. (At the time of writing, +no other versions of this protocol have been defined. An earlier and +incompatible version of the protocol was used in older pre-releases of +http://nanomsg.org[nanomsg], but was not released in any production +version.) + +=== Protocol Options + +The following protocol-specific options are available. + +`NNG_OPT_MAXTTL`:: + + Maximum time-to-live. This option is an integer value + between 0 and 255, + inclusive, and is the maximum number of "hops" that a message may + pass through until it is discarded. The default value is 8. A value + of 0 may be used to disable the loop protection, allowing an infinite + number of hops. + +=== Protocol Headers + +The _nng_respondent_ protocol uses a _backtrace_ in the header. This +form uses an array of 32-bit big-endian identifiers, where the first +element in the array +identifies the local peer identifier to which the message will next be sent. +This is a hop-by-hop header where each element in a path adds routing +information to the end when sending a survey, and when replying removes +elements to obtain the next hop information. The survey ID is at the +end of this header and is inserted into the header as its first element +by the originating surveyor. (Survey IDs are distinguished from hops by +having their high order bit set to one.) + +// TODO: Insert reference to RFC. + +== SEE ALSO + +<<nng#,nng(7)>>, +<<nng_surveyor#,nng_surveyor(7)>> diff --git a/docs/man/nng_send.adoc b/docs/man/nng_send.adoc new file mode 100644 index 00000000..53a87de3 --- /dev/null +++ b/docs/man/nng_send.adoc @@ -0,0 +1,94 @@ += nng_send(3) +// +// Copyright 2018 Staysail Systems, Inc. <info@staysail.tech> +// Copyright 2018 Capitar IT Group BV <info@capitar.com> +// +// This document is supplied under the terms of the MIT License, a +// copy of which should be located in the distribution where this +// file was obtained (LICENSE.txt). A copy of the license may also be +// found online at https://opensource.org/licenses/MIT. +// + +== NAME + +nng_send - send data + +== SYNOPSIS + +[source, c] +----------- +#include <nng/nng.h> + +int nng_send(nng_socket s, void *data, size_t size, int flags); +----------- + +== DESCRIPTION + +The `nng_send()` sends a message containing the _data_ of length _size_ +using the socket _s_. + +NOTE: The semantics of what sending a message means vary from protocol to +protocol, so examination of the protocol documentation is encouraged. (For +example, with an <<nng_pub#,nng_pub(3)>> socket the data is broadcast, so that +any peers who have a suitable subscription will be able to receive it using +<<nng_recv#,nng_recv(3)>> or a similar function.) Furthermore, some protocols +may not support sending data (such as <<nng_sub#,nng_sub(3)>>) or may +require other conditions. (For example, <<nng_rep#,nng_rep(3)>> sockets +cannot normally send data, which are responses to requests, until they have +first received a request.) + +The _flags_ may contain either of (or neither of) the following values: + +`NNG_FLAG_NONBLOCK`:: + The function returns immediately, regardless of whether + the socket is able to accept the data or not. If the socket is unable + to accept the data (such as if backpressure exists because the peers + are consuming messages too slowly, or no peer is present), then the + function will return with `NNG_EAGAIN`. If this flag is not specified, + then the function will block if such a condition exists. + +`NNG_FLAG_ALLOC`:: + The _data_ was allocated using <<nng_alloc#,nng_alloc(3)>>, or was obtained + from a call to <<nng_recv#,nng_recv(3)>> with the `NNG_FLAG_ALLOC` flag. + If this function returns success, then the _data_ is "owned" by the + function, and it will assume responsibility for calling + <<nng_free#,nng_free(3)>> when it is no longer needed. In the absence + of this flag, the _data_ is copied by the implementation before the + function returns to the caller. + +TIP: The `NNG_FLAG_ALLOC` flag can be used to reduce data copies, thereby +increasing performance. + +NOTE: Regardless of the presence or absence of `NNG_FLAG_NONBLOCK`, there may +be queues between the sender and the receiver. Furthermore, there is no +guarantee that the message has actually been delivered. Finally, with some +protocols, the semantic is implictly `NNG_FLAG_NONBLOCK`, such as with +<<nng_pub#,nng_pub(3)>> sockets, which are best-effort delivery only. + +WARNING: When using `NNG_FLAG_ALLOC`, it is important that the value of _size_ +match the actual allocated size of the data. Using an incorrect size results +in unspecified behavior, which may include heap corruption, program crashes, +or transdimensional mutation of the program's author. + +== RETURN VALUES + +This function returns 0 on success, and non-zero otherwise. + +== ERRORS + +`NNG_EAGAIN`:: The socket _s_ cannot accept data for sending. +`NNG_ECLOSED`:: The socket _s_ is not open. +`NNG_EINVAL`:: An invalid set of _flags_ was specified. +`NNG_EMSGSIZE`:: The value of _size_ is too large. +`NNG_ENOMEM`:: Insufficient memory is available. +`NNG_ENOTSUP`:: The protocol for socket _s_ does not support sending. +`NNG_ESTATE`:: The socket _s_ cannot send data in this state. + +== SEE ALSO + +<<nng_alloc#,nng_alloc(3)>>, +<<nng_free#,nng_free(3)>>, +<<nng_recv#,nng_recv(3)>>, +<<nng_sendmsg#,nng_sendmsg(3)>>, +<<nng_strerror#,nng_strerror(3)>>, +<<nng#,nng(7)>> diff --git a/docs/man/nng_strerror.adoc b/docs/man/nng_strerror.adoc new file mode 100644 index 00000000..c81a460f --- /dev/null +++ b/docs/man/nng_strerror.adoc @@ -0,0 +1,46 @@ += nng_strerror(3) +// +// Copyright 2018 Staysail Systems, Inc. <info@staysail.tech> +// Copyright 2018 Capitar IT Group BV <info@capitar.com> +// +// This document is supplied under the terms of the MIT License, a +// copy of which should be located in the distribution where this +// file was obtained (LICENSE.txt). A copy of the license may also be +// found online at https://opensource.org/licenses/MIT. +// + +== NAME + +nng_strerror - return an error description + +== SYNOPSIS + +[source, c] +----------- +#include <nng/nng.h> + +const char * nng_strerror(int err); +----------- + +== DESCRIPTION + +The `nng_strerror()` returns the human-readable description of the +given _nng_ error in `err`. + +NOTE: The returned error message is provided in US English, but in the +future locale-specific strings may be presented instead. + +NOTE: The specific strings associated with specific error messages are +subject to change. Therefore applications must not depend on the message, +but may use them verbatim when supplying information to end-users, such +as in diagnostic messages or log entries. + +== RETURN VALUES + +This function returns the human-readable error message, terminated +by a `NUL` byte. + +== SEE ALSO + +<<libnng#,libnng(3)>>, +<<nng#,nng(7)>> diff --git a/docs/man/nng_sub.adoc b/docs/man/nng_sub.adoc new file mode 100644 index 00000000..579e4cf0 --- /dev/null +++ b/docs/man/nng_sub.adoc @@ -0,0 +1,83 @@ += nng_sub(7) +// +// Copyright 2018 Staysail Systems, Inc. <info@staysail.tech> +// Copyright 2018 Capitar IT Group BV <info@capitar.com> +// +// This document is supplied under the terms of the MIT License, a +// copy of which should be located in the distribution where this +// file was obtained (LICENSE.txt). A copy of the license may also be +// found online at https://opensource.org/licenses/MIT. +// + +== NAME + +nng_sub - subscriber protocol + +== SYNOPSIS + +[source,c] +---------- +#include <nng/protocol/pubsub0/sub.h> + +int nng_sub0_open(nng_socket *s); +---------- + +== DESCRIPTION + +The _nng_sub_ protocol is one half of a publisher/subscriber pattern. +In this pattern, a publisher sends data, which is broadcast to all +subscribers. The subscribing applications only see the data to which +they have subscribed. + +The _nng_sub_ protocol is the subscriber side, and the +<<nng_pub#,nng_pub(7)>> protocol is the publisher side. + +NOTE: In this implementation, the publisher delivers all messages to all +subscribers. The subscribers maintain their own subscriptions, and filter +them locally. Thus, this pattern should not be used in an attempt to +reduce bandwidth consumption. + +The topics that subscribers subscribe to is just the first part of +the message body. Applications should construct their messages +accordingly. + +=== Socket Operations + +The `nng_sub0_open()` call creates a subscriber socket. This socket +may be used to receive messages, but is unable to send them. Attempts +to send messages will result in `NNG_ENOTSUP`. + +=== Protocol Versions + +Only version 0 of this protocol is supported. (At the time of writing, +no other versions of this protocol have been defined.) + +=== Protocol Options + +The following protocol-specific options are available. + +`NNG_OPT_SUB_SUBSCRIBE`:: + + This option registers a topic that the subscriber is interested in. + The option is write-only, and takes an array of bytes, of arbitrary size. + Each incoming message is checked against the list of subscribed topics. + If the body begins with the entire set of bytes in the topic, then the + message is accepted. If no topic matches, then the message is + discarded. ++ +TIP: To receive all messages, an empty topic (zero length) can be used. + +`NNG_OPT_SUB_UNSUBSCRIBE`:: + + This option, also read-only, removes a topic from the subscription list. + Note that if the topic was not previously subscribed to with + `NNG_OPT_SUB_SUBSCRIBE` then an `NNG_ENOENT` error will result. + +=== Protocol Headers + +The _nng_sub_ protocol has no protocol-specific headers. + +== SEE ALSO + +<<nng#,nng(7)>>, +<<nng_pub#,nng_pub(7)>> diff --git a/docs/man/nng_surveyor.adoc b/docs/man/nng_surveyor.adoc new file mode 100644 index 00000000..15937b27 --- /dev/null +++ b/docs/man/nng_surveyor.adoc @@ -0,0 +1,107 @@ += nng_surveyor(7) +// +// Copyright 2018 Staysail Systems, Inc. <info@staysail.tech> +// Copyright 2018 Capitar IT Group BV <info@capitar.com> +// +// This document is supplied under the terms of the MIT License, a +// copy of which should be located in the distribution where this +// file was obtained (LICENSE.txt). A copy of the license may also be +// found online at https://opensource.org/licenses/MIT. +// + +== NAME + +nng_surveyor - surveyor protocol + +== SYNOPSIS + +[source,c] +---------- +#include <nng/protocol/survey0/survey.h> + +int nng_surveyor0_open(nng_socket *s); +---------- + +== DESCRIPTION + +The _nng_surveyor_ protocol is one half of a survey pattern. +In this pattern, a surveyor sends a survey, which is broadcast to all +peer respondents. The respondents then have a chance to reply (but after +not obliged to). The survey itself is a timed event, so that responses +received after the survey has finished are discarded. + +TIP: This protocol is useful in solving voting problems, such as leader +election in cluster configurations, as well as certain kinds of service +discovery problems. + +The _nng_surveyor_ protocol is the surveyor side, and the +<<nng_respondent#,nng_respondent(7)>> protocol is the respondent side. + +=== Socket Operations + +The `nng_surveyor0_open()` call creates a respondent socket. This socket +may be used to send messages (surveys), and then to receive replies. Generally +a reply can only be received after sending a survey. Generally a surveyor +can expect to receive at most one reply from each responder. (Messages +can be duplicated in some topologies, so there is no guarantee of this.) + +Attempts to receive on a socket with no outstanding survey will result +in `NNG_ESTATE`. If the survey times out while the surveyor is waiting +for replies, then the result will be `NNG_ETIMEDOUT`. + +Only one survey can be outstanding at a time; sending another survey will +cancel the prior one, and any responses from respondents from the prior +survey that arrive after this will be discarded. + +Raw mode sockets (set with `NNG_OPT_RAW`) ignore all these restrictions. + +=== Protocol Versions + +Only version 0 of this protocol is supported. (At the time of writing, +no other versions of this protocol have been defined. An earlier and +incompatible version of the protocol was used in older pre-releases of +http://nanomsg.org[nanomsg], but was not released in any production +version.) + +=== Protocol Options + +The following protocol-specific options are available. + +`NNG_OPT_SURVEYOR_SURVEYTIME`:: + + This read/write option is a duration (32-bit unsigned integer) representing + a relative number of milliseconds that following surveys will last. + When a new survey is started, a timer of this duration is also started. + Any responses arriving this time will be discarded. Attempts to receive + after the timer expires with no other surveys started will result in + `NNG_ESTATE`. Attempts to receive when this timer expires will result in + `NNG_ETIMEDOUT`. + +`NNG_OPT_MAXTTL`:: + + Maximum time-to-live. This option is an integer value + between 0 and 255, + inclusive, and is the maximum number of "hops" that a message may + pass through until it is discarded. The default value is 8. A value + of 0 may be used to disable the loop protection, allowing an infinite + number of hops. + +=== Protocol Headers + +The _nng_surveyor_ protocol uses a _backtrace_ in the header. This +form uses an array of 32-bit big-endian identifiers, where the first +element in the array +identifies the local peer identifier to which the message will next be sent. +This is a hop-by-hop header where each element in a path adds routing +information to the end when sending a survey, and when replying removes +elements to obtain the next hop information. The survey ID is at the +end of this header and is inserted into the header as its first element +by the originating surveyor. (Survey IDs are distinguished from hops by +having their high order bit set to one.) + +// TODO: Insert reference to RFC. + +== SEE ALSO + +<<nng#,nng(7)>>, +<<nng_respondent#,nng_respondent(7)>> diff --git a/docs/man/nng_tcp.adoc b/docs/man/nng_tcp.adoc new file mode 100644 index 00000000..9a0c9897 --- /dev/null +++ b/docs/man/nng_tcp.adoc @@ -0,0 +1,115 @@ += nng_tcp(7) +// +// Copyright 2018 Staysail Systems, Inc. <info@staysail.tech> +// Copyright 2018 Capitar IT Group BV <info@capitar.com> +// +// This document is supplied under the terms of the MIT License, a +// copy of which should be located in the distribution where this +// file was obtained (LICENSE.txt). A copy of the license may also be +// found online at https://opensource.org/licenses/MIT. +// + +== NAME + +nng_tcp - TCP/IP transport for nng + +== SYNOPSIS + +[source,c] +---------- +#include <nng/transport/tcp/tcp.h> + +int nng_tcp_register(void); +---------- + +== DESCRIPTION + +The _nng_tcp_ transport provides communication support between +_nng_ sockets across a TCP/IP network. Both IPv4 and IPv6 +are supported when the underlying platform also supports it. + +// We need to insert a reference to the nanomsg RFC. + +=== Registration + +The _tcp_ transport is generally built-in to the _nng_ core, so +no extra steps to use it should be necessary. + +=== URI Format + +This transport uses URIs using the scheme `tcp://`, followed by +an IP address or hostname, followed by a colon and finally a +TCP port number. For example, to contact port 80 on the localhost +either of the following URIs could be used: `tcp://127.0.0.1:80` or +`tcp://localhost:80`. + +When specifying IPv6 addresses, the address must be enclosed in +square brackets (`[]`) to avoid confusion with the final colon +separating the port. + +For example, the same port 80 on the IPv6 loopback address ('::1') would +be specified as `tcp://[::1]:80`. + +NOTE: When using symbolic names, the name is resolved when the +name is first used. _nng_ won't become aware of changes in the +name resolution until restart, +usually.footnote:[This is a bug and will likely be fixed in the future.] + +The special value of 0 (`INADDR_ANY`) can be used for a listener +to indicate that it should listen on all interfaces on the host. +A short-hand for this form is to either omit the address, or specify +the asterisk (`*`) character. For example, the following three +URIs are all equivalent, and could be used to listen to port 9999 +on the host: + + 1. `tcp://0.0.0.0:9999` + 2. `tcp://*:9999` + 3. `tcp://:9999` + +The entire URI must be less than `NNG_MAXADDRLEN` bytes long. + +=== Socket Address + +When using an `nng_sockaddr` structure, the actual structure is either +of type `nng_sockaddr_in` (for IPv4) or `nng_sockaddr_in6` (for IPv6). +These are `struct` types with the following definitions: + +[source,c] +-------- +#define NNG_AF_INET 3 <1> +#define NNG_AF_INET6 4 +#define NNG_MAXADDRLEN 128 + +typedef struct { + // ... <2> + uint16_t sa_family; // must be NNG_AF_INET + uint16_t sa_port; // TCP port number + uint32_t sa_addr; + // ... +} nng_sockaddr_in; + +typedef struct { + // ... <2> + uint16_t sa_family; // must be NNG_AF_INET6 + uint16_t sa_port; // TCP port number + uint8_t sa_addr[16]; + // ... +} nng_sockaddr_in6; +-------- +<1> The values of these macros may change, so applications +should avoid depending upon their values and instead use them symbolically. +<2> Other members may be present, but only those listed here +are suitable for application use. + +The `sa_family` member will have the value `NNG_AF_INET` or `NNG_AF_INET6`. +The `sa_port` and `sa_addr` are the TCP port number and address, both in +network byte order (most significant byte is first). + +=== Transport Options + +The _tcp_ transport has no special +options.footnote:[Options for TCP keepalive, linger, and nodelay are planned.] + +== SEE ALSO + +<<nng#,nng(7)>> diff --git a/docs/man/nng_tls.adoc b/docs/man/nng_tls.adoc new file mode 100644 index 00000000..6ad4033f --- /dev/null +++ b/docs/man/nng_tls.adoc @@ -0,0 +1,180 @@ += nng_tls(7) +// +// Copyright 2018 Staysail Systems, Inc. <info@staysail.tech> +// Copyright 2018 Capitar IT Group BV <info@capitar.com> +// +// This document is supplied under the terms of the MIT License, a +// copy of which should be located in the distribution where this +// file was obtained (LICENSE.txt). A copy of the license may also be +// found online at https://opensource.org/licenses/MIT. +// + +== NAME + +nng_tls - TLS transport for nng + +== SYNOPSIS + +[source,c] +---------- +#include <nng/transport/tls/tls.h> + +int nng_tls_register(void); +---------- + +== DESCRIPTION + +The _nng_tls_ transport provides communication support between +_nng_ sockets across a TCP/IP network using +https://tools.ietf.org/html/rfc5246[TLS v1.2] on top of +https://tools.ietf.org/html/rfc793[TCP]. Both IPv4 and IPv6 +are supported when the underlying platform also supports it. + +The protocol details are documented in +http://nanomsg.org/rfcs/sp-tls-v1.html[TLS Mapping for Scalability Protocols]. + +=== Registration + +Depending upon how the library was built, it may be necessary to +register the transport by calling `nng_tls_register`. This function +returns zero on success, or an nng error value if the transport +cannot be initialized for any reason. + +=== Availability + +The _tls_ transport depends on the use of an external library. +As of this writing, https://tls.mbed.org/[mbed TLS] version 2.0 +or later is required. + +TIP: Applications may need to add this library (or libraries) to +their link line, particularly when using a statically built +_nng_ library. + +NOTE: The mbed TLS library uses different licensing terms than +_nng_ itself; as of this writing it is offered under either +https://opensource.org/licenses/Apache-2.0[Apache License 2.0] or +https://opensource.org/licenses/gpl-license[GNU GPL] terms. +You are responsible for understanding and adhering to the +license terms of any libraries you make use of. + +=== URI Format + +This transport uses URIs using the scheme `tls+tcp://`, followed by +an IP address or hostname, followed by a colon and finally a +TCP port number. For example, to contact port 4433 on the localhost +either of the following URIs could be used: `tls+tcp://127.0.0.1:4433` or +`tls+tcp://localhost:4433`. + +When specifying IPv6 addresses, the address must be enclosed in +square brackets (`[]`) to avoid confusion with the final colon +separating the port. + +For example, the same port 4433 on the IPv6 loopback address ('::1') would +be specified as `tls+tcp://[::1]:4433`. + +NOTE: When using symbolic names, the name is resolved when the +name is first used. _nng_ won't become aware of changes in the +name resolution until restart, +usually.footnote:[This is a bug and will likely be fixed in the future.] + +TIP: Certificate validation generally works when using names +rather than IP addresses. This transport automatically +uses the name supplied in the URL when validating the +certificate supplied by the server. + +The special value of 0 (`INADDR_ANY`) can be used for a listener +to indicate that it should listen on all interfaces on the host. +A short-hand for this form is to either omit the address, or specify +the asterisk (`*`) character. For example, the following three +URIs are all equivalent, and could be used to listen to port 9999 +on the host: + + 1. `tls+tcp://0.0.0.0:9999` + 2. `tls+tcp://*:9999` + 3. `tls+tcp://:9999` + +The entire URI must be less than `NNG_MAXADDRLEN` bytes long. + +=== Socket Address + +When using an `nng_sockaddr` structure, the actual structure is either +of type `nng_sockaddr_in` (for IPv4) or `nng_sockaddr_in6` (for IPv6). +These are `struct` types with the following definitions: + +[source,c] +-------- +#define NNG_AF_INET 3 <1> +#define NNG_AF_INET6 4 +#define NNG_MAXADDRLEN 128 + +typedef struct { + // ... <2> + uint16_t sa_family; // must be NNG_AF_INET + uint16_t sa_port; // TCP port number + uint32_t sa_addr; + // ... +} nng_sockaddr_in; + +typedef struct { + // ... <2> + uint16_t sa_family; // must be NNG_AF_INET6 + uint16_t sa_port; // TCP port number + uint8_t sa_addr[16]; + // ... +} nng_sockaddr_in6; +-------- +<1> The values of these macros may change, so applications +should avoid depending upon their values and instead use them symbolically. +<2> Other members may be present, but only those listed here +are suitable for application use. + +The `sa_family` member will have the value `NNG_AF_INET` or `NNG_AF_INET6`. +The `sa_port` and `sa_addr` are the TCP port number and address, both in +network byte order (most significant byte is first). + +=== Transport Options + +The following transport options are available. Note that +setting these must be done before the transport is started. + +`NNG_OPT_TLS_CONFIG`:: + +This option is used on an endpoint to access the underlying TLS +configuration object. The value is of type `nng_tls_config *`. + +TIP: Use this option when advanced TLS configuration is required. + +`NNG_OPT_TLS_CA_FILE`:: + +This is a write-only option used to load certificates associated +associated private key from a file. +See <<nng_tls_config_ca_file#,nng_tls_config_ca_file(3)>> for more +information. + +`NNG_OPT_TLS_CERT_KEY_FILE`:: + +This is a write-only option used to load the local certificate and +associated private key from a file. The private key used must be +unencrypted. (Use the `NNG_OPT_TLS_CONFIG` option to access the underlying +TLS configuration if more advanced configuration is needed.) +See <<nng_tls_config_own_cert#,nng_tls_config_own_cert(3)>> for more +information. + +`NNG_OPT_TLS_AUTH_MODE`:: + +This is a write-only option used to configure the authentication mode +used. It can take an integer with value `NNG_TLS_AUTH_MODE_NONE`, +`NNG_TLS_AUTH_MODE_REQUIRED`, or `NNG_TLS_AUTH_MODE_OPTIONAL`. See +<<nng_tls_config_auth_mode#,nng_tls_config_auth_mode(3)>> for more details. + +`NNG_OPT_TLS_VERIFIED`:: + +This is a read-only option which returns a boolean value (integer 0 or 1). +It will true (1) if the remote peer has been properly verified using TLS +authentication, or false (0) otherwise. This option may return incorrect +results if peer authentication is disabled with `NNG_TLS_AUTH_MODE_NONE`. + +== SEE ALSO + +<<nng#,nng(7)>>, +<<nng_tls_config_alloc#,nng_tls_config_alloc(3)>> diff --git a/docs/man/nng_tls_config_alloc.adoc b/docs/man/nng_tls_config_alloc.adoc new file mode 100644 index 00000000..e67982da --- /dev/null +++ b/docs/man/nng_tls_config_alloc.adoc @@ -0,0 +1,70 @@ += nng_tls_config_alloc(3) +// +// Copyright 2018 Staysail Systems, Inc. <info@staysail.tech> +// Copyright 2018 Capitar IT Group BV <info@capitar.com> +// +// This document is supplied under the terms of the MIT License, a +// copy of which should be located in the distribution where this +// file was obtained (LICENSE.txt). A copy of the license may also be +// found online at https://opensource.org/licenses/MIT. +// + +== NAME + +nng_tls_config_alloc - allocate TLS configuration object + +== SYNOPSIS + +[source, c] +----------- +#include <nng/nng.h> + +typedef enum nng_tls_mode { + NNG_TLS_MODE_CLIENT, + NNG_TLS_MODE_SERVER +} nng_tls_mode; + +int nng_tls_config_alloc(nni_tls_config **cfgp, nng_tls_mode mode); +----------- + +== DESCRIPTION + +The `nng_tls_config_alloc()` function creates a newly initialized +https://tools.ietf.org/html/rfc5246[Transport Layer Security]) +configuration object, and stores a pointer to it in the value pointed +to by _cfgp_. + +This object is initialized for use when acting as either a +client (`NNG_TLS_MODE_CLIENT`) or as a server (`NNG_TLS_MODE_SERVER`), +depending on the value of _mode_. + +A TLS object can be further modified by functions that set the security +keys used, peeer certificates, protocol policies, and so forth. + +A single TLS configuration object can be used with multiple TLS streams +or services. The underlying system uses reference counting to ensure +that object is not inadvertently freed while in use. + +Also note that a TLS configuration object becomes "read-only" after it +is first used with a service. After this points, attempts to apply +further changes to the configuration will result in `NNG_EBUSY`. + + +== RETURN VALUES + +This function returns 0 on success, and non-zero otherwise. + +== ERRORS + +`NNG_ENOMEM`:: Insufficient memory is available. +`NNG_EINVAL`:: An invalid _mode_ was specified. + +== SEE ALSO + +<<nng_strerror#,nng_strerror(3)>>, +<<nng_tls_config_auth_mode#,nng_tls_config_auth_mode(3)>>, +<<nng_tls_config_ca_chain#,nng_tls_config_ca_chain(3)>>, +<<nng_tls_config_own_cert#,nng_tls_config_own_cert(3)>>, +<<nng_tls_config_free#,nng_tls_config_free(3)>>, +<<nng_tls_config_server_name#,nng_tls_config_server_name(3)>>, +<<nng#,nng(7)>> diff --git a/docs/man/nng_tls_config_auth_mode.adoc b/docs/man/nng_tls_config_auth_mode.adoc new file mode 100644 index 00000000..1c0f70ec --- /dev/null +++ b/docs/man/nng_tls_config_auth_mode.adoc @@ -0,0 +1,70 @@ += nng_tls_config_auth_mode(3) +// +// Copyright 2018 Staysail Systems, Inc. <info@staysail.tech> +// Copyright 2018 Capitar IT Group BV <info@capitar.com> +// +// This document is supplied under the terms of the MIT License, a +// copy of which should be located in the distribution where this +// file was obtained (LICENSE.txt). A copy of the license may also be +// found online at https://opensource.org/licenses/MIT. +// + +== NAME + +nng_tls_config_auth_mode - configure authentication mode + +== SYNOPSIS + +[source, c] +----------- +#include <nng/nng.h> + +typedef enum nng_tls_auth_mode { + NNG_TLS_AUTH_MODE_NONE, + NNG_TLS_AUTH_MODE_OPTIONAL, + NNG_TLS_AUTH_MODE_REQUIRED +} nng_tls_auth_mode; + +int nng_tls_config_auth_mode(nni_tls_config *cfg, nng_tls_auth_mode mode); +----------- + +== DESCRIPTION + +The `nng_tls_config_auth_mode()` function configures the authentication mode +to be used for TLS sessions using this configuration object. + +The possible modes are: + +`NNG_TLS_AUTH_MODE_NONE`:: +No authentication of the TLS peer is performed. This is the default for +TLS servers, which most typically do not authenticate their clients. + +`NNG_TLS_AUTH_MODE_OPTIONAL`:: +If a certificate is presented by the peer, then it is validated. However, +if the peer does not present a valid certificate, then the sesssion is allowed +to proceed without authentication. + +`NNG_TLS_AUTH_MODE_REQUIRED`:: +A check is made to ensure that the peer has presented a valid certificate +used for the session. If the peer's certificate is invalid or missing, then +the session is refused. This is the default for clients. + +== RETURN VALUES + +This function returns 0 on success, and non-zero otherwise. + +== ERRORS + +`NNG_ENOMEM`:: Insufficient memory is available. +`NNG_EINVAL`:: An invalid _mode_ was specified. +`NNG_EBUSY`:: The configuration _cfg_ is already in use, and cannot be modified. + + +== SEE ALSO + +<<nng_strerror#,nng_strerror(3)>>, +<<nng_tls_config_alloc#,nng_tls_config_alloc(3)>>, +<<nng_tls_config_ca_chain#,nng_tls_config_ca_chain(3)>>, +<<nng_tls_config_ca_file#,nng_tls_config_ca_file(3)>>, +<<nng_tls_config_server_name#,nng_tls_config_server_name(3)>>, +<<nng#,nng(7)>> diff --git a/docs/man/nng_tls_config_ca_chain.adoc b/docs/man/nng_tls_config_ca_chain.adoc new file mode 100644 index 00000000..cac92b3c --- /dev/null +++ b/docs/man/nng_tls_config_ca_chain.adoc @@ -0,0 +1,62 @@ += nng_tls_config_ca_chain(3) +// +// Copyright 2018 Staysail Systems, Inc. <info@staysail.tech> +// Copyright 2018 Capitar IT Group BV <info@capitar.com> +// +// This document is supplied under the terms of the MIT License, a +// copy of which should be located in the distribution where this +// file was obtained (LICENSE.txt). A copy of the license may also be +// found online at https://opensource.org/licenses/MIT. +// + +== NAME + +nng_tls_config_ca_chain - configure certificate authority certificate chain + +== SYNOPSIS + +[source, c] +----------- +#include <nng/nng.h> + +int nng_tls_config_ca_cert(nni_tls_config *cfg, const char *chain, + const char *crl); +----------- + +== DESCRIPTION + +The `nng_tls_config_ca_chain()` function configures a certificate or +certificate chain to be used when validating peers using the configuration +_cfg_. + +NOTE: Certificates *must* be configured when using the authentication mode +`NNG_TLS_AUTH_MODE_REQUIRED`. + +TIP: This function may be called multiple times, to add additional chains +to a configuration, without affecting those added previously. + +The certificates located in _chain_ must be a zero-terminated C string in +https://tools.ietf.org/html/rfc7468[PEM] format. Multiple certificates may +appear concatenated together, with the leaf certificate listed first. +together. + +The _crl_ may be `NULL`, or may also be a C string containing a PEM format +certificate revocation list for the associated authority. + +== RETURN VALUES + +This function returns 0 on success, and non-zero otherwise. + +== ERRORS + +`NNG_ENOMEM`:: Insufficient memory is available. +`NNG_EBUSY`:: The configuration _cfg_ is already in use, and cannot be modified. +`NNG_EINVAL`:: An invalid _chain_ or _crl_ was supplied. + +== SEE ALSO + +<<nng_strerror#,nng_strerror(3)>>, +<<nng_tls_config_alloc#,nng_tls_config_alloc(3)>>, +<<nng_tls_config_auth_mode#,nng_tls_config_auth_mode(3)>>, +<<nng_tls_config_ca_file#,nng_tls_config_ca_file(3)>>, +<<nng#,nng(7)>> diff --git a/docs/man/nng_tls_config_ca_file.adoc b/docs/man/nng_tls_config_ca_file.adoc new file mode 100644 index 00000000..833c6747 --- /dev/null +++ b/docs/man/nng_tls_config_ca_file.adoc @@ -0,0 +1,59 @@ += nng_tls_config_ca_file(3) +// +// Copyright 2018 Staysail Systems, Inc. <info@staysail.tech> +// Copyright 2018 Capitar IT Group BV <info@capitar.com> +// +// This document is supplied under the terms of the MIT License, a +// copy of which should be located in the distribution where this +// file was obtained (LICENSE.txt). A copy of the license may also be +// found online at https://opensource.org/licenses/MIT. +// + +== NAME + +nng_tls_config_ca_file - load certificate authority from file + +== SYNOPSIS + +[source, c] +----------- +#include <nng/nng.h> + +int nng_tls_config_ca_file(nni_tls_config *cfg, const char *path); +----------- + +== DESCRIPTION + +The `nng_tls_config_ca_file()` function configures the certificate authority +certificate chain and optional revocation list by loading the certificates +(and revocation list if present) from a single named file. The file must +at least one X.509 certificate in https://tools.ietf.org/html/rfc7468[PEM] +format, and may contain multiple such certificates, as well as zero or +more PEM CRL objects. This information is used to validate certificates +that are presented by peers, when using the configuration _cfg_. + +NOTE: Certificates *must* be configured when using the authentication mode +`NNG_TLS_AUTH_MODE_REQUIRED`. + +TIP: This function may be called multiple times, to add additional chains +to a configuration, without affecting those added previously. + +== RETURN VALUES + +This function returns 0 on success, and non-zero otherwise. + +== ERRORS + +`NNG_ENOMEM`:: Insufficient memory is available. +`NNG_EBUSY`:: The configuration _cfg_ is already in use, and cannot be modified. +`NNG_EINVAL`:: The contents of _path_ are invalid or do not contain a valid PEM certificate. +`NNG_ENOENT`:: The file _path_ does not exist. +`NNG_EPERM`:: The file _path_ is not readable. + +== SEE ALSO + +<<nng_strerror#,nng_strerror(3)>>, +<<nng_tls_config_alloc#,nng_tls_config_alloc(3)>>, +<<nng_tls_config_auth_mode#,nng_tls_config_auth_mode(3)>>, +<<nng_tls_config_ca_chain#,nng_tls_config_ca_chain(3)>>, +<<nng#,nng(7)>> diff --git a/docs/man/nng_tls_config_cert_key_file.adoc b/docs/man/nng_tls_config_cert_key_file.adoc new file mode 100644 index 00000000..9e1424b6 --- /dev/null +++ b/docs/man/nng_tls_config_cert_key_file.adoc @@ -0,0 +1,63 @@ += nng_tls_config_cert_key_file(3) +// +// Copyright 2018 Staysail Systems, Inc. <info@staysail.tech> +// Copyright 2018 Capitar IT Group BV <info@capitar.com> +// +// This document is supplied under the terms of the MIT License, a +// copy of which should be located in the distribution where this +// file was obtained (LICENSE.txt). A copy of the license may also be +// found online at https://opensource.org/licenses/MIT. +// + +== NAME + +nng_tls_config_cert_key_file - load own certificate and key from file + +== SYNOPSIS + +[source, c] +----------- +#include <nng/nng.h> + +int nng_tls_config_cert_key_file(nni_tls_config *cfg, const char *path, + const char *pass); +----------- + +== DESCRIPTION + +The `nng_tls_config_cert_key_file()` function loads a certificate (or +certificate chain) and a private key from the file named by _path_. + +The file must contain both the https://tools.ietf.org/html/rfc7468[PEM] +encoded certificate and associated private key, which will be used when +establishing TLS sessions using _cfg_. It may contain additional certificates +leading to a validation chain, with the leaf certificate first. +There is no need to include the self-signed root, as the peer +will need to have that already in order to perform it's own validation. + +The private key may be encrypted with a password, in which can be supplied in +_pass_. The value `NULL` should be supplied for _pass_ if the key is not +encrypted. + +On servers, it is possible to call this function multiple times for the +same configuration. This can be useful for specifying different parameters +to be used for different cryptographic algorithms. + +== RETURN VALUES + +This function returns 0 on success, and non-zero otherwise. + +== ERRORS + +`NNG_ENOMEM`:: Insufficient memory is available. +`NNG_EBUSY`:: The configuration _cfg_ is already in use, and cannot be modified. +`NNG_EINVAL`:: The contents of _path_ are invalid. +`NNG_ENOENT`:: The file named by _path_ does not exist. +`NNG_EPERM`:: The file named by _path_ cannot be opened. + +== SEE ALSO + +<<nng_strerror#,nng_strerror(3)>>, +<<nng_tls_config_alloc#,nng_tls_config_alloc(3)>>, +<<nng_tls_config_own_cert#,nng_tls_config_own_cert(3)>>, +<<nng#,nng(7)>> diff --git a/docs/man/nng_tls_config_free.adoc b/docs/man/nng_tls_config_free.adoc new file mode 100644 index 00000000..c1233b0b --- /dev/null +++ b/docs/man/nng_tls_config_free.adoc @@ -0,0 +1,42 @@ += nng_tls_config_alloc(3) +// +// Copyright 2018 Staysail Systems, Inc. <info@staysail.tech> +// Copyright 2018 Capitar IT Group BV <info@capitar.com> +// +// This document is supplied under the terms of the MIT License, a +// copy of which should be located in the distribution where this +// file was obtained (LICENSE.txt). A copy of the license may also be +// found online at https://opensource.org/licenses/MIT. +// + +== NAME + +nng_tls_config_free - deallocate a TLS configuration object + +== SYNOPSIS + +[source, c] +----------- +#include <nng/nng.h> + +void nng_tls_config_free(nni_tls_config *cfg); +----------- + +== DESCRIPTION + +The `nng_tls_config_free()` decrements the reference count on the +TLS configuration object pointed to by _cfg_, and if the resulting +reference count is zero, then deallocates the configuration object. + +== RETURN VALUES + +None. + +== ERRORS + +None. + +== SEE ALSO + +<<nng_tls_config_alloc#,nng_tls_config_alloc(3)>>, +<<nng#,nng(7)>> diff --git a/docs/man/nng_tls_config_own_cert.adoc b/docs/man/nng_tls_config_own_cert.adoc new file mode 100644 index 00000000..bd13fa92 --- /dev/null +++ b/docs/man/nng_tls_config_own_cert.adoc @@ -0,0 +1,62 @@ += nng_tls_config_own_cert(3) +// +// Copyright 2018 Staysail Systems, Inc. <info@staysail.tech> +// Copyright 2018 Capitar IT Group BV <info@capitar.com> +// +// This document is supplied under the terms of the MIT License, a +// copy of which should be located in the distribution where this +// file was obtained (LICENSE.txt). A copy of the license may also be +// found online at https://opensource.org/licenses/MIT. +// + +== NAME + +nng_tls_config_own_cert - configure own certificate and key + +== SYNOPSIS + +[source, c] +----------- +#include <nng/nng.h> + +int nng_tls_config_own_cert(nni_tls_config *cfg, const char *cert, + const char *key, const char *pass); +----------- + +== DESCRIPTION + +The `nng_tls_config_own_cert()` function configures a certificate _cert_ +identifying the local side of a TLS connection used with _cfg_, along with an +associated private or secret key _key_. The certificate may be +a chain, with the leaf signer first and the root at the end. The +self-signed certificate at the end can be omitted. (The client should already +have it, and will have to in order to validate this certificate anyway). + +The _key_ may be encrypted with a password, in which can be supplied in +_pass_. The value `NULL` should be supplied for _pass_ if the key is not +encrypted. + +On servers, it is possible to call this function multiple times for the +same configuration. This can be useful for specifying different parameters +to be used for different cryptographic algorithms. + +The certificate located in _cert_ and _key_ must be NUL (`\0`) terminated C +strings containing +https://tools.ietf.org/html/rfc7468[PEM] formatted material. + +== RETURN VALUES + +This function returns 0 on success, and non-zero otherwise. + +== ERRORS + +`NNG_ENOMEM`:: Insufficient memory is available. +`NNG_EBUSY`:: The configuration _cfg_ is already in use, and cannot be modified. +`NNG_EINVAL`:: An invalid _cert_ or _key_ was supplied. + +== SEE ALSO + +<<nng_strerror#,nng_strerror(3)>>, +<<nng_tls_config_alloc#,nng_tls_config_alloc(3)>>, +<<nng_tls_config_cert_key_file#,nng_tls_config_cert_key_file(3)>>, +<<nng#,nng(7)>> diff --git a/docs/man/nng_tls_config_server_name.adoc b/docs/man/nng_tls_config_server_name.adoc new file mode 100644 index 00000000..d533a809 --- /dev/null +++ b/docs/man/nng_tls_config_server_name.adoc @@ -0,0 +1,49 @@ += nng_tls_config_server_name(3) +// +// Copyright 2018 Staysail Systems, Inc. <info@staysail.tech> +// Copyright 2018 Capitar IT Group BV <info@capitar.com> +// +// This document is supplied under the terms of the MIT License, a +// copy of which should be located in the distribution where this +// file was obtained (LICENSE.txt). A copy of the license may also be +// found online at https://opensource.org/licenses/MIT. +// + +== NAME + +nng_tls_config_server_name - configure remote server name + +== SYNOPSIS + +[source, c] +----------- +#include <nng/nng.h> + +int nng_tls_config_server_name(nni_tls_config *cfg, const char *name); +----------- + +== DESCRIPTION + +The `nng_tls_config_server_name()` function configures the remote server name +to be used by a client when connection to a server. The supplied _name_ +is used when comparing the identity in the server's certificate. Furthermore, +when Server Name Indication (SNI) is used, the _name_ may be sent to the server +as a hint to tell it which of several possible certificates should be used. + +TIP: This function is only useful in configuring client behavior. + +== RETURN VALUES + +This function returns 0 on success, and non-zero otherwise. + +== ERRORS + +`NNG_ENOMEM`:: Insufficient memory is available. +`NNG_EBUSY`:: The configuration _cfg_ is already in use, and cannot be modified. + +== SEE ALSO + +<<nng_strerror#,nng_strerror(3)>>, +<<nng_tls_config_alloc#,nng_tls_config_alloc(3)>>, +<<nng_tls_config_auth_mode#,nng_tls_config_auth_mode(3)>>, +<<nng#,nng(7)>> diff --git a/docs/man/nng_url_clone.adoc b/docs/man/nng_url_clone.adoc new file mode 100644 index 00000000..4c005120 --- /dev/null +++ b/docs/man/nng_url_clone.adoc @@ -0,0 +1,44 @@ += nng_url_clone(3) +// +// Copyright 2018 Staysail Systems, Inc. <info@staysail.tech> +// Copyright 2018 Capitar IT Group BV <info@capitar.com> +// +// This document is supplied under the terms of the MIT License, a +// copy of which should be located in the distribution where this +// file was obtained (LICENSE.txt). A copy of the license may also be +// found online at https://opensource.org/licenses/MIT. +// + +== NAME + +nng_url_clone - clone URL structure + +== SYNOPSIS + +[source, c] +----------- +#include <nng/nng.h> + +int nng_url_clone(nng_url **dup, nng_url *orig); +----------- + +== DESCRIPTION + +The `nng_url_clone()` makes a clone of the original URL structure _orig_, and +saves the result in the location pointed by _dup_. This clone includes +fully duplicating each of the member fields. + +== RETURN VALUES + +This function returns 0 on success, and non-zero otherwise. + +== ERRORS + +`NNG_ENOMEM`:: Insufficient free memory exists to duplicate a message. + +== SEE ALSO + +<<nng_url_free#,nng_url_free(3)>>, +<<nng_url_parse#,nng_url_parse(3)>>, +<<nng_strerror#,nng_strerror(3)>>, +<<nng#,nng(7)>> diff --git a/docs/man/nng_url_free.adoc b/docs/man/nng_url_free.adoc new file mode 100644 index 00000000..427f6f48 --- /dev/null +++ b/docs/man/nng_url_free.adoc @@ -0,0 +1,42 @@ += nng_url_free(3) +// +// Copyright 2018 Staysail Systems, Inc. <info@staysail.tech> +// Copyright 2018 Capitar IT Group BV <info@capitar.com> +// +// This document is supplied under the terms of the MIT License, a +// copy of which should be located in the distribution where this +// file was obtained (LICENSE.txt). A copy of the license may also be +// found online at https://opensource.org/licenses/MIT. +// + +== NAME + +nng_url_free - free a URL structure + +== SYNOPSIS + +[source, c] +----------- +#include <nng/nng.h> + +void nng_url_free(nng_url *url); +----------- + +== DESCRIPTION + +The `nng_url_free()` function deallocates the _url_ entirely, including +any of it's members. + +== RETURN VALUES + +None. + +== ERRORS + +None. + +== SEE ALSO + +<<nng_url_clone#,nng_url_clone(3)>>, +<<nng_url_parse#,nng_url_parse(3)>>, +<<nng#,nng(7)>> diff --git a/docs/man/nng_url_parse.adoc b/docs/man/nng_url_parse.adoc new file mode 100644 index 00000000..c42d5c1c --- /dev/null +++ b/docs/man/nng_url_parse.adoc @@ -0,0 +1,94 @@ += nng_url_parse(3) +// +// Copyright 2018 Staysail Systems, Inc. <info@staysail.tech> +// Copyright 2018 Capitar IT Group BV <info@capitar.com> +// +// This document is supplied under the terms of the MIT License, a +// copy of which should be located in the distribution where this +// file was obtained (LICENSE.txt). A copy of the license may also be +// found online at https://opensource.org/licenses/MIT. +// + +== NAME + +nng_url_parse - create URL structure from a string + +== SYNOPSIS + +[source, c] +----------- +#include <nng/nng.h> + +int nng_url_parse(nng_url **urlp, const char *str); +----------- + +== DESCRIPTION + +The `nng_url_parse()` function parses the string _str_ containing an +https://tools.ietf.org/html/rfc3986[RFC 3986] compliant URL, and creates +a structure containing the results. A pointer to the resulting structure +is stored in _urlp_. + +The `nng_url` structure has at least the following members: + +[source, c] +---- +struct nng_url { + char *u_scheme; // Scheme, such as "http"; always lower case. + char *u_rawurl; // Unparsed URL, with minimal canonicalization. + char *u_userinfo; // Userinfo component, or NULL. + char *u_host; // Full host, including port if present. + char *u_hostname; // Hostname only (or address), or empy string. + char *u_port; // Port number, may be default or empty string. + char *u_path; // Path if present, empty string otherwise. + char *u_query; // Query info if present, NULL otherwise. + char *u_fragment; // Fragment if present, NULL otherwise. + char *u_requri; // Request-URI (path[?query][#fragment]) +}; +---- + +=== URL Canonicalization + +The `nng_url_parse()` function also canonicalizes the results, as +follows: + + 1. The URL is parsed into the various components. + 2. The `u_scheme`, `u_hostname`, `u_host`, and `u_port` members are + converted to lower case. + 3. Percent-encoded values for + https://tools.ietf.org/html/rfc3986#section-2.3[unreserved characters] + converted to their unencoded forms. + 4. Additionally URL percent-encoded values for characters in the path + and with numeric values larger than 127 (i.e. not ASCII) are decoded. + 5. The resulting `u_path` is checked for invalid UTF-8 sequences, consisting + of surrogate pairs, illegal byte sequences, or overlong encodings. + If this check fails, then the entire URL is considered invalid, and + the function returns `NNG_EINVAL`. + 6. Path segments consisting of `.` and `..` are resolved as per + https://tools.ietf.org/html/rfc3986#section-6.2.2.3[RFC 3986 6.2.2.3]. + 7. Further, empty path segments are removed, meaning that duplicate + slash (`/`) separators are removed from the path. + 8. If a port was not specified, but the scheme defines a default + port, then `u_port` will be filled in with the value of the default port. + +TIP: Only the `u_userinfo`, `u_query`, and `u_fragment` members will ever be + `NULL`. The other members will be filled in with either default values + or the empty string if they cannot be determined from _str_. + +== RETURN VALUES + +This function returns 0 on success, and non-zero otherwise. + + +== ERRORS + +`NNG_ENOMEM`:: Insufficient free memory exists to allocate a message. +`NNG_EINVAL`:: An invalid URL was supplied. + + +== SEE ALSO + +<<nng_url_clone#,nng_url_clone(3)>>, +<<nng_url_free#,nng_url_free(3)>>, +<<nng_strerror#,nng_strerror(3)>>, +<<nng#,nng(7)>> diff --git a/docs/man/nng_ws.adoc b/docs/man/nng_ws.adoc new file mode 100644 index 00000000..c41ccc1c --- /dev/null +++ b/docs/man/nng_ws.adoc @@ -0,0 +1,209 @@ += nng_ws(7) +// +// Copyright 2018 Staysail Systems, Inc. <info@staysail.tech> +// Copyright 2018 Capitar IT Group BV <info@capitar.com> +// +// This document is supplied under the terms of the MIT License, a +// copy of which should be located in the distribution where this +// file was obtained (LICENSE.txt). A copy of the license may also be +// found online at https://opensource.org/licenses/MIT. +// + +== NAME + +nng_ws - WebSocket transport for nng + +== SYNOPSIS + +[source,c] +---------- +#include <nng/transport/websocket/ws.h> + +int nng_ws_register(void); +int nng_wss_register(void); +---------- + +== DESCRIPTION + +The _nng_ws_ transport provides communication support between +_nng_ sockets across a TCP/IP network using +https://tools.ietf.org/html/rfc6455[WebSockets]. Both IPv4 and IPv6 +are supported when the underlying platform also supports it. + +The protocol details are documented in +http://nanomsg.org/rfcs/sp-websocket-v1.html[WebSocket Mapping for Scalability Protocols]. + +=== Registration + +Depending upon how the library was built, it may be necessary to +register the transport by calling `nng_ws_register`. This function +returns zero on success, or an nng error value if the transport +cannot be initialized for any reason. + +If TLS support is enabled in the library, secure WebSockets (over TLS v1.2) +can be used as well, but the secure transport may have to be registered using +the `nng_wss_register` function. (Note that this function will not be +present if TLS support was not enabled in the library.) + +=== URI Format + +This transport uses URIs using the scheme `ws://`, followed by +an IP address or hostname, optionally followed by a colon and an +TCP port number, optionally followed by a path. (If no port number +is specified then port 80 is assumed. If no path is specified then +a path of `/` is assumed.) +For example, the URI `ws://localhost/app/pubsub` would use +port 80 on localhost, with the path `/app/pubsub`. + +Secure WebSockets (if enabled) use the scheme `wss://`, and the default +TCP port number of 443. Otherwise the format is the same as for regular +WebSockets. + +When specifying IPv6 addresses, the address must be enclosed in +square brackets (`[]`) to avoid confusion with the final colon +separating the port. + +For example, the same path and port on the IPv6 loopback address (`::1`) +would be specified as `ws://[::1]/app/pubsub`. + +NOTE: When using symbolic names, the name is resolved when the +name is first used. _nng_ won't become aware of changes in the +name resolution until restart, +usually.footnote:[This is a bug and will likely be fixed in the future.] + +NOTE: The value specified as the host, if any, will also be used +in the `Host:` HTTP header during HTTP negotiation. + +To listen to all ports on the system, the host name may be elided from +the URL on the listener. This will wind up listening to all interfaces +on the system, with possible caveats for IPv4 and IPv6 depending on what +the underlying system supports. (On most modern systems it will map to the +special IPv6 address `::`, and both IPv4 and IPv6 connections will be +permitted, with IPv4 addresses mapped to IPv6 addresses.) + +=== Socket Address + +When using an `nng_sockaddr` structure, the actual structure is either +of type `nng_sockaddr_in` (for IPv4) or `nng_sockaddr_in6` (for IPv6). +These are `struct` types with the following definitions: + +[source,c] +-------- +#define NNG_AF_INET 3 <1> +#define NNG_AF_INET6 4 +#define NNG_MAXADDRLEN 128 + +typedef struct { + // ... <2> + uint16_t sa_family; // must be NNG_AF_INET + uint16_t sa_port; // TCP port number + uint32_t sa_addr; + // ... +} nng_sockaddr_in; + +typedef struct { + // ... <2> + uint16_t sa_family; // must be NNG_AF_INET6 + uint16_t sa_port; // TCP port number + uint8_t sa_addr[16]; + // ... +} nng_sockaddr_in6; +-------- +<1> The values of these macros may change, so applications +should avoid depending upon their values and instead use them symbolically. +<2> Other members may be present, but only those listed here +are suitable for application use. + +The `sa_family` member will have the value `NNG_AF_INET` or `NNG_AF_INET6`. +The `sa_port` and `sa_addr` are the TCP port number and address, both in +network byte order (most significant byte is first). + +=== Server Instances + +This transport makes use of shared HTTP server instances, permitting multiple +sockets or listeners to be configured with the same hostname and port. When +creating a new listener, it is registered with an existing HTTP server instance +if one can be found. Note that the matching algorithm is somewhat simple, +using only a string based hostname or IP address and port to match. Therefore +it is recommended to use only IP addresses or the empty string as the hostname +in listener URLs. + +Likewise, when sharing a server instance, it may not be possible to alter +TLS configuration if the server is already running, as there is only a single +TLS configuration context for the entire server instance. + +All sharing of server instances is only typically possible within the same +process. + +The server may also be used by other things (for example to serve static +content), in the same process. + +=== Transport Options + +The following transport options are available. Note that +setting these must be done before the transport is started. + +NOTE: The TLS specific options (beginning with `NNG_OPT_TLS_`) are +only available for `wss://` endpoints. + +`NNG_OPT_WS_REQUEST_HEADERS`:: + +This value is a string, consisting of multiple lines terminated +by CRLF sequences, that can be used to add further headers to the +HTTP request sent when connecting. This option can be set on dialers, +and retrieved from pipes. + +`NNG_OPT_WS_RESPONSE_HEADERS`:: + +This value is a string, consisting of multiple lines terminated +by CRLF sequences, that can be used to add furthe headers to the +HTTP response sent when connecting. This option can be set on listeners, +and retrieved from pipes. + +`NNG_OPT_TLS_CONFIG`:: + +This option is used on an endpoint to access the underlying TLS +configuration object. The value is of type `nng_tls_config *`. + +TIP: Use this option when advanced TLS configuration is required. + +`NNG_OPT_TLS_CA_FILE`:: + +This is a write-only option used to load certificates associated +associated private key from a file. +See <<nng_tls_config_ca_file#,nng_tls_config_ca_file(3)>> for more +information. + +`NNG_OPT_TLS_CERT_KEY_FILE`:: + +This is a write-only option used to load the local certificate and +associated private key from a file. The private key used must be +unencrypted. (Use the `NNG_OPT_TLS_CONFIG` option to access the underlying +TLS configuration if more advanced configuration is needed.) +See <<nng_tls_config_own_cert#,nng_tls_config_own_cert(3)>> for more +information. + +`NNG_OPT_TLS_AUTH_MODE`:: + +This is a write-only option used to configure the authentication mode +used. It can take an integer with value `NNG_TLS_AUTH_MODE_NONE`, +`NNG_TLS_AUTH_MODE_REQUIRED`, or `NNG_TLS_AUTH_MODE_OPTIONAL`. See +<<nng_tls_config_auth_mode#,nng_tls_config_auth_mode(3)>> for more details. + +`NNG_OPT_TLS_VERIFIED`:: + +This is a read-only option which returns a boolean value (integer 0 or 1). +It will true (1) if the remote peer has been properly verified using TLS +authentication, or false (0) otherwise. This option may return incorrect +results if peer authentication is disabled with `NNG_TLS_AUTH_MODE_NONE`. + +// We should also look at a hook mechanism for listeners. Probably this could +// look like NNG_OPT_WS_LISTEN_HOOK_FUNC which would take a function pointer +// along the lines of int hook(void *, char *req_headers, char **res_headers), +// and NNG_OPT_LISTEN_HOOK_ARG that passes the void * passed in as first arg. +// Alternatively we can uplevel the HTTP API and pass the actual HTTP objects. + +== SEE ALSO + +<<nng#,nng(7)>>, +<<nng_tls_config_alloc#,nng_tls_config_alloc(3)>> diff --git a/docs/man/nng_zerotier.adoc b/docs/man/nng_zerotier.adoc new file mode 100644 index 00000000..d28b1884 --- /dev/null +++ b/docs/man/nng_zerotier.adoc @@ -0,0 +1,209 @@ += nng_zerotier(7) +// +// Copyright 2018 Staysail Systems, Inc. <info@staysail.tech> +// Copyright 2018 Capitar IT Group BV <info@capitar.com> +// +// This document is supplied under the terms of the MIT License, a +// copy of which should be located in the distribution where this +// file was obtained (LICENSE.txt). A copy of the license may also be +// found online at https://opensource.org/licenses/MIT. +// + +== NAME + +nng_zerotier - ZeroTier transport for nng + +== SYNOPSIS + +[source,c] +---------- +#include <nng/transport/zerotier/zerotier.h> + +int nng_zt_register(void); +---------- + +== DESCRIPTION + +The _nng_zerotier_ transport provides communication support for +_nng_ applications over a http://www.zerotier.com[ZeroTier] network, +using a Virtual Layer 2 packet facility. + +CAUTION: This transport is very experimental. To utilize it at +present, the library must be built with support, and the +ZeroTierOne `dev` branch must be included; this will require +linking against a suitable `libzerotiercore` static library. + +NOTE: The `libzerotiercore` library at present is covered under different +license terms than the rest of _nng_. Please be careful to review +and adhere to the licensing terms. + +While ZeroTier makes use of the host's IP stack (and UDP in particular), +this transport does not use or require an IP stack on the virtual +network; thereby mitigating any considerations about IP address management. + +This service uses Ethernet type 901 to transport packets. Network rules +must permit this Ethernet type to pass in order to have a functional +network. + +NOTE: This document assumes that the reader is familiar with ZeroTier +concepts and administration. + +=== Registration + +Depending upon how the library was built, it may be necessary to +register the transport by calling `nng_zt_register`. This function +returns zero on success, or an nng error value if the transport +cannot be initialized for any reason. + +=== URI Format + +This transport uses URIs using the scheme `zt://`, followed by a node +number (ten hexadecimal digits) followed by a `.` delimited, and then +a network address (sixteen hexadecimal digits), followed by a colon (`.`) +and service or port number (decimal value, up to 24-bits). +For example, the URI `zt://fedcba9876.0123456789abdef:999` indicates +that node fedcba9876 on network 0123456789abcdef is listening on port 999. + +The special value `*` can be used in lieu of a node number to represent +the node's own node number. + +Listeners may use port 0 to indicate that a suitable port +number be selected automatically. Applications using this must determine the +selected port number using the `nng_listener_getopt` function. + +=== Socket Address + +When using an `nng_sockaddr` structure, the actual structure is of type +`struct nng_sockaddr_zt`. This type has the following definition: + +[source,c] +-------- +#define NNG_AF_ZT 5 + +struct nng_sockaddr_zt { + uint16_t sa_family; // must be NNG_AF_ZT + uint64_t sa_nwid; // 64-bit network ID + uint64_t sa_nodeid; // 40-bit node ID + uint32_t sa_port; // 24-bit application port +} +-------- + +The `sa_family` member will have the value `NNG_AF_ZT` (5). The remaining +members are, unlike TCP socket address, in native byte order. Only the +lower 24-bits of the `sa_port` may be used. Likewise only the lower 40-bits +of the `sa_nodeid` may be used. + +=== Node Presence + +By default this transport creates an "ephemeral" node, and used the +same ephemeral node for any additional endpoints created. As this node +is ephemeral, the keys associated with it and all associated data are +located in memory and are discarded upon application termination. If +a persistent node is desired, please see the `NNG_OPT_ZT_HOME` option +below. + +It is possible for a single application to join multiple networks +using the same node, or using separate nodes. + +=== Transport Options + +The following transport options are available: + +`NNG_OPT_ZT_HOME`:: + + This is a string representing the "home directory", where the transport + can store (and reuse) persistent state, such as key materials, node + identity, and federation membership. This option must be set before the + ZeroTier transport is first used. If this value is empty, then an ephemeral + ZeroTier node is created, and no persistent state is used. The default + is to use an ephemeral node. ++ +NOTE: If this option is set to different values on different sockets, +dialers, or listeners, then separate nodes will be created. It +is perfectly valid for an application to have multiple node identities +in this fashion. + +`NNG_OPT_ZT_NWID`:: + + This is a read-only option for listeners, dialers, and pipes, and + provides a `uint64_t` in native byte order representing the 64-bit ZeroTier + network number. + +`NNG_OPT_ZT_NODE`:: + + This is a read-only option for listeners, dialers, and pipes, and + provides a `uint64_t` in native byte order representing the ZeroTier + 40-bit node address. + +`NNG_OPT_ZT_NETWORK_STATUS`:: + + This is a read-only integer, representing the ZeroTier network status. + Valid values for this are: ++ +[cols="1,2"] +|=== + +| `nng_zt_network_status_configuring` +| The ZeroTier node is still configuring, network services are not available. + +| `nng_zt_network_status_ok` +| The ZeroTier network is up. + +| `nng_zt_network_status_denied` +| The node does not have permission to join the ZeroTier network. + +| `nng_zt_network_status_notfound` +| The ZeroTier network is not found. + +| `nng_zt_network_status_error` +| Some other ZeroTier error has occurred; the network is not available. + +| `nng_zt_network_status_obsolete` +| The node is running obsolete software; the network is not available. + +|=== + + +`NNG_OPT_ZT_NETWORK_NAME`:: + + This is a read-only ASCIIZ string containing the name of the network + as established by the ZeroTier network administrator. + +`NNG_OPT_ZT_PING_TIME`:: + + If no traffic has been received from the ZeroTier peer after this + period of time, then a "ping" message is sent to check if the peer + is still alive. This is an `nng_duration` (msec). + +`NNG_OPT_ZT_PING_COUNT`:: + + If this number (`int`) of consecutive "ping" requests are sent to the + peer with no response (and no other intervening traffic), then the + peer is assumed to be dead and the connection is closed. Note that + if any traffic is received from the peer, then the underlying counter + is reset to zero. + +`NNG_OPT_ZT_MTU`:: + + This is a read-only size (`size_t`) representing the ZeroTier virtual + network MTU; this is the Virtual Layer 2 MTU. The headers used by + this transport and the protocols consume some of this for each message + sent over the network. (The transport uses 20-bytes of this, and each + protocol may consume additional space, typically not more than 16-bytes.) + +`NNG_OPT_ZT_ORBIT`:: + + This is a write-only option that takes an array of two `uint64_t` values, + indicating the ID of a ZeroTier "moon", and the node ID of the root server + for that moon. (The ID may be zero if the moon ID is the same as it's + root server ID, which is conventional.) + +`NNG_OPT_ZT_DEORBIT`:: + + This write-only option takes a single `uint64_t` indicating the moon + ID to "deorbit". If the node is not already orbiting the moon, then + this has no effect. + +== SEE ALSO + +<<nng#,nng(7)>> diff --git a/docs/man/preview.sh b/docs/man/preview.sh new file mode 100755 index 00000000..73f17aaa --- /dev/null +++ b/docs/man/preview.sh @@ -0,0 +1,128 @@ +#!/bin/bash +# +# Copyright 2018 Staysail Systems, Inc. <info@staysail.tech> +# Copyright 2018 Capitar IT Group BV <info@capitar.com> +# This software is supplied under the terms of the MIT License, a +# copy of which should be located in the distribution where this +# file was obtained (LICENSE.txt). A copy of the license may also be +# found online at https://opensource.org/licenses/MIT. +# + +# This script is used to preview in HTML or man format, the documentation. +# I use it during development, YMMV. It is probably completely useless +# on Windows. + +MANSOURCE="NNG" +MANMANUAL="NNG Reference Manual" + +case $(uname -s) in +Darwin) + OPEN=open + MAN=man + ;; +Linux) + OPEN=xdg-open + MAN=man + ;; +*) + echo "No idea how to preview on this system." + exit 2 +esac + +if [ -n "$DISPLAY" ] +then + style=html +else + style=man +fi + +while getopts cs: arg +do + case "${arg}" in + c) cleanup=yes;; + s) style=$OPTARG;; + ?) echo "Usage: $0 [-s <style>][-c] <files...>"; exit 1 ;; + esac +done +shift $(( $OPTIND - 1 )) + +case $style in +html) + suffix=.html + ;; +ps) + suffix=.ps + ;; +pdf) + suffix=.pdf + ;; +man) + suffix=.man + OPEN=${MAN} + ;; +*) + echo "Unknown style, choose one of [html|man|pdf|ps]." 1>&2 + exit 2 +esac + +version=$(cat $(dirname $0)/../.version) +name=nng + +generate_pdf() { + typeset input=$1 + typeset output=$2 + asciidoctor-pdf -aversion-label=${name} -arevnumber=${version} \ + -asource-highlighter=pygments -aicons=font \ + -a mansource="${MANSOURCE}" -a manmanual="${MANMANUAL}" \ + -b pdf -a notitle -d article -o ${output} $input +} + +generate_html() { + typeset input=$1 + typeset output=$2 + asciidoctor -atoc=left -aversion-label=${name} -arevnumber=${version} \ + -aicons=font -asource-highlighter=pygments \ + -a mansource="${MANSOURCE}" -a manmanual="${MANMANUAL}" \ + -b html5 -d manpage -o ${output} $input +} + +generate_man() { + typeset input=$1 + typeset output=$2 + asciidoctor -aversion-label=${name} -arevnumber=${version} \ + -a mansource="${MANSOURCE}" -a manmanual="${MANMANUAL}" \ + -d manpage -b manpage -o ${output} $input +} + +generate_ps() { + typeset input=$1 + typeset output=$2 + manpage=${2%.ps}.man + generate_man $1 $manpage + if [ $? -eq 0 ]; then + man -t $manpage > $output + fi +} + + +if [ -n "${cleanup}" ] +then + tempdir=$(mktemp -d) + clean() { + sleep 1 + rm -rf ${tempdir} + } + trap clean 0 + mkdir -p ${tempdir} +else + tempdir=/tmp/${LOGNAME}.${name}.preview + mkdir -p ${tempdir} +fi + +for input in "$@"; do + base=$(basename $input) + base=${base%.adoc} + output=${tempdir}/${base}${suffix} + generate_${style} $input $output + $OPEN $output +done diff --git a/docs/man/publish.sh b/docs/man/publish.sh new file mode 100755 index 00000000..8ef60b58 --- /dev/null +++ b/docs/man/publish.sh @@ -0,0 +1,115 @@ +#!/bin/bash +# +# Copyright 2018 Staysail Systems, Inc. <info@staysail.tech> +# Copyright 2018 Capitar IT Group BV <info@capitar.com> +# This software is supplied under the terms of the MIT License, a +# copy of which should be located in the distribution where this +# file was obtained (LICENSE.txt). A copy of the license may also be +# found online at https://opensource.org/licenses/MIT. +# +# +# This program attempts to publish updated documentation to our gh-pages +# branch. +# +# We read the .version file from ../.version. +# +# The docs are published into the gh-pages branch, in a directory +# called man/v<version>. +# +# This script requires asciidoctor, pygments, git, and a UNIX shell. +# + +tmpdir=$(mktemp -d) +srcdir=$(dirname $0) +dstdir=${tmpdir}/pages +cd ${srcdir} +VERSION=$(cat ../.version) +MANMANUAL="NNG Reference Manual" +MANSOURCE="NNG" +LAYOUT=refman +dstman=${dstdir}/man/v${VERSION} +name=nng + +giturl="${GITURL:-git@github.com:nanomsg/nng}" + +cleanup() { + echo "DELETING ${tmpdir}" + rm -rf ${tmpdir} +} + +mkdir -p ${tmpdir} + +trap cleanup 0 + +echo git clone ${giturl} ${dstdir} || exit 1 +git clone ${giturl} ${dstdir} || exit 1 + +(cd ${dstdir}; git checkout gh-pages) + +[ -d ${dstman} ] || mkdir -p ${dstman} + +dirty= +for input in $(find . -name '*.adoc'); do + adoc=${input#./} + html=${adoc%.adoc}.html + output=${dstman}/${html} + + status=$(git status -s $input ) + when=$(git log -n1 --format='%ad' '--date=format-local:%s' $input ) + cat <<EOF > ${output} +--- +version: ${VERSION} +layout: ${LAYOUT} +--- +EOF + + if [ -n "$when" ] + then + epoch="SOURCE_DATE_EPOCH=${when}" + else + epoch= + dirty=yes + fi + if [ -n "$status" ] + then + echo "File $adoc is not checked in!" + dirty=yes + fi + + + env ${epoch} asciidoctor \ + -dmanpage \ + -amansource="${MANSOURCE}" \ + -amanmanual="${MANMANUAL}" \ + -anofooter=yes \ + -askip-front-matter \ + -atoc=left \ + -asource-highlighter=pygments \ + -aicons=font \ + -bhtml5 \ + -o - ${adoc} >> ${output} + chmod 0644 ${output} + + if [ $? -ne 0 ] + then + echo "Failed to process $adoc !" + fails=yes + fi + + + (cd ${dstman}; git add ${html}) +done + +if [ -n "$dirty" ] +then + echo "Repository has uncommited documentation. Aborting." + exit 1 +fi + +if [ -n "$fails" ] +then + echo "Failures formatting documentation. Aborting." + exit 1 +fi + +(cd ${dstman}; git commit -m "man page updates for ${VERSION}"; git push origin gh-pages) |
