diff options
| author | Garrett D'Amore <garrett@damore.org> | 2018-03-20 18:38:54 -0700 |
|---|---|---|
| committer | Garrett D'Amore <garrett@damore.org> | 2018-03-20 18:42:23 -0700 |
| commit | 6df40cb6eea9a4220d61c4c927ce5a857a12a338 (patch) | |
| tree | ac4b7ecbcb41a456eb4d0429fc180047656371ba /src/core/options.c | |
| parent | 9ca901c1b70b17d851426483d9f54611cfa8e395 (diff) | |
| download | nng-6df40cb6eea9a4220d61c4c927ce5a857a12a338.tar.gz nng-6df40cb6eea9a4220d61c4c927ce5a857a12a338.tar.bz2 nng-6df40cb6eea9a4220d61c4c927ce5a857a12a338.zip | |
fixes #301 String option handling for getopt
Diffstat (limited to 'src/core/options.c')
| -rw-r--r-- | src/core/options.c | 206 |
1 files changed, 116 insertions, 90 deletions
diff --git a/src/core/options.c b/src/core/options.c index f51a6abe..9410de5f 100644 --- a/src/core/options.c +++ b/src/core/options.c @@ -129,140 +129,166 @@ nni_setopt_size(size_t *sp, const void *v, size_t sz, size_t minv, size_t maxv) } int -nni_getopt_ms(nni_duration u, void *val, size_t *sizep) +nni_setopt_buf(nni_msgq *mq, const void *val, size_t sz) { - size_t sz = sizeof(u); + int len; - if (sz > *sizep) { - sz = *sizep; + if (sz < sizeof(len)) { + return (NNG_EINVAL); } - *sizep = sizeof(u); - memcpy(val, &u, sz); - return (0); + memcpy(&len, val, sizeof(len)); + if (len < 0) { + return (NNG_EINVAL); + } + if (len > 8192) { + // put a reasonable uppper limit on queue depth. + // This is a count in messages, so the total queue + // size could be quite large indeed in this case. + return (NNG_EINVAL); + } + return (nni_msgq_resize(mq, len)); } int -nni_getopt_sockaddr(const nng_sockaddr *sa, void *val, size_t *sizep) +nni_copyout(const void *src, size_t srcsz, void *dst, size_t *dstszp) { - size_t sz = sizeof(*sa); - - if (sz > *sizep) { - sz = *sizep; + 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; } - *sizep = sizeof(*sa); - memcpy(val, sa, sz); - return (0); + *dstszp = srcsz; + memcpy(dst, src, copysz); + return (rv); } int -nni_getopt_int(int i, void *val, size_t *sizep) +nni_copyout_bool(bool b, void *dst, size_t *szp, int typ) { - size_t sz = sizeof(i); - - if (sz > *sizep) { - sz = *sizep; + switch (typ) { + case NNI_TYPE_BOOL: + NNI_ASSERT(*szp == sizeof(b)); + *(bool *) dst = b; + return (0); + case NNI_TYPE_OPAQUE: + return (nni_copyout(&b, sizeof(b), dst, szp)); + default: + return (NNG_EBADTYPE); } - *sizep = sizeof(i); - memcpy(val, &i, sz); - return (0); } int -nni_getopt_u64(uint64_t u, void *val, size_t *sizep) +nni_copyout_int(int i, void *dst, size_t *szp, int typ) { - size_t sz = sizeof(u); - - if (sz > *sizep) { - sz = *sizep; + switch (typ) { + case NNI_TYPE_INT32: + NNI_ASSERT(*szp == sizeof(i)); + *(int *) dst = i; + return (0); + case NNI_TYPE_OPAQUE: + return (nni_copyout(&i, sizeof(i), dst, szp)); + default: + return (NNG_EBADTYPE); } - *sizep = sizeof(u); - memcpy(val, &u, sz); - return (0); } int -nni_getopt_str(const char *ptr, void *val, size_t *sizep) +nni_copyout_ms(nng_duration d, void *dst, size_t *szp, int typ) { - size_t len = strlen(ptr) + 1; - size_t sz; - - sz = (len > *sizep) ? *sizep : len; - *sizep = len; - memcpy(val, ptr, sz); - return (0); + switch (typ) { + case NNI_TYPE_DURATION: + NNI_ASSERT(*szp == sizeof(d)); + *(nng_duration *) dst = d; + return (0); + case NNI_TYPE_OPAQUE: + return (nni_copyout(&d, sizeof(d), dst, szp)); + default: + return (NNG_EBADTYPE); + } } int -nni_getopt_size(size_t u, void *val, size_t *sizep) +nni_copyout_ptr(void *p, void *dst, size_t *szp, int typ) { - size_t sz = sizeof(u); - - if (sz > *sizep) { - sz = *sizep; + switch (typ) { + case NNI_TYPE_POINTER: + NNI_ASSERT(*szp == sizeof(p)); + *(void **) dst = p; + return (0); + case NNI_TYPE_OPAQUE: + return (nni_copyout(&p, sizeof(p), dst, szp)); + default: + return (NNG_EBADTYPE); } - *sizep = sizeof(u); - memcpy(val, &u, sz); - return (0); } int -nni_getopt_bool(bool b, void *val, size_t *sizep) +nni_copyout_size(size_t s, void *dst, size_t *szp, int typ) { - size_t sz = sizeof(b); - - if (sz > *sizep) { - sz = *sizep; + switch (typ) { + case NNI_TYPE_SIZE: + NNI_ASSERT(*szp == sizeof(s)); + *(size_t *) dst = s; + return (0); + case NNI_TYPE_OPAQUE: + return (nni_copyout(&s, sizeof(s), dst, szp)); + default: + return (NNG_EBADTYPE); } - *sizep = sizeof(b); - memcpy(val, &b, sz); - return (0); } int -nni_getopt_ptr(void *ptr, void *val, size_t *sizep) +nni_copyout_sockaddr(const nng_sockaddr *sap, void *dst, size_t *szp, int typ) { - size_t sz = sizeof(ptr); - - if (sz > *sizep) { - sz = *sizep; + switch (typ) { + case NNI_TYPE_SOCKADDR: + NNI_ASSERT(*szp == sizeof(*sap)); + *(nng_sockaddr *) dst = *sap; + return (0); + case NNI_TYPE_OPAQUE: + return (nni_copyout(sap, sizeof(*sap), dst, szp)); + default: + return (NNG_EBADTYPE); } - *sizep = sizeof(ptr); - memcpy(val, &ptr, sz); - return (0); } int -nni_setopt_buf(nni_msgq *mq, const void *val, size_t sz) +nni_copyout_u64(uint64_t u, void *dst, size_t *szp, int typ) { - int len; - - if (sz < sizeof(len)) { - return (NNG_EINVAL); + switch (typ) { + case NNI_TYPE_UINT64: + NNI_ASSERT(*szp == sizeof(u)); + *(uint64_t *) dst = u; + return (0); + case NNI_TYPE_OPAQUE: + return (nni_copyout(&u, sizeof(u), dst, szp)); + default: + return (NNG_EBADTYPE); } - memcpy(&len, val, sizeof(len)); - if (len < 0) { - return (NNG_EINVAL); - } - if (len > 8192) { - // put a reasonable uppper limit on queue depth. - // This is a count in messages, so the total queue - // size could be quite large indeed in this case. - return (NNG_EINVAL); - } - return (nni_msgq_resize(mq, len)); } int -nni_getopt_buf(nni_msgq *mq, void *val, size_t *sizep) +nni_copyout_str(const char *str, void *dst, size_t *szp, int typ) { - int len = nni_msgq_cap(mq); - - size_t sz = *sizep; - - if (sz > sizeof(len)) { - sz = sizeof(len); + char *s; + + switch (typ) { + case NNI_TYPE_STRING: + NNI_ASSERT(*szp == sizeof(char *)); + 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: + return (NNG_EBADTYPE); } - memcpy(val, &len, sz); - *sizep = sizeof(len); - return (0); -}
\ No newline at end of file +} |
