pansen
2019-01-28 48e524d7135bff2a32759a642c9aa7298a881e31
# Type(<scope>): <subject>

# <body>

# <footer>

# type 字段包含:
# feat:新功能(feature)
# fix:修补bug
# docs:文档(documentation)
# style: 格式(不影响代码运行的变动)
# refactor:重构(即不是新增功能,也不是修改bug的代码变动)
# test:增加测试
# chore:构建过程或辅助工具的变动
# scope用于说明 commit 影响的范围,比如数据层、控制层、视图层等等。
# subject是 commit 目的的简短描述,不超过50个字符
# Body 部分是对本次 commit 的详细描述,可以分成多行
# Footer用来关闭 Issue或以BREAKING CHANGE开头,后面是对变动的描述、
# 以及变动理由和迁移方法

# 英文版详细例子,请看这里
# https://github.com/sparkbox/how_to/tree/master/style/git
# 中文版介绍,请看这里
# http://www.ruanyifeng.com/blog/2016/01/commit_message_change_log.html
2个文件已修改
43个文件已添加
3629 ■■■■■ 已修改文件
.gitignore 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
README.md 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
aBuild/nng/bin/nngcat 补丁 | 查看 | 原始文档 | blame | 历史
aBuild/nng/include/nng/compat/nanomsg/bus.h 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
aBuild/nng/include/nng/compat/nanomsg/inproc.h 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
aBuild/nng/include/nng/compat/nanomsg/ipc.h 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
aBuild/nng/include/nng/compat/nanomsg/nn.h 284 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
aBuild/nng/include/nng/compat/nanomsg/pair.h 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
aBuild/nng/include/nng/compat/nanomsg/pipeline.h 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
aBuild/nng/include/nng/compat/nanomsg/pubsub.h 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
aBuild/nng/include/nng/compat/nanomsg/reqrep.h 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
aBuild/nng/include/nng/compat/nanomsg/survey.h 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
aBuild/nng/include/nng/compat/nanomsg/tcp.h 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
aBuild/nng/include/nng/compat/nanomsg/ws.h 41 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
aBuild/nng/include/nng/nng.h 980 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
aBuild/nng/include/nng/protocol/bus0/bus.h 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
aBuild/nng/include/nng/protocol/pair0/pair.h 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
aBuild/nng/include/nng/protocol/pair1/pair.h 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
aBuild/nng/include/nng/protocol/pipeline0/pull.h 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
aBuild/nng/include/nng/protocol/pipeline0/push.h 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
aBuild/nng/include/nng/protocol/pubsub0/pub.h 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
aBuild/nng/include/nng/protocol/pubsub0/sub.h 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
aBuild/nng/include/nng/protocol/reqrep0/rep.h 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
aBuild/nng/include/nng/protocol/reqrep0/req.h 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
aBuild/nng/include/nng/protocol/survey0/respond.h 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
aBuild/nng/include/nng/protocol/survey0/survey.h 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
aBuild/nng/include/nng/supplemental/http/http.h 528 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
aBuild/nng/include/nng/supplemental/ipc/ipc.h 133 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
aBuild/nng/include/nng/supplemental/tcp/tcp.h 154 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
aBuild/nng/include/nng/supplemental/tls/tls.h 180 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
aBuild/nng/include/nng/supplemental/util/options.h 48 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
aBuild/nng/include/nng/supplemental/util/platform.h 106 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
aBuild/nng/include/nng/transport/inproc/inproc.h 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
aBuild/nng/include/nng/transport/ipc/ipc.h 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
aBuild/nng/include/nng/transport/tcp/tcp.h 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
aBuild/nng/include/nng/transport/tls/tls.h 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
aBuild/nng/include/nng/transport/ws/websocket.h 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
aBuild/nng/include/nng/transport/zerotier/zerotier.h 149 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
aBuild/nng/lib/cmake/nng/nng-config-version.cmake 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
aBuild/nng/lib/cmake/nng/nng-config.cmake 50 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
aBuild/nng/lib/cmake/nng/nng-targets-noconfig.cmake 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
aBuild/nng/lib/cmake/nng/nng-targets.cmake 88 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
aBuild/nng/lib/libnng.a 补丁 | 查看 | 原始文档 | blame | 历史
aBuild/nng/lib/libnng.so.1.1.0 补丁 | 查看 | 原始文档 | blame | 历史
nng @ 82afec 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
.gitignore
@@ -5,14 +5,14 @@
*.obj
# Compiled Dynamic libraries
*.so
#*.so
*.dylib
*.dll
# Compiled Static libraries
*.lai
*.la
*.a
#*.a
*.lib
# Executables
README.md
@@ -2,3 +2,25 @@
Git上的开源代码
---
#### 指定安装目录
* cmake
    > cmake CMakeList.txt -DCMAKE_INSTALL_PREFIX=dir
    >
    > cmake ../ -DCMAKE_INSTALL_PREFIX=dir
* configure
    > ./configure prefix==dir
---
#### 编译命令
* 编译
    > make -j
* 安装
    > make install
