diff options
Diffstat (limited to 'src/core')
| -rw-r--r-- | src/core/stream.c | 16 | ||||
| -rw-r--r-- | src/core/url.c | 82 | ||||
| -rw-r--r-- | src/core/url.h | 3 |
3 files changed, 75 insertions, 26 deletions
diff --git a/src/core/stream.c b/src/core/stream.c index 2112f5ef..9309a3a0 100644 --- a/src/core/stream.c +++ b/src/core/stream.c @@ -32,7 +32,23 @@ static struct { .listener_alloc = nni_ipc_listener_alloc, .checkopt = nni_ipc_checkopt, }, +#ifdef NNG_PLATFORM_POSIX { + .scheme = "unix", + .dialer_alloc = nni_ipc_dialer_alloc, + .listener_alloc = nni_ipc_listener_alloc, + .checkopt = nni_ipc_checkopt, + }, +#endif +#ifdef NNG_HAVE_ABSTRACT_SOCKETS + { + .scheme = "abstract", + .dialer_alloc = nni_ipc_dialer_alloc, + .listener_alloc = nni_ipc_listener_alloc, + .checkopt = nni_ipc_checkopt, + }, +#endif + { .scheme = "tcp", .dialer_alloc = nni_tcp_dialer_alloc, .listener_alloc = nni_tcp_listener_alloc, diff --git a/src/core/url.c b/src/core/url.c index 2f1e3a78..f0cd16ad 100644 --- a/src/core/url.c +++ b/src/core/url.c @@ -1,5 +1,5 @@ // -// Copyright 2019 Staysail Systems, Inc. <info@staysail.tech> +// Copyright 2020 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 @@ -17,8 +17,8 @@ #include "url.h" -static char -url_hexval(char c) +static uint8_t +url_hex_val(char c) { if ((c >= '0') && (c <= '9')) { return (c - '0'); @@ -44,21 +44,21 @@ url_utf8_validate(void *arg) int nb; while (*s) { - if ((s[0] & 0x80) == 0) { + if ((s[0] & 0x80u) == 0) { s++; continue; } - if ((s[0] & 0xe0) == 0xc0) { + if ((s[0] & 0xe0u) == 0xc0) { // 0x80 thru 0x7ff - v = (s[0] & 0x1f); + v = (s[0] & 0x1fu); minv = 0x80; nb = 1; - } else if ((s[0] & 0xf0) == 0xe0) { - v = (s[0] & 0xf); + } else if ((s[0] & 0xf0u) == 0xe0) { + v = (s[0] & 0xfu); minv = 0x800; nb = 2; - } else if ((s[0] & 0xf8) == 0xf0) { - v = (s[0] & 0x7); + } else if ((s[0] & 0xf8u) == 0xf0) { + v = (s[0] & 0x7u); minv = 0x10000; nb = 3; } else { @@ -68,12 +68,12 @@ url_utf8_validate(void *arg) } s++; for (int i = 0; i < nb; i++) { - if ((s[0] & 0xc0) != 0x80) { + if ((s[0] & 0xc0u) != 0x80) { return (NNG_EINVAL); // not continuation } s++; - v <<= 6; - v += s[0] & 0x3f; + v <<= 6u; + v += s[0] & 0x3fu; } if (v < minv) { return (NNG_EINVAL); @@ -88,14 +88,42 @@ url_utf8_validate(void *arg) return (0); } +size_t +nni_url_decode(uint8_t *out, const char *in, size_t max_len) +{ + size_t len; + uint8_t c; + + len = 0; + while ((c = (uint8_t) *in) != '\0') { + if (len >= max_len) { + return ((size_t) -1); + } + if (c == '%') { + in++; + if ((!isxdigit(in[0])) || (!isxdigit(in[1]))) { + return ((size_t) -1); + } + out[len] = url_hex_val(*in++); + out[len] <<= 4u; + out[len] += url_hex_val(*in++); + len++; + } else { + out[len++] = c; + in++; + } + } + return (len); +} + static int url_canonify_uri(char **outp, const char *in) { - char * out; - size_t src, dst, len; - int c; - int rv; - bool skip; + char * out; + size_t src, dst, len; + uint8_t c; + int rv; + bool skip; // We know that the transform is strictly "reducing". if ((out = nni_strdup(in)) == NULL) { @@ -112,9 +140,9 @@ url_canonify_uri(char **outp, const char *in) nni_free(out, len); return (NNG_EINVAL); } - c = url_hexval(out[src + 1]); + c = url_hex_val(out[src + 1]); c *= 16; - c += url_hexval(out[src + 2]); + c += url_hex_val(out[src + 2]); // If it's a safe character, decode, otherwise leave // it alone. We also decode valid high-bytes for // UTF-8, which will let us validate them and use @@ -127,8 +155,8 @@ url_canonify_uri(char **outp, const char *in) out[dst++] = (char) c; } else { out[dst++] = '%'; - out[dst++] = (char) toupper(out[src + 1]); - out[dst++] = (char) toupper(out[src + 2]); + out[dst++] = toupper((uint8_t) out[src + 1]); + out[dst++] = toupper((uint8_t) out[src + 2]); } src += 3; continue; @@ -311,9 +339,11 @@ nni_url_parse(nni_url **urlp, const char *raw) // path names are not canonicalized, which means that the address and // URL properties for relative paths won't be portable to other // processes unless they are in the same directory. When in doubt, - // we recommend using absolute paths, such as ipc:///var/run/mysocket. + // we recommend using absolute paths, such as ipc:///var/run/socket. if ((strcmp(url->u_scheme, "ipc") == 0) || + (strcmp(url->u_scheme, "unix") == 0) || + (strcmp(url->u_scheme, "abstract") == 0) || (strcmp(url->u_scheme, "inproc") == 0)) { if ((url->u_path = nni_strdup(s)) == NULL) { rv = NNG_ENOMEM; @@ -388,7 +418,6 @@ nni_url_parse(nni_url **urlp, const char *raw) url->u_path[len] = '\0'; s += len; - len = 0; // Look for query info portion. if (s[0] == '?') { @@ -500,7 +529,10 @@ nni_url_asprintf(char **str, const nni_url *url) const char *hostob = ""; const char *hostcb = ""; - if ((strcmp(scheme, "ipc") == 0) || (strcmp(scheme, "inproc") == 0)) { + if ((strcmp(scheme, "ipc") == 0) || (strcmp(scheme, "inproc") == 0) || + (strcmp(scheme, "unix") == 0) || + (strcmp(scheme, "ipc+abstract") == 0) || + (strcmp(scheme, "unix+abstract") == 0)) { return (nni_asprintf(str, "%s://%s", scheme, url->u_path)); } diff --git a/src/core/url.h b/src/core/url.h index afb8a882..e846bf37 100644 --- a/src/core/url.h +++ b/src/core/url.h @@ -1,5 +1,5 @@ // -// Copyright 2019 Staysail Systems, Inc. <info@staysail.tech> +// Copyright 2020 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 @@ -19,5 +19,6 @@ extern int nni_url_clone(nni_url **, const nni_url *); extern const char *nni_url_default_port(const char *); extern int nni_url_asprintf(char **, const nni_url *); extern int nni_url_asprintf_port(char **, const nni_url *, int); +extern size_t nni_url_decode(uint8_t *, const char *, size_t); #endif // CORE_URL_H |
