aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/core/defs.h2
-rw-r--r--src/core/options.c248
-rw-r--r--src/core/options.h4
-rw-r--r--src/core/pipe.h3
-rw-r--r--src/core/sock_test.c9
-rw-r--r--src/core/socket.c25
-rw-r--r--src/sp/transport/zerotier/zerotier.c53
-rw-r--r--src/supplemental/websocket/websocket.c2
8 files changed, 91 insertions, 255 deletions
diff --git a/src/core/defs.h b/src/core/defs.h
index f367dcc4..6d6e3ff6 100644
--- a/src/core/defs.h
+++ b/src/core/defs.h
@@ -187,7 +187,7 @@ typedef void (*nni_cb)(void *);
// Types. These are used to provide more structured access to options
// (and maybe later statistics). For now these are internal only.
typedef enum {
- NNI_TYPE_OPAQUE,
+ NNI_TYPE_NONE, // DO NOT USE
NNI_TYPE_BOOL,
NNI_TYPE_INT32,
NNI_TYPE_UINT32,
diff --git a/src/core/options.c b/src/core/options.c
index ff794168..fabd55fa 100644
--- a/src/core/options.c
+++ b/src/core/options.c
@@ -1,5 +1,5 @@
//
-// Copyright 2020 Staysail Systems, Inc. <info@staysail.tech>
+// Copyright 2024 Staysail Systems, Inc. <info@staysail.tech>
// Copyright 2018 Capitar IT Group BV <info@capitar.com>
// Copyright 2018 Devolutions <info@devolutions.net>
//
@@ -9,7 +9,9 @@
// found online at https://opensource.org/licenses/MIT.
//
+#include "core/defs.h"
#include "core/nng_impl.h"
+#include "nng/nng.h"
#include <stdio.h>
#include <string.h>
@@ -18,20 +20,12 @@ int
nni_copyin_ms(nni_duration *dp, const void *v, size_t sz, nni_type t)
{
nni_duration dur;
+ NNI_ARG_UNUSED(sz);
- switch (t) {
- case NNI_TYPE_DURATION:
- dur = *(nng_duration *) v;
- break;
- case NNI_TYPE_OPAQUE:
- if (sz != sizeof(dur)) {
- return (NNG_EINVAL);
- }
- memcpy(&dur, v, sz);
- break;
- default:
+ if (t != NNI_TYPE_DURATION) {
return (NNG_EBADTYPE);
}
+ dur = *(nng_duration *) v;
if (dur < -1) {
return (NNG_EINVAL);
@@ -45,25 +39,12 @@ nni_copyin_ms(nni_duration *dp, const void *v, size_t sz, nni_type t)
int
nni_copyin_bool(bool *bp, const void *v, size_t sz, nni_type t)
{
- switch (t) {
- case NNI_TYPE_BOOL:
- if (bp != NULL) {
- *bp = *(bool *) v;
- }
- break;
- case NNI_TYPE_OPAQUE:
- if (sz != sizeof(bool)) {
- return (NNG_EINVAL);
- }
- // NB: C99 does not require that sizeof (bool) == 1.
- if (bp != NULL) {
- memcpy(bp, v, sz);
- }
- break;
- default:
+ NNI_ARG_UNUSED(sz);
+
+ if (t != NNI_TYPE_BOOL) {
return (NNG_EBADTYPE);
}
-
+ *bp = *(bool *) v;
return (0);
}
@@ -72,29 +53,19 @@ nni_copyin_int(
int *ip, const void *v, size_t sz, int minv, int maxv, nni_type t)
{
int i;
+ NNI_ARG_UNUSED(sz);
- switch (t) {
- case NNI_TYPE_INT32:
- i = *(int *) v;
- break;
- case NNI_TYPE_OPAQUE:
- if (sz != sizeof(i)) {
- return (NNG_EINVAL);
- }
- memcpy(&i, v, sz);
- break;
- default:
+ if (t != NNI_TYPE_INT32) {
return (NNG_EBADTYPE);
}
+ i = *(int *) v;
if (i > maxv) {
return (NNG_EINVAL);
}
if (i < minv) {
return (NNG_EINVAL);
}
- if (ip != NULL) {
- *ip = i;
- }
+ *ip = i;
return (0);
}
@@ -103,18 +74,9 @@ nni_copyin_size(
size_t *sp, const void *v, size_t sz, size_t minv, size_t maxv, nni_type t)
{
size_t val;
+ NNI_ARG_UNUSED(sz);
- switch (t) {
- case NNI_TYPE_SIZE:
- val = *(size_t *) v;
- break;
- case NNI_TYPE_OPAQUE:
- if (sz != sizeof(val)) {
- return (NNG_EINVAL);
- }
- memcpy(&val, v, sz);
- break;
- default:
+ if (t != NNI_TYPE_SIZE) {
return (NNG_EBADTYPE);
}
@@ -122,84 +84,49 @@ nni_copyin_size(
if ((val > maxv) || (val < minv)) {
return (NNG_EINVAL);
}
- if (sp != NULL) {
- *sp = val;
- }
+ *sp = val;
return (0);
}
int
nni_copyin_ptr(void **pp, const void *v, size_t sz, nni_type t)
{
- void *p;
+ NNI_ARG_UNUSED(sz);
- switch (t) {
- case NNI_TYPE_POINTER:
- p = *(void **) v;
- break;
- case NNI_TYPE_OPAQUE:
- if (sz != sizeof(p)) {
- return (NNG_EINVAL);
- }
- memcpy(&p, v, sz);
- break;
- default:
+ if (t != NNI_TYPE_POINTER) {
return (NNG_EBADTYPE);
}
- if (pp != NULL) {
- *pp = p;
- }
+
+ *pp = *(void **) v;
return (0);
}
int
-nni_copyin_str(char *s, const void *v, size_t sz, size_t maxsz, nni_type t)
+nni_copyin_str(char *s, const void *v, size_t maxsz, nni_type t)
{
size_t z;
- switch (t) {
- case NNI_TYPE_STRING:
- z = v == NULL ? 0 : strlen(v);
- break;
- case NNI_TYPE_OPAQUE:
- z = v == NULL ? 0 : nni_strnlen(v, sz);
- if (z >= sz) {
- return (NNG_EINVAL); // missing terminator
- }
- break;
- default:
+ if (t != NNI_TYPE_STRING) {
return (NNG_EBADTYPE);
}
- if (z >= maxsz) {
+ z = nni_strnlen(v, maxsz);
+ if (z == maxsz && ((char *) v)[maxsz - 1] != 0) {
return (NNG_EINVAL); // too long
}
- if (s != NULL) {
- memcpy(s, v, z);
- }
+ memcpy(s, v, z);
+ s[z] = 0;
return (0);
}
int
nni_copyin_u64(uint64_t *up, const void *v, size_t sz, nni_type t)
{
- uint64_t u;
+ NNI_ARG_UNUSED(sz);
- switch (t) {
- case NNI_TYPE_UINT64:
- u = *(uint64_t *) v;
- break;
- case NNI_TYPE_OPAQUE:
- if (sz != sizeof(u)) {
- return (NNG_EINVAL);
- }
- memcpy(&u, v, sz);
- break;
- default:
+ if (t != NNI_TYPE_UINT64) {
return (NNG_EBADTYPE);
}
- if (up != NULL) {
- *up = u;
- }
+ *up = *(uint64_t *) v;
return (0);
}
@@ -214,140 +141,97 @@ nni_copyin_sockaddr(nng_sockaddr *ap, const void *v, nni_type t)
}
int
-nni_copyout(const void *src, size_t srcsz, void *dst, size_t *dstszp)
-{
- int rv = 0;
- size_t copysz = *dstszp;
- // Assumption is that this is type NNI_TYPE_OPAQUE.
- if (copysz > srcsz) {
- copysz = srcsz;
- } else if (srcsz > copysz) {
- // destination too small.
- rv = NNG_EINVAL;
- }
- *dstszp = srcsz;
- memcpy(dst, src, copysz);
- return (rv);
-}
-
-int
nni_copyout_bool(bool b, void *dst, size_t *szp, nni_type t)
{
- switch (t) {
- case NNI_TYPE_BOOL:
- *(bool *) dst = b;
- return (0);
- case NNI_TYPE_OPAQUE:
- return (nni_copyout(&b, sizeof(b), dst, szp));
- default:
+ NNI_ARG_UNUSED(szp);
+ if (t != NNI_TYPE_BOOL) {
return (NNG_EBADTYPE);
}
+ *(bool *) dst = b;
+ return (0);
}
int
nni_copyout_int(int i, void *dst, size_t *szp, nni_type t)
{
- switch (t) {
- case NNI_TYPE_INT32:
- *(int *) dst = i;
- return (0);
- case NNI_TYPE_OPAQUE:
- return (nni_copyout(&i, sizeof(i), dst, szp));
- default:
+ NNI_ARG_UNUSED(szp);
+ if (t != NNI_TYPE_INT32) {
return (NNG_EBADTYPE);
}
+ *(int *) dst = i;
+ return (0);
}
int
nni_copyout_ms(nng_duration d, void *dst, size_t *szp, nni_type t)
{
- switch (t) {
- case NNI_TYPE_DURATION:
- *(nng_duration *) dst = d;
- return (0);
- case NNI_TYPE_OPAQUE:
- return (nni_copyout(&d, sizeof(d), dst, szp));
- default:
+ NNI_ARG_UNUSED(szp);
+ if (t != NNI_TYPE_DURATION) {
return (NNG_EBADTYPE);
}
+ *(nng_duration *) dst = d;
+ return (0);
}
int
nni_copyout_ptr(void *p, void *dst, size_t *szp, nni_type t)
{
- switch (t) {
- case NNI_TYPE_POINTER:
- *(void **) dst = p;
- return (0);
- case NNI_TYPE_OPAQUE:
- return (nni_copyout(&p, sizeof(p), dst, szp));
- default:
+ NNI_ARG_UNUSED(szp);
+ if (t != NNI_TYPE_POINTER) {
return (NNG_EBADTYPE);
}
+ *(void **) dst = p;
+ return (0);
}
int
nni_copyout_size(size_t s, void *dst, size_t *szp, nni_type t)
{
- switch (t) {
- case NNI_TYPE_SIZE:
- *(size_t *) dst = s;
- return (0);
- case NNI_TYPE_OPAQUE:
- return (nni_copyout(&s, sizeof(s), dst, szp));
- default:
+ NNI_ARG_UNUSED(szp);
+ if (t != NNI_TYPE_SIZE) {
return (NNG_EBADTYPE);
}
+ *(size_t *) dst = s;
+ return (0);
}
int
nni_copyout_sockaddr(
const nng_sockaddr *sap, void *dst, size_t *szp, nni_type t)
{
- switch (t) {
- case NNI_TYPE_SOCKADDR:
- *(nng_sockaddr *) dst = *sap;
- return (0);
- case NNI_TYPE_OPAQUE:
- return (nni_copyout(sap, sizeof(*sap), dst, szp));
- default:
+ NNI_ARG_UNUSED(szp);
+ if (t != NNI_TYPE_SOCKADDR) {
return (NNG_EBADTYPE);
}
+ *(nng_sockaddr *) dst = *sap;
+ return (0);
}
int
nni_copyout_u64(uint64_t u, void *dst, size_t *szp, nni_type t)
{
- switch (t) {
- case NNI_TYPE_UINT64:
- *(uint64_t *) dst = u;
- return (0);
- case NNI_TYPE_OPAQUE:
- return (nni_copyout(&u, sizeof(u), dst, szp));
- default:
+ NNI_ARG_UNUSED(szp);
+ if (t != NNI_TYPE_UINT64) {
return (NNG_EBADTYPE);
}
+ *(uint64_t *) dst = u;
+ return (0);
}
int
nni_copyout_str(const char *str, void *dst, size_t *szp, nni_type t)
{
char *s;
-
- switch (t) {
- case NNI_TYPE_STRING:
- if ((s = nni_strdup(str)) == NULL) {
- return (NNG_ENOMEM);
- }
- *(char **) dst = s;
- return (0);
-
- case NNI_TYPE_OPAQUE:
- return (nni_copyout(str, strlen(str) + 1, dst, szp));
-
- default:
+ NNI_ARG_UNUSED(szp);
+ if (t != NNI_TYPE_STRING) {
return (NNG_EBADTYPE);
}
+
+ if ((s = nni_strdup(str)) == NULL) {
+ return (NNG_ENOMEM);
+ }
+ *(char **) dst = s;
+ return (0);
}
int
diff --git a/src/core/options.h b/src/core/options.h
index 67481d9f..89006630 100644
--- a/src/core/options.h
+++ b/src/core/options.h
@@ -31,13 +31,13 @@ extern int nni_copyin_bool(bool *, const void *, size_t, nni_type);
extern int nni_copyin_int(int *, const void *, size_t, int, int, nni_type);
extern int nni_copyin_size(
size_t *, const void *, size_t, size_t, size_t, nni_type);
-extern int nni_copyin_str(char *, const void *, size_t, size_t, nni_type);
+extern int nni_copyin_str(char *, const void *, size_t, nni_type);
extern int nni_copyin_ptr(void **, const void *, size_t, nni_type);
extern int nni_copyin_u64(uint64_t *, const void *, size_t, nni_type);
extern int nni_copyin_sockaddr(nng_sockaddr *, const void *, nni_type);
// nni_copyout_xxx copies out a type of the named value. It assumes that
-// the type is aligned and the size correct, unless NNI_TYPE_OPAQUE is passed.
+// the type is aligned and the size correct.
extern int nni_copyout(const void *, size_t, void *, size_t *);
extern int nni_copyout_bool(bool, void *, size_t *, nni_type);
extern int nni_copyout_int(int, void *, size_t *, nni_type);
diff --git a/src/core/pipe.h b/src/core/pipe.h
index a1bc361e..9e7109de 100644
--- a/src/core/pipe.h
+++ b/src/core/pipe.h
@@ -34,8 +34,7 @@ extern void nni_pipe_close(nni_pipe *);
extern uint16_t nni_pipe_peer(nni_pipe *);
-// nni_pipe_getopt looks up the option. The last argument is the type,
-// which. If the type is NNI_TYPE_OPAQUE, then no format check is performed.
+// nni_pipe_getopt looks up the option.
extern int nni_pipe_getopt(
nni_pipe *, const char *, void *, size_t *, nni_opt_type);
diff --git a/src/core/sock_test.c b/src/core/sock_test.c
index 28a1201a..1fe94e4c 100644
--- a/src/core/sock_test.c
+++ b/src/core/sock_test.c
@@ -1,5 +1,5 @@
//
-// Copyright 2020 Staysail Systems, Inc. <info@staysail.tech>
+// Copyright 2024 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
@@ -123,6 +123,13 @@ test_socket_name(void)
// strings must not be too long
NUTS_FAIL(
nng_socket_set_string(s1, NNG_OPT_SOCKNAME, buf), NNG_EINVAL);
+ memset(buf, 'A', 64);
+ buf[64] = 0;
+ NUTS_FAIL(
+ nng_socket_set_string(s1, NNG_OPT_SOCKNAME, buf), NNG_EINVAL);
+ buf[63] = 0;
+ NUTS_PASS(nng_socket_set_string(s1, NNG_OPT_SOCKNAME, buf));
+ NUTS_PASS(nng_socket_set_string(s1, NNG_OPT_SOCKNAME, "hello"));
NUTS_PASS(nng_socket_get_string(s1, NNG_OPT_SOCKNAME, &str));
NUTS_ASSERT(str != NULL);
diff --git a/src/core/socket.c b/src/core/socket.c
index b3fb96b2..c911fa40 100644
--- a/src/core/socket.c
+++ b/src/core/socket.c
@@ -210,11 +210,9 @@ static int
sock_set_sockname(void *s, const void *buf, size_t sz, nni_type t)
{
int rv;
- if (sz >= 64) {
- return (NNG_EINVAL);
- }
- rv = (nni_copyin_str(
- SOCK(s)->s_name, buf, sizeof(SOCK(s)->s_name), sz, t));
+ NNI_ARG_UNUSED(sz);
+ rv =
+ (nni_copyin_str(SOCK(s)->s_name, buf, sizeof(SOCK(s)->s_name), t));
#ifdef NNG_ENABLE_STATS
if (rv == 0) {
nni_stat_set_string(&SOCK(s)->st_name, SOCK(s)->s_name);
@@ -988,7 +986,8 @@ nni_sock_setopt(
}
} else if (strcmp(name, NNG_OPT_RECVMAXSZ) == 0) {
- if ((rv = nni_copyin_size(NULL, v, sz, 0, NNI_MAXSZ, t)) !=
+ size_t scratch;
+ if ((rv = nni_copyin_size(&scratch, v, sz, 0, NNI_MAXSZ, t)) !=
0) {
return (rv);
}
@@ -1080,17 +1079,9 @@ nni_sock_getopt(
if (strcmp(sopt->name, name) == 0) {
size_t sz = sopt->sz;
- if ((sopt->typ != NNI_TYPE_OPAQUE) &&
- (t != sopt->typ)) {
-
- if (t != NNI_TYPE_OPAQUE) {
- nni_mtx_unlock(&s->s_mx);
- return (NNG_EBADTYPE);
- }
- if (*szp != sopt->sz) {
- nni_mtx_unlock(&s->s_mx);
- return (NNG_EINVAL);
- }
+ if (t != sopt->typ) {
+ nni_mtx_unlock(&s->s_mx);
+ return (NNG_EBADTYPE);
}
if (szp != NULL) {
diff --git a/src/sp/transport/zerotier/zerotier.c b/src/sp/transport/zerotier/zerotier.c
index b3e931ef..7b2142b1 100644
--- a/src/sp/transport/zerotier/zerotier.c
+++ b/src/sp/transport/zerotier/zerotier.c
@@ -1614,36 +1614,11 @@ zt_tran_fini(void)
}
static int
-zt_check_recvmaxsz(const void *v, size_t sz, nni_type t)
-{
- return (nni_copyin_size(NULL, v, sz, 0, NNI_MAXSZ, t));
-}
-
-static int
-zt_check_orbit(const void *v, size_t sz, nni_type t)
-{
- NNI_ARG_UNUSED(v);
- if ((t != NNI_TYPE_UINT64) && (t != NNI_TYPE_OPAQUE)) {
- return (NNG_EBADTYPE);
- }
- if (sz != sizeof(uint64_t) && sz != sizeof(uint64_t) * 2) {
- return (NNG_EINVAL);
- }
- return (0);
-}
-
-static int
-zt_check_deorbit(const void *v, size_t sz, nni_type t)
-{
- return (nni_copyin_u64(NULL, v, sz, t));
-}
-
-static int
zt_check_string(const void *v, size_t sz, nni_type t)
{
size_t len;
- if ((t != NNI_TYPE_OPAQUE) && (t != NNI_TYPE_STRING)) {
+ if (t != NNI_TYPE_STRING) {
return (NNG_EBADTYPE);
}
len = nni_strnlen(v, sz);
@@ -1653,18 +1628,6 @@ zt_check_string(const void *v, size_t sz, nni_type t)
return (0);
}
-static int
-zt_check_time(const void *v, size_t sz, nni_type t)
-{
- return (nni_copyin_ms(NULL, v, sz, t));
-}
-
-static int
-zt_check_tries(const void *v, size_t sz, nni_type t)
-{
- return (nni_copyin_int(NULL, v, sz, 0, 1000000, t));
-}
-
static void
zt_pipe_close(void *arg)
{
@@ -2692,19 +2655,11 @@ zt_ep_set_orbit(void *arg, const void *data, size_t sz, nni_type t)
int rv;
enum ZT_ResultCode zrv;
- if ((t != NNI_TYPE_UINT64) && (t != NNI_TYPE_OPAQUE)) {
+ if (t != NNI_TYPE_UINT64) {
return (NNG_EBADTYPE);
}
- if (sz == sizeof(uint64_t)) {
- memcpy(&moonid, data, sizeof(moonid));
- peerid = 0;
- } else if (sz == sizeof(uint64_t) * 2) {
- memcpy(&moonid, data, sizeof(moonid));
- memcpy(&peerid, ((char *) data) + sizeof(uint64_t),
- sizeof(peerid));
- } else {
- return (NNG_EINVAL);
- }
+ memcpy(&moonid, data, sizeof(moonid));
+ peerid = 0;
nni_mtx_lock(&zt_lk);
if ((ep->ze_ztn == NULL) && ((rv = zt_node_find(ep)) != 0)) {
diff --git a/src/supplemental/websocket/websocket.c b/src/supplemental/websocket/websocket.c
index ce733c84..b215c1da 100644
--- a/src/supplemental/websocket/websocket.c
+++ b/src/supplemental/websocket/websocket.c
@@ -186,7 +186,7 @@ static void ws_listener_free(void *);
static int
ws_check_string(const void *v, size_t sz, nni_opt_type t)
{
- if ((t != NNI_TYPE_OPAQUE) && (t != NNI_TYPE_STRING)) {
+ if (t != NNI_TYPE_STRING) {
return (NNG_EBADTYPE);
}
if (nni_strnlen(v, sz) >= sz) {