aBuild/nng/bin/nngcat
Binary files differ
aBuild/nng/include/nng/compat/nanomsg/bus.h
New file
@@ -0,0 +1,33 @@
//
// 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.
//
#ifndef NNG_COMPAT_BUS_H
#define NNG_COMPAT_BUS_H
// This header contains interfaces that are intended to offer compatibility
// with nanomsg v1.0.  These are not the "preferred" interfaces for nng,
// and consumers should only use these if they are porting software that
// previously used nanomsg.  New programs should use the nng native APIs.
#ifdef __cplusplus
extern "C" {
#endif
// BUS sockopt level.
#define NN_PROTO_BUS 7
#define NN_BUS (NN_PROTO_BUS * 16 + 0)
// BUS has no options.
#ifdef __cplusplus
}
#endif
#endif // NNG_COMPAT_BUS_H
aBuild/nng/include/nng/compat/nanomsg/inproc.h
New file
@@ -0,0 +1,31 @@
//
// 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.
//
#ifndef NNG_COMPAT_INPROC_H
#define NNG_COMPAT_INPROC_H
// This header contains interfaces that are intended to offer compatibility
// with nanomsg v1.0.  These are not the "preferred" interfaces for nng,
// and consumers should only use these if they are porting software that
// previously used nanomsg.  New programs should use the nng native APIs.
#ifdef __cplusplus
extern "C" {
#endif
// inproc sockopt level.
// There are no inproc tunables.
#define NN_INPROC (-1)
#ifdef __cplusplus
}
#endif
#endif // NNG_COMPAT_INPROC_H
aBuild/nng/include/nng/compat/nanomsg/ipc.h
New file
@@ -0,0 +1,39 @@
//
// 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.
//
#ifndef NNG_COMPAT_IPC_H
#define NNG_COMPAT_IPC_H
// This header contains interfaces that are intended to offer compatibility
// with nanomsg v1.0.  These are not the "preferred" interfaces for nng,
// and consumers should only use these if they are porting software that
// previously used nanomsg.  New programs should use the nng native APIs.
#ifdef __cplusplus
extern "C" {
#endif
// IPC sockopt level.
#define NN_IPC (-2)
// IPC options.  Note that these are not currently supported.
// IPC_SEC_ATTR works quite differently in NNG, and must be
// configured using the new API.  The buffer sizing options are
// not supported at all.  None of these were ever documente, and
// are offered here only for source compatibility.
#define NN_IPC_SEC_ATTR 1
#define NN_IPC_OUTBUFSZ 2
#define NN_IPC_INBUFSZ 3
#ifdef __cplusplus
}
#endif
#endif // NNG_COMPAT_IPC_H
aBuild/nng/include/nng/compat/nanomsg/nn.h
New file
@@ -0,0 +1,284 @@
//
// 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.
//
#ifndef NNG_COMPAT_NN_H
#define NNG_COMPAT_NN_H
// This header contains interfaces that are intended to offer compatibility
// with nanomsg v1.0.  These are not the "preferred" interfaces for nng,
// and consumers should only use these if they are porting software that
// previously used nanomsg.  New programs should use the nng native APIs.
// Note that compatibility promises are limited to public portions of the
// nanomsg API, and specifically do NOT extend to the ABI.  Furthermore,
// there may be other limitations around less commonly used portions of the
// API; for example only SP headers may be transported in control data for
// messages, there is almost no compatibility offered for statistics.
// Error values may differ from those returned by nanomsg as well; the nng
// error reporting facility expresses only a subset of the possibilities of
// nanomsg.
// Note that unlinke nanomsg, nng does not aggressively recycle socket or
// endpoint IDs, which means applications which made assumptions that these
// would be relatively small integers (e.g. to use them as array indices)
// may break.  (No promise about values was ever made.)
#ifdef __cplusplus
extern "C" {
#endif
#include <errno.h>
#include <stddef.h>
#include <stdint.h>
// clang-format gets in the way of most of this file.
// We turn it off, at least until it gets smarter about aligning
// macro definitions or we adopt enums or somesuch.
// clang-format off
// NNG_DECL is used on declarations to deal with scope.
// For building Windows DLLs, it should be the appropriate __declspec().
// For shared libraries with platforms that support hidden visibility,
// it should evaluate to __attribute__((visibility("default"))).
#ifndef NN_DECL
#if defined(_WIN32) && !defined(NNG_STATIC_LIB)
#if defined(NNG_SHARED_LIB)
#define NN_DECL        __declspec(dllexport)
#else
#define NN_DECL        __declspec(dllimport)
#endif // NNG_SHARED_LIB
#else
#if defined(NNG_SHARED_LIB) && defined(NNG_HIDDEN_VISIBILITY)
#define NN_DECL __attribute__((visibility("default")))
#else
#define NN_DECL extern
#endif
#endif // _WIN32 && !NNG_STATIC_LIB
#endif  // NN_DECL
#define AF_SP            1
#define AF_SP_RAW        2
#define NN_SOCKADDR_MAX        128
#define NN_SOL_SOCKET        0
// Flag for send/recv (nonblocking)
#define NN_DONTWAIT        1
// CMSG data type
#define PROTO_SP        1
#define SP_HDR            1
// Errnos.  Legacy nanomsg uses posix errnos where possible.
// If a define is not set, use add NN_ERRBASE.  nng does not
// return all of these values, so there may be some loss of
// of information for edge cases, but we don't expect that to be
// a problem really.
#define NN_ERRBASE        (0x10000000)
#ifndef ENOTSUP
#define ENOTSUP            (NN_ERRBASE+1)
#endif
#ifndef EPROTONOSUPPORT
#define EPROTONOSUPPORT        (NN_ERRBASE+2)
#endif
#ifndef ENOBUFS
#define ENOBUFS            (NN_ERRBASE+3)
#endif
#ifndef ENETDOWN
#define ENETDOWN        (NN_ERRBASE+4)
#endif
#ifndef EADDRINUSE
#define EADDRINUSE        (NN_ERRBASE+5)
#endif
#ifndef EADDRNOTAVAIL
#define EADDRNOTAVAIL        (NN_ERRBASE+6)
#endif
#ifndef ENOTSOCK
#define ENOTSOCK        (NN_ERRBASE+7)
#endif
#ifndef EAGAIN
#define EAGAIN            (NN_ERRBASE+8)
#endif
#ifndef EBADF
#define EBADF            (NN_ERRBASE+9)
#endif
#ifndef EINVAL
#define EINVAL            (NN_ERRBASE+10)
#endif
#ifndef EMFILE
#define EMFILE            (NN_ERRBASE+11)
#endif
#ifndef EFAULT
#define EFAULT            (NN_ERRBASE+12)
#endif
#ifndef EACCES
#define EACCES            (NN_ERRBASE+13)
#endif
#ifndef ENETRESET
#define ENETRESET        (NN_ERRBASE+14)
#endif
#ifndef ENETUNREACH
#define ENETUNREACH        (NN_ERRBASE+15)
#endif
#ifndef EHOSTUNREACH
#define EHOSTUNREACH        (NN_ERRBASE+16)
#endif
#ifndef EAFNOSUPPORT
#define EAFNOSUPPORT        (NN_ERRBASE+17)
#endif
#ifndef EINPROGRESS
#define EINPROGRESS        (NN_ERRBASE+18)
#endif
#ifndef EPROTO
#define EPROTO            (NN_ERRBASE+19)
#endif
#ifndef ECONNREFUSED
#define ECONNREFUSED        (NN_ERRBASE+20)
#endif
#ifndef ENOTCONN
#define ENOTCONN        (NN_ERRBASE+21)
#endif
#ifndef EMSGSIZE
#define EMSGSIZE        (NN_ERRBASE+22)
#endif
#ifndef ETIMEDOUT
#define ETIMEDOUT        (NN_ERRBASE+23)
#endif
#ifndef ECONNABORTED
#define ECONNABORTED        (NN_ERRBASE+24)
#endif
#ifndef ECONNRESET
#define ECONNRESET        (NN_ERRBASE+25)
#endif
#ifndef ENOPROTOOPT
#define ENOPROTOOPT        (NN_ERRBASE+26)
#endif
#ifndef EISCONN
#define EISCONN            (NN_ERRBASE+27)
#endif
#ifndef ESOCKNOSUPPORT
#define ESOCKNOSPPORT        (NN_ERRBASE+28)
#endif
#ifndef ETERM
#define ETERM            (NN_ERRBASE+29)
#endif
#ifndef EFSM
#define EFSM            (NN_ERRBASE+30)
#endif
#ifndef ENOENT
#define ENOENT            (NN_ERRBASE+31)
#endif
#ifndef EIO
#define EIO            (NN_ERRBASE+32)
#endif
#ifndef EEXIST
#define EEXIST            (NN_ERRBASE+33)
#endif
#ifndef ENOSPC
#define ENOSPC            (NN_ERRBASE+34)
#endif
// Socket options
#define NN_LINGER        1
#define NN_SNDBUF        2
#define NN_RCVBUF        3
#define NN_SNDTIMEO        4
#define NN_RCVTIMEO        5
#define NN_RECONNECT_IVL    6
#define NN_RECONNECT_IVL_MAX    7
#define NN_SNDPRIO        8
#define NN_RCVPRIO        9
#define NN_SNDFD        10
#define NN_RCVFD        11
#define NN_DOMAIN        12
#define NN_PROTOCOL        13
#define NN_IPV4ONLY        14
#define NN_SOCKET_NAME        15
#define NN_RCVMAXSIZE        16
#define NN_MAXTTL        17
// from this point on formatting is fine
// clang-format on
// Poll stuff
#define NN_POLLIN 1
#define NN_POLLOUT 2
struct nn_pollfd {
    int      fd;
    uint16_t events;
    uint16_t revents;
};
// Magical size for allocation
#define NN_MSG ((size_t) -1)
struct nn_iovec {
    void * iov_base;
    size_t iov_len;
};
struct nn_msghdr {
    struct nn_iovec *msg_iov;
    int              msg_iovlen;
    void *           msg_control;
    size_t           msg_controllen;
};
struct nn_cmsghdr {
    size_t cmsg_len;
    int    cmsg_level;
    int    cmsg_type;
};
#define NN_CMSG_ALIGN(len) \
    (((len) + sizeof(size_t) - 1) & (size_t) ~(sizeof(size_t) - 1))
// Unlike old nanomsg, we explicitly only support the SP header as attached
// cmsg data.  It turns out that old nanomsg didn't really store anything
// useful otherwise anyway.  (One specific exception was that it stored the
// message type of text or binary for the websocket transport.  We don't think
// anyone used that in practice though.)
#define NN_CMSG_FIRSTHDR(mh) nn_cmsg_next((struct nn_msghdr *) (mh), NULL)
#define NN_CMSG_NXTHDR(mh, ch) \
    nn_cmsg_next((struct nn_msghdr *) (mh), (struct nn_cmsghdr *) ch)
#define NN_CMSG_DATA(ch) ((unsigned char *) (((struct nn_cmsghdr *) (ch)) + 1))
#define NN_CMSG_SPACE(len) \
    (NN_CMSG_ALIGN(len) + NN_CMSG_ALIGN(sizeof(struct nn_cmsghdr)))
#define NN_CMSG_LEN(len) (NN_CMSG_ALIGN(sizeof(struct nn_cmsghdr)) + (len))
NN_DECL struct nn_cmsghdr *nn_cmsg_next(
    struct nn_msghdr *, struct nn_cmsghdr *);
NN_DECL int nn_socket(int, int);
NN_DECL int nn_setsockopt(int, int, int, const void *, size_t);
NN_DECL int nn_getsockopt(int, int, int, void *, size_t *);
NN_DECL int nn_bind(int, const char *);
NN_DECL int nn_connect(int, const char *);
NN_DECL int nn_shutdown(int, int);
NN_DECL int nn_send(int, const void *, size_t, int);
NN_DECL int nn_recv(int, void *, size_t, int);
NN_DECL int nn_sendmsg(int, const struct nn_msghdr *, int);
NN_DECL int nn_recvmsg(int, struct nn_msghdr *, int);
NN_DECL int nn_close(int);
NN_DECL int nn_poll(struct nn_pollfd *, int, int);
NN_DECL int nn_device(int, int);
NN_DECL uint64_t    nn_get_statistic(int, int);
NN_DECL void *      nn_allocmsg(size_t, int);
NN_DECL void *      nn_reallocmsg(void *, size_t);
NN_DECL int         nn_freemsg(void *);
NN_DECL int         nn_errno(void);
NN_DECL const char *nn_strerror(int);
NN_DECL void        nn_term(void);
#ifdef __cplusplus
}
#endif
#endif // NNG_COMPAT_NN_H
aBuild/nng/include/nng/compat/nanomsg/pair.h
New file
@@ -0,0 +1,39 @@
//
// 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.
//
#ifndef NNG_COMPAT_PAIR_H
#define NNG_COMPAT_PAIR_H
// This header contains interfaces that are intended to offer compatibility
// with nanomsg v1.0.  These are not the "preferred" interfaces for nng,
// and consumers should only use these if they are porting software that
// previously used nanomsg.  New programs should use the nng native APIs.
#ifdef __cplusplus
extern "C" {
#endif
// PAIR sockopt level.
#define NN_PROTO_PAIR 1
#define NN_PAIR (NN_PROTO_PAIR * 16 + 0)
// These are technically "new", and not available in nanomsg, but
// offered here as a transition aid.  If you want to use the advanced
// PAIRv1 options (POLYAMOROUS mode) you still need to use the new API.
#define NN_PAIR_v0 (NN_PROTO_PAIR * 16 + 0)
#define NN_PAIR_V1 (NN_PROTO_PAIR * 16 + 1)
// PAIR has no options.
#ifdef __cplusplus
}
#endif
#endif // NNG_COMPAT_PAIR_H
aBuild/nng/include/nng/compat/nanomsg/pipeline.h
New file
@@ -0,0 +1,34 @@
//
// 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.
//
#ifndef NNG_COMPAT_PIPELINE_H
#define NNG_COMPAT_PIPELINE_H
// This header contains interfaces that are intended to offer compatibility
// with nanomsg v1.0.  These are not the "preferred" interfaces for nng,
// and consumers should only use these if they are porting software that
// previously used nanomsg.  New programs should use the nng native APIs.
#ifdef __cplusplus
extern "C" {
#endif
// PUSH and PULL sockopt level.
#define NN_PROTO_PIPELINE 5
#define NN_PUSH (NN_PROTO_PIPELINE * 16 + 0)
#define NN_PULL (NN_PROTO_PIPELINE * 16 + 1)
// PUSH and PULL have no options.
#ifdef __cplusplus
}
#endif
#endif // NNG_COMPAT_PIPELINE_H
aBuild/nng/include/nng/compat/nanomsg/pubsub.h
New file
@@ -0,0 +1,36 @@
//
// 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.
//
#ifndef NNG_COMPAT_PUBSUB_H
#define NNG_COMPAT_PUBSUB_H
// This header contains interfaces that are intended to offer compatibility
// with nanomsg v1.0.  These are not the "preferred" interfaces for nng,
// and consumers should only use these if they are porting software that
// previously used nanomsg.  New programs should use the nng native APIs.
#ifdef __cplusplus
extern "C" {
#endif
// PUB and SUB sockopt level.
#define NN_PROTO_PUBSUB 2
#define NN_PUB (NN_PROTO_PUBSUB * 16 + 0)
#define NN_SUB (NN_PROTO_PUBSUB * 16 + 1)
// SUB options.  (PUB has none.)
#define NN_SUB_SUBSCRIBE (NN_SUB * 16 + 1)
#define NN_SUB_UNSUBSCRIBE (NN_SUB * 16 + 2)
#ifdef __cplusplus
}
#endif
#endif // NNG_COMPAT_PUBSUB_H
aBuild/nng/include/nng/compat/nanomsg/reqrep.h
New file
@@ -0,0 +1,35 @@
//
// 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.
//
#ifndef NNG_COMPAT_REQREP_H
#define NNG_COMPAT_REQREP_H
// This header contains interfaces that are intended to offer compatibility
// with nanomsg v1.0.  These are not the "preferred" interfaces for nng,
// and consumers should only use these if they are porting software that
// previously used nanomsg.  New programs should use the nng native APIs.
#ifdef __cplusplus
extern "C" {
#endif
// REQ and REP sockopt level.
#define NN_PROTO_REQREP 3
#define NN_REQ (NN_PROTO_REQREP * 16 + 0)
#define NN_REP (NN_PROTO_REQREP * 16 + 1)
// REQ options.  (REP has none.)
#define NN_REQ_RESEND_IVL (NN_REQ * 16 + 1)
#ifdef __cplusplus
}
#endif
#endif // NNG_COMPAT_REQREP_H
aBuild/nng/include/nng/compat/nanomsg/survey.h
New file
@@ -0,0 +1,36 @@
//
// 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.
//
#ifndef NNG_COMPAT_SURVEY_H
#define NNG_COMPAT_SURVEY_H
// This header contains interfaces that are intended to offer compatibility
// with nanomsg v1.0.  These are not the "preferred" interfaces for nng,
// and consumers should only use these if they are porting software that
// previously used nanomsg.  New programs should use the nng native APIs.
#ifdef __cplusplus
extern "C" {
#endif
// SURVEYOR and RESPONDENT sockopt level.
#define NN_PROTO_SURVEY 6
#define NN_SURVEYOR (NN_PROTO_SURVEY * 16 + 2)
#define NN_RESPONDENT (NN_PROTO_SURVEY * 16 + 3)
// SURVEYOR options.  (RESPONDENT has none.)
#define NN_SURVEYOR_DEADLINE (NN_SURVEYOR * 16 + 1)
#ifdef __cplusplus
}
#endif
#endif // NNG_COMPAT_SURVEY_H
aBuild/nng/include/nng/compat/nanomsg/tcp.h
New file
@@ -0,0 +1,33 @@
//
// 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.
//
#ifndef NNG_COMPAT_TCP_H
#define NNG_COMPAT_TCP_H
// This header contains interfaces that are intended to offer compatibility
// with nanomsg v1.0.  These are not the "preferred" interfaces for nng,
// and consumers should only use these if they are porting software that
// previously used nanomsg.  New programs should use the nng native APIs.
#ifdef __cplusplus
extern "C" {
#endif
// TCP sockopt level.
#define NN_TCP (-3)
// TCP options.
#define NN_TCP_NODELAY 1
#ifdef __cplusplus
}
#endif
#endif // NNG_COMPAT_TCP_H
aBuild/nng/include/nng/compat/nanomsg/ws.h
New file
@@ -0,0 +1,41 @@
//
// 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.
//
#ifndef NNG_COMPAT_WS_H
#define NNG_COMPAT_WS_H
// This header contains interfaces that are intended to offer compatibility
// with nanomsg v1.0.  These are not the "preferred" interfaces for nng,
// and consumers should only use these if they are porting software that
// previously used nanomsg.  New programs should use the nng native APIs.
#ifdef __cplusplus
extern "C" {
#endif
// WS sockopt level.
#define NN_WS (-4)
// WS options.
// Note that while legacy libnanomsg had *some* support for text messages,
// NNG only supports binary.  Binary types are required to pass protocol
// headers with NNG and nanomsg in any event.  This means that the NNG
// WebSocket support will not be compatible with some very old browsers.
#define NN_WS_MSG_TYPE 1
#define NN_WS_MSG_TYPE_TEXT 0x1
#define NN_WS_MSG_TYPE_BINARY 0x2
#ifdef __cplusplus
}
#endif
#endif // NNG_COMPAT_WS_H
aBuild/nng/include/nng/nng.h
New file
@@ -0,0 +1,980 @@
//
// Copyright 2019 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.
//
#ifndef NNG_H
#define NNG_H
// NNG (nanomsg-next-gen) is an improved implementation of the SP protocols.
// The APIs have changed, and there is no attempt to provide API compatibility
// with legacy libnanomsg. This file defines the library consumer-facing
// Public API. Use of definitions or declarations not found in this header
// file is specfically unsupported and strongly discouraged.
#ifdef __cplusplus
extern "C" {
#endif
#include <stdbool.h>
#include <stddef.h>
#include <stdint.h>
// NNG_DECL is used on declarations to deal with scope.
// For building Windows DLLs, it should be the appropriate __declspec().
// For shared libraries with platforms that support hidden visibility,
// it should evaluate to __attribute__((visibility("default"))).
#ifndef NNG_DECL
#if defined(_WIN32) && !defined(NNG_STATIC_LIB)
#if defined(NNG_SHARED_LIB)
#define NNG_DECL __declspec(dllexport)
#else
#define NNG_DECL __declspec(dllimport)
#endif // NNG_SHARED_LIB
#else
#if defined(NNG_SHARED_LIB) && defined(NNG_HIDDEN_VISIBILITY)
#define NNG_DECL __attribute__((visibility("default")))
#else
#define NNG_DECL extern
#endif
#endif // _WIN32 && !NNG_STATIC_LIB
#endif // NNG_DECL
// NNG Library & API version.
// We use SemVer, and these versions are about the API, and
// may not necessarily match the ABI versions. Right now at
// version 0, you should not be making any forward compatibility
// assumptions.
#define NNG_MAJOR_VERSION 1
#define NNG_MINOR_VERSION 1
#define NNG_PATCH_VERSION 1
#define NNG_RELEASE_SUFFIX "" // if non-empty, this is a pre-release
// Maximum length of a socket address. This includes the terminating NUL.
// This limit is built into other implementations, so do not change it.
// Note that some transports are quite happy to let you use addresses
// in excess of this, but if you do you may not be able to communicate
// with other implementations.
#define NNG_MAXADDRLEN (128)
// Types common to nng.
// Identifiers are wrapped in a structure to improve compiler validation
// of incorrect passing.  This gives us strong type checking.  Modern
// compilers compile passing these by value to identical code as passing
// the integer type (at least with optimization applied).  Please do not
// access the ID member directly.
typedef struct nng_ctx_s {
    uint32_t id;
} nng_ctx;
typedef struct nng_dialer_s {
    uint32_t id;
} nng_dialer;
typedef struct nng_listener_s {
    uint32_t id;
} nng_listener;
typedef struct nng_pipe_s {
    uint32_t id;
} nng_pipe;
typedef struct nng_socket_s {
    uint32_t id;
} nng_socket;
typedef int32_t         nng_duration; // in milliseconds
typedef struct nng_msg  nng_msg;
typedef struct nng_stat nng_stat;
typedef struct nng_aio  nng_aio;
// Initializers.
// clang-format off
#define NNG_PIPE_INITIALIZER { 0 }
#define NNG_SOCKET_INITIALIZER { 0 }
#define NNG_DIALER_INITIALIZER { 0 }
#define NNG_LISTENER_INITIALIZER { 0 }
#define NNG_CTX_INITIALIZER { 0 }
// clang-format on
// Some address details. This is in some ways like a traditional sockets
// sockaddr, but we have our own to cope with our unique families, etc.
// The details of this structure are directly exposed to applications.
// These structures can be obtained via property lookups, etc.
struct nng_sockaddr_inproc {
    uint16_t sa_family;
    char     sa_name[NNG_MAXADDRLEN];
};
typedef struct nng_sockaddr_inproc nng_sockaddr_inproc;
struct nng_sockaddr_path {
    uint16_t sa_family;
    char     sa_path[NNG_MAXADDRLEN];
};
typedef struct nng_sockaddr_path nng_sockaddr_path;
typedef struct nng_sockaddr_path nng_sockaddr_ipc;
struct nng_sockaddr_in6 {
    uint16_t sa_family;
    uint16_t sa_port;
    uint8_t  sa_addr[16];
};
typedef struct nng_sockaddr_in6 nng_sockaddr_in6;
typedef struct nng_sockaddr_in6 nng_sockaddr_udp6;
typedef struct nng_sockaddr_in6 nng_sockaddr_tcp6;
struct nng_sockaddr_in {
    uint16_t sa_family;
    uint16_t sa_port;
    uint32_t sa_addr;
};
struct nng_sockaddr_zt {
    uint16_t sa_family;
    uint64_t sa_nwid;
    uint64_t sa_nodeid;
    uint32_t sa_port;
};
typedef struct nng_sockaddr_in nng_sockaddr_in;
typedef struct nng_sockaddr_in nng_sockaddr_udp;
typedef struct nng_sockaddr_in nng_sockaddr_tcp;
typedef struct nng_sockaddr_zt nng_sockaddr_zt;
typedef union nng_sockaddr {
    uint16_t            s_family;
    nng_sockaddr_ipc    s_ipc;
    nng_sockaddr_inproc s_inproc;
    nng_sockaddr_in6    s_in6;
    nng_sockaddr_in     s_in;
    nng_sockaddr_zt     s_zt;
} nng_sockaddr;
enum nng_sockaddr_family {
    NNG_AF_UNSPEC = 0,
    NNG_AF_INPROC = 1,
    NNG_AF_IPC    = 2,
    NNG_AF_INET   = 3,
    NNG_AF_INET6  = 4,
    NNG_AF_ZT     = 5 // ZeroTier
};
// Scatter/gather I/O.
typedef struct nng_iov {
    void * iov_buf;
    size_t iov_len;
} nng_iov;
// Some definitions for durations used with timeouts.
#define NNG_DURATION_INFINITE (-1)
#define NNG_DURATION_DEFAULT (-2)
#define NNG_DURATION_ZERO (0)
// nng_fini is used to terminate the library, freeing certain global resources.
// This should only be called during atexit() or just before dlclose().
// THIS FUNCTION MUST NOT BE CALLED CONCURRENTLY WITH ANY OTHER FUNCTION
// IN THIS LIBRARY; IT IS NOT REENTRANT OR THREADSAFE.
//
// For most cases, this call is unnecessary, but it is provided to assist
// when debugging with memory checkers (e.g. valgrind).  Calling this
// function prevents global library resources from being reported incorrectly
// as memory leaks.  In those cases, we recommend doing this with atexit().
NNG_DECL void nng_fini(void);
// nng_close closes the socket, terminating all activity and
// closing any underlying connections and releasing any associated
// resources.
NNG_DECL int nng_close(nng_socket);
// nng_socket_id returns the positive socket id for the socket, or -1
// if the socket is not valid.
NNG_DECL int nng_socket_id(nng_socket);
// nng_closeall closes all open sockets. Do not call this from
// a library; it will affect all sockets.
NNG_DECL void nng_closeall(void);
// nng_setopt sets an option for a specific socket.
NNG_DECL int nng_setopt(nng_socket, const char *, const void *, size_t);
NNG_DECL int nng_setopt_bool(nng_socket, const char *, bool);
NNG_DECL int nng_setopt_int(nng_socket, const char *, int);
NNG_DECL int nng_setopt_ms(nng_socket, const char *, nng_duration);
NNG_DECL int nng_setopt_size(nng_socket, const char *, size_t);
NNG_DECL int nng_setopt_uint64(nng_socket, const char *, uint64_t);
NNG_DECL int nng_setopt_string(nng_socket, const char *, const char *);
NNG_DECL int nng_setopt_ptr(nng_socket, const char *, void *);
// nng_socket_getopt obtains the option for a socket.
NNG_DECL int nng_getopt(nng_socket, const char *, void *, size_t *);
NNG_DECL int nng_getopt_bool(nng_socket, const char *, bool *);
NNG_DECL int nng_getopt_int(nng_socket, const char *, int *);
NNG_DECL int nng_getopt_ms(nng_socket, const char *, nng_duration *);
NNG_DECL int nng_getopt_size(nng_socket, const char *, size_t *);
NNG_DECL int nng_getopt_uint64(nng_socket, const char *, uint64_t *);
NNG_DECL int nng_getopt_ptr(nng_socket, const char *, void **);
// Arguably the pipe callback functions could be handled as an option,
// but with the need to specify an argument, we find it best to unify
// this as a separate function to pass in the argument and the callback.
// Only one callback can be set on a given socket, and there is no way
// to retrieve the old value.
typedef enum {
    NNG_PIPE_EV_ADD_PRE,  // Called just before pipe added to socket
    NNG_PIPE_EV_ADD_POST, // Called just after pipe added to socket
    NNG_PIPE_EV_REM_POST, // Called just after pipe removed from socket
    NNG_PIPE_EV_NUM,      // Used internally, must be last.
} nng_pipe_ev;
typedef void (*nng_pipe_cb)(nng_pipe, int, void *);
// nng_pipe_notify registers a callback to be executed when the
// given event is triggered.  To watch for different events, register
// multiple times.  Each event can have at most one callback registered.
NNG_DECL int nng_pipe_notify(nng_socket, int, nng_pipe_cb, void *);
// nng_getopt_string is special -- it allocates a string to hold the
// resulting string, which should be freed with nng_strfree when it is
// no logner needed.
NNG_DECL int nng_getopt_string(nng_socket, const char *, char **);
// nng_listen creates a listening endpoint with no special options,
// and starts it listening.  It is functionally equivalent to the legacy
// nn_bind(). The underlying endpoint is returned back to the caller in the
// endpoint pointer, if it is not NULL.  The flags are ignored at present.
NNG_DECL int nng_listen(nng_socket, const char *, nng_listener *, int);
// nng_dial creates a dialing endpoint, with no special options, and
// starts it dialing.  Dialers have at most one active connection at a time
// This is similar to the legacy nn_connect().  The underlying endpoint
// is returned back to the caller in the endpoint pointer, if it is not NULL.
// The flags may be NNG_FLAG_NONBLOCK to indicate that the first attempt to
// dial will be made in the background, returning control to the caller
// immediately.  In this case, if the connection fails, the function will
// keep retrying in the background.  (If the connection is dropped in either
// case, it will still be reconnected in the background -- only the initial
// connection attempt is normally synchronous.)
NNG_DECL int nng_dial(nng_socket, const char *, nng_dialer *, int);
// nng_dialer_create creates a new dialer, that is not yet started.
NNG_DECL int nng_dialer_create(nng_dialer *, nng_socket, const char *);
// nng_listener_create creates a new listener, that is not yet started.
NNG_DECL int nng_listener_create(nng_listener *, nng_socket, const char *);
// nng_dialer_start starts the endpoint dialing.  This is only possible if
// the dialer is not already dialing.
NNG_DECL int nng_dialer_start(nng_dialer, int);
// nng_listener_start starts the endpoint listening.  This is only possible if
// the listener is not already listening.
NNG_DECL int nng_listener_start(nng_listener, int);
// nng_dialer_close closes the dialer, shutting down all underlying
// connections and releasing all associated resources.
NNG_DECL int nng_dialer_close(nng_dialer);
// nng_listener_close closes the listener, shutting down all underlying
// connections and releasing all associated resources.
NNG_DECL int nng_listener_close(nng_listener);
// nng_dialer_id returns the positive dialer ID, or -1 if the dialer is
// invalid.
NNG_DECL int nng_dialer_id(nng_dialer);
// nng_listener_id returns the positive listener ID, or -1 if the listener is
// invalid.
NNG_DECL int nng_listener_id(nng_listener);
// nng_dialer_setopt sets an option for a specific dialer.  Note
// dialer options may not be altered on a running dialer.
NNG_DECL int nng_dialer_setopt(nng_dialer, const char *, const void *, size_t);
NNG_DECL int nng_dialer_setopt_bool(nng_dialer, const char *, bool);
NNG_DECL int nng_dialer_setopt_int(nng_dialer, const char *, int);
NNG_DECL int nng_dialer_setopt_ms(nng_dialer, const char *, nng_duration);
NNG_DECL int nng_dialer_setopt_size(nng_dialer, const char *, size_t);
NNG_DECL int nng_dialer_setopt_uint64(nng_dialer, const char *, uint64_t);
NNG_DECL int nng_dialer_setopt_ptr(nng_dialer, const char *, void *);
NNG_DECL int nng_dialer_setopt_string(nng_dialer, const char *, const char *);
// nng_dialer_getopt obtains the option for a dialer. This will
// fail for options that a particular dialer is not interested in,
// even if they were set on the socket.
NNG_DECL int nng_dialer_getopt(nng_dialer, const char *, void *, size_t *);
NNG_DECL int nng_dialer_getopt_bool(nng_dialer, const char *, bool *);
NNG_DECL int nng_dialer_getopt_int(nng_dialer, const char *, int *);
NNG_DECL int nng_dialer_getopt_ms(nng_dialer, const char *, nng_duration *);
NNG_DECL int nng_dialer_getopt_size(nng_dialer, const char *, size_t *);
NNG_DECL int nng_dialer_getopt_sockaddr(
    nng_dialer, const char *, nng_sockaddr *);
NNG_DECL int nng_dialer_getopt_uint64(nng_dialer, const char *, uint64_t *);
NNG_DECL int nng_dialer_getopt_ptr(nng_dialer, const char *, void **);
// nng_dialer_getopt_string is special -- it allocates a string to hold the
// resulting string, which should be freed with nng_strfree when it is
// no logner needed.
NNG_DECL int nng_dialer_getopt_string(nng_dialer, const char *, char **);
// nng_listener_setopt sets an option for a dialer.  This value is
// not stored in the socket.  Subsequent setopts on the socket may
// override these value however.  Note listener options may not be altered
// on a running listener.
NNG_DECL int nng_listener_setopt(
    nng_listener, const char *, const void *, size_t);
NNG_DECL int nng_listener_setopt_bool(nng_listener, const char *, bool);
NNG_DECL int nng_listener_setopt_int(nng_listener, const char *, int);
NNG_DECL int nng_listener_setopt_ms(nng_listener, const char *, nng_duration);
NNG_DECL int nng_listener_setopt_size(nng_listener, const char *, size_t);
NNG_DECL int nng_listener_setopt_uint64(nng_listener, const char *, uint64_t);
NNG_DECL int nng_listener_setopt_ptr(nng_listener, const char *, void *);
NNG_DECL int nng_listener_setopt_string(
    nng_listener, const char *, const char *);
// nng_listener_getopt obtains the option for a listener.  This will
// fail for options that a particular listener is not interested in,
// even if they were set on the socket.
NNG_DECL int nng_listener_getopt(nng_listener, const char *, void *, size_t *);
NNG_DECL int nng_listener_getopt_bool(nng_listener, const char *, bool *);
NNG_DECL int nng_listener_getopt_int(nng_listener, const char *, int *);
NNG_DECL int nng_listener_getopt_ms(
    nng_listener, const char *, nng_duration *);
NNG_DECL int nng_listener_getopt_size(nng_listener, const char *, size_t *);
NNG_DECL int nng_listener_getopt_sockaddr(
    nng_listener, const char *, nng_sockaddr *);
NNG_DECL int nng_listener_getopt_uint64(
    nng_listener, const char *, uint64_t *);
NNG_DECL int nng_listener_getopt_ptr(nng_listener, const char *, void **);
// nng_listener_getopt_string is special -- it allocates a string to hold the
// resulting string, which should be freed with nng_strfree when it is
// no logner needed.
NNG_DECL int nng_listener_getopt_string(nng_listener, const char *, char **);
// nng_strerror returns a human readable string associated with the error
// code supplied.
NNG_DECL const char *nng_strerror(int);
// nng_send sends (or arranges to send) the data on the socket.  Note that
// this function may (will!) return before any receiver has actually
// received the data.  The return value will be zero to indicate that the
// socket has accepted the entire data for send, or an errno to indicate
// failure.  The flags may include NNG_FLAG_NONBLOCK or NNG_FLAG_ALLOC.
// If the flag includes NNG_FLAG_ALLOC, then the function will call
// nng_free() on the supplied pointer & size on success. (If the call
// fails then the memory is not freed.)
NNG_DECL int nng_send(nng_socket, void *, size_t, int);
// nng_recv receives message data into the socket, up to the supplied size.
// The actual size of the message data will be written to the value pointed
// to by size.  The flags may include NNG_FLAG_NONBLOCK and NNG_FLAG_ALLOC.
// If NNG_FLAG_ALLOC is supplied then the library will allocate memory for
// the caller.  In that case the pointer to the allocated will be stored
// instead of the data itself.  The caller is responsible for freeing the
// associated memory with nng_free().
NNG_DECL int nng_recv(nng_socket, void *, size_t *, int);
// nng_sendmsg is like nng_send, but offers up a message structure, which
// gives the ability to provide more control over the message, including
// providing backtrace information.  It also can take a message that was
// obtain via nn_recvmsg, allowing for zero copy forwarding.
NNG_DECL int nng_sendmsg(nng_socket, nng_msg *, int);
// nng_recvmsg is like nng_recv, but is used to obtain a message structure
// as well as the data buffer.  This can be used to obtain more information
// about where the message came from, access raw headers, etc.  It also
// can be passed off directly to nng_sendmsg.
NNG_DECL int nng_recvmsg(nng_socket, nng_msg **, int);
// nng_send_aio sends data on the socket asynchronously.  As with nng_send,
// the completion may be executed before the data has actually been delivered,
// but only when it is accepted for delivery.  The supplied AIO must have
// been initialized, and have an associated message.  The message will be
// "owned" by the socket if the operation completes successfully.  Otherwise
// the caller is responsible for freeing it.
NNG_DECL void nng_send_aio(nng_socket, nng_aio *);
// nng_recv_aio receives data on the socket asynchronously.  On a successful
// result, the AIO will have an associated message, that can be obtained
// with nng_aio_get_msg().  The caller takes ownership of the message at
// this point.
NNG_DECL void nng_recv_aio(nng_socket, nng_aio *);
// Context support.  User contexts are not supported by all protocols,
// but for those that do, they give a way to create multiple contexts
// on a single socket, each of which runs the protocol's state machinery
// independently, offering a way to achieve concurrent protocol support
// without resorting to raw mode sockets.  See the protocol specific
// documentation for further details.  (Note that at this time, only
// asynchronous send/recv are supported for contexts, but its easy enough
// to make synchronous versions with nng_aio_wait().)  Note that nng_close
// of the parent socket will *block* as long as any contexts are open.
// nng_ctx_open creates a context.  This returns NNG_ENOTSUP if the
// protocol implementation does not support separate contexts.
NNG_DECL int nng_ctx_open(nng_ctx *, nng_socket);
// nng_ctx_close closes the context.
NNG_DECL int nng_ctx_close(nng_ctx);
// nng_ctx_id returns the numeric id for the context; this will be
// a postive value for a valid context, or < 0 for an invalid context.
// A valid context is not necessarily an *open* context.
NNG_DECL int nng_ctx_id(nng_ctx);
// nng_ctx_recv receives asynchronously.  It works like nng_recv_aio, but
// uses a local context instead of the socket global context.
NNG_DECL void nng_ctx_recv(nng_ctx, nng_aio *);
// nng_ctx_send sends asynchronously. It works like nng_send_aio, but
// uses a local context instead of the socket global context.
NNG_DECL void nng_ctx_send(nng_ctx, nng_aio *);
// nng_ctx_getopt is used to retrieve a context-specific option.  This
// can only be used for those options that relate to specific context
// tunables (which does include NNG_OPT_SENDTIMEO and NNG_OPT_RECVTIMEO);
// see the protocol documentation for more details.
NNG_DECL int nng_ctx_getopt(nng_ctx, const char *, void *, size_t *);
NNG_DECL int nng_ctx_getopt_bool(nng_ctx, const char *, bool *);
NNG_DECL int nng_ctx_getopt_int(nng_ctx, const char *, int *);
NNG_DECL int nng_ctx_getopt_ms(nng_ctx, const char *, nng_duration *);
NNG_DECL int nng_ctx_getopt_size(nng_ctx, const char *, size_t *);
// nng_ctx_setopt is used to set a context-specific option.  This
// can only be used for those options that relate to specific context
// tunables (which does include NNG_OPT_SENDTIMEO and NNG_OPT_RECVTIMEO);
// see the protocol documentation for more details.
NNG_DECL int nng_ctx_setopt(nng_ctx, const char *, const void *, size_t);
NNG_DECL int nng_ctx_setopt_bool(nng_ctx, const char *, bool);
NNG_DECL int nng_ctx_setopt_int(nng_ctx, const char *, int);
NNG_DECL int nng_ctx_setopt_ms(nng_ctx, const char *, nng_duration);
NNG_DECL int nng_ctx_setopt_size(nng_ctx, const char *, size_t);
// nng_alloc is used to allocate memory.  It's intended purpose is for
// allocating memory suitable for message buffers with nng_send().
// Applications that need memory for other purposes should use their platform
// specific API.
NNG_DECL void *nng_alloc(size_t);
// nng_free is used to free memory allocated with nng_alloc, which includes
// memory allocated by nng_recv() when the NNG_FLAG_ALLOC message is supplied.
// As the application is required to keep track of the size of memory, this
// is probably less convenient for general uses than the C library malloc and
// calloc.
NNG_DECL void nng_free(void *, size_t);
// nng_strdup duplicates the source string, using nng_alloc. The result
// should be freed with nng_strfree (or nng_free(strlen(s)+1)).
NNG_DECL char *nng_strdup(const char *);
// nng_strfree is equivalent to nng_free(strlen(s)+1).
NNG_DECL void nng_strfree(char *);
// Async IO API.  AIO structures can be thought of as "handles" to
// support asynchronous operations.  They contain the completion callback, and
// a pointer to consumer data.  This is similar to how overlapped I/O
// works in Windows, when used with a completion callback.
//
// AIO structures can carry up to 4 distinct input values, and up to
// 4 distinct output values, and up to 4 distinct "private state" values.
// The meaning of the inputs and the outputs are determined by the
// I/O functions being called.
// nng_aio_alloc allocates a new AIO, and associated the completion
// callback and its opaque argument.  If NULL is supplied for the
// callback, then the caller must use nng_aio_wait() to wait for the
// operation to complete.  If the completion callback is not NULL, then
// when a submitted operation completes (or is canceled or fails) the
// callback will be executed, generally in a different thread, with no
// locks held.
NNG_DECL int nng_aio_alloc(nng_aio **, void (*)(void *), void *);
// nng_aio_free frees the AIO and any associated resources.
// It *must not* be in use at the time it is freed.
NNG_DECL void nng_aio_free(nng_aio *);
// nng_aio_stop stops any outstanding operation, and waits for the
// AIO to be free, including for the callback to have completed
// execution.  Therefore the caller must NOT hold any locks that
// are acquired in the callback, or deadlock will occur.
NNG_DECL void nng_aio_stop(nng_aio *);
// nng_aio_result returns the status/result of the operation. This
// will be zero on successful completion, or an nng error code on
// failure.
NNG_DECL int nng_aio_result(nng_aio *);
// nng_aio_count returns the number of bytes transferred for certain
// I/O operations.  This is meaningless for other operations (e.g.
// DNS lookups or TCP connection setup).
NNG_DECL size_t nng_aio_count(nng_aio *);
// nng_aio_cancel attempts to cancel any in-progress I/O operation.
// The AIO callback will still be executed, but if the cancellation is
// successful then the status will be NNG_ECANCELED.
NNG_DECL void nng_aio_cancel(nng_aio *);
// nng_aio_abort is like nng_aio_cancel, but allows for a different
// error result to be returned.
NNG_DECL void nng_aio_abort(nng_aio *, int);
// nng_aio_wait waits synchronously for any pending operation to complete.
// It also waits for the callback to have completed execution.  Therefore,
// the caller of this function must not hold any locks acquired by the
// callback or deadlock may occur.
NNG_DECL void nng_aio_wait(nng_aio *);
// nng_aio_set_msg sets the message structure to use for asynchronous
// message send operations.
NNG_DECL void nng_aio_set_msg(nng_aio *, nng_msg *);
// nng_aio_get_msg returns the message structure associated with a completed
// receive operation.
NNG_DECL nng_msg *nng_aio_get_msg(nng_aio *);
// nng_aio_set_input sets an input parameter at the given index.
NNG_DECL int nng_aio_set_input(nng_aio *, unsigned, void *);
// nng_aio_get_input retrieves the input parameter at the given index.
NNG_DECL void *nng_aio_get_input(nng_aio *, unsigned);
// nng_aio_set_output sets an output result at the given index.
NNG_DECL int nng_aio_set_output(nng_aio *, unsigned, void *);
// nng_aio_get_output retrieves the output result at the given index.
NNG_DECL void *nng_aio_get_output(nng_aio *, unsigned);
// nng_aio_set_timeout sets a timeout on the AIO.  This should be called for
// operations that should time out after a period.  The timeout should be
// either a positive number of milliseconds, or NNG_DURATION_INFINITE to
// indicate that the operation has no timeout.  A poll may be done by
// specifying NNG_DURATION_ZERO.  The value NNG_DURATION_DEFAULT indicates
// that any socket specific timeout should be used.
NNG_DECL void nng_aio_set_timeout(nng_aio *, nng_duration);
// nng_aio_set_iov sets a scatter/gather vector on the aio.  The iov array
// itself is copied. Data members (the memory regions referenced) *may* be
// copied as well, depending on the operation.  This operation is guaranteed
// to succeed if n <= 4, otherwise it may fail due to NNG_ENOMEM.
NNG_DECL int nng_aio_set_iov(nng_aio *, unsigned, const nng_iov *);
// nng_aio_begin is called by the provider to mark the operation as
// beginning.  If it returns false, then the provider must take no
// further action on the aio.
NNG_DECL bool nng_aio_begin(nng_aio *);
// nng_aio_finish is used to "finish" an asynchronous operation.
// It should only be called by "providers" (such as HTTP server API users).
// The argument is the value that nng_aio_result() should return.
// IMPORTANT: Callers must ensure that this is called EXACTLY ONCE on any
// given aio.
NNG_DECL void nng_aio_finish(nng_aio *, int);
// nng_aio_defer is used to register a cancellation routine, and indicate
// that the operation will be completed asynchronously.  It must only be
// called once per operation on an aio, and must only be called by providers.
// If the operation is canceled by the consumer, the cancellation callback
// will be called.  The provider *must* still ensure that the nng_aio_finish()
// function is called EXACTLY ONCE.  If the operation cannot be canceled
// for any reason, the cancellation callback should do nothing.  The
// final argument is passed to the cancelfn.  The final argument of the
// cancellation function is the error number (will not be zero) corresponding
// to the reason for cancellation, e.g. NNG_ETIMEDOUT or NNG_ECANCELED.
typedef void (*nng_aio_cancelfn)(nng_aio *, void *, int);
NNG_DECL void nng_aio_defer(nng_aio *, nng_aio_cancelfn, void *);
// nng_aio_sleep does a "sleeping" operation, basically does nothing
// but wait for the specified number of milliseconds to expire, then
// calls the callback.  This returns 0, rather than NNG_ETIMEDOUT.
NNG_DECL void nng_sleep_aio(nng_duration, nng_aio *);
// Message API.
NNG_DECL int   nng_msg_alloc(nng_msg **, size_t);
NNG_DECL void  nng_msg_free(nng_msg *);
NNG_DECL int   nng_msg_realloc(nng_msg *, size_t);
NNG_DECL void *nng_msg_header(nng_msg *);
NNG_DECL size_t nng_msg_header_len(const nng_msg *);
NNG_DECL void * nng_msg_body(nng_msg *);
NNG_DECL size_t nng_msg_len(const nng_msg *);
NNG_DECL int    nng_msg_append(nng_msg *, const void *, size_t);
NNG_DECL int    nng_msg_insert(nng_msg *, const void *, size_t);
NNG_DECL int    nng_msg_trim(nng_msg *, size_t);
NNG_DECL int    nng_msg_chop(nng_msg *, size_t);
NNG_DECL int    nng_msg_header_append(nng_msg *, const void *, size_t);
NNG_DECL int    nng_msg_header_insert(nng_msg *, const void *, size_t);
NNG_DECL int    nng_msg_header_trim(nng_msg *, size_t);
NNG_DECL int    nng_msg_header_chop(nng_msg *, size_t);
NNG_DECL int    nng_msg_header_append_u16(nng_msg *, uint16_t);
NNG_DECL int    nng_msg_header_append_u32(nng_msg *, uint32_t);
NNG_DECL int    nng_msg_header_append_u64(nng_msg *, uint64_t);
NNG_DECL int    nng_msg_header_insert_u16(nng_msg *, uint16_t);
NNG_DECL int    nng_msg_header_insert_u32(nng_msg *, uint32_t);
NNG_DECL int    nng_msg_header_insert_u64(nng_msg *, uint64_t);
NNG_DECL int    nng_msg_header_chop_u16(nng_msg *, uint16_t *);
NNG_DECL int    nng_msg_header_chop_u32(nng_msg *, uint32_t *);
NNG_DECL int    nng_msg_header_chop_u64(nng_msg *, uint64_t *);
NNG_DECL int    nng_msg_header_trim_u16(nng_msg *, uint16_t *);
NNG_DECL int    nng_msg_header_trim_u32(nng_msg *, uint32_t *);
NNG_DECL int    nng_msg_header_trim_u64(nng_msg *, uint64_t *);
NNG_DECL int    nng_msg_append_u16(nng_msg *, uint16_t);
NNG_DECL int    nng_msg_append_u32(nng_msg *, uint32_t);
NNG_DECL int    nng_msg_append_u64(nng_msg *, uint64_t);
NNG_DECL int    nng_msg_insert_u16(nng_msg *, uint16_t);
NNG_DECL int    nng_msg_insert_u32(nng_msg *, uint32_t);
NNG_DECL int    nng_msg_insert_u64(nng_msg *, uint64_t);
NNG_DECL int    nng_msg_chop_u16(nng_msg *, uint16_t *);
NNG_DECL int    nng_msg_chop_u32(nng_msg *, uint32_t *);
NNG_DECL int    nng_msg_chop_u64(nng_msg *, uint64_t *);
NNG_DECL int    nng_msg_trim_u16(nng_msg *, uint16_t *);
NNG_DECL int    nng_msg_trim_u32(nng_msg *, uint32_t *);
NNG_DECL int    nng_msg_trim_u64(nng_msg *, uint64_t *);
NNG_DECL int    nng_msg_dup(nng_msg **, const nng_msg *);
NNG_DECL void   nng_msg_clear(nng_msg *);
NNG_DECL void   nng_msg_header_clear(nng_msg *);
NNG_DECL void   nng_msg_set_pipe(nng_msg *, nng_pipe);
NNG_DECL nng_pipe nng_msg_get_pipe(const nng_msg *);
NNG_DECL int      nng_msg_getopt(nng_msg *, int, void *, size_t *);
// Pipe API. Generally pipes are only "observable" to applications, but
// we do permit an application to close a pipe. This can be useful, for
// example during a connection notification, to disconnect a pipe that
// is associated with an invalid or untrusted remote peer.
NNG_DECL int nng_pipe_getopt(nng_pipe, const char *, void *, size_t *);
NNG_DECL int nng_pipe_getopt_bool(nng_pipe, const char *, bool *);
NNG_DECL int nng_pipe_getopt_int(nng_pipe, const char *, int *);
NNG_DECL int nng_pipe_getopt_ms(nng_pipe, const char *, nng_duration *);
NNG_DECL int nng_pipe_getopt_size(nng_pipe, const char *, size_t *);
NNG_DECL int nng_pipe_getopt_sockaddr(nng_pipe, const char *, nng_sockaddr *);
NNG_DECL int nng_pipe_getopt_uint64(nng_pipe, const char *, uint64_t *);
NNG_DECL int nng_pipe_getopt_ptr(nng_pipe, const char *, void **);
NNG_DECL int nng_pipe_getopt_string(nng_pipe, const char *, char **);
NNG_DECL int nng_pipe_close(nng_pipe);
NNG_DECL int nng_pipe_id(nng_pipe);
NNG_DECL nng_socket nng_pipe_socket(nng_pipe);
NNG_DECL nng_dialer nng_pipe_dialer(nng_pipe);
NNG_DECL nng_listener nng_pipe_listener(nng_pipe);
// Flags.
enum nng_flag_enum {
    NNG_FLAG_ALLOC    = 1, // Recv to allocate receive buffer.
    NNG_FLAG_NONBLOCK = 2  // Non-blocking operations.
};
// Options.
#define NNG_OPT_SOCKNAME "socket-name"
#define NNG_OPT_RAW "raw"
#define NNG_OPT_PROTO "protocol"
#define NNG_OPT_PROTONAME "protocol-name"
#define NNG_OPT_PEER "peer"
#define NNG_OPT_PEERNAME "peer-name"
#define NNG_OPT_RECVBUF "recv-buffer"
#define NNG_OPT_SENDBUF "send-buffer"
#define NNG_OPT_RECVFD "recv-fd"
#define NNG_OPT_SENDFD "send-fd"
#define NNG_OPT_RECVTIMEO "recv-timeout"
#define NNG_OPT_SENDTIMEO "send-timeout"
#define NNG_OPT_LOCADDR "local-address"
#define NNG_OPT_REMADDR "remote-address"
#define NNG_OPT_URL "url"
#define NNG_OPT_MAXTTL "ttl-max"
#define NNG_OPT_RECVMAXSZ "recv-size-max"
#define NNG_OPT_RECONNMINT "reconnect-time-min"
#define NNG_OPT_RECONNMAXT "reconnect-time-max"
// TLS options are only used when the underlying transport supports TLS.
// NNG_OPT_TLS_CONFIG is a pointer to an nng_tls_config object.  Generally
// this can used with endpoints, although once an endpoint is started, or
// once a configuration is used, the value becomes read-only. Note that
// when configuring the object, a hold is placed on the TLS configuration,
// using a reference count.  When retrieving the object, no such hold is
// placed, and so the caller must take care not to use the associated object
// after the endpoint it is associated with is closed.
#define NNG_OPT_TLS_CONFIG "tls-config"
// NNG_OPT_TLS_AUTH_MODE is a write-only integer (int) option that specifies
// whether peer authentication is needed.  The option can take one of the
// values of NNG_TLS_AUTH_MODE_NONE, NNG_TLS_AUTH_MODE_OPTIONAL, or
// NNG_TLS_AUTH_MODE_REQUIRED.  The default is typically NNG_TLS_AUTH_MODE_NONE
// for listeners, and NNG_TLS_AUTH_MODE_REQUIRED for dialers. If set to
// REQUIRED, then connections will be rejected if the peer cannot be verified.
// If set to OPTIONAL, then a verification step takes place, but the connection
// is still permitted.  (The result can be checked with NNG_OPT_TLS_VERIFIED).
#define NNG_OPT_TLS_AUTH_MODE "tls-authmode"
// NNG_OPT_TLS_CERT_KEY_FILE names a single file that contains a certificate
// and key identifying the endpoint.  This is a write-only value.  This can be
// set multiple times for times for different keys/certs corresponding to
// different algorithms on listeners, whereas dialers only support one.  The
// file must contain both cert and key as PEM blocks, and the key must
// not be encrypted.  (If more flexibility is needed, use the TLS configuration
// directly, via NNG_OPT_TLS_CONFIG.)
#define NNG_OPT_TLS_CERT_KEY_FILE "tls-cert-key-file"
// NNG_OPT_TLS_CA_FILE names a single file that contains certificate(s) for a
// CA, and optionally CRLs, which are used to validate the peer's certificate.
// This is a write-only value, but multiple CAs can be loaded by setting this
// multiple times.
#define NNG_OPT_TLS_CA_FILE "tls-ca-file"
// NNG_OPT_TLS_SERVER_NAME is a write-only string that can typically be
// set on dialers to check the CN of the server for a match.  This
// can also affect SNI (server name indication).  It usually has no effect
// on listeners.
#define NNG_OPT_TLS_SERVER_NAME "tls-server-name"
// NNG_OPT_TLS_VERIFIED returns a boolean indicating whether the peer has
// been verified (true) or not (false). Typically this is read-only, and
// only available for pipes. This option may return incorrect results if
// peer authentication is disabled with `NNG_TLS_AUTH_MODE_NONE`.
#define NNG_OPT_TLS_VERIFIED "tls-verified"
// TCP options.  These may be supported on various transports that use
// TCP underneath such as TLS, or not.
// TCP nodelay disables the use of Nagle, so that messages are sent
// as soon as data is available. This tends to reduce latency, but
// can come at the cost of extra messages being sent, and may have
// a detrimental effect on performance. For most uses, we recommend
// enabling this. (Disable it if you are on a very slow network.)
// This is a boolean.
#define NNG_OPT_TCP_NODELAY "tcp-nodelay"
// TCP keepalive causes the underlying transport to send keep-alive
// messages, and keep the session active. Keepalives are zero length
// messages with the ACK flag turned on. If we don't get an ACK back,
// then we know the other side is gone. This is useful for detecting
// dead peers, and is also used to prevent disconnections caused by
// middle boxes thinking the session has gone idle (e.g. keeping NAT
// state current). This is a boolean.
#define NNG_OPT_TCP_KEEPALIVE "tcp-keepalive"
// IPC options.  These will largely vary depending on the platform,
// as POSIX systems have very different options than Windows.
// Security Descriptor.  This option may only be set on listeners
// on the Windows platform, where the object is a pointer to a
// a Windows SECURITY_DESCRIPTOR.
#define NNG_OPT_IPC_SECURITY_DESCRIPTOR "ipc:security-descriptor"
// Permissions bits.  This option is only valid for listeners on
// POSIX platforms and others that honor UNIX style permission bits.
// Note that some platforms may not honor the permissions here, although
// at least Linux and macOS seem to do so.  Check before you rely on
// this for security.
#define NNG_OPT_IPC_PERMISSIONS "ipc:permissions"
// Peer UID.  This is only available on POSIX style systems.
#define NNG_OPT_IPC_PEER_UID "ipc:peer-uid"
// Peer GID (primary group).  This is only available on POSIX style systems.
#define NNG_OPT_IPC_PEER_GID "ipc:peer-gid"
// Peer process ID.  Available on Windows, Linux, and SunOS.
// In theory we could obtain this with the first message sent,
// but we have elected not to do this for now. (Nice RFE for a FreeBSD
// guru though.)
#define NNG_OPT_IPC_PEER_PID "ipc:peer-pid"
// Peer Zone ID.  Only on SunOS systems.  (Linux containers have no
// definable kernel identity; they are a user-land fabrication made up
// from various pieces of different namespaces. FreeBSD does have
// something called JailIDs, but it isn't obvious how to determine this,
// or even if processes can use IPC across jail boundaries.)
#define NNG_OPT_IPC_PEER_ZONEID "ipc:peer-zoneid"
// XXX: TBD: priorities, ipv4only
// Statistics. These are for informational purposes only, and subject
// to change without notice. The API for accessing these is stable,
// but the individual statistic names, values, and meanings are all
// subject to change.
// nng_stats_get takes a snapshot of the entire set of statistics.
// While the operation can be somewhat expensive (allocations), it
// is done in a way that minimizes impact to running operations.
// Note that the statistics are provided as tree, with parents
// used for grouping, and with child statistics underneath.  The
// top stat returned will be of type NNG_STAT_SCOPE with name "".
// Applications may choose to consider this root scope as "root", if
// the empty string is not suitable.
NNG_DECL int nng_stats_get(nng_stat **);
// nng_stats_free frees a previous list of snapshots.  This should only
// be called on the parent statistic that obtained via nng_stats_get.
NNG_DECL void nng_stats_free(nng_stat *);
// nng_stats_dump is a debugging function that dumps the entire set of
// statistics to stdout.
NNG_DECL void nng_stats_dump(nng_stat *);
// nng_stat_next finds the next sibling for the current stat.  If there
// are no more siblings, it returns NULL.
NNG_DECL nng_stat *nng_stat_next(nng_stat *);
// nng_stat_child finds the first child of the current stat.  If no children
// exist, then NULL is returned.
NNG_DECL nng_stat *nng_stat_child(nng_stat *);
// nng_stat_name is used to determine the name of the statistic.
// This is a human readable name.  Statistic names, as well as the presence
// or absence or semantic of any particular statistic are not part of any
// stable API, and may be changed without notice in future updates.
NNG_DECL const char *nng_stat_name(nng_stat *);
// nng_stat_type is used to determine the type of the statistic.
// At present, only NNG_STAT_TYPE_LEVEL and and NNG_STAT_TYPE_COUNTER
// are defined.  Counters generally increment, and therefore changes in the
// value over time are likely more interesting than the actual level.  Level
// values reflect some absolute state however, and should be presented to the
// user as is.
NNG_DECL int nng_stat_type(nng_stat *);
enum nng_stat_type_enum {
    NNG_STAT_SCOPE   = 0, // Stat is for scoping, and carries no value
    NNG_STAT_LEVEL   = 1, // Numeric "absolute" value, diffs meaningless
    NNG_STAT_COUNTER = 2, // Incrementing value (diffs are meaningful)
    NNG_STAT_STRING  = 3, // Value is a string
    NNG_STAT_BOOLEAN = 4, // Value is a boolean
    NNG_STAT_ID      = 5, // Value is a numeric ID
};
// nng_stat_unit provides information about the unit for the statistic,
// such as NNG_UNIT_BYTES or NNG_UNIT_BYTES.  If no specific unit is
// applicable, such as a relative priority, then NN_UNIT_NONE is returned.
NNG_DECL int nng_stat_unit(nng_stat *);
enum nng_unit_enum {
    NNG_UNIT_NONE     = 0, // No special units
    NNG_UNIT_BYTES    = 1, // Bytes, e.g. bytes sent, etc.
    NNG_UNIT_MESSAGES = 2, // Messages, one per message
    NNG_UNIT_MILLIS   = 3, // Milliseconds
    NNG_UNIT_EVENTS   = 4  // Some other type of event
};
// nng_stat_value returns returns the actual value of the statistic.
// Statistic values reflect their value at the time that the corresponding
// snapshot was updated, and are undefined until an update is performed.
NNG_DECL uint64_t nng_stat_value(nng_stat *);
// nng_stat_string returns the string associated with a string statistic,
// or NULL if the statistic is not part of the string.  The value returned
// is valid until the associated statistic is freed.
NNG_DECL const char *nng_stat_string(nng_stat *);
// nng_stat_desc returns a human readable description of the statistic.
// This may be useful for display in diagnostic interfaces, etc.
NNG_DECL const char *nng_stat_desc(nng_stat *);
// nng_stat_timestamp returns a timestamp (milliseconds) when the statistic
// was captured.  The base offset is the same as used by nng_clock().
// We don't use nng_time though, because that's in the supplemental header.
NNG_DECL uint64_t nng_stat_timestamp(nng_stat *);
// Device functionality.  This connects two sockets together in a device,
// which means that messages from one side are forwarded to the other.
NNG_DECL int nng_device(nng_socket, nng_socket);
// Symbol name and visibility.  TBD.  The only symbols that really should
// be directly exported to runtimes IMO are the option symbols.  And frankly
// they have enough special logic around them that it might be best not to
// automate the promotion of them to other APIs.  This is an area open
// for discussion.
// Error codes.  These generally have different values from UNIX errnos,
// so take care about converting them.  The one exception is that 0 is
// unambigiously "success".
//
// NNG_SYSERR is a special code, which allows us to wrap errors from the
// underlying operating system.  We generally prefer to map errors to one
// of the above, but if we cannot, then we just encode an error this way.
// The bit is large enough to accommodate all known UNIX and Win32 error
// codes.  We try hard to match things semantically to one of our standard
// errors.  For example, a connection reset or aborted we treat as a
// closed connection, because that's basically what it means.  (The remote
// peer closed the connection.)  For certain kinds of resource exhaustion
// we treat it the same as memory.  But for files, etc. that's OS-specific,
// and we use the generic below.  Some of the above error codes we use
// internally, and the application should never see (e.g. NNG_EINTR).
//
// NNG_ETRANERR is like ESYSERR, but is used to wrap transport specific
// errors, from different transports.  It should only be used when none
// of the other options are available.
enum nng_errno_enum {
    NNG_EINTR        = 1,
    NNG_ENOMEM       = 2,
    NNG_EINVAL       = 3,
    NNG_EBUSY        = 4,
    NNG_ETIMEDOUT    = 5,
    NNG_ECONNREFUSED = 6,
    NNG_ECLOSED      = 7,
    NNG_EAGAIN       = 8,
    NNG_ENOTSUP      = 9,
    NNG_EADDRINUSE   = 10,
    NNG_ESTATE       = 11,
    NNG_ENOENT       = 12,
    NNG_EPROTO       = 13,
    NNG_EUNREACHABLE = 14,
    NNG_EADDRINVAL   = 15,
    NNG_EPERM        = 16,
    NNG_EMSGSIZE     = 17,
    NNG_ECONNABORTED = 18,
    NNG_ECONNRESET   = 19,
    NNG_ECANCELED    = 20,
    NNG_ENOFILES     = 21,
    NNG_ENOSPC       = 22,
    NNG_EEXIST       = 23,
    NNG_EREADONLY    = 24,
    NNG_EWRITEONLY   = 25,
    NNG_ECRYPTO      = 26,
    NNG_EPEERAUTH    = 27,
    NNG_ENOARG       = 28,
    NNG_EAMBIGUOUS   = 29,
    NNG_EBADTYPE     = 30,
    NNG_EINTERNAL    = 1000,
    NNG_ESYSERR      = 0x10000000,
    NNG_ETRANERR     = 0x20000000
};
// URL support.  We frequently want to process a URL, and these methods
// give us a convenient way of doing so.
typedef struct nng_url {
    char *u_rawurl;   // never NULL
    char *u_scheme;   // never NULL
    char *u_userinfo; // will be NULL if not specified
    char *u_host;     // including colon and port
    char *u_hostname; // name only, will be "" if not specified
    char *u_port;     // port, will be "" if not specified
    char *u_path;     // path, will be "" if not specified
    char *u_query;    // without '?', will be NULL if not specified
    char *u_fragment; // without '#', will be NULL if not specified
    char *u_requri;   // includes query and fragment, "" if not specified
} nng_url;
// nng_url_parse parses a URL string into a structured form.
// Note that the u_port member will be filled out with a numeric
// port if one isn't specified and a default port is appropriate for
// the scheme.  The URL structure is allocated, along with individual
// members.  It can be freed with nng_url_free.
NNG_DECL int nng_url_parse(nng_url **, const char *);
// nng_url_free frees a URL structure that was created by nng_url_parse9().
NNG_DECL void nng_url_free(nng_url *);
// nng_url_clone clones a URL structure.
NNG_DECL int nng_url_clone(nng_url **, const nng_url *);
// nng_version returns the library version as a human readable string.
NNG_DECL const char *nng_version(void);
#ifdef __cplusplus
}
#endif
#endif // NNG_H
aBuild/nng/include/nng/protocol/bus0/bus.h
New file
@@ -0,0 +1,34 @@
//
// 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.
//
#ifndef NNG_PROTOCOL_BUS0_BUS_H
#define NNG_PROTOCOL_BUS0_BUS_H
#ifdef __cplusplus
extern "C" {
#endif
NNG_DECL int nng_bus0_open(nng_socket *);
NNG_DECL int nng_bus0_open_raw(nng_socket *);
#ifndef nng_bus_open
#define nng_bus_open nng_bus0_open
#endif
#ifndef nng_bus_open_raw
#define nng_bus_open_raw nng_bus0_open_raw
#endif
#ifdef __cplusplus
}
#endif
#endif // NNG_PROTOCOL_BUS0_BUS_H
aBuild/nng/include/nng/protocol/pair0/pair.h
New file
@@ -0,0 +1,34 @@
//
// 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.
//
#ifndef NNG_PROTOCOL_PAIR0_PAIR_H
#define NNG_PROTOCOL_PAIR0_PAIR_H
#ifdef __cplusplus
extern "C" {
#endif
NNG_DECL int nng_pair0_open(nng_socket *);
NNG_DECL int nng_pair0_open_raw(nng_socket *);
#ifndef nng_pair_open
#define nng_pair_open nng_pair0_open
#endif
#ifndef nng_pair_open_raw
#define nng_pair_open_raw nng_pair0_open_raw
#endif
#ifdef __cplusplus
}
#endif
#endif // NNG_PROTOCOL_PAIR0_PAIR_H
aBuild/nng/include/nng/protocol/pair1/pair.h
New file
@@ -0,0 +1,35 @@
//
// 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.
//
#ifndef NNG_PROTOCOL_PAIR1_PAIR_H
#define NNG_PROTOCOL_PAIR1_PAIR_H
#ifdef __cplusplus
extern "C" {
#endif
NNG_DECL int nng_pair1_open(nng_socket *);
NNG_DECL int nng_pair1_open_raw(nng_socket *);
#ifndef nng_pair_open
#define nng_pair_open nng_pair1_open
#endif
#ifndef nng_pair_open_raw
#define nng_pair_open_raw nng_pair1_open_raw
#endif
#define NNG_OPT_PAIR1_POLY "pair1:polyamorous"
#ifdef __cplusplus
}
#endif
#endif // NNG_PROTOCOL_PAIR1_PAIR_H
aBuild/nng/include/nng/protocol/pipeline0/pull.h
New file
@@ -0,0 +1,33 @@
//
// 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.
//
#ifndef NNG_PROTOCOL_PIPELINE0_PULL_H
#define NNG_PROTOCOL_PIPELINE0_PULL_H
#ifdef __cplusplus
extern "C" {
#endif
NNG_DECL int nng_pull0_open(nng_socket *);
NNG_DECL int nng_pull0_open_raw(nng_socket *);
#ifndef nng_pull_open
#define nng_pull_open nng_pull0_open
#endif
#ifndef nng_pull_open_raw
#define nng_pull_open_raw nng_pull0_open_raw
#endif
#ifdef __cplusplus
}
#endif
#endif // NNG_PROTOCOL_PIPELINE0_PULL_H
aBuild/nng/include/nng/protocol/pipeline0/push.h
New file
@@ -0,0 +1,33 @@
//
// 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.
//
#ifndef NNG_PROTOCOL_PIPELINE0_PUSH_H
#define NNG_PROTOCOL_PIPELINE0_PUSH_H
#ifdef __cplusplus
extern "C" {
#endif
NNG_DECL int nng_push0_open(nng_socket *);
NNG_DECL int nng_push0_open_raw(nng_socket *);
#ifndef nng_push_open
#define nng_push_open nng_push0_open
#endif
#ifndef nng_push_open_raw
#define nng_push_open_raw nng_push0_open_raw
#endif
#ifdef __cplusplus
}
#endif
#endif // NNG_PROTOCOL_PIPELINE0_PUSH_H
aBuild/nng/include/nng/protocol/pubsub0/pub.h
New file
@@ -0,0 +1,33 @@
//
// 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.
//
#ifndef NNG_PROTOCOL_PUBSUB0_PUB_H
#define NNG_PROTOCOL_PUBSUB0_PUB_H
#ifdef __cplusplus
extern "C" {
#endif
NNG_DECL int nng_pub0_open(nng_socket *);
NNG_DECL int nng_pub0_open_raw(nng_socket *);
#ifndef nng_pub_open
#define nng_pub_open nng_pub0_open
#endif
#ifndef nng_pub_open_raw
#define nng_pub_open_raw nng_pub0_open_raw
#endif
#ifdef __cplusplus
}
#endif
#endif // NNG_PROTOCOL_PUBSUB0_PUB_H
aBuild/nng/include/nng/protocol/pubsub0/sub.h
New file
@@ -0,0 +1,37 @@
//
// 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.
//
#ifndef NNG_PROTOCOL_PUBSUB0_SUB_H
#define NNG_PROTOCOL_PUBSUB0_SUB_H
#ifdef __cplusplus
extern "C" {
#endif
NNG_DECL int nng_sub0_open(nng_socket *);
NNG_DECL int nng_sub0_open_raw(nng_socket *);
#ifndef nng_sub_open
#define nng_sub_open nng_sub0_open
#endif
#ifndef nng_sub_open_raw
#define nng_sub_open_raw nng_sub0_open_raw
#endif
#define NNG_OPT_SUB_SUBSCRIBE "sub:subscribe"
#define NNG_OPT_SUB_UNSUBSCRIBE "sub:unsubscribe"
#ifdef __cplusplus
}
#endif
#endif // NNG_PROTOCOL_PUBSUB0_SUB_H
aBuild/nng/include/nng/protocol/reqrep0/rep.h
New file
@@ -0,0 +1,33 @@
//
// 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.
//
#ifndef NNG_PROTOCOL_REQREP0_REP_H
#define NNG_PROTOCOL_REQREP0_REP_H
#ifdef __cplusplus
extern "C" {
#endif
NNG_DECL int nng_rep0_open(nng_socket *);
NNG_DECL int nng_rep0_open_raw(nng_socket *);
#ifndef nng_rep_open
#define nng_rep_open nng_rep0_open
#endif
#ifndef nng_rep_open
#define nng_rep_open_raw nng_rep0_open_raw
#endif
#ifdef __cplusplus
}
#endif
#endif // NNG_PROTOCOL_REQREP0_REP_H
aBuild/nng/include/nng/protocol/reqrep0/req.h
New file
@@ -0,0 +1,34 @@
//
// 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.
//
#ifndef NNG_PROTOCOL_REQREP0_REQ_H
#define NNG_PROTOCOL_REQREP0_REQ_H
#ifdef __cplusplus
extern "C" {
#endif
NNG_DECL int nng_req0_open(nng_socket *);
NNG_DECL int nng_req0_open_raw(nng_socket *);
#ifndef nng_req_open
#define nng_req_open nng_req0_open
#endif
#ifndef nng_req_open_raw
#define nng_req_open_raw nng_req0_open_raw
#endif
#define NNG_OPT_REQ_RESENDTIME "req:resend-time"
#ifdef __cplusplus
}
#endif
#endif // NNG_PROTOCOL_REQREP0_REQ_H
aBuild/nng/include/nng/protocol/survey0/respond.h
New file
@@ -0,0 +1,33 @@
//
// 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.
//
#ifndef NNG_PROTOCOL_SURVEY0_RESPOND_H
#define NNG_PROTOCOL_SURVEY0_RESPOND_H
#ifdef __cplusplus
extern "C" {
#endif
NNG_DECL int nng_respondent0_open(nng_socket *);
NNG_DECL int nng_respondent0_open_raw(nng_socket *);
#ifndef nng_respondent_open
#define nng_respondent_open nng_respondent0_open
#endif
#ifndef nng_respondent_open_raw
#define nng_respondent_open_raw nng_respondent0_open_raw
#endif
#ifdef __cplusplus
}
#endif
#endif // NNG_PROTOCOL_SURVEY0_RESPOND_H
aBuild/nng/include/nng/protocol/survey0/survey.h
New file
@@ -0,0 +1,35 @@
//
// 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.
//
#ifndef NNG_PROTOCOL_SURVEY0_SURVEY_H
#define NNG_PROTOCOL_SURVEY0_SURVEY_H
#ifdef __cplusplus
extern "C" {
#endif
NNG_DECL int nng_surveyor0_open(nng_socket *);
NNG_DECL int nng_surveyor0_open_raw(nng_socket *);
#ifndef nng_surveyor_open
#define nng_surveyor_open nng_surveyor0_open
#endif
#ifndef nng_surveyor_open_raw
#define nng_surveyor_open_raw nng_surveyor0_open_raw
#endif
#define NNG_OPT_SURVEYOR_SURVEYTIME "surveyor:survey-time"
#ifdef __cplusplus
}
#endif
#endif // NNG_PROTOCOL_SURVEY0_SURVEY_H
aBuild/nng/include/nng/supplemental/http/http.h
New file
@@ -0,0 +1,528 @@
//
// 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.
//
#ifndef NNG_SUPPLEMENTAL_HTTP_HTTP_H
#define NNG_SUPPLEMENTAL_HTTP_HTTP_H
// HTTP API.  Only present if HTTP support compiled into the library.
// Functions will return NNG_ENOTSUP (or NULL or 0 as appropriate)
// if the library lacks support for HTTP.
#ifdef __cplusplus
extern "C" {
#endif
#include <stdint.h>
struct nng_tls_config;
// HTTP status codes.  This list is not exhaustive.
enum nng_http_status {
    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,
};
// nng_http_req represents an HTTP request.
typedef struct nng_http_req nng_http_req;
// nng_http_req_alloc creates a vanilla HTTP request object.  The object is
// initialized with the given URL object for an HTTP/1.1 GET request by
// default. It also adds the Host: header required for HTTP/1.1.  If the
// url is NULL, then the uri and Host: header are uninitialized, and will
// need to be set explicitly.
NNG_DECL int nng_http_req_alloc(nng_http_req **, const nng_url *);
// nng_http_req_free frees an HTTP request object.
NNG_DECL void nng_http_req_free(nng_http_req *);
// nng_http_req_get_method returns the method.
NNG_DECL const char *nng_http_req_get_method(nng_http_req *);
// nng_http_req_get_version returns the version, usually HTTP/1.1.
NNG_DECL const char *nng_http_req_get_version(nng_http_req *);
// nng_http_req_get_uri returns the "abs-uri", which is URL without
// the scheme, host, or port.
NNG_DECL const char *nng_http_req_get_uri(nng_http_req *);
// nng_http_req_set_header sets an HTTP header, replacing any previous value
// that might have been present.
NNG_DECL int nng_http_req_set_header(
    nng_http_req *, const char *, const char *);
// nng_http_req_add_header adds an HTTP header, without disrupting any other
// with the same name that might have been present.
NNG_DECL int nng_http_req_add_header(
    nng_http_req *, const char *, const char *);
// nng_http_req_del_header deletes all occurrences of a named header.
NNG_DECL int nng_http_req_del_header(nng_http_req *, const char *);
// nng_http_req_get_header looks up a header with the named, returns NULL
// if not found.
NNG_DECL const char *nng_http_req_get_header(nng_http_req *, const char *);
// nng_http_req_set_method is used to change the method of a request.
// The method should be an upper case HTTP method, like POST, or DELETE.
// Null sets the default ("GET").
NNG_DECL int nng_http_req_set_method(nng_http_req *, const char *);
// nng_http_req_set_version is used to change the version of a request.
// Normally the version is "HTTP/1.1".  Note that the framework does
// not support HTTP/2 at all.  Null sets the default ("HTTP/1.1").
NNG_DECL int nng_http_req_set_version(nng_http_req *, const char *);
// nng_http_req_set_uri is used to change the URI of a request.  This
// should be an "abs-uri", that is a path, plus query and fragment if
// needed.  The scheme, host, and port don't belong here.  The URI should
// start with a leading '/' per HTTP.
NNG_DECL int nng_http_req_set_uri(nng_http_req *, const char *);
// nng_http_req_set_data adds entity data to the request.  The
// data object must persist (so only really useful for static data).
// The content-length header is updated as well, but the caller should
// probably set the content-type header.
NNG_DECL int nng_http_req_set_data(nng_http_req *, const void *, size_t);
// nng_http_req_copy_data adds entity data to the response. A private
// copy of the data is made (will be freed with the request).
// The content-length header is updated as well, but the caller should
// probably set the content-type header.
NNG_DECL int nng_http_req_copy_data(nng_http_req *, const void *, size_t);
// nng_http_req_get_data gets the data for the response.
NNG_DECL void nng_http_req_get_data(nng_http_req *, void **, size_t *);
// nng_http_res represents an HTTP response.
typedef struct nng_http_res nng_http_res;
// nng_http_res_alloc creates a vanilla HTTP response object.  The object is
// initialized for an HTTP/1.1 200 OK response by default.
NNG_DECL int nng_http_res_alloc(nng_http_res **);
// nng_http_res_alloc_error creates an error HTTP response object.  The object
// is initialized for an HTTP/1.1 response, and contains an associated
// generic HTML error page.
NNG_DECL int nng_http_res_alloc_error(nng_http_res **, uint16_t);
// nng_http_res_free frees an HTTP response object.
NNG_DECL void nng_http_res_free(nng_http_res *);
// nng_http_res_get_status returns the HTTP status code from the server.
NNG_DECL uint16_t nng_http_res_get_status(nng_http_res *);
// nng_http_res_set_status sets the HTTP status code.
NNG_DECL int nng_http_res_set_status(nng_http_res *, uint16_t);
// nng_http_res_get_reason returns the human readable status message
// that the server responds (or responded) with.
NNG_DECL const char *nng_http_res_get_reason(nng_http_res *);
// nng_http_res_set_rason sets the human readable status message.
// NULL means that a default reason is used based on the status code.
NNG_DECL int nng_http_res_set_reason(nng_http_res *, const char *);
// nng_http_res_set_header sets an HTTP header, replacing any previous value
// that might have been present.
NNG_DECL int nng_http_res_set_header(
    nng_http_res *, const char *, const char *);
// nng_http_res_add_header adds an HTTP header, without disrupting any other
// with the same name that might have been present.
NNG_DECL int nng_http_res_add_header(
    nng_http_res *, const char *, const char *);
// nng_http_res_del_header deletes all occurrences of a named header.
NNG_DECL int nng_http_res_del_header(nng_http_res *, const char *);
// nng_http_res_get_header looks up a header with the named, returns NULL
// if not found.
NNG_DECL const char *nng_http_res_get_header(nng_http_res *, const char *);
// nng_http_res_set_version is used to change the version of a response.
// Normally the version is "HTTP/1.1".  Note that the framework does
// not support HTTP/2 at all.  NULL sets the default ("HTTP/1.1").
NNG_DECL int nng_http_res_set_version(nng_http_res *, const char *);
// nng_http_res_get_version returns the version, usually HTTP/1.1.
NNG_DECL const char *nng_http_res_get_version(nng_http_res *);
// nng_http_res_get_data gets the data for the response.
NNG_DECL void nng_http_res_get_data(nng_http_res *, void **, size_t *);
// nng_http_res_set_data adds entity data to the response.  The
// data object must persist (so only really useful for static data).
// The content-length header is updated as well, but the caller should
// probably set the content-type header.
NNG_DECL int nng_http_res_set_data(nng_http_res *, const void *, size_t);
// nng_http_res_copy_data adds entity data to the response. A private
// copy of the data is made (will be freed with the request).
// The content-length header is updated as well, but the caller should
// probably set the content-type header.
NNG_DECL int nng_http_res_copy_data(nng_http_res *, const void *, size_t);
// An nng_http_conn represents an underlying "connection".  It may be
// a TCP channel, or a TLS channel, but the main thing is that this is
// normally only used for exchanging HTTP requests and responses.
typedef struct nng_http_conn nng_http_conn;
// nng_http_conn_close closes the underlying channel.  Applications should
// not use this channel after this operation is performed.
NNG_DECL void nng_http_conn_close(nng_http_conn *);
// nng_http_conn_read attempts to read data from the connection.  This
// completes as soon as at least one byte is read; it does not wait
// for the entire aio to be filled.
NNG_DECL void nng_http_conn_read(nng_http_conn *, nng_aio *);
// nng_http_conn_read_all is like nng_http_conn_read, but it does not
// finish until either all the requested data is read, or an error occurs.
NNG_DECL void nng_http_conn_read_all(nng_http_conn *, nng_aio *);
// nng_http_conn_write attempts to write data, but it can write less
// than the amount requested. (It completes as soon as at least one
// byte is written.)
NNG_DECL void nng_http_conn_write(nng_http_conn *, nng_aio *);
// nng_http_conn_write_all is like nng_http_conn_write, but it does not
// finish until either all the requested data is written, or an error occurs.
NNG_DECL void nng_http_conn_write_all(nng_http_conn *, nng_aio *);
// nng_http_conn_write_req writes the entire request.  It will also write any
// data that has been attached.
NNG_DECL void nng_http_conn_write_req(
    nng_http_conn *, nng_http_req *, nng_aio *);
// nng_http_conn_write_res writes the entire response.  It will also write any
// data that has been attached.
NNG_DECL void nng_http_conn_write_res(
    nng_http_conn *, nng_http_res *, nng_aio *);
// nng_http_conn_read_req reads an entire request, EXCEPT for any entity
// data.  The caller is responsible for processing the headers in the request
// and reading any submitted entity data itself.
NNG_DECL void nng_http_conn_read_req(
    nng_http_conn *, nng_http_req *, nng_aio *);
// nng_http_conn_read_res reads an entire response, EXCEPT for any entity
// data.  The caller is responsible for processing the headers in the response
// and reading any submitted entity data itself.
NNG_DECL void nng_http_conn_read_res(
    nng_http_conn *, nng_http_res *, nng_aio *);
// nng_http_req_reset resets the request to an initially allocated state.
NNG_DECL void nng_http_req_reset(nng_http_req *);
// nng_http_res_reset resets the response to an initially allocated state.
NNG_DECL void nng_http_res_reset(nng_http_res *);
// nng_http_handler is a handler used on the server side to handle HTTP
// requests coming into a specific URL.
typedef struct nng_http_handler nng_http_handler;
// nng_http_handler_alloc creates a server handler object, for the supplied
// absolute URI (path only) with the callback.  By default the handler
// is assumed to handle only GET requests (and implictly HEAD requests
// as well.)
//
// Note that methods which modify a handler cannot be called while the handler
// is registered with the server, and that a handler can only be registered
// once per server.
//
// The callback function will receive the following arguments (via
// nng_aio_get_input(): nng_http_request *, nng_http_handler *, and
// nng_http_conn *.  The first is a request object, for convenience.
// The second is the handler, from which the callback can obtain any other
// data it has set.  The final is the http connection, which can be used
// to hijack the session.
//
// Upon completion, the handler should store an nng_http_res * as the
// first output using nng_aio_set_output.  If it does not do so, or supplies
// NULL, then it must send a response itself.
//
// The callback should return 0 in most circumstances; if it returns anything
// other than 0 then the connection is terminated (after possibly sending
// a 500 error response to the client.)
NNG_DECL int nng_http_handler_alloc(
    nng_http_handler **, const char *, void (*)(nng_aio *));
// nng_http_handler_free frees the handler. This actually just drops a
// reference count on the handler, as it may be in use by an existing
// server.  The server will also call this when it is destroyed.
NNG_DECL void nng_http_handler_free(nng_http_handler *);
// nng_http_handler_alloc_file creates a "file" based handler, that
// serves up static content from the given file path.  The content-type
// supplied is determined from the file name using a simple built-in map.
NNG_DECL int nng_http_handler_alloc_file(
    nng_http_handler **, const char *, const char *);
// nng_http_handler_alloc_static creates a static-content handler.
// The last argument is the content-type, which may be NULL (in which case
// "application/octet-stream" is assumed.)
NNG_DECL int nng_http_handler_alloc_static(
    nng_http_handler **, const char *, const void *, size_t, const char *);
// nng_http_handler_alloc_redirect creates an HTTP redirect handler.
// The status is given, along with the new URL.  If the status is 0,
// then 301 will be used instead.
NNG_DECL int nng_http_handler_alloc_redirect(
    nng_http_handler **, const char *, uint16_t, const char *);
// nng_http_handler_alloc_file creates a "directory" based handler, that
// serves up static content from the given directory tree.  Directories
// that contain an index.html or index.htm file use that file for the
// directory content, otherwise a suitable error page is returned (the server
// does not generate index pages automatically.)  The content-type for
// files is determined from the file name using a simple built-in map.
NNG_DECL int nng_http_handler_alloc_directory(
    nng_http_handler **, const char *, const char *);
// nng_http_handler_set_method sets the method that the handler will be
// called for.  By default this is GET.  If NULL is supplied for the
// method, then the handler is executed regardless of method, and must
// inspect the method itself.
NNG_DECL int nng_http_handler_set_method(nng_http_handler *, const char *);
// nng_http_handler_set_host sets the Host: that the handler will be
// called for (to allow for virtual hosts).  If the value is NULL (the
// default, then the Host: header is not considered when matching the
// handler.)  Note that the Host: header must match *exactly* (except
// that case is not considered.)
NNG_DECL int nng_http_handler_set_host(nng_http_handler *, const char *);
// nng_http_handler_collect_body is used to indicate the server should
// check for, and process, data sent by the client, which will be attached
// to the request.  If this is false, then the handler will need to check
// for and process any content data.  By default the server will accept
// up to 1MB.  If the client attempts to send more data than requested,
// then a 400 Bad Request will be sent back to the client.  To set an
// unlimited value, use (size_t)-1.  To preclude the client from sending
// *any* data, use 0.  (The static and file handlers use 0 by default.)
NNG_DECL int nng_http_handler_collect_body(nng_http_handler *, bool, size_t);
// nng_http_handler_set_tree indicates that the handler is being registered
// for a heirarchical tree, rather than just a single path, so it will be
// called for all child paths supplied.  By default the handler is only
// called for an exact path match.
NNG_DECL int nng_http_handler_set_tree(nng_http_handler *);
// nng_http_handler_set_data is used to store additional data, along with
// a possible clean up routine.  (The clean up is a custom deallocator and
// will be called with the supplied data as an argument, when the handler
// is being deallocated.)
NNG_DECL int nng_http_handler_set_data(
    nng_http_handler *, void *, void (*)(void *));
// nng_http_handler_get_data returns the data that was previously stored.
NNG_DECL void *nng_http_handler_get_data(nng_http_handler *);
// nng_http_server is a handle to an HTTP server instance.  Servers
// only serve a single port / address at this time.
typedef struct nng_http_server nng_http_server;
// nng_http_server_hold gets a server structure, using the address determined
// from the URL.  If a server already exists, then a hold is placed on it, and
// that instance is returned.  If no such server exists, then a new instance
// is created.
NNG_DECL int nng_http_server_hold(nng_http_server **, const nng_url *);
// nng_http_server_release releases the hold on the server.  If this is the
// last instance of the server, then it is shutdown and resources are freed.
NNG_DECL void nng_http_server_release(nng_http_server *);
// nng_http_server_start starts the server handling HTTP.  Once this is
// called, it will not be possible to change certain parameters (such as
// any TLS configuration).
NNG_DECL int nng_http_server_start(nng_http_server *);
// nng_http_server_stop stops the server.  No new client connections are
// accepted after this returns.  Once a server is stopped fully, the
// instance will no longer be returned by nng_http_server_hold, as the
// server may not be reused.
NNG_DECL void nng_http_server_stop(nng_http_server *);
// nng_http_server_add_handler registers a handler on the server.
// This function will return NNG_EADDRINUSE if a conflicting handler
// is already registered (i.e. a handler with the same value for Host,
// Method, and URL.)
NNG_DECL int nng_http_server_add_handler(
    nng_http_server *, nng_http_handler *);
// nni_http_del_handler removes the given handler.  The caller is
// responsible for finalizing it afterwards.  If the handler was not found
// (not registered), NNG_ENOENT is returned.  In this case it is unsafe
// to make assumptions about the validity of the handler.
NNG_DECL int nng_http_server_del_handler(
    nng_http_server *, nng_http_handler *);
// nng_http_server_set_tls adds a TLS configuration to the server,
// and enables the use of it.  This returns NNG_EBUSY if the server is
// already started.   This wipes out the entire TLS configuration on the
// server client, so the caller must have configured it reasonably.
// This API is not recommended unless the caller needs complete control
// over the TLS configuration.
NNG_DECL int nng_http_server_set_tls(
    nng_http_server *, struct nng_tls_config *);
// nng_http_server_get_tls obtains the TLS configuration if one is present,
// or returns NNG_EINVAL.  The TLS configuration is invalidated if the
// nng_http_server_set_tls function is called, so be careful.
NNG_DECL int nng_http_server_get_tls(
    nng_http_server *, struct nng_tls_config **);
// nng_http_server_set_error_page sets a custom error page (HTML) content
// to be sent for the given error code.  This is used when the error is
// generated internally by the framework, or when the application returns
// the response back to the server via the handler's aio, and the response
// was allocated with nng_http_res_alloc_error.  If the response was not
// allocated this way, or the application writes the response itself instead
// of letting the server do so, then this setting will be ignored.
NNG_DECL int nng_http_server_set_error_page(
    nng_http_server *, uint16_t, const char *);
// nng_http_server_set_error_file works like nng_http_server_error_page,
// except that the content is loaded from the named file path.  The contents
// are loaded at the time this function is called, so this function should be
// called anytime the contents of the named file have changed.
NNG_DECL int nng_http_server_set_error_file(
    nng_http_server *, uint16_t, const char *);
// nng_http_server_res_error takes replaces the body of the response with
// a custom error page previously set for the server, using the status
// of the response.  The response must have the status set first using
// nng_http_res_set_status or implicitly via nng_http_res_alloc_error.
NNG_DECL int nng_http_server_res_error(nng_http_server *, nng_http_res *);
// nng_http_hijack is intended to be called by a handler that wishes to
// take over the processing of the HTTP session -- usually to change protocols
// (such as in the case of websocket).  The caller is responsible for the
// final disposal of the associated nng_http_conn.  Also, this completely
// disassociates the http session from the server, so the server may be
// stopped or destroyed without affecting the hijacked session.  Note also
// that the hijacker will need to issue any HTTP reply itself.  Finally,
// when a session is hijacked, the caller is also responsible for disposing
// of the request structure.  (Some hijackers may keep the request for
// further processing.)
NNG_DECL int nng_http_hijack(nng_http_conn *);
// nng_http_client represents a "client" object.  Clients can be used
// to create HTTP connections.  At present, connections are not cached
// or reused, but that could change in the future.
typedef struct nng_http_client nng_http_client;
// nng_http_client_alloc allocates a client object, associated with
// the given URL.
NNG_DECL int nng_http_client_alloc(nng_http_client **, const nng_url *);
// nng_http_client_free frees the client.  Connections created by the
// the client are not necessarily closed.
NNG_DECL void nng_http_client_free(nng_http_client *);
// nng_http_client_set_tls sets the TLS configuration.  This wipes out
// the entire TLS configuration on the client, so the caller must have
// configured it reasonably.  This API is not recommended unless the
// caller needs complete control over the TLS configuration.
NNG_DECL int nng_http_client_set_tls(
    nng_http_client *, struct nng_tls_config *);
// nng_http_client_get_tls obtains the TLS configuration if one is present,
// or returns NNG_EINVAL.  The supplied TLS configuration object may
// be invalidated by any future calls to nni_http_client_set_tls.
NNG_DECL int nng_http_client_get_tls(
    nng_http_client *, struct nng_tls_config **);
// nng_http_client_connect establishes a new connection with the server
// named in the URL used when the client was created.  Once the connection
// is established, the associated nng_http_conn object pointer is returned
// in the first (index 0) output for the aio.
NNG_DECL void nng_http_client_connect(nng_http_client *, nng_aio *);
// nng_http_conn_transact is used to perform a round-trip exchange (i.e. a
// single HTTP transaction).  It will not automatically close the connection,
// unless some kind of significant error occurs.  The caller should close
// the connection if the aio does not complete successfully.
// Note that this will fail with NNG_ENOTSUP if the server attempts to reply
// with a chunked transfer encoding.
NNG_DECL void nng_http_conn_transact(
    nng_http_conn *, nng_http_req *, nng_http_res *, nng_aio *);
// nng_http_client_transact is used to execute a single transaction to a
// server. The connection is opened, and will be closed when the transaction is
// complete.  Note that this will fail with NNG_ENOTSUP if the server attempts
// to reply with a chunked transfer encoding.
NNG_DECL void nng_http_client_transact(
    nng_http_client *, nng_http_req *, nng_http_res *, nng_aio *);
#ifdef __cplusplus
}
#endif
#endif // NNG_H
aBuild/nng/include/nng/supplemental/ipc/ipc.h
New file
@@ -0,0 +1,133 @@
//
// Copyright 2018 Staysail Systems, Inc. <info@staysail.tech>
// Copyright 2018 Capitar IT Group BV <info@capitar.com>
// Copyright 2018 Devolutions <info@devolutions.net>
//
// 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.
//
#ifndef NNG_SUPPLEMENTAL_IPC_IPC_H
#define NNG_SUPPLEMENTAL_IPC_IPC_H
#ifdef __cplusplus
extern "C" {
#endif
#include <stddef.h>
#include <stdint.h>
#include <nng/nng.h>
#include <nng/transport/ipc/ipc.h> // For IPC option names.
// This is our "public" IPC API.  This allows applications to access
// basic IPC functions, using our AIO framework.  Most applications will
// not need this.  This supports both UNIX domain sockets (AF_LOCAL),
// and Windows Named Pipes, depending on the underlying platform.
// nng_ipc represents a single IPC connection.  This is generally
// a connected stream.
typedef struct nng_ipc_s nng_ipc;
// nng_ipc_dialer is a dialer object used to create outgoing connections.
// This is a bit different than a typical BSD socket API, but doing it
// helps keep the API orthogonal to the listener API.
typedef struct nng_ipc_dialer_s nng_ipc_dialer;
// nng_ipc_listener is a listener object.  This is used to accept incoming
// connections.
typedef struct nng_ipc_listener_s nng_ipc_listener;
// nng_ipc_close closes the connection, but does not release the
// underlying object.  Operations that may be pending on the connect,
// as well as further operations, will result in NNG_ECLOSED.
NNG_DECL void nng_ipc_close(nng_ipc *);
// nng_ipc_free frees the IPC connection, closing it if it is open.
// This is necessary to release the resources of the IPC object.
// (It is an error to refer to the IPC object after this is called.)
NNG_DECL void nng_ipc_free(nng_ipc *);
// nng_ipc_send sends the data in the aio, which should be stored in
// an iov for the message.  Note that the iov in the aio may be modified,
// so applications should not assume otherwise.
NNG_DECL void nng_ipc_send(nng_ipc *, nng_aio *);
// nng_ipc_recv receives data into the iov supplied.  It is possible for
// the callback to be executed with less data read than requested.  (This
// is actually pretty likely for bulk transfers.)  The caller should update
// the iov's and resubmit as needed.
NNG_DECL void nng_ipc_recv(nng_ipc *, nng_aio *);
// nng_ipc_getopt is used to get options.  The options available are:
//
// NNG_OPT_REMADDR         - nng_sockaddr for the connection.
// NNG_OPT_LOCADD          - nng_sockaddr for the connection.
// NNG_OPT_IPC_PEER_UID    - peer user ID (if available), uint64_t
// NNG_OPT_IPC_PEER_GID    - peer group ID (if available), uint64_t
// NNG_OPT_IPC_PEER_ZONEID - peer zone ID (illumos/Solaris only), uint64_t
NNG_DECL int nng_ipc_getopt(nng_ipc *, const char *, void *, size_t *);
// nng_ipc_setopt is used to set options.  There are presently no such
// options defined for connections.
NNG_DECL int nng_ipc_setopt(nng_ipc *, const char *, const void *, size_t);
// nng_ipc_dialer_alloc is used to allocate an IPC dialer.
NNG_DECL int nng_ipc_dialer_alloc(nng_ipc_dialer **);
// nng_ipc_dialer_close closes the dialer, aborting any pending outbound
// connection attempts (and preventing any new ones) with NNG_ECLOSED.
// This does not free the resources associated with the dialer, so the
// application should still call nng_ipc_dialer_free.  Connections already
// established by the dialer are unaffected by this call.
NNG_DECL void nng_ipc_dialer_close(nng_ipc_dialer *);
// nng_ipc_dialer_free is used to free the dialer.  This implicitly calls
// nng_ipc_dialer_close, then releases the resources associated with the
// dialer.  It is therefore an error for the application to attempt to use
// the dialer after this call.
NNG_DECL void nng_ipc_dialer_free(nng_ipc_dialer *);
// nng_ipc_dialer_dial attempts to create a new connection (nng_ipc *)
// may making an outbound connect call.  If this succeeds, the aio
// will return a suitable nng_ipc * in the first output of the aio.
// (I.e. nng_aio_get_output(aio, 0).)  The destination address to dial
// is stored in the 2nd argument.
NNG_DECL void nng_ipc_dialer_dial(
    nng_ipc_dialer *, const nng_sockaddr *, nng_aio *);
// nng_ipc_listener_alloc creates a listener.
NNG_DECL int nng_ipc_listener_alloc(nng_ipc_listener **);
// nng_ipc_listener_close closes the listener, unbinding it from
// any active path if it was previously bound with nng_ipc_listener_listen.
// This does not completely release the resources associated with the
// listener, so nng_ipc_listener_free should still be called.
// Any pending accept calls will be aborted with NNG_ECLOSED, and any
// future attempts will also result in NNG_ECLOSED.  Connections already
// established by this listener are unaffected by this call.
NNG_DECL void nng_ipc_listener_close(nng_ipc_listener *);
// nng_ipc_listener_free frees the listener.  This causes any other
// outstanding accept calls to return NNG_ECLOSED.  The listener cannot
// be used by the application after this is called.  This implictly
// includes a call to nng_ipc_listener_close().
NNG_DECL void nng_ipc_listener_free(nng_ipc_listener *);
// nng_ipc_listener_listen binds to the IPC address and arranges for
// the IPC path to be created and bound.  It does not accept any new
// incoming connections.  This operation is synchronous.
NNG_DECL int nng_ipc_listener_listen(nng_ipc_listener *, const nng_sockaddr *);
// nng_ipc_listener_accept accepts an incoming connection (creating an
// nng_ipc * object), and returns it in the nng_aio as the first output
// on success.
NNG_DECL void nng_ipc_listener_accept(nng_ipc_listener *, nng_aio *);
#ifdef __cplusplus
}
#endif
#endif // NNG_SUPPLEMENTAL_IPC_IPC_H
aBuild/nng/include/nng/supplemental/tcp/tcp.h
New file
@@ -0,0 +1,154 @@
//
// 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.
//
#ifndef NNG_SUPPLEMENTAL_TCP_TCP_H
#define NNG_SUPPLEMENTAL_TCP_TCP_H
#ifdef __cplusplus
extern "C" {
#endif
#include <stddef.h>
#include <stdint.h>
#include <nng/nng.h>
// This is our "public" TCP API.  This allows applications to access
// basic TCP functions, using our AIO framework.  Most applications will
// not need this.
// nng_tcp represents a single TCP connection.  This is generally
// a connected stream.
typedef struct nng_tcp_s nng_tcp;
// nng_tcp_dialer is a dialer object used to create outgoing connections.
// This is a bit different than a typical BSD socket API, but doing it
// helps keep the API orthogonal to the listener API.
typedef struct nng_tcp_dialer_s nng_tcp_dialer;
// nng_tcp_listener is a listener object.  This is used to accept incoming
// connections.
typedef struct nng_tcp_listener_s nng_tcp_listener;
// nng_tcp_close closes the connection, but does not release the
// underlying object.  Operations that may be pending on the connect,
// as well as further operations, will result in NNG_ECLOSED.
NNG_DECL void nng_tcp_close(nng_tcp *);
// nng_tcp_free frees the TCP connection, closing it if it is open.
// This is necessary to release the resources of the TCP object.
// (It is an error to refer to the TCP object after this is called.)
NNG_DECL void nng_tcp_free(nng_tcp *);
// nng_tcp_send sends the data in the aio, which should be stored in
// an iov for the message.  Note that the iov in the aio may be modified,
// so applications should not assume otherwise.
NNG_DECL void nng_tcp_send(nng_tcp *, nng_aio *);
// nng_tcp_recv receives data into the iov supplied.  It is possible for
// the callback to be executed with less data read than requested.  (This
// is actually pretty likely for bulk transfers.)  The caller should update
// the iov's and resubmit as needed.
NNG_DECL void nng_tcp_recv(nng_tcp *, nng_aio *);
// nng_tcp_getopt is used to retrieve socket options, using the named
// option values, like NNG_OPT_TCP_NODELAY or NNG_OPT_REMADDR.
NNG_DECL int nng_tcp_getopt(nng_tcp *, const char *, void *, size_t *);
// nng_tcp_setopt is used to set socket options, using the named
// option values, like NNG_OPT_TCP_KEEPALIVE.
NNG_DECL int nng_tcp_setopt(nng_tcp *, const char *, const void *, size_t);
// nng_tcp_dialer_alloc is used to allocate a TCP dialer.
NNG_DECL int nng_tcp_dialer_alloc(nng_tcp_dialer **);
// nng_tcp_dialer_close closes the dialer, aborting any pending outbound
// connection attempts (and preventing any new ones) with NNG_ECLOSED.
// This does not free the resources associated with the dialer, so the
// application should still call nng_tcp_dialer_free.  Connections already
// established by the dialer are unaffected by this call.
NNG_DECL void nng_tcp_dialer_close(nng_tcp_dialer *);
// nng_tcp_dialer_free is used to free the dialer.  This implicitly calls
// nng_tcp_dialer_close, then releases the resources associated with the
// dialer.  It is therefore an error for the application to attempt to use
// the dialer after this call.
NNG_DECL void nng_tcp_dialer_free(nng_tcp_dialer *);
// nng_tcp_dialer_dial attempts to create a new connection (nng_tcp *)
// may making an outbound connect call.  If this succeeds, the aio
// will return a suitable nng_tcp * in the first output of the aio.
// (I.e. nng_aio_get_output(aio, 0).)  The destination address to dial
// is stored in the 2nd argument.
NNG_DECL void nng_tcp_dialer_dial(
    nng_tcp_dialer *, const nng_sockaddr *, nng_aio *);
// nng_tcp_dialer_getopt gets an option.
NNG_DECL int nng_tcp_dialer_getopt(
    nng_tcp_dialer *, const char *, void *, size_t *);
// nng_tcp_dialer_setopt sets an option.  This can be done to set the
// initial values of NNG_OPT_TCP_NODELAY or NNG_OPT_TCP_KEEPALIVE for
// created connections, for example.  Also, the NNG_OPT_LOCADDR can
// be set, which sets the source address new connections will be
// established from -- except that the port is ignored as it is always
// randomly chosen.
NNG_DECL int nng_tcp_dialer_setopt(
    nng_tcp_dialer *, const char *, const void *, size_t);
// nng_tcp_listener_alloc creates a listener.
NNG_DECL int nng_tcp_listener_alloc(nng_tcp_listener **);
// nng_tcp_listener_close closes the listener, unbinding it from
// any active ports if it was previously bound with nng_tcp_listener_listen.
// This does not completely release the resources associated with the
// listener, so nng_tcp_listener_free should still be called.
// Any pending accept calls will be aborted with NNG_ECLOSED, and any
// future attempts will also result in NNG_ECLOSED.  Connections already
// established by this listener are unaffected by this call.
NNG_DECL void nng_tcp_listener_close(nng_tcp_listener *);
// nng_tcp_listener_free frees the listener.  This causes any other
// outstanding accept calls to return NNG_ECLOSED.  The listener cannot
// be used by the application after this is called.  This implictly
// includes a call to nng_tcp_listener_close().
NNG_DECL void nng_tcp_listener_free(nng_tcp_listener *);
// nng_tcp_listener_listen binds to the TCP address and arranges for
// the TCP port / address to be allocated.  It does not accept any new
// incoming connections.  (The listenq depth is configured to some reasonable
// default -- typically around 128.)  This operation is synchronous.
// A zero valued port may be supplied in the sockaddr, in which case
// a follow up call to get the NNG_OPT_LOCADDR can be used to determine the
// bound address.
NNG_DECL int nng_tcp_listener_listen(nng_tcp_listener *, const nng_sockaddr *);
// nng_tcp_listener_accept accepts an incoming connection (creating an
// nng_tcp * object), and returns it in the nng_aio as the first output
// on success.
NNG_DECL void nng_tcp_listener_accept(nng_tcp_listener *, nng_aio *);
// nng_tcp_listener_getopt gets an option.  A good example of this is to
// obtain the NNG_OPT_LOCADDR local address after starting the listener
// on a wild card port (0).
NNG_DECL int nng_tcp_listener_getopt(
    nng_tcp_listener *, const char *, void *, size_t *);
// nng_tcp_listener_setopt sets an option.  This can be done to set the
// initial values of NNG_OPT_TCP_NODELAY or NNG_OPT_TCP_KEEPALIVE for
// created connections, for example.
NNG_DECL int nng_tcp_listener_setopt(
    nng_tcp_listener *, const char *, const void *, size_t);
#ifdef __cplusplus
}
#endif
#endif // NNG_SUPPLEMENTAL_TCP_TCP_H
aBuild/nng/include/nng/supplemental/tls/tls.h
New file
@@ -0,0 +1,180 @@
//
// 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.
//
#ifndef NNG_SUPPLEMENTAL_TLS_TLS_H
#define NNG_SUPPLEMENTAL_TLS_TLS_H
#ifdef __cplusplus
extern "C" {
#endif
#include <stddef.h>
#include <stdint.h>
// Note that TLS functions may be stubbed out if TLS is not enabled in
// the build.
// For some transports, we need TLS configuration, including certificates
// and so forth.  A TLS configuration cannot be changed once it is in use.
typedef struct nng_tls_config nng_tls_config;
typedef enum nng_tls_mode {
    NNG_TLS_MODE_CLIENT = 0,
    NNG_TLS_MODE_SERVER = 1,
} nng_tls_mode;
typedef enum nng_tls_auth_mode {
    NNG_TLS_AUTH_MODE_NONE     = 0, // No verification is performed
    NNG_TLS_AUTH_MODE_OPTIONAL = 1, // Verify cert if presented
    NNG_TLS_AUTH_MODE_REQUIRED = 2, // Verify cert, close if invalid
} nng_tls_auth_mode;
// nng_tls_config_alloc creates a TLS configuration using
// reasonable defaults.  This configuration can be shared
// with multiple pipes or services/servers.
NNG_DECL int nng_tls_config_alloc(nng_tls_config **, nng_tls_mode);
// nng_tls_config_hold increments the reference count on the TLS
// configuration object.  The hold can be dropped by calling
// nng_tls_config_free later.
NNG_DECL void nng_tls_config_hold(nng_tls_config *);
// nng_tls_config_free drops the reference count on the TLS
// configuration object, and if zero, deallocates it.
NNG_DECL void nng_tls_config_free(nng_tls_config *);
// nng_tls_config_server_name sets the server name.  This is
// called by clients to set the name that the server supplied
// certificate should be matched against.  This can also cause
// the SNI to be sent to the server to tell it which cert to
// use if it supports more than one.
NNG_DECL int nng_tls_config_server_name(nng_tls_config *, const char *);
// nng_tls_config_ca_cert configures one or more CAs used for validation
// of peer certificates.  Multiple CAs (and their chains) may be configured
// by either calling this multiple times, or by specifying a list of
// certificates as concatenated data.  The final argument is an optional CRL
// (revokation list) for the CA, also in PEM.  Both PEM strings are ASCIIZ
// format (except that the CRL may be NULL).
NNG_DECL int nng_tls_config_ca_chain(
    nng_tls_config *, const char *, const char *);
// nng_tls_config_own_cert is used to load our own certificate and public
// key.  For servers, this may be called more than once to configure multiple
// different keys, for example with different algorithms depending on what
// the peer supports. On the client, only a single option is available.
// The first two arguments are the cert (or validation chain) and the
// key as PEM format ASCIIZ strings.  The final argument is an optional
// password and may be NULL.
NNG_DECL int nng_tls_config_own_cert(
    nng_tls_config *, const char *, const char *, const char *);
// nng_tls_config_key is used to pass our own private key.
NNG_DECL int nng_tls_config_key(nng_tls_config *, const uint8_t *, size_t);
// nng_tls_config_pass is used to pass a password used to decrypt
// private keys that are encrypted.
NNG_DECL int nng_tls_config_pass(nng_tls_config *, const char *);
// nng_tls_config_auth_mode is used to configure the authentication mode use.
// The default is that servers have this off (i.e. no client authentication)
// and clients have it on (they verify the server), which matches typical
// practice.
NNG_DECL int nng_tls_config_auth_mode(nng_tls_config *, nng_tls_auth_mode);
// nng_tls_config_ca_file is used to pass a CA chain and optional CRL
// via the filesystem.  If CRL data is present, it must be contained
// in the file, along with the CA certificate data.  The format is PEM.
// The path name must be a legal file name.
NNG_DECL int nng_tls_config_ca_file(nng_tls_config *, const char *);
// nng_tls_config_cert_key_file is used to pass our own certificate and
// private key data via the filesystem.  Both the key and certificate
// must be present as PEM blocks in the same file.  A password is used to
// decrypt the private key if it is encrypted and the password supplied is not
// NULL. This may be called multiple times on servers, but only once on a
// client. (Servers can support multiple different certificates and keys for
// different cryptographic algorithms.  Clients only get one.)
NNG_DECL int nng_tls_config_cert_key_file(
    nng_tls_config *, const char *, const char *);
// The rest of the definitions in this file rely upon having support for the
// TLS supplemental API enabled.  If you don't have this configured in your
// library, then your programs will not link.
// nng_tls represents a TLS connection over TCP.
typedef struct nng_tls_s nng_tls;
// nng_tls_dialer is a dialer that creates TLS connections (nng_tls objects)
// by establishing outgoing connections.
typedef struct nng_tls_dialer_s nng_tls_dialer;
// nng_tls_listener is a listener that creates TLS connections (nng_tls
// objects) by accepting incoming connections.
typedef struct nng_tls_listener_s nng_tls_listener;
// nng_tls_close closes a TLS connection, without releasing the underlying
// resources.  Use nng_tls_free to release the resources.
NNG_DECL void nng_tls_close(nng_tls *);
// nng_tls_free frees a TLS connection, and will implicity also close the
// connection if not already done so.
NNG_DECL void nng_tls_free(nng_tls *);
NNG_DECL void nng_tls_send(nng_tls *, nng_aio *);
NNG_DECL void nng_tls_recv(nng_tls *, nng_aio *);
NNG_DECL int nng_tls_getopt(nng_tls *, const char *, void *, size_t *);
// nng_tls_dialer_alloc allocates a dialer that creates TLS connections
// (nng_tls structures) by connecting to remote servers.
NNG_DECL int nng_tls_dialer_alloc(nng_tls_dialer **);
// nng_tls_dialer_close closes the dialer, but does not free it's resources.
NNG_DECL void nng_tls_dialer_close(nng_tls_dialer *);
// nng_tls_dialer_free frees the dialer, implicitly closing it as well.
NNG_DECL void nng_tls_dialer_free(nng_tls_dialer *);
// nng_tls_dialer_dial attempts to create a new connection (nng_tls object)
// by dialing to the remote server specified in the aio.  Note that the
// TLS connection may be returned before the TLS handshake is complete.
// The remote server will only be verified if a server name has been configured
// with the NNG_OPT_TLS_SERVER_NAME option (using nng_tls_dialer_setopt).
NNG_DECL void nng_tls_dialer_dial(
    nng_tls_dialer *, const nng_sockaddr *, nng_aio *);
// nng_tls_dialer_getopt returns options from the dialer.
NNG_DECL int nng_tls_dialer_getopt(
    nng_tls_dialer *, const char *, void *, size_t *);
// nng_tls_dialer_setopt sets options on the dialer.  Options may include
// NNG_OPT_TLS_CONFIG, as well as various other NNG_OPT_TLS_ options and
// the TCP options that are valid for TCP dialers as well.
NNG_DECL int nng_tls_dialer_setopt(
    nng_tls_dialer *, const char *, const void *, size_t);
NNG_DECL int  nng_tls_listener_alloc(nng_tls_listener **);
NNG_DECL void nng_tls_listener_close(nng_tls_listener *);
NNG_DECL void nng_tls_listener_free(nng_tls_listener *);
NNG_DECL int nng_tls_listener_listen(nng_tls_listener *, const nng_sockaddr *);
NNG_DECL void nng_tls_listener_accept(nng_tls_listener *, nng_aio *);
NNG_DECL int nng_tls_listener_getopt(
    nng_tls_listener *, const char *, void *, size_t *);
NNG_DECL int nng_tls_listener_setopt(
    nng_tls_listener *, const char *, const void *, size_t);
#ifdef __cplusplus
}
#endif
#endif // NNG_SUPPLEMENTAL_TLS_TLS_H
aBuild/nng/include/nng/supplemental/util/options.h
New file
@@ -0,0 +1,48 @@
//
// 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.
//
#ifndef NNG_SUPPLEMENTAL_UTIL_OPTIONS_H
#define NNG_SUPPLEMENTAL_UTIL_OPTIONS_H
#include <stdbool.h>
#ifdef __cplusplus
extern "C" {
#endif
// This is a relatively simple "options parsing" library, used to
// parse command line options.  We would use getopt(3), but there are
// two problems with getopt(3).  First, it isn't available on all
// platforms (especially Win32), and second, it doesn't support long
// options.  We *exclusively* support long options.  POSIX style
// short option clustering is *NOT* supported.
struct nng_optspec {
    const char *o_name;  // Long style name (may be NULL for short only)
    int         o_short; // Short option (no clustering!)
    int         o_val;   // Value stored on a good parse (>0)
    bool        o_arg;   // Option takes an argument if true
};
typedef struct nng_optspec nng_optspec;
// Call with *optidx set to 1 to start parsing for a standard program.
// The val will store the value of the matched "o_val", optarg will be
// set to match the option string, and optidx will be increment appropriately.
// Returns -1 when the end of options is reached, 0 on success, or
// NNG_EINVAL if the option parse is invalid for any reason.
NNG_DECL int nng_opts_parse(int argc, char *const *argv,
    const nng_optspec *opts, int *val, char **optarg, int *optidx);
#ifdef __cplusplus
}
#endif
#endif // NNG_SUPPLEMENTAL_UTIL_OPTIONS_H
aBuild/nng/include/nng/supplemental/util/platform.h
New file
@@ -0,0 +1,106 @@
//
// 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.
//
#ifndef NNG_SUPPLEMENTAL_UTIL_PLATFORM_H
#define NNG_SUPPLEMENTAL_UTIL_PLATFORM_H
// The declarations in this file are provided to assist with application
// portability.  Conceptually these APIs are based on work we have already
// done for NNG internals, and we find that they are useful in building
// portable applications.
// If it is more natural to use native system APIs like pthreads or C11
// APIs or Windows APIs, then by all means please feel free to simply
// ignore this.
#include <stddef.h>
#include <stdint.h>
#ifdef __cplusplus
extern "C" {
#endif
// nng_time represents an absolute time since some arbitrary point in the
// past, measured in milliseconds.  The values are always positive.
typedef uint64_t nng_time;
// Return an absolute time from some arbitrary point.  The value is
// provided in milliseconds, and is of limited resolution based on the
// system clock.  (Do not use it for fine grained performance measurements.)
NNG_DECL nng_time nng_clock(void);
// Sleep for specified msecs.
NNG_DECL void nng_msleep(nng_duration);
// nng_thread is a handle to a "thread", which may be a real system
// thread, or a coroutine on some platforms.
typedef struct nng_thread nng_thread;
// Create and start a thread.  Note that on some platforms, this might
// actually be a coroutine, with limitations about what system APIs
// you can call.  Therefore, these threads should only be used with the
// I/O APIs provided by nng.  The thread runs until completion.
NNG_DECL int nng_thread_create(nng_thread **, void (*)(void *), void *);
// Destroy a thread (waiting for it to complete.)  When this function
// returns all resources for the thread are cleaned up.
NNG_DECL void nng_thread_destroy(nng_thread *);
// nng_mtx represents a mutex, which is a simple, non-retrant, boolean lock.
typedef struct nng_mtx nng_mtx;
// nng_mtx_alloc allocates a mutex structure.
NNG_DECL int nng_mtx_alloc(nng_mtx **);
// nng_mtx_free frees the mutex.  It most not be locked.
NNG_DECL void nng_mtx_free(nng_mtx *);
// nng_mtx_lock locks the mutex; if it is already locked it will block
// until it can be locked.  If the caller already holds the lock, the
// results are undefined (a panic may occur).
NNG_DECL void nng_mtx_lock(nng_mtx *);
// nng_mtx_unlock unlocks a previously locked mutex.  It is an error to
// call this on a mutex which is not owned by caller.
NNG_DECL void nng_mtx_unlock(nng_mtx *);
// nng_cv is a condition variable.  It is always allocated with an
// associated mutex, which must be held when waiting for it, or
// when signaling it.
typedef struct nng_cv nng_cv;
NNG_DECL int nng_cv_alloc(nng_cv **, nng_mtx *);
// nng_cv_free frees the condition variable.
NNG_DECL void nng_cv_free(nng_cv *);
// nng_cv_wait waits until the condition variable is "signaled".
NNG_DECL void nng_cv_wait(nng_cv *);
// nng_cv_until waits until either the condition is signaled, or
// the timeout expires.  It returns NNG_ETIMEDOUT in that case.
NNG_DECL int nng_cv_until(nng_cv *, nng_time);
// nng_cv_wake wakes all threads waiting on the condition.
NNG_DECL void nng_cv_wake(nng_cv *);
// nng_cv_wake1 wakes only one thread waiting on the condition.  This may
// reduce the thundering herd problem, but care must be taken to ensure
// that no waiter starves forvever.
NNG_DECL void nng_cv_wake1(nng_cv *);
// nng_random returns a "strong" (cryptographic sense) random number.
NNG_DECL uint32_t nng_random(void);
#ifdef __cplusplus
}
#endif
#endif // NNG_SUPPLEMENTAL_UTIL_PLATFORM_H
aBuild/nng/include/nng/transport/inproc/inproc.h
New file
@@ -0,0 +1,18 @@
//
// Copyright 2017 Garrett D'Amore <garrett@damore.org>
// Copyright 2017 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.
//
#ifndef NNG_TRANSPORT_INPROC_INPROC_H
#define NNG_TRANSPORT_INPROC_INPROC_H
// inproc transport.  This is used for intra-process communication.
NNG_DECL int nng_inproc_register(void);
#endif // NNG_TRANSPORT_INPROC_INPROC_H
aBuild/nng/include/nng/transport/ipc/ipc.h
New file
@@ -0,0 +1,19 @@
//
// Copyright 2019 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.
//
#ifndef NNG_TRANSPORT_IPC_IPC_H
#define NNG_TRANSPORT_IPC_IPC_H
// ipc transport.  This is used for inter-process communication on
// the same host computer.
NNG_DECL int nng_ipc_register(void);
#endif // NNG_TRANSPORT_IPC_IPC_H
aBuild/nng/include/nng/transport/tcp/tcp.h
New file
@@ -0,0 +1,18 @@
//
// Copyright 2017 Garrett D'Amore <garrett@damore.org>
// Copyright 2017 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.
//
#ifndef NNG_TRANSPORT_TCP_TCP_H
#define NNG_TRANSPORT_TCP_TCP_H
// TCP transport.  This is used for communication over TCP/IP.
NNG_DECL int nng_tcp_register(void);
#endif // NNG_TRANSPORT_TCP_TCP_H
aBuild/nng/include/nng/transport/tls/tls.h
New file
@@ -0,0 +1,18 @@
//
// 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.
//
#ifndef NNG_TRANSPORT_TLS_TLS_H
#define NNG_TRANSPORT_TLS_TLS_H
// TLS transport.  This is used for communication via TLS v1.2 over TCP/IP.
NNG_DECL int nng_tls_register(void);
#endif // NNG_TRANSPORT_TLS_TLS_H
aBuild/nng/include/nng/transport/ws/websocket.h
New file
@@ -0,0 +1,32 @@
//
// 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.
//
#ifndef NNG_TRANSPORT_WS_WEBSOCKET_H
#define NNG_TRANSPORT_WS_WEBSOCKET_H
// WebSocket transport.  This is used for communication via WebSocket.
NNG_DECL int nng_ws_register(void);
// NNG_OPT_WS_REQUEST_HEADERS is a string containing the
// request headers, formatted as CRLF terminated lines.
#define NNG_OPT_WS_REQUEST_HEADERS "ws:request-headers"
// NNG_OPT_WS_RESPONSE_HEADERS is a string containing the
// response headers, formatted as CRLF terminated lines.
#define NNG_OPT_WS_RESPONSE_HEADERS "ws:response-headers"
// These aliases are for WSS naming consistency.
#define NNG_OPT_WSS_REQUEST_HEADERS NNG_OPT_WS_REQUEST_HEADERS
#define NNG_OPT_WSS_RESPONSE_HEADERS NNG_OPT_WS_RESPONSE_HEADERS
NNG_DECL int nng_wss_register(void);
#endif // NNG_TRANSPORT_WS_WEBSOCKET_H
aBuild/nng/include/nng/transport/zerotier/zerotier.h
New file
@@ -0,0 +1,149 @@
//
// 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.
//
#ifndef NNG_TRANSPORT_ZEROTIER_ZEROTIER_H
#define NNG_TRANSPORT_ZEROTIER_ZEROTIER_H
// ZeroTier Transport.  This sits on the ZeroTier L2 network, which itself
// is implemented on top of UDP.  This requires the 3rd party
// libzerotiercore library (which is GPLv3!) and platform specific UDP
// functionality to be built in.  Note that care must be taken to link
// dynamically if one wishes to avoid making your entire application GPL3.
// (Alternatively ZeroTier offers commercial licenses which may prevent
// this particular problem.)  This implementation does not make use of
// certain advanced capabilities in ZeroTier such as more sophisticated
// route management and TCP fallback.  You need to have connectivity
// to the Internet to use this.  (Or at least to your Planetary root.)
//
// The ZeroTier URL format we support is zt://<ztid>.<nwid>:<port> where
// the <nwid> component represents the 64-bit hexadecimal ZeroTier
// network ID,the <ztid> represents the 40-bit hexadecimal ZeroTier
// node (device) ID, and the <port> is a 24-bit (decimal) port number.
//
// A listener may replace the <ztid> with a wildcard, to just bind to itself,
// in which case the format will be zt://*.<nwid>:<port>
//
// A listener may also use either 0 or * for the <port> to indicate that
// a random local ephemeral port should be used.
//
// Because ZeroTier takes a while to establish connectivity, it is even
// more important that applications using the ZeroTier transport not
// assume that a connection will be immediately available.  It can take
// quite a few seconds for peer-to-peer connectivity to be established.
//
// The ZeroTier transport was funded by Capitar IT Group, BV.
//
// The protocol itself is documented online at:
// http://nanomsg.org/rfcs/sp-zerotier-v0.html
//
// This transport is highly experimental.
// ZeroTier transport-specific options.
// NNG_OPT_ZT_HOME is a string containing a directory, where persistent
// state (key files, etc.) will be stored.  It should be protected from
// unauthorized viewing and modification.  This option must be set on an
// endpoint or socket before the endpoint(s) are started.  If the unset,
// or an empty string, then no persistence is used and an ephemeral node
// will be created instead.  Note that different endpoints may use different
// values for this option, and that will lead to each endpoint having a
// different ZeroTier identity -- however only one ephemeral node will
// be created for the application.
#define NNG_OPT_ZT_HOME "zt:home"
// NNG_OPT_ZT_NWID is the 64-bit network ID, represented using a uint64_t in
// native byte order.  This is a read-only option; it is derived automatically
// from the URL.
#define NNG_OPT_ZT_NWID "zt:nwid"
// NNG_OPT_ZT_NODE is the 40-bit node ID, stored in native order in the low
// 40-bits of a uint64_t, of the node.  This is a read-only option.
#define NNG_OPT_ZT_NODE "zt:node"
// NNG_OPT_ZT_NETWORK_STATUS represents the status of the ZeroTier virtual
// network.  The option is a read-only value, stored as an integer, which
// takes of the nng_zt_network_status_xxx values listed below.
#define NNG_OPT_ZT_NETWORK_STATUS "zt:network-status"
// NNG_OPT_ZT_NETWORK_NAME is a human-readable name for the ZeroTier virtual
// network.  This will only be set once the ZeroTier network has come up
// as the name comes from the network controller.  This is read-only, and
// is presented as an ASCIIZ string.
#define NNG_OPT_ZT_NETWORK_NAME "zt:network-name"
// NNG_OPT_ZT_PING_TIME and NNG_OPT_ZT_PING_TRIES are used to send ping
// requests when a connection appears to be idled.  If a logical session
// has not received traffic from it's peer for ping-time, then a ping packet
// is sent.  This will be done up to ping-count times.  If no traffic from
// the remote peer is seen after all ping requests are sent, then the peer
// is assumed to be dead or offline, and the session is closed.  The
// NNG_OPT_ZT_PING_TIME is a duration (msec, stored as an nng_duration, and
// NNG_OPT_ZT_PING_COUNT is an integer.)  This ping process can be disabled
// by setting either ping-time or ping-count to zero.
#define NNG_OPT_ZT_PING_TIME "zt:ping-time"
#define NNG_OPT_ZT_PING_TRIES "zt:ping-tries"
// NNG_OPT_ZT_CONN_TIME and NNG_OPT_ZT_CONN_TRIES are used to control
// the interval between connection attempts, and the maximum number of
// connection attempts to make before assuming that the peer is absent
// (and returning NNG_ETIMEDOUT).  The NNG_OPT_ZT_CONN_TIME is a duration,
// the NNG_OPT_ZT_CONN_TRIES is an integer.
#define NNG_OPT_ZT_CONN_TIME "zt:conn-time"
#define NNG_OPT_ZT_CONN_TRIES "zt:conn-tries"
// NNG_OPT_ZT_MTU is a read-only size_t and contains the ZeroTier virtual
// network MTU (i.e. the L2 payload MTU). Messages that are larger than this
// (including our 20-byte header data) will be fragmented into multiple
// virtual L2 frames.
#define NNG_OPT_ZT_MTU "zt:mtu"
// NNG_OPT_ZT_ORBIT is a write-only API to add a "moon" -- this affects the
// endpoint, and all other endpoints using the same node. The value is
// a pair of 64-bit integers -- the first is the moon ID, and the second, if
// non-zero, is the node ID of a server.  Conventionally this is the same
// as the moon ID.
#define NNG_OPT_ZT_ORBIT "zt:orbit"
// NNG_OPT_ZT_DEORBIT removes the moon ID from the node, so that it will
// no longer use that moon.  The argument is a moon ID to remove.  If the
// node is not already orbiting, then this operation does nothing.
#define NNG_OPT_ZT_DEORBIT "zt:deorbit"
// NNG_OPT_ZT_ADD_LOCAL_ADDR adds the local address (IP address) as
// local interface address.  This facilitates the local startup and
// discovery.  Note that this can be called multiple times to add
// additional address.  This is optional, and usually not needed.
// The value is an nng_sockaddr corresponding to an IP (or IPv6) address.
#define NNG_OPT_ZT_ADD_LOCAL_ADDR "zt:add-local-addr"
// NNG_OPT_ZT_CLEAR_LOCAL_ADDRS clears ZeroTier's notion of all
// local addresses.  This may be useful when used on a mobile node,
// to reset the notion of what the local addresses are.  This
// option takes no argument really.
#define NNG_OPT_ZT_CLEAR_LOCAL_ADDRS "zt:clear-local-addrs"
// Network status values.
// These values are supplied to help folks checking status.  They are the
// return values from zt_opt_status.  We avoid hard coding them as defines,
// to keep applications from baking in values that may change if the
// underlying ZeroTier transport changes.
enum nng_zt_status {
    NNG_ZT_STATUS_UP,
    NNG_ZT_STATUS_CONFIG,
    NNG_ZT_STATUS_DENIED,
    NNG_ZT_STATUS_NOTFOUND,
    NNG_ZT_STATUS_ERROR,
    NNG_ZT_STATUS_OBSOLETE,
    NNG_ZT_STATUS_UNKNOWN,
};
NNG_DECL int nng_zt_register(void);
#endif // NNG_TRANSPORT_ZEROTIER_ZEROTIER_H
aBuild/nng/lib/cmake/nng/nng-config-version.cmake
New file
@@ -0,0 +1,46 @@
# This is a basic version file for the Config-mode of find_package().
# It is used by write_basic_package_version_file() as input file for configure_file()
# to create a version-file which can be installed along a config.cmake file.
#
# The created file sets PACKAGE_VERSION_EXACT if the current version string and
# the requested version string are exactly the same and it sets
# PACKAGE_VERSION_COMPATIBLE if the current version is >= requested version,
# but only if the requested major version is the same as the current one.
# The variable CVF_VERSION must be set before calling configure_file().
set(PACKAGE_VERSION "1.1.1-37-g82afec9")
if(PACKAGE_VERSION VERSION_LESS PACKAGE_FIND_VERSION)
  set(PACKAGE_VERSION_COMPATIBLE FALSE)
