1 //        Copyright DarkRiDDeR (Roman Barinov) 2020.
2 // Distributed under the Boost Software License, Version 1.0.
3 //       (See accompanying file LICENSE or copy at
4 //          http://www.boost.org/LICENSE_1_0.txt)
5 
6 module bindbc.nng.types;
7 
8 
9 public import core.stdc.stdint: int8_t, uint8_t, int16_t, uint16_t, int32_t, uint32_t, int64_t, uint64_t;
10 
11 
12 extern (C) @trusted @nogc nothrow align(1):
13 
14 /**
15  nng.h:
16 */
17 enum {
18     NNG_MAJOR_VERSION = 1,
19     NNG_MINOR_VERSION = 1,
20     NNG_PATCH_VERSION = 1,
21     NNG_RELEASE_SUFFIX = "",
22     NNG_MAXADDRLEN = 128
23 }
24 
25 struct nng_ctx {
26     uint32_t id;
27 }
28 
29 struct nng_dialer {
30     uint32_t id;
31 }
32 
33 struct nng_listener {
34     uint32_t id;
35 }
36 
37 struct nng_pipe {
38     uint32_t id;
39 }
40 
41 struct nng_socket {
42     uint32_t id;
43 }
44 
45 alias nng_duration = int32_t; // in milliseconds
46 struct nng_msg;
47 struct nng_stat;
48 struct nng_aio;
49 
50 enum {
51     NNG_PIPE_INITIALIZER = nng_pipe( 0 ),
52     NNG_SOCKET_INITIALIZER = nng_socket( 0 ),
53     NNG_DIALER_INITIALIZER = nng_dialer ( 0 ),
54     NNG_LISTENER_INITIALIZER = nng_listener( 0 ),
55     NNG_CTX_INITIALIZER = nng_ctx ( 0 )
56 }
57 
58 struct nng_sockaddr_inproc {
59     uint16_t sa_family;
60     char[NNG_MAXADDRLEN] sa_name;
61 }
62 
63 struct nng_sockaddr_path {
64     uint16_t sa_family;
65     char[NNG_MAXADDRLEN] sa_path;
66 }
67 
68 struct nng_sockaddr_in6 {
69     uint16_t sa_family;
70     uint16_t sa_port;
71     uint8_t[16] sa_addr;
72 }
73 alias nng_sockaddr_udp6 = nng_sockaddr_in6;
74 alias nng_sockaddr_tcp6 = nng_sockaddr_in6;
75 
76 struct nng_sockaddr_in {
77     uint16_t sa_family;
78     uint16_t sa_port;
79     uint32_t sa_addr;
80 }
81 
82 struct nng_sockaddr_zt {
83     uint16_t sa_family;
84     uint64_t sa_nwid;
85     uint64_t sa_nodeid;
86     uint32_t sa_port;
87 }
88 alias nng_sockaddr_udp = nng_sockaddr_in;
89 alias nng_sockaddr_tcp = nng_sockaddr_in;
90 
91 align(1) union nng_sockaddr {
92     uint16_t            s_family;
93     nng_sockaddr_path   s_ipc;
94     nng_sockaddr_inproc s_inproc;
95     nng_sockaddr_in6    s_in6;
96     nng_sockaddr_in     s_in;
97     nng_sockaddr_zt     s_zt;
98 }
99 
100 package enum nng_sockaddr_family {
101     AF_UNSPEC = 0,
102     AF_INPROC = 1,
103     AF_IPC    = 2,
104     AF_INET   = 3,
105     AF_INET6  = 4,
106     AF_ZT     = 5 // ZeroTier
107 }
108 alias NNG_SOCKADDR_FAMILY = nng_sockaddr_family;
109 
110 struct nng_iov {
111     void * iov_buf;
112     size_t iov_len;
113 }
114 
115 enum {
116     NNG_DURATION_INFINITE = -1,
117     NNG_DURATION_DEFAULT = -2,
118     NNG_DURATION_ZERO = 0
119 }
120 
121 enum nng_pipe_ev {
122     ADD_PRE,  // Called just before pipe added to socket
123     ADD_POST, // Called just after pipe added to socket
124     REM_POST, // Called just after pipe removed from socket
125     NUM,      // Used internally, must be last.
126 }
127 alias NNG_PIPE_EV = nng_pipe_ev;
128 
129 alias nng_pipe_cb = void delegate (nng_pipe, nng_pipe_ev, void *);
130 alias nng_aio_cancelfn = void delegate (nng_aio *, void *, int);
131 
132 enum nng_flag_enum {
133     ALLOC    = 1,
134     NONBLOCK = 2
135 }
136 alias NNG_FLAG = nng_flag_enum; 
137 
138 enum {
139     NNG_OPT_SOCKNAME = "socket-name",
140     NNG_OPT_RAW = "raw",
141     NNG_OPT_PROTO = "protocol",
142     NNG_OPT_PROTONAME = "protocol-name",
143     NNG_OPT_PEER = "peer",
144     NNG_OPT_PEERNAME = "peer-name",
145     NNG_OPT_RECVBUF = "recv-buffer",
146     NNG_OPT_SENDBUF = "send-buffer",
147     NNG_OPT_RECVFD = "recv-fd",
148     NNG_OPT_SENDFD = "send-fd",
149     NNG_OPT_RECVTIMEO = "recv-timeout",
150     NNG_OPT_SENDTIMEO = "send-timeout",
151     NNG_OPT_LOCADDR = "local-address",
152     NNG_OPT_REMADDR = "remote-address",
153     NNG_OPT_URL = "url",
154     NNG_OPT_MAXTTL = "ttl-max",
155     NNG_OPT_RECVMAXSZ = "recv-size-max",
156     NNG_OPT_RECONNMINT = "reconnect-time-min",
157     NNG_OPT_RECONNMAXT = "reconnect-time-max",
158     NNG_OPT_TLS_CONFIG = "tls-config",
159     NNG_OPT_TLS_AUTH_MODE = "tls-authmode",
160     NNG_OPT_TLS_CERT_KEY_FILE = "tls-cert-key-file",
161     NNG_OPT_TLS_CA_FILE = "tls-ca-file",
162     NNG_OPT_TLS_SERVER_NAME = "tls-server-name",
163     NNG_OPT_TLS_VERIFIED = "tls-verified",
164     NNG_OPT_TCP_NODELAY = "tcp-nodelay",
165     NNG_OPT_TCP_KEEPALIVE = "tcp-keepalive",
166     NNG_OPT_TCP_BOUND_PORT = "tcp-bound-port",
167     NNG_OPT_IPC_SECURITY_DESCRIPTOR = "ipc:security-descriptor",
168     NNG_OPT_IPC_PERMISSIONS = "ipc:permissions",
169     NNG_OPT_IPC_PEER_UID = "ipc:peer-uid",
170     NNG_OPT_IPC_PEER_GID = "ipc:peer-gid",
171     NNG_OPT_IPC_PEER_PID = "ipc:peer-pid",
172     NNG_OPT_IPC_PEER_ZONEID = "ipc:peer-zoneid",
173     NNG_OPT_WS_REQUEST_HEADERS = "ws:request-headers",
174     NNG_OPT_WS_RESPONSE_HEADERS = "ws:response-headers",
175     NNG_OPT_WS_RESPONSE_HEADER = "ws:response-header:",
176     NNG_OPT_WS_REQUEST_HEADER = "ws:request-header:",
177     NNG_OPT_WS_REQUEST_URI = "ws:request-uri",
178     NNG_OPT_WS_SENDMAXFRAME = "ws:txframe-max",
179     NNG_OPT_WS_RECVMAXFRAME = "ws:rxframe-max",
180     NNG_OPT_WS_PROTOCOL = "ws:protocol"
181 }
182 
183 package enum nng_stat_type_enum {
184     SCOPE   = 0, // Stat is for scoping, and carries no value
185     LEVEL   = 1, // Numeric "absolute" value, diffs meaningless
186     COUNTER = 2, // Incrementing value (diffs are meaningful)
187     STRING  = 3, // Value is a string
188     BOOLEAN = 4, // Value is a boolean
189     ID      = 5, // Value is a numeric ID
190 }
191 alias NNG_STAT = nng_stat_type_enum;
192 
193 package enum nng_unit_enum {
194     NONE     = 0, // No special units
195     BYTES    = 1, // Bytes, e.g. bytes sent, etc.
196     MESSAGES = 2, // Messages, one per message
197     MILLIS   = 3, // Milliseconds
198     EVENTS   = 4  // Some other type of event
199 }
200 alias NNG_UNIT = nng_unit_enum;
201 
202 package enum nng_errno_enum {
203     EINTR        = 1,
204     ENOMEM       = 2,
205     EINVAL       = 3,
206     EBUSY        = 4,
207     ETIMEDOUT    = 5,
208     ECONNREFUSED = 6,
209     ECLOSED      = 7,
210     EAGAIN       = 8,
211     ENOTSUP      = 9,
212     EADDRINUSE   = 10,
213     ESTATE       = 11,
214     ENOENT       = 12,
215     EPROTO       = 13,
216     EUNREACHABLE = 14,
217     EADDRINVAL   = 15,
218     EPERM        = 16,
219     EMSGSIZE     = 17,
220     ECONNABORTED = 18,
221     ECONNRESET   = 19,
222     ECANCELED    = 20,
223     ENOFILES     = 21,
224     ENOSPC       = 22,
225     EEXIST       = 23,
226     EREADONLY    = 24,
227     EWRITEONLY   = 25,
228     ECRYPTO      = 26,
229     EPEERAUTH    = 27,
230     ENOARG       = 28,
231     EAMBIGUOUS   = 29,
232     EBADTYPE     = 30,
233     ECONNSHUT    = 31,
234     EINTERNAL    = 1000,
235     ESYSERR      = 0x10000000,
236     ETRANERR     = 0x20000000
237 }
238 alias NNG_ERRNO = nng_errno_enum;
239 
240 struct nng_url {
241     char *u_rawurl;   // never NULL
242     char *u_scheme;   // never NULL
243     char *u_userinfo; // will be NULL if not specified
244     char *u_host;     // including colon and port
245     char *u_hostname; // name only, will be "" if not specified
246     char *u_port;     // port, will be "" if not specified
247     char *u_path;     // path, will be "" if not specified
248     char *u_query;    // without '?', will be NULL if not specified
249     char *u_fragment; // without '#', will be NULL if not specified
250     char *u_requri;   // includes query and fragment, "" if not specified
251 }
252 
253 struct nng_stream;
254 struct nng_stream_dialer;
255 struct nng_stream_listener;
256 
257 
258 /**
259  compat/nanomsg/bus.h
260 */
261 enum {
262     NN_PROTO_BUS = 7,
263     NN_BUS = (NN_PROTO_BUS * 16 + 0)
264 }
265 
266 
267 /**
268  compat/nanomsg/inproc.h
269 */
270 enum NN_INPROC = -1;
271 
272 
273 /**
274  compat/nanomsg/ipc.h
275 */
276 enum {
277     NN_IPC = -2,
278     NN_IPC_SEC_ATTR = 1,
279     NN_IPC_OUTBUFSZ = 2,
280     NN_IPC_INBUFSZ = 3,
281 }
282 
283 
284 /**
285  compat/nanomsg/nn.h
286 */
287 enum {
288     AF_SP = 1,
289     AF_SP_RAW = 2,
290     NN_SOCKADDR_MAX = 128,
291     NN_SOL_SOCKET = 0,
292     NN_DONTWAIT = 1,
293     PROTO_SP = 1,
294     SP_HDR = 1,
295 }
296 
297 // Errnos.
298 public import core.stdc.errno;
299 
300 // Socket options
301 enum {
302     NN_LINGER = 1,
303     NN_SNDBUF = 2,
304     NN_RCVBUF = 3,
305     NN_SNDTIMEO = 4,
306     NN_RCVTIMEO = 5,
307     NN_RECONNECT_IVL = 6,
308     NN_RECONNECT_IVL_MAX = 7,
309     NN_SNDPRIO = 8,
310     NN_RCVPRIO = 9,
311     NN_SNDFD = 10,
312     NN_RCVFD = 11,
313     NN_DOMAIN = 12,
314     NN_PROTOCOL = 13,
315     NN_IPV4ONLY = 14,
316     NN_SOCKET_NAME = 15,
317     NN_RCVMAXSIZE = 16,
318     NN_MAXTTL = 17
319 }
320 
321 // Poll stuff
322 enum {
323     NN_POLLIN = 1,
324     NN_POLLOUT = 2
325 }
326 
327 struct nn_pollfd {
328 	int      fd;
329 	uint16_t events;
330 	uint16_t revents;
331 }
332 
333 struct nn_iovec {
334     void * iov_base;
335     size_t iov_len;
336 }
337 
338 struct nn_msghdr {
339 	nn_iovec*        msg_iov;
340 	int              msg_iovlen;
341 	void *           msg_control;
342 	size_t           msg_controllen;
343 }
344 
345 struct nn_cmsghdr {
346     size_t cmsg_len;
347     int    cmsg_level;
348     int    cmsg_type;
349 }
350 
351 /**
352   rewritten from lambda syntax because libdparse does not recognise alias to a lambda
353   and docs won't be built because adrdox depends on it
354 */
355 pragma(inline)
356 auto NN_CMSG_ALIGN_ (long len)
357 {
358     return (len + size_t.sizeof - 1) & cast(size_t) ~(size_t.sizeof - 1);
359 }
360 
361 /// posix-defined msghdr manipulation
362 pragma(inline)
363 auto NN_CMSG_FIRSTHDR(T)(T* mhdr)
364 {
365     return nn_cmsg_next (cast(nn_msghdr*) mhdr, null);
366 }
367 
368 /// posix-defined msghdr manipulation
369 pragma(inline)
370 auto NN_CMSG_NXTHDR(T,U)(T* mhdr, U*cmsg)
371 {
372     return nn_cmsg_next (cast(nn_msghdr*) mhdr, cast(nn_cmsghdr*) cmsg);
373 }
374 
375 /// posix-defined msghdr manipulation
376 pragma(inline)
377 ubyte* NN_CMSG_DATA(T)(T* cmsg)
378 {
379     return cast(ubyte*) ((cast(nn_cmsghdr*) cmsg) + 1);
380 }
381 
382 /// Extension to POSIX defined by RFC 3542.
383 pragma(inline)
384 auto NN_CMSG_SPACE(size_t len)
385 {
386     return (NN_CMSG_ALIGN_ (len) + NN_CMSG_ALIGN_ (nn_cmsghdr.sizeof));
387 }
388 
389 /// Extension to POSIX defined by RFC 3542.
390 pragma(inline)
391 auto NN_CMSG_LEN(size_t len)
392 {
393     return (NN_CMSG_ALIGN_ (nn_cmsghdr.sizeof) + (len));
394 }
395 
396 enum NN_MSG = size_t.max;
397 
398 
399 /**
400  compat/nanomsg/pair.h
401 */
402 enum {
403     NN_PROTO_PAIR = 1,
404     NN_PAIR = (NN_PROTO_PAIR * 16 + 0),
405     NN_PAIR_v0 = (NN_PROTO_PAIR * 16 + 0),
406     NN_PAIR_V1 = (NN_PROTO_PAIR * 16 + 1)
407 }
408 
409 
410 /**
411  compat/nanomsg/pipeline.h
412 */
413 enum {
414     NN_PROTO_PIPELINE = 5,
415     NN_PUSH = (NN_PROTO_PIPELINE * 16 + 0),
416     NN_PULL = (NN_PROTO_PIPELINE * 16 + 1)
417 }
418 
419 
420 /**
421  compat/nanomsg/pubsub.h
422 */
423 enum {
424     NN_PROTO_PUBSUB = 2,
425     NN_PUB = (NN_PROTO_PUBSUB * 16 + 0),
426     NN_SUB = (NN_PROTO_PUBSUB * 16 + 1),
427     NN_SUB_SUBSCRIBE = (NN_SUB * 16 + 1),
428     NN_SUB_UNSUBSCRIBE = (NN_SUB * 16 + 2),
429 }
430 
431 
432 /**
433  compat/nanomsg/reqrep.h
434 */
435 enum {
436     NN_PROTO_REQREP = 3,
437     NN_REQ = (NN_PROTO_REQREP * 16 + 0),
438     NN_REP = (NN_PROTO_REQREP * 16 + 1),
439     NN_REQ_RESEND_IVL = (NN_REQ * 16 + 1)
440 }
441 
442 
443 /**
444  compat/nanomsg/survey.h
445 */
446 enum {
447     NN_PROTO_SURVEY = 6,
448     NN_SURVEYOR = (NN_PROTO_SURVEY * 16 + 2),
449     NN_RESPONDENT = (NN_PROTO_SURVEY * 16 + 3),
450     NN_SURVEYOR_DEADLINE = (NN_SURVEYOR * 16 + 1)
451 }
452 
453 
454 /**
455  compat/nanomsg/tcp.h
456 */
457 enum {
458     NN_TCP = -3,
459     NN_TCP_NODELAY = 1
460 }
461 
462 
463 /**
464  compat/nanomsg/ws.h
465 */
466 enum {
467     NN_WS = -4,
468     NN_WS_MSG_TYPE = 1,
469     NN_WS_MSG_TYPE_TEXT = 0x1,
470     NN_WS_MSG_TYPE_BINARY = 0x2,
471 }
472 
473 
474 /**
475  protocol/pair1/pair1.h
476 */
477 enum NNG_OPT_PAIR1_POLY = "pair1:polyamorous";
478 
479 
480 /**
481  protocol/pubsub0/sub.h
482 */
483 enum {
484     NNG_OPT_SUB_SUBSCRIBE = "sub:subscribe",
485     NNG_OPT_SUB_UNSUBSCRIBE = "sub:unsubscribe",
486     NNG_OPT_SUB_PREFNEW = "sub:prefnew"
487 }
488 
489 
490 /**
491  protocol/reqrep0/req.h
492 */
493 enum NNG_OPT_REQ_RESENDTIME = "req:resend-time";
494 
495 
496 /**
497  protocol/survey0/survey.h
498 */
499 enum NNG_OPT_SURVEYOR_SURVEYTIME = "surveyor:survey-time";
500 
501 
502 /**
503  supplemental/http/http.h
504 */
505 struct nng_tls_config;
506 
507 // HTTP status codes.  This list is not exhaustive.
508 package enum nng_http_status {
509     CONTINUE                 = 100,
510     SWITCHING                = 101,
511     PROCESSING               = 102,
512     OK                       = 200,
513     CREATED                  = 201,
514     ACCEPTED                 = 202,
515     NOT_AUTHORITATIVE        = 203,
516     NO_CONTENT               = 204,
517     RESET_CONTENT            = 205,
518     PARTIAL_CONTENT          = 206,
519     MULTI_STATUS             = 207,
520     ALREADY_REPORTED         = 208,
521     IM_USED                  = 226,
522     MULTIPLE_CHOICES         = 300,
523     STATUS_MOVED_PERMANENTLY = 301,
524     FOUND                    = 302,
525     SEE_OTHER                = 303,
526     NOT_MODIFIED             = 304,
527     USE_PROXY                = 305,
528     TEMPORARY_REDIRECT       = 307,
529     PERMANENT_REDIRECT       = 308,
530     BAD_REQUEST              = 400,
531     UNAUTHORIZED             = 401,
532     PAYMENT_REQUIRED         = 402,
533     FORBIDDEN                = 403,
534     NOT_FOUND                = 404,
535     METHOD_NOT_ALLOWED       = 405,
536     NOT_ACCEPTABLE           = 406,
537     PROXY_AUTH_REQUIRED      = 407,
538     REQUEST_TIMEOUT          = 408,
539     CONFLICT                 = 409,
540     GONE                     = 410,
541     LENGTH_REQUIRED          = 411,
542     PRECONDITION_FAILED      = 412,
543     PAYLOAD_TOO_LARGE        = 413,
544     ENTITY_TOO_LONG          = 414,
545     UNSUPPORTED_MEDIA_TYPE   = 415,
546     RANGE_NOT_SATISFIABLE    = 416,
547     EXPECTATION_FAILED       = 417,
548     TEAPOT                   = 418,
549     UNPROCESSABLE_ENTITY     = 422,
550     LOCKED                   = 423,
551     FAILED_DEPENDENCY        = 424,
552     UPGRADE_REQUIRED         = 426,
553     PRECONDITION_REQUIRED    = 428,
554     TOO_MANY_REQUESTS        = 429,
555     HEADERS_TOO_LARGE        = 431,
556     UNAVAIL_LEGAL_REASONS    = 451,
557     INTERNAL_SERVER_ERROR    = 500,
558     NOT_IMPLEMENTED          = 501,
559     BAD_GATEWAY              = 502,
560     SERVICE_UNAVAILABLE      = 503,
561     GATEWAY_TIMEOUT          = 504,
562     HTTP_VERSION_NOT_SUPP    = 505,
563     VARIANT_ALSO_NEGOTIATES  = 506,
564     INSUFFICIENT_STORAGE     = 507,
565     LOOP_DETECTED            = 508,
566     NOT_EXTENDED             = 510,
567     NETWORK_AUTH_REQUIRED    = 511,
568 }
569 alias NNG_HTTP_STATUS = nng_http_status;
570 
571 struct nng_http_req;
572 struct nng_http_res;
573 struct nng_http_conn;
574 struct nng_http_handler;
575 struct nng_http_server;
576 struct nng_http_client;
577 
578 
579 /**
580  supplemental/tls/tls.h
581 */
582 package enum nng_tls_mode {
583 	CLIENT = 0,
584 	SERVER = 1,
585 }
586 alias NNG_TLS_MODE = nng_tls_mode;
587 
588 package enum nng_tls_auth_mode {
589 	NONE     = 0, // No verification is performed
590 	OPTIONAL = 1, // Verify cert if presented
591 	REQUIRED = 2, // Verify cert, close if invalid
592 }
593 alias NNG_TLS_AUTH_MODE = nng_tls_auth_mode;
594 
595 /**
596  supplemental/util/options.h
597 */
598 struct nng_optspec {
599     const char *o_name;  // Long style name (may be NULL for short only)
600     int         o_short; // Short option (no clustering!)
601     int         o_val;   // Value stored on a good parse (>0)
602     bool        o_arg;   // Option takes an argument if true
603 }
604 
605 
606 /**
607  supplemental/util/platform.h
608 */
609 alias nng_time = uint64_t ;
610 struct nng_thread;
611 struct nng_mtx;
612 struct nng_cv;
613 
614 
615 /**
616  transport/ws/websocket.h
617 */
618 alias NNG_OPT_WSS_REQUEST_HEADERS = NNG_OPT_WS_REQUEST_HEADERS;
619 alias NNG_OPT_WSS_RESPONSE_HEADERS = NNG_OPT_WS_RESPONSE_HEADERS;
620 
621 
622 /**
623  transport/zerotier/zerotier.h
624 */
625 enum {
626     NNG_OPT_ZT_HOME = "zt:home",
627     NNG_OPT_ZT_NWID = "zt:nwid",
628     NNG_OPT_ZT_NODE = "zt:node",
629     NNG_OPT_ZT_NETWORK_STATUS = "zt:network-status",
630     NNG_OPT_ZT_NETWORK_NAME = "zt:network-name",
631     NNG_OPT_ZT_PING_TIME = "zt:ping-time",
632     NNG_OPT_ZT_PING_TRIES = "zt:ping-tries",
633     NNG_OPT_ZT_CONN_TIME = "zt:conn-time",
634     NNG_OPT_ZT_CONN_TRIES = "zt:conn-tries",
635     NNG_OPT_ZT_MTU = "zt:mtu",
636     NNG_OPT_ZT_ORBIT = "zt:orbit",
637     NNG_OPT_ZT_DEORBIT = "zt:deorbit",
638     NNG_OPT_ZT_ADD_LOCAL_ADDR = "zt:add-local-addr",
639     NNG_OPT_ZT_CLEAR_LOCAL_ADDRS = "zt:clear-local-addrs"
640 }
641 
642 package enum nng_zt_status {
643 	UP,
644 	CONFIG,
645 	DENIED,
646 	NOTFOUND,
647 	ERROR,
648 	OBSOLETE,
649 	UNKNOWN,
650 }
651 alias NNG_ZT_STATUS = nng_zt_status;