diff options
Diffstat (limited to 'src/core')
| -rw-r--r-- | src/core/defs.h | 2 | ||||
| -rw-r--r-- | src/core/options.c | 248 | ||||
| -rw-r--r-- | src/core/options.h | 4 | ||||
| -rw-r--r-- | src/core/pipe.h | 3 | ||||
| -rw-r--r-- | src/core/sock_test.c | 9 | ||||
| -rw-r--r-- | src/core/socket.c | 25 |
6 files changed, 86 insertions, 205 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) { |