else()
  if("1.1.1-37-g82afec9" MATCHES "^([0-9]+)\\.")
    set(CVF_VERSION_MAJOR "${CMAKE_MATCH_1}")
  else()
    set(CVF_VERSION_MAJOR "1.1.1-37-g82afec9")
  endif()
  if(PACKAGE_FIND_VERSION_MAJOR STREQUAL CVF_VERSION_MAJOR)
    set(PACKAGE_VERSION_COMPATIBLE TRUE)
  else()
    set(PACKAGE_VERSION_COMPATIBLE FALSE)
  endif()
  if(PACKAGE_FIND_VERSION STREQUAL PACKAGE_VERSION)
      set(PACKAGE_VERSION_EXACT TRUE)
  endif()
endif()
# if the installed or the using project don't have CMAKE_SIZEOF_VOID_P set, ignore it:
if("${CMAKE_SIZEOF_VOID_P}" STREQUAL "" OR "8" STREQUAL "")
   return()
endif()
# check that the installed version has the same 32/64bit-ness as the one which is currently searching:
if(NOT CMAKE_SIZEOF_VOID_P STREQUAL "8")
  math(EXPR installedBits "8 * 8")
  set(PACKAGE_VERSION "${PACKAGE_VERSION} (${installedBits}bit)")
  set(PACKAGE_VERSION_UNSUITABLE TRUE)
