aboutsummaryrefslogtreecommitdiff
path: root/src/nng.c
diff options
context:
space:
mode:
authorGarrett D'Amore <garrett@damore.org>2018-03-19 16:02:37 -0700
committerGarrett D'Amore <garrett@damore.org>2018-03-20 09:53:58 -0700
commit9ca901c1b70b17d851426483d9f54611cfa8e395 (patch)
treea26b11e16f505ccdc77b5ac6681e0f9de705ff20 /src/nng.c
parent9b886a9999247d87c9f6d389c3e65a4bd39be010 (diff)
downloadnng-9ca901c1b70b17d851426483d9f54611cfa8e395.tar.gz
nng-9ca901c1b70b17d851426483d9f54611cfa8e395.tar.bz2
nng-9ca901c1b70b17d851426483d9f54611cfa8e395.zip
fixes #296 Typed options should validate option type
fixes #302 nng_dialer/listener/pipe_getopt_sockaddr desired This adds plumbing to pass and check the type of options all the way through. NNG_ZT_OPT_ORBIT is type UINT64, but you can use the untyped form to pass two of them if needed. No typed access for retrieving strings yet. I think this should allocate a pointer and copy that out, but that's for later.
Diffstat (limited to 'src/nng.c')
-rw-r--r--src/nng.c269
1 files changed, 168 insertions, 101 deletions
diff --git a/src/nng.c b/src/nng.c
index 62c7de7b..f4d6ce0c 100644
--- a/src/nng.c
+++ b/src/nng.c
@@ -331,8 +331,8 @@ nng_dialer_start(nng_dialer id, int flags)
}
static int
-nng_ep_setopt(
- uint32_t id, const char *name, const void *val, size_t sz, int mode)
+nng_ep_setx(
+ uint32_t id, const char *n, const void *v, size_t sz, int mode, int t)
{
nni_ep *ep;
int rv;
@@ -344,7 +344,7 @@ nng_ep_setopt(
return (rv);
}
if (nni_ep_mode(ep) == mode) {
- rv = nni_ep_setopt(ep, name, val, sz);
+ rv = nni_ep_setopt(ep, n, v, sz, t);
} else {
rv = NNG_ENOENT;
}
@@ -353,7 +353,7 @@ nng_ep_setopt(
}
static int
-nng_ep_getopt(uint32_t id, const char *name, void *val, size_t *szp, int mode)
+nng_ep_getx(uint32_t id, const char *n, void *v, size_t *szp, int mode, int t)
{
nni_ep *ep;
int rv;
@@ -365,7 +365,7 @@ nng_ep_getopt(uint32_t id, const char *name, void *val, size_t *szp, int mode)
return (rv);
}
if (nni_ep_mode(ep) == mode) {
- rv = nni_ep_getopt(ep, name, val, szp);
+ rv = nni_ep_getopt(ep, n, v, szp, t);
} else {
rv = NNG_ENOENT;
}
@@ -373,197 +373,238 @@ nng_ep_getopt(uint32_t id, const char *name, void *val, size_t *szp, int mode)
return (rv);
}
+static int
+nng_dialer_setx(nng_dialer id, const char *nm, const void *v, size_t sz, int t)
+{
+ return (nng_ep_setx(id, nm, v, sz, NNI_EP_MODE_DIAL, t));
+}
+
int
nng_dialer_setopt(nng_dialer id, const char *name, const void *v, size_t sz)
{
- return (nng_ep_setopt(id, name, v, sz, NNI_EP_MODE_DIAL));
+ return (nng_dialer_setx(id, name, v, sz, NNI_TYPE_OPAQUE));
}
int
-nng_dialer_setopt_bool(nng_dialer id, const char *name, bool val)
+nng_dialer_setopt_bool(nng_dialer id, const char *name, bool v)
{
- return (nng_dialer_setopt(id, name, &val, sizeof(val)));
+ return (nng_dialer_setx(id, name, &v, sizeof(v), NNI_TYPE_BOOL));
}
int
-nng_dialer_setopt_int(nng_dialer id, const char *name, int val)
+nng_dialer_setopt_int(nng_dialer id, const char *name, int v)
{
- return (nng_dialer_setopt(id, name, &val, sizeof(val)));
+ return (nng_dialer_setx(id, name, &v, sizeof(v), NNI_TYPE_INT32));
}
int
-nng_dialer_setopt_size(nng_dialer id, const char *name, size_t val)
+nng_dialer_setopt_size(nng_dialer id, const char *name, size_t v)
{
- return (nng_dialer_setopt(id, name, &val, sizeof(val)));
+ return (nng_dialer_setx(id, name, &v, sizeof(v), NNI_TYPE_SIZE));
}
int
-nng_dialer_setopt_ms(nng_dialer id, const char *name, nng_duration val)
+nng_dialer_setopt_ms(nng_dialer id, const char *name, nng_duration v)
{
- return (nng_dialer_setopt(id, name, &val, sizeof(val)));
+ return (nng_dialer_setx(id, name, &v, sizeof(v), NNI_TYPE_DURATION));
}
int
-nng_dialer_setopt_uint64(nng_dialer id, const char *name, uint64_t val)
+nng_dialer_setopt_uint64(nng_dialer id, const char *name, uint64_t v)
{
- return (nng_dialer_setopt(id, name, &val, sizeof(val)));
+ return (nng_dialer_setx(id, name, &v, sizeof(v), NNI_TYPE_UINT64));
}
int
-nng_dialer_setopt_ptr(nng_dialer id, const char *name, void *val)
+nng_dialer_setopt_ptr(nng_dialer id, const char *name, void *v)
{
- return (nng_dialer_setopt(id, name, &val, sizeof(val)));
+ return (nng_dialer_setx(id, name, &v, sizeof(v), NNI_TYPE_POINTER));
}
int
-nng_dialer_setopt_string(nng_dialer id, const char *name, const char *val)
+nng_dialer_setopt_string(nng_dialer id, const char *name, const char *v)
+{
+ return (nng_dialer_setx(id, name, v, strlen(v) + 1, NNI_TYPE_STRING));
+}
+
+static int
+nng_dialer_getx(nng_dialer id, const char *n, void *v, size_t *szp, int t)
{
- return (nng_dialer_setopt(id, name, val, strlen(val) + 1));
+ return (nng_ep_getx(id, n, v, szp, NNI_EP_MODE_DIAL, t));
}
int
nng_dialer_getopt(nng_dialer id, const char *name, void *val, size_t *szp)
{
- return (nng_ep_getopt(id, name, val, szp, NNI_EP_MODE_DIAL));
+ return (nng_dialer_getx(id, name, val, szp, NNI_TYPE_OPAQUE));
}
int
-nng_dialer_getopt_bool(nng_dialer id, const char *name, bool *valp)
+nng_dialer_getopt_bool(nng_dialer id, const char *name, bool *vp)
{
- size_t sz = sizeof(*valp);
- return (nng_dialer_getopt(id, name, valp, &sz));
+ size_t sz = sizeof(*vp);
+ return (nng_dialer_getx(id, name, vp, &sz, NNI_TYPE_BOOL));
}
int
-nng_dialer_getopt_int(nng_dialer id, const char *name, int *valp)
+nng_dialer_getopt_int(nng_dialer id, const char *name, int *vp)
{
- size_t sz = sizeof(*valp);
- return (nng_dialer_getopt(id, name, valp, &sz));
+ size_t sz = sizeof(*vp);
+ return (nng_dialer_getx(id, name, vp, &sz, NNI_TYPE_INT32));
}
int
-nng_dialer_getopt_size(nng_dialer id, const char *name, size_t *valp)
+nng_dialer_getopt_size(nng_dialer id, const char *name, size_t *vp)
{
- size_t sz = sizeof(*valp);
- return (nng_dialer_getopt(id, name, valp, &sz));
+ size_t sz = sizeof(*vp);
+ return (nng_dialer_getx(id, name, vp, &sz, NNI_TYPE_SIZE));
}
int
-nng_dialer_getopt_uint64(nng_dialer id, const char *name, uint64_t *valp)
+nng_dialer_getopt_sockaddr(nng_dialer id, const char *name, nng_sockaddr *vp)
{
- size_t sz = sizeof(*valp);
- return (nng_dialer_getopt(id, name, valp, &sz));
+ size_t sz = sizeof(*vp);
+ return (nng_dialer_getx(id, name, vp, &sz, NNI_TYPE_SOCKADDR));
}
int
-nng_dialer_getopt_ptr(nng_dialer id, const char *name, void **valp)
+nng_dialer_getopt_uint64(nng_dialer id, const char *name, uint64_t *vp)
{
- size_t sz = sizeof(*valp);
- return (nng_dialer_getopt(id, name, valp, &sz));
+ size_t sz = sizeof(*vp);
+ return (nng_dialer_getx(id, name, vp, &sz, NNI_TYPE_UINT64));
}
int
-nng_dialer_getopt_ms(nng_dialer id, const char *name, nng_duration *valp)
+nng_dialer_getopt_ptr(nng_dialer id, const char *name, void **vp)
{
- size_t sz = sizeof(*valp);
- return (nng_dialer_getopt(id, name, valp, &sz));
+ size_t sz = sizeof(*vp);
+ return (nng_dialer_getx(id, name, vp, &sz, NNI_TYPE_POINTER));
+}
+
+int
+nng_dialer_getopt_ms(nng_dialer id, const char *name, nng_duration *vp)
+{
+ size_t sz = sizeof(*vp);
+ return (nng_dialer_getx(id, name, vp, &sz, NNI_TYPE_DURATION));
+}
+
+int
+nng_listener_setx(
+ nng_listener id, const char *name, const void *v, size_t sz, int t)
+{
+ return (nng_ep_setx(id, name, v, sz, NNI_EP_MODE_LISTEN, t));
}
int
nng_listener_setopt(
nng_listener id, const char *name, const void *v, size_t sz)
{
- return (nng_ep_setopt(id, name, v, sz, NNI_EP_MODE_LISTEN));
+ return (nng_listener_setx(id, name, v, sz, NNI_TYPE_OPAQUE));
}
int
-nng_listener_setopt_bool(nng_listener id, const char *name, bool val)
+nng_listener_setopt_bool(nng_listener id, const char *name, bool v)
{
- return (nng_listener_setopt(id, name, &val, sizeof(val)));
+ return (nng_listener_setx(id, name, &v, sizeof(v), NNI_TYPE_BOOL));
}
int
-nng_listener_setopt_int(nng_listener id, const char *name, int val)
+nng_listener_setopt_int(nng_listener id, const char *name, int v)
{
- return (nng_listener_setopt(id, name, &val, sizeof(val)));
+ return (nng_listener_setx(id, name, &v, sizeof(v), NNI_TYPE_INT32));
}
int
-nng_listener_setopt_size(nng_listener id, const char *name, size_t val)
+nng_listener_setopt_size(nng_listener id, const char *name, size_t v)
{
- return (nng_listener_setopt(id, name, &val, sizeof(val)));
+ return (nng_listener_setx(id, name, &v, sizeof(v), NNI_TYPE_SIZE));
}
int
-nng_listener_setopt_ms(nng_listener id, const char *name, nng_duration val)
+nng_listener_setopt_ms(nng_listener id, const char *name, nng_duration v)
{
- return (nng_listener_setopt(id, name, &val, sizeof(val)));
+ return (nng_listener_setx(id, name, &v, sizeof(v), NNI_TYPE_DURATION));
}
int
-nng_listener_setopt_uint64(nng_listener id, const char *name, uint64_t val)
+nng_listener_setopt_uint64(nng_listener id, const char *name, uint64_t v)
{
- return (nng_listener_setopt(id, name, &val, sizeof(val)));
+ return (nng_listener_setx(id, name, &v, sizeof(v), NNI_TYPE_UINT64));
}
int
-nng_listener_setopt_ptr(nng_listener id, const char *name, void *val)
+nng_listener_setopt_ptr(nng_listener id, const char *name, void *v)
{
- return (nng_listener_setopt(id, name, &val, sizeof(val)));
+ return (nng_listener_setx(id, name, &v, sizeof(v), NNI_TYPE_POINTER));
}
int
-nng_listener_setopt_string(nng_listener id, const char *name, const char *val)
+nng_listener_setopt_string(nng_listener id, const char *n, const char *v)
{
- return (nng_listener_setopt(id, name, val, strlen(val) + 1));
+ return (nng_listener_setx(id, n, v, strlen(v) + 1, NNI_TYPE_STRING));
}
int
-nng_listener_getopt(nng_listener id, const char *name, void *val, size_t *szp)
+nng_listener_getx(
+ nng_listener id, const char *name, void *v, size_t *szp, int t)
{
- return (nng_ep_getopt(id, name, val, szp, NNI_EP_MODE_LISTEN));
+ return (nng_ep_getx(id, name, v, szp, NNI_EP_MODE_LISTEN, t));
}
int
-nng_listener_getopt_bool(nng_listener id, const char *name, bool *valp)
+nng_listener_getopt(nng_listener id, const char *name, void *v, size_t *szp)
{
- size_t sz = sizeof(*valp);
- return (nng_listener_getopt(id, name, valp, &sz));
+ return (nng_listener_getx(id, name, v, szp, NNI_TYPE_OPAQUE));
}
int
-nng_listener_getopt_int(nng_listener id, const char *name, int *valp)
+nng_listener_getopt_bool(nng_listener id, const char *name, bool *vp)
{
- size_t sz = sizeof(*valp);
- return (nng_listener_getopt(id, name, valp, &sz));
+ size_t sz = sizeof(*vp);
+ return (nng_listener_getx(id, name, vp, &sz, NNI_TYPE_BOOL));
}
int
-nng_listener_getopt_size(nng_listener id, const char *name, size_t *valp)
+nng_listener_getopt_int(nng_listener id, const char *name, int *vp)
{
- size_t sz = sizeof(*valp);
- return (nng_listener_getopt(id, name, valp, &sz));
+ size_t sz = sizeof(*vp);
+ return (nng_listener_getx(id, name, vp, &sz, NNI_TYPE_INT32));
}
int
-nng_listener_getopt_uint64(nng_listener id, const char *name, uint64_t *valp)
+nng_listener_getopt_size(nng_listener id, const char *name, size_t *vp)
{
- size_t sz = sizeof(*valp);
- return (nng_listener_getopt(id, name, valp, &sz));
+ size_t sz = sizeof(*vp);
+ return (nng_listener_getx(id, name, vp, &sz, NNI_TYPE_SIZE));
}
int
-nng_listener_getopt_ptr(nng_listener id, const char *name, void **valp)
+nng_listener_getopt_sockaddr(
+ nng_listener id, const char *name, nng_sockaddr *vp)
{
- size_t sz = sizeof(*valp);
- return (nng_listener_getopt(id, name, valp, &sz));
+ size_t sz = sizeof(*vp);
+ return (nng_listener_getx(id, name, vp, &sz, NNI_TYPE_SOCKADDR));
}
int
-nng_listener_getopt_ms(nng_listener id, const char *name, nng_duration *valp)
+nng_listener_getopt_uint64(nng_listener id, const char *name, uint64_t *vp)
{
- size_t sz = sizeof(*valp);
- return (nng_listener_getopt(id, name, valp, &sz));
+ size_t sz = sizeof(*vp);
+ return (nng_listener_getx(id, name, vp, &sz, NNI_TYPE_UINT64));
+}
+
+int
+nng_listener_getopt_ptr(nng_listener id, const char *name, void **vp)
+{
+ size_t sz = sizeof(*vp);
+ return (nng_listener_getx(id, name, vp, &sz, NNI_TYPE_POINTER));
+}
+
+int
+nng_listener_getopt_ms(nng_listener id, const char *name, nng_duration *vp)
+{
+ size_t sz = sizeof(*vp);
+ return (nng_listener_getx(id, name, vp, &sz, NNI_TYPE_DURATION));
}
static int
@@ -596,8 +637,8 @@ nng_listener_close(nng_listener l)
return (nng_ep_close((uint32_t) l, NNI_EP_MODE_LISTEN));
}
-int
-nng_setopt(nng_socket sid, const char *name, const void *val, size_t sz)
+static int
+nng_setx(nng_socket sid, const char *name, const void *val, size_t sz, int t)
{
nni_sock *sock;
int rv;
@@ -608,13 +649,19 @@ nng_setopt(nng_socket sid, const char *name, const void *val, size_t sz)
if ((rv = nni_sock_find(&sock, sid)) != 0) {
return (rv);
}
- rv = nni_sock_setopt(sock, name, val, sz);
+ rv = nni_sock_setopt(sock, name, val, sz, t);
nni_sock_rele(sock);
return (rv);
}
int
-nng_getopt(nng_socket sid, const char *name, void *val, size_t *szp)
+nng_setopt(nng_socket sid, const char *name, const void *val, size_t sz)
+{
+ return (nng_setx(sid, name, val, sz, NNI_TYPE_OPAQUE));
+}
+
+static int
+nng_getx(nng_socket sid, const char *name, void *val, size_t *szp, int t)
{
nni_sock *sock;
int rv;
@@ -625,94 +672,100 @@ nng_getopt(nng_socket sid, const char *name, void *val, size_t *szp)
if ((rv = nni_sock_find(&sock, sid)) != 0) {
return (rv);
}
- rv = nni_sock_getopt(sock, name, val, szp);
+ rv = nni_sock_getopt(sock, name, val, szp, t);
nni_sock_rele(sock);
return (rv);
}
+int
+nng_getopt(nng_socket sid, const char *name, void *val, size_t *szp)
+{
+ return (nng_getx(sid, name, val, szp, NNI_TYPE_OPAQUE));
+}
+
// Convenience option wrappers.
int
nng_setopt_int(nng_socket sid, const char *name, int val)
{
- return (nng_setopt(sid, name, &val, sizeof(val)));
+ return (nng_setx(sid, name, &val, sizeof(val), NNI_TYPE_INT32));
}
int
nng_setopt_bool(nng_socket sid, const char *name, bool val)
{
- return (nng_setopt(sid, name, &val, sizeof(val)));
+ return (nng_setx(sid, name, &val, sizeof(val), NNI_TYPE_BOOL));
}
int
nng_setopt_size(nng_socket sid, const char *name, size_t val)
{
- return (nng_setopt(sid, name, &val, sizeof(val)));
+ return (nng_setx(sid, name, &val, sizeof(val), NNI_TYPE_SIZE));
}
int
nng_setopt_ms(nng_socket sid, const char *name, nng_duration val)
{
- return (nng_setopt(sid, name, &val, sizeof(val)));
+ return (nng_setx(sid, name, &val, sizeof(val), NNI_TYPE_DURATION));
}
int
nng_setopt_uint64(nng_socket sid, const char *name, uint64_t val)
{
- return (nng_setopt(sid, name, &val, sizeof(val)));
+ return (nng_setx(sid, name, &val, sizeof(val), NNI_TYPE_UINT64));
}
int
nng_setopt_ptr(nng_socket sid, const char *name, void *val)
{
- return (nng_setopt(sid, name, &val, sizeof(val)));
+ return (nng_setx(sid, name, &val, sizeof(val), NNI_TYPE_POINTER));
}
int
nng_setopt_string(nng_socket sid, const char *name, const char *val)
{
- return (nng_setopt(sid, name, val, strlen(val) + 1));
+ return (nng_setx(sid, name, val, strlen(val) + 1, NNI_TYPE_STRING));
}
int
nng_getopt_bool(nng_socket sid, const char *name, bool *valp)
{
size_t sz = sizeof(*valp);
- return (nng_getopt(sid, name, valp, &sz));
+ return (nng_getx(sid, name, valp, &sz, NNI_TYPE_BOOL));
}
int
nng_getopt_int(nng_socket sid, const char *name, int *valp)
{
size_t sz = sizeof(*valp);
- return (nng_getopt(sid, name, valp, &sz));
+ return (nng_getx(sid, name, valp, &sz, NNI_TYPE_INT32));
}
int
nng_getopt_size(nng_socket sid, const char *name, size_t *valp)
{
size_t sz = sizeof(*valp);
- return (nng_getopt(sid, name, valp, &sz));
+ return (nng_getx(sid, name, valp, &sz, NNI_TYPE_SIZE));
}
int
nng_getopt_uint64(nng_socket sid, const char *name, uint64_t *valp)
{
size_t sz = sizeof(*valp);
- return (nng_getopt(sid, name, valp, &sz));
+ return (nng_getx(sid, name, valp, &sz, NNI_TYPE_UINT64));
}
int
nng_getopt_ms(nng_socket sid, const char *name, nng_duration *valp)
{
size_t sz = sizeof(*valp);
- return (nng_getopt(sid, name, valp, &sz));
+ return (nng_getx(sid, name, valp, &sz, NNI_TYPE_DURATION));
}
int
nng_getopt_ptr(nng_socket sid, const char *name, void **valp)
{
size_t sz = sizeof(*valp);
- return (nng_getopt(sid, name, valp, &sz));
+ return (nng_getx(sid, name, valp, &sz, NNI_TYPE_DURATION));
}
int
@@ -779,6 +832,7 @@ static const struct {
{ NNG_EPEERAUTH, "Peer could not be authenticated" },
{ NNG_ENOARG, "Option requires argument" },
{ NNG_EAMBIGUOUS, "Ambiguous option" },
+ { NNG_EBADTYPE, "Incorrect type" },
{ NNG_EINTERNAL, "Internal error detected" },
{ 0, NULL },
// clang-format on
@@ -811,8 +865,8 @@ nng_strerror(int num)
return (unknownerrbuf);
}
-int
-nng_pipe_getopt(nng_pipe id, const char *name, void *val, size_t *sizep)
+static int
+nng_pipe_getopt_x(nng_pipe id, const char *name, void *val, size_t *szp, int t)
{
int rv;
nni_pipe *p;
@@ -823,51 +877,64 @@ nng_pipe_getopt(nng_pipe id, const char *name, void *val, size_t *sizep)
if ((rv = nni_pipe_find(&p, id)) != 0) {
return (rv);
}
- rv = nni_pipe_getopt(p, name, val, sizep);
+ rv = nni_pipe_getopt(p, name, val, szp, t);
nni_pipe_rele(p);
return (rv);
}
int
+nng_pipe_getopt(nng_pipe id, const char *name, void *val, size_t *szp)
+{
+ return (nng_pipe_getopt_x(id, name, val, szp, NNI_TYPE_OPAQUE));
+}
+
+int
nng_pipe_getopt_bool(nng_pipe id, const char *name, bool *valp)
{
size_t sz = sizeof(*valp);
- return (nng_pipe_getopt(id, name, valp, &sz));
+ return (nng_pipe_getopt_x(id, name, valp, &sz, NNI_TYPE_BOOL));
}
int
nng_pipe_getopt_int(nng_pipe id, const char *name, int *valp)
{
size_t sz = sizeof(*valp);
- return (nng_pipe_getopt(id, name, valp, &sz));
+ return (nng_pipe_getopt_x(id, name, valp, &sz, NNI_TYPE_INT32));
}
int
nng_pipe_getopt_size(nng_pipe id, const char *name, size_t *valp)
{
size_t sz = sizeof(*valp);
- return (nng_pipe_getopt(id, name, valp, &sz));
+ return (nng_pipe_getopt_x(id, name, valp, &sz, NNI_TYPE_SIZE));
}
int
nng_pipe_getopt_uint64(nng_pipe id, const char *name, uint64_t *valp)
{
size_t sz = sizeof(*valp);
- return (nng_pipe_getopt(id, name, valp, &sz));
+ return (nng_pipe_getopt_x(id, name, valp, &sz, NNI_TYPE_UINT64));
}
int
nng_pipe_getopt_ms(nng_pipe id, const char *name, nng_duration *valp)
{
size_t sz = sizeof(*valp);
- return (nng_pipe_getopt(id, name, valp, &sz));
+ return (nng_pipe_getopt_x(id, name, valp, &sz, NNI_TYPE_DURATION));
}
int
nng_pipe_getopt_ptr(nng_pipe id, const char *name, void **valp)
{
size_t sz = sizeof(*valp);
- return (nng_pipe_getopt(id, name, valp, &sz));
+ return (nng_pipe_getopt_x(id, name, valp, &sz, NNI_TYPE_POINTER));
+}
+
+int
+nng_pipe_getopt_sockaddr(nng_pipe id, const char *name, nng_sockaddr *sap)
+{
+ size_t sz = sizeof(*sap);
+ return (nng_pipe_getopt_x(id, name, sap, &sz, NNI_TYPE_SOCKADDR));
}
int