aboutsummaryrefslogtreecommitdiff
path: root/src/platform/posix/posix_sockaddr.c
diff options
context:
space:
mode:
authorGarrett D'Amore <garrett@damore.org>2017-07-21 14:03:08 -0700
committerGarrett D'Amore <garrett@damore.org>2017-07-25 12:17:06 -0700
commit9e5149973d5d16efec14ee12e62de23198b325ce (patch)
treec5392103d62d185016666f5bb7d1f447e2686389 /src/platform/posix/posix_sockaddr.c
parent2579a853e6db72ba75a1e3e6c30997364b9df32d (diff)
downloadnng-9e5149973d5d16efec14ee12e62de23198b325ce.tar.gz
nng-9e5149973d5d16efec14ee12e62de23198b325ce.tar.bz2
nng-9e5149973d5d16efec14ee12e62de23198b325ce.zip
Initial swag at UDP (POSIX only) low level handling.
This includes async send and recv, driven from the poller. This will be requierd to support the underlying UDP and ZeroTier transports in the future. (ZeroTier is getting done first.)
Diffstat (limited to 'src/platform/posix/posix_sockaddr.c')
-rw-r--r--src/platform/posix/posix_sockaddr.c93
1 files changed, 93 insertions, 0 deletions
diff --git a/src/platform/posix/posix_sockaddr.c b/src/platform/posix/posix_sockaddr.c
new file mode 100644
index 00000000..d3ab9c6d
--- /dev/null
+++ b/src/platform/posix/posix_sockaddr.c
@@ -0,0 +1,93 @@
+//
+// Copyright 2017 Garrett D'Amore <garrett@damore.org>
+// Copyright 2017 Capitar IT Group BV <info@capitar.com>
+//
+// This software is supplied under the terms of the MIT License, a
+// copy of which should be located in the distribution where this
+// file was obtained (LICENSE.txt). A copy of the license may also be
+// found online at https://opensource.org/licenses/MIT.
+//
+
+#include "core/nng_impl.h"
+
+#ifdef PLATFORM_POSIX_SOCKADDR
+
+#include <arpa/inet.h>
+#include <fcntl.h>
+#include <netinet/in.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/socket.h>
+#include <sys/types.h>
+
+int
+nni_posix_nn2sockaddr(void *sa, const nni_sockaddr *na)
+{
+ struct sockaddr_in * sin;
+ struct sockaddr_in6 * sin6;
+ const nng_sockaddr_in * nsin;
+ const nng_sockaddr_in6 *nsin6;
+
+ switch (na->s_un.s_family) {
+ case NNG_AF_INET:
+ sin = (void *) sa;
+ nsin = &na->s_un.s_in;
+ memset(sin, 0, sizeof(*sin));
+ sin->sin_family = PF_INET;
+ sin->sin_port = nsin->sa_port;
+ sin->sin_addr.s_addr = nsin->sa_addr;
+ return (sizeof(*sin));
+
+ case NNG_AF_INET6:
+ sin6 = (void *) sa;
+ nsin6 = &na->s_un.s_in6;
+ memset(sin6, 0, sizeof(*sin6));
+#ifdef SIN6_LEN
+ sin6->sin6_len = sizeof(*sin6);
+#endif
+ sin6->sin6_family = PF_INET6;
+ sin6->sin6_port = nsin6->sa_port;
+ memcpy(sin6->sin6_addr.s6_addr, nsin6->sa_addr, 16);
+ return (sizeof(*sin6));
+ }
+ return (-1);
+}
+
+int
+nni_posix_sockaddr2nn(nni_sockaddr *na, const void *sa)
+{
+ const struct sockaddr_in * sin;
+ const struct sockaddr_in6 *sin6;
+ nng_sockaddr_in * nsin;
+ nng_sockaddr_in6 * nsin6;
+
+ switch (((struct sockaddr *) sa)->sa_family) {
+ case AF_INET:
+ sin = (void *) sa;
+ nsin = &na->s_un.s_in;
+ nsin->sa_family = NNG_AF_INET;
+ nsin->sa_port = sin->sin_port;
+ nsin->sa_addr = sin->sin_addr.s_addr;
+ break;
+ case AF_INET6:
+ sin6 = (void *) sa;
+ nsin6 = &na->s_un.s_in6;
+ nsin6->sa_family = NNG_AF_INET6;
+ nsin6->sa_port = sin6->sin6_port;
+ memcpy(nsin6->sa_addr, sin6->sin6_addr.s6_addr, 16);
+ break;
+ default:
+ // We should never see this - the OS should always be
+ // specific about giving us either AF_INET or AF_INET6.
+ // Other address families are not handled here.
+ return (-1);
+ }
+ return (0);
+}
+
+#else
+
+// Suppress empty symbols warnings in ranlib.
+int nni_posix_sockaddr_not_used = 0;
+
+#endif // PLATFORM_POSIX_SOCKADDR