endif()
aBuild/nng/lib/cmake/nng/nng-config.cmake
New file
@@ -0,0 +1,50 @@
# Copyright 2018 Staysail Systems, Inc. <info@staysail.tech>
#
# 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.
####### Expanded from @PACKAGE_INIT@ by configure_package_config_file() #######
####### Any changes to this file will be overwritten by the next CMake run ####
####### The input file was nng-config.cmake.in                            ########
get_filename_component(PACKAGE_PREFIX_DIR "${CMAKE_CURRENT_LIST_DIR}/../../../" ABSOLUTE)
macro(set_and_check _var _file)
  set(${_var} "${_file}")
  if(NOT EXISTS "${_file}")
    message(FATAL_ERROR "File or directory ${_file} referenced by variable ${_var} does not exist !")
  endif()
endmacro()
macro(check_required_components _NAME)
  foreach(comp ${${_NAME}_FIND_COMPONENTS})
    if(NOT ${_NAME}_${comp}_FOUND)
      if(${_NAME}_FIND_REQUIRED_${comp})
        set(${_NAME}_FOUND FALSE)
      endif()
    endif()
  endforeach()
endmacro()
####################################################################################
set(NNG_VERSION_MAJOR "1")
set(NNG_VERSION_MINOR "1")
set(NNG_VERSION_PATCH "1")
set_and_check(NNG_INCLUDE_DIRS "${PACKAGE_PREFIX_DIR}/include/nng")
include("${CMAKE_CURRENT_LIST_DIR}/nng-targets.cmake")
# Make sure we find packages for our dependencies
foreach(_PKG IN ITEMS Threads)
    find_package(${_PKG} REQUIRED)
endforeach ()
set(NNG_LIBRARY nng::nng)
check_required_components(nng)
aBuild/nng/lib/cmake/nng/nng-targets-noconfig.cmake
New file
@@ -0,0 +1,19 @@
#----------------------------------------------------------------
# Generated CMake target import file.
#----------------------------------------------------------------
# Commands may need to know the format version.
set(CMAKE_IMPORT_FILE_VERSION 1)
# Import target "nng::nng" for configuration ""
set_property(TARGET nng::nng APPEND PROPERTY IMPORTED_CONFIGURATIONS NOCONFIG)
set_target_properties(nng::nng PROPERTIES
  IMPORTED_LOCATION_NOCONFIG "${_IMPORT_PREFIX}/lib/libnng.so.1.1.0"
  IMPORTED_SONAME_NOCONFIG "libnng.so.1"
  )
list(APPEND _IMPORT_CHECK_TARGETS nng::nng )
list(APPEND _IMPORT_CHECK_FILES_FOR_nng::nng "${_IMPORT_PREFIX}/lib/libnng.so.1.1.0" )
# Commands beyond this point should not need to know the version.
set(CMAKE_IMPORT_FILE_VERSION)
aBuild/nng/lib/cmake/nng/nng-targets.cmake
New file
@@ -0,0 +1,88 @@
# Generated by CMake 3.5.1
if("${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION}" LESS 2.5)
   message(FATAL_ERROR "CMake >= 2.6.0 required")
