diff options
| author | Garrett D'Amore <garrett@damore.org> | 2017-09-25 12:49:10 -0700 |
|---|---|---|
| committer | Garrett D'Amore <garrett@damore.org> | 2017-09-27 14:38:12 -0700 |
| commit | 64db0f085be0c9efc6dca8d9e72d3e5a47cb792e (patch) | |
| tree | 475520498d8ebe9e47e9785d8f9d209c87582400 /src/nng.h | |
| parent | 86a96e5bf1b207a8b1aa925e1d9f73ce834505b8 (diff) | |
| download | nng-64db0f085be0c9efc6dca8d9e72d3e5a47cb792e.tar.gz nng-64db0f085be0c9efc6dca8d9e72d3e5a47cb792e.tar.bz2 nng-64db0f085be0c9efc6dca8d9e72d3e5a47cb792e.zip | |
Refactor option handling APIs.
This makes the APIs use string keys, and largely eliminates the use of
integer option IDs altogether. The underlying registration for options
is also now a bit richer, letting protcols and transports declare the
actual options they use, rather than calling down into each entry point
carte blanche and relying on ENOTSUP.
This code may not be as fast as the integers was, but it is more intuitive,
easier to extend, and is not on any hot code paths. (If you're diddling
options on a hot code path you're doing something wrong.)
Diffstat (limited to 'src/nng.h')
| -rw-r--r-- | src/nng.h | 136 |
1 files changed, 60 insertions, 76 deletions
@@ -86,16 +86,16 @@ NNG_DECL uint16_t nng_protocol(nng_socket); NNG_DECL uint16_t nng_peer(nng_socket); // nng_setopt sets an option for a specific socket. -NNG_DECL int nng_setopt(nng_socket, int, const void *, size_t); -NNG_DECL int nng_setopt_int(nng_socket, int, int); -NNG_DECL int nng_setopt_usec(nng_socket, int, uint64_t); -NNG_DECL int nng_setopt_size(nng_socket, int, size_t); +NNG_DECL int nng_setopt(nng_socket, const char *, const void *, size_t); +NNG_DECL int nng_setopt_int(nng_socket, const char *, int); +NNG_DECL int nng_setopt_usec(nng_socket, const char *, uint64_t); +NNG_DECL int nng_setopt_size(nng_socket, const char *, size_t); // nng_socket_getopt obtains the option for a socket. -NNG_DECL int nng_getopt(nng_socket, int, void *, size_t *); -NNG_DECL int nng_getopt_int(nng_socket, int, int *); -NNG_DECL int nng_getopt_usec(nng_socket, int, uint64_t *); -NNG_DECL int nng_getopt_size(nng_socket, int, size_t *); +NNG_DECL int nng_getopt(nng_socket, const char *, void *, size_t *); +NNG_DECL int nng_getopt_int(nng_socket, const char *, int *); +NNG_DECL int nng_getopt_usec(nng_socket, const char *, uint64_t *); +NNG_DECL int nng_getopt_size(nng_socket, const char *, size_t *); // nng_notify_func is a user function that is executed upon certain // events. See below. @@ -199,35 +199,36 @@ NNG_DECL int nng_listener_close(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, int, const void *, size_t); -NNG_DECL int nng_dialer_setopt_int(nng_dialer, int, int); -NNG_DECL int nng_dialer_setopt_usec(nng_dialer, int, uint64_t); -NNG_DECL int nng_dialer_setopt_size(nng_dialer, int, size_t); +NNG_DECL int nng_dialer_setopt(nng_dialer, const char *, const void *, size_t); +NNG_DECL int nng_dialer_setopt_int(nng_dialer, const char *, int); +NNG_DECL int nng_dialer_setopt_usec(nng_dialer, const char *, uint64_t); +NNG_DECL int nng_dialer_setopt_size(nng_dialer, const char *, size_t); // 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, int, void *, size_t *); -NNG_DECL int nng_dialer_getopt_int(nng_dialer, int, int *); -NNG_DECL int nng_dialer_getopt_usec(nng_dialer, int, uint64_t *); -NNG_DECL int nng_dialer_getopt_size(nng_dialer, int, size_t *); +NNG_DECL int nng_dialer_getopt(nng_dialer, const char *, void *, size_t *); +NNG_DECL int nng_dialer_getopt_int(nng_dialer, const char *, int *); +NNG_DECL int nng_dialer_getopt_usec(nng_dialer, const char *, uint64_t *); +NNG_DECL int nng_dialer_getopt_size(nng_dialer, const char *, size_t *); // 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_dialer, int, const void *, size_t); -NNG_DECL int nng_listener_setopt_int(nng_dialer, int, int); -NNG_DECL int nng_listener_setopt_usec(nng_dialer, int, uint64_t); -NNG_DECL int nng_listener_setopt_size(nng_dialer, int, size_t); +NNG_DECL int nng_listener_setopt( + nng_listener, const char *, const void *, size_t); +NNG_DECL int nng_listener_setopt_int(nng_listener, const char *, int); +NNG_DECL int nng_listener_setopt_usec(nng_listener, const char *, uint64_t); +NNG_DECL int nng_listener_setopt_size(nng_listener, const char *, size_t); // 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, int, void *, size_t *); -NNG_DECL int nng_listener_getopt_int(nng_listener, int, int *); -NNG_DECL int nng_listener_getopt_usec(nng_listener, int, uint64_t *); -NNG_DECL int nng_listener_getopt_size(nng_listener, int, size_t *); +NNG_DECL int nng_listener_getopt(nng_listener, const char *, void *, size_t *); +NNG_DECL int nng_listener_getopt_int(nng_listener, const char *, int *); +NNG_DECL int nng_listener_getopt_usec(nng_listener, const char *, uint64_t *); +NNG_DECL int nng_listener_getopt_size(nng_listener, const char *, size_t *); // nng_strerror returns a human readable string associated with the error // code supplied. @@ -320,7 +321,7 @@ NNG_DECL const char *nng_option_name(int); // 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, int, void *, size_t *); +NNG_DECL int nng_pipe_getopt(nng_pipe, const char *, void *, size_t *); NNG_DECL int nng_pipe_close(nng_pipe); // Flags. @@ -395,60 +396,41 @@ NNG_DECL int nng_respondent0_open(nng_socket *); #define nng_surveyor_open nng_surveyor0_open #define nng_respondent_open nng_respondent0_open -// Options. We encode option numbers as follows: -// -// <level> - 0: socket, 1: transport -// <type> - zero (socket), or transport (8 bits) -// <code> - specific value (16 bits) -#define NNG_OPT_SOCKET(c) (c) -#define NNG_OPT_TRANSPORT_OPT(t, c) (0x10000 | ((t) << 16) | (c)) +// Options. +#define NNG_OPT_RAW "raw" +#define NNG_OPT_LINGER "linger" +#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_PROTOCOL "protocol" +#define NNG_OPT_TRANSPORT "transport" +#define NNG_OPT_RECVMAXSZ "recv-size-max" +#define NNG_OPT_RECONNMINT "reconnect-time-min" +#define NNG_OPT_RECONNMAXT "reconnect-time-max" + +#define NNG_OPT_SUB_SUBSCRIBE "sub:subscribe" +#define NNG_OPT_SUB_UNSUBSCRIBE "sub:unsubscribe" + +#define NNG_OPT_REQ_RESENDTIME "req:resend-time" + +#define NNG_OPT_SURVEYOR_SURVEYTIME "surveyor:survey-time" NNG_DECL const char *nng_opt_raw; -NNG_DECL const char *nng_opt_linger; -NNG_DECL const char *nng_opt_recvbuf; -NNG_DECL const char *nng_opt_sendbuf; -NNG_DECL const char *nng_opt_recvtimeo; -NNG_DECL const char *nng_opt_sendtimeo; NNG_DECL const char *nng_opt_recvmaxsz; -NNG_DECL const char *nng_opt_reconnmint; -NNG_DECL const char *nng_opt_reconnmaxt; NNG_DECL const char *nng_opt_maxttl; NNG_DECL const char *nng_opt_protocol; NNG_DECL const char *nng_opt_transport; -NNG_DECL const char *nng_opt_recvfd; -NNG_DECL const char *nng_opt_sendfd; NNG_DECL const char *nng_opt_locaddr; NNG_DECL const char *nng_opt_remaddr; -NNG_DECL const char *nng_opt_url; -NNG_DECL const char *nng_opt_req_resendtime; -NNG_DECL const char *nng_opt_sub_subscribe; -NNG_DECL const char *nng_opt_sub_unsubscribe; NNG_DECL const char *nng_opt_surveyor_surveytime; -NNG_DECL int nng_optid_raw; -NNG_DECL int nng_optid_linger; -NNG_DECL int nng_optid_recvbuf; -NNG_DECL int nng_optid_sendbuf; -NNG_DECL int nng_optid_recvtimeo; -NNG_DECL int nng_optid_sendtimeo; -NNG_DECL int nng_optid_recvmaxsz; -NNG_DECL int nng_optid_reconnmint; -NNG_DECL int nng_optid_reconnmaxt; -NNG_DECL int nng_optid_maxttl; -NNG_DECL int nng_optid_protocol; -NNG_DECL int nng_optid_transport; -NNG_DECL int nng_optid_recvfd; -NNG_DECL int nng_optid_sendfd; -NNG_DECL int nng_optid_locaddr; -NNG_DECL int nng_optid_remaddr; -NNG_DECL int nng_optid_url; - -// These protocol specific options may not be valid until a socket of -// the given protocol is opened! -NNG_DECL int nng_optid_req_resendtime; -NNG_DECL int nng_optid_sub_subscribe; -NNG_DECL int nng_optid_sub_unsubscribe; -NNG_DECL int nng_optid_surveyor_surveytime; // XXX: TBD: priorities, socket names, ipv4only // Statistics. These are for informational purposes only, and subject @@ -598,8 +580,9 @@ enum nng_errno_enum { NNG_ENOFILES = 21, NNG_ENOSPC = 22, NNG_EEXIST = 23, - NNG_EINTERNAL = 24, - NNG_ETRANSPORT = 25, + NNG_EREADONLY = 24, + NNG_EWRITEONLY = 25, + NNG_EINTERNAL = 1000, NNG_ESYSERR = 0x10000000, NNG_ETRANERR = 0x20000000, }; @@ -648,11 +631,12 @@ typedef struct nng_sockaddr_zt nng_sockaddr_zt; typedef struct nng_sockaddr { union { - uint16_t s_family; - nng_sockaddr_path s_path; - nng_sockaddr_in6 s_in6; - nng_sockaddr_in s_in; - nng_sockaddr_zt s_zt; + uint16_t s_family; + nng_sockaddr_path s_path; + nng_sockaddr_inproc s_inproc; + nng_sockaddr_in6 s_in6; + nng_sockaddr_in s_in; + nng_sockaddr_zt s_zt; } s_un; } nng_sockaddr; |
