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;