endif()
cmake_policy(PUSH)
cmake_policy(VERSION 2.6)
#----------------------------------------------------------------
# Generated CMake target import file.
#----------------------------------------------------------------
# Commands may need to know the format version.
set(CMAKE_IMPORT_FILE_VERSION 1)
# Protect against multiple inclusion, which would fail when already imported targets are added once more.
set(_targetsDefined)
set(_targetsNotDefined)
set(_expectedTargets)
foreach(_expectedTarget nng::nng)
  list(APPEND _expectedTargets ${_expectedTarget})
  if(NOT TARGET ${_expectedTarget})
    list(APPEND _targetsNotDefined ${_expectedTarget})
  endif()
  if(TARGET ${_expectedTarget})
    list(APPEND _targetsDefined ${_expectedTarget})
  endif()
endforeach()
if("${_targetsDefined}" STREQUAL "${_expectedTargets}")
  set(CMAKE_IMPORT_FILE_VERSION)
  cmake_policy(POP)
  return()
endif()
if(NOT "${_targetsDefined}" STREQUAL "")
  message(FATAL_ERROR "Some (but not all) targets in this export set were already defined.\nTargets Defined: ${_targetsDefined}\nTargets not yet defined: ${_targetsNotDefined}\n")
endif()
unset(_targetsDefined)
unset(_targetsNotDefined)
unset(_expectedTargets)
# Compute the installation prefix relative to this file.
get_filename_component(_IMPORT_PREFIX "${CMAKE_CURRENT_LIST_FILE}" PATH)
get_filename_component(_IMPORT_PREFIX "${_IMPORT_PREFIX}" PATH)
get_filename_component(_IMPORT_PREFIX "${_IMPORT_PREFIX}" PATH)
get_filename_component(_IMPORT_PREFIX "${_IMPORT_PREFIX}" PATH)
# Create imported target nng::nng
add_library(nng::nng SHARED IMPORTED)
set_target_properties(nng::nng PROPERTIES
  INTERFACE_INCLUDE_DIRECTORIES "${_IMPORT_PREFIX}/include"
)
# Load information for each installed configuration.
get_filename_component(_DIR "${CMAKE_CURRENT_LIST_FILE}" PATH)
file(GLOB CONFIG_FILES "${_DIR}/nng-targets-*.cmake")
foreach(f ${CONFIG_FILES})
  include(${f})
