aboutsummaryrefslogtreecommitdiff
path: root/src/core/options.c
diff options
context:
space:
mode:
authorGarrett D'Amore <garrett@damore.org>2018-03-20 18:38:54 -0700
committerGarrett D'Amore <garrett@damore.org>2018-03-20 18:42:23 -0700
commit6df40cb6eea9a4220d61c4c927ce5a857a12a338 (patch)
treeac4b7ecbcb41a456eb4d0429fc180047656371ba /src/core/options.c
parent9ca901c1b70b17d851426483d9f54611cfa8e395 (diff)
downloadnng-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.c206
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
+}