endforeach()
# Cleanup temporary variables.
set(_IMPORT_PREFIX)
# Loop over all imported files and verify that they actually exist
foreach(target ${_IMPORT_CHECK_TARGETS} )
  foreach(file ${_IMPORT_CHECK_FILES_FOR_${target}} )
    if(NOT EXISTS "${file}" )
      message(FATAL_ERROR "The imported target \"${target}\" references the file
   \"${file}\"
but this file does not exist.  Possible reasons include:
* The file was deleted, renamed, or moved to another location.
* An install or uninstall procedure did not complete successfully.
* The installation package was faulty and contained
   \"${CMAKE_CURRENT_LIST_FILE}\"
but not all the files it references.
")
    endif()
  endforeach()
  unset(_IMPORT_CHECK_FILES_FOR_${target})
endforeach()
unset(_IMPORT_CHECK_TARGETS)
# This file does not depend on other imported targets which have
# been exported from the same project but in a separate export set.
# Commands beyond this point should not need to know the version.
set(CMAKE_IMPORT_FILE_VERSION)
cmake_policy(POP)
aBuild/nng/lib/libnng.a
Binary files differ
aBuild/nng/lib/libnng.so.1.1.0
Binary files differ
nng
New file
@@ -1 +1 @@
Subproject commit 0000000000000000000000000000000000000000
Subproject commit 82afec95496fd2e4b8fb404aa90e961f93db1fe8