tsocket: add tsocket_address_bsd_sockaddr() and tsocket_address_bsd_from_sockaddr()
authorStefan Metzmacher <metze@samba.org>
Wed, 4 Nov 2009 18:03:41 +0000 (19:03 +0100)
committerStefan Metzmacher <metze@samba.org>
Tue, 15 Dec 2009 22:34:22 +0000 (23:34 +0100)
metze

lib/tsocket/tsocket.h
lib/tsocket/tsocket_bsd.c
lib/tsocket/tsocket_guide.txt

index ae73113b5a7c9baea8e4baa998a960a44609eded..6e9fcbdccac310ee26cdcd95b77e13fa273fd576 100644 (file)
@@ -179,6 +179,21 @@ int _tstream_unix_socketpair(TALLOC_CTX *mem_ctx1,
        _tstream_unix_socketpair(mem_ctx1, stream1, mem_ctx2, stream2, \
                                 __location__)
 
+struct sockaddr;
+
+int _tsocket_address_bsd_from_sockaddr(TALLOC_CTX *mem_ctx,
+                                      struct sockaddr *sa,
+                                      size_t sa_socklen,
+                                      struct tsocket_address **_addr,
+                                      const char *location);
+#define tsocket_address_bsd_from_sockaddr(mem_ctx, sa, sa_socklen, _addr) \
+       _tsocket_address_bsd_from_sockaddr(mem_ctx, sa, sa_socklen, _addr, \
+                                          __location__)
+
+ssize_t tsocket_address_bsd_sockaddr(const struct tsocket_address *addr,
+                                    struct sockaddr *sa,
+                                    size_t sa_socklen);
+
 int _tstream_bsd_existing_socket(TALLOC_CTX *mem_ctx,
                                 int fd,
                                 struct tstream_context **_stream,
index 05f5be19cbed225cf66b7d4011772c043479c6c8..d44525338c63bbe4f27fd23a1e006445c65949b6 100644 (file)
@@ -201,11 +201,11 @@ struct tsocket_address_bsd {
        } u;
 };
 
-static int _tsocket_address_bsd_from_sockaddr(TALLOC_CTX *mem_ctx,
-                                             struct sockaddr *sa,
-                                             socklen_t sa_socklen,
-                                             struct tsocket_address **_addr,
-                                             const char *location)
+int _tsocket_address_bsd_from_sockaddr(TALLOC_CTX *mem_ctx,
+                                      struct sockaddr *sa,
+                                      size_t sa_socklen,
+                                      struct tsocket_address **_addr,
+                                      const char *location)
 {
        struct tsocket_address *addr;
        struct tsocket_address_bsd *bsda;
@@ -259,6 +259,50 @@ static int _tsocket_address_bsd_from_sockaddr(TALLOC_CTX *mem_ctx,
        return 0;
 }
 
+ssize_t tsocket_address_bsd_sockaddr(const struct tsocket_address *addr,
+                                    struct sockaddr *sa,
+                                    size_t sa_socklen)
+{
+       struct tsocket_address_bsd *bsda = talloc_get_type(addr->private_data,
+                                          struct tsocket_address_bsd);
+       ssize_t rlen = 0;
+
+       if (!bsda) {
+               errno = EINVAL;
+               return -1;
+       }
+
+       switch (bsda->u.sa.sa_family) {
+       case AF_UNIX:
+               rlen = sizeof(struct sockaddr_un);
+               break;
+       case AF_INET:
+               rlen = sizeof(struct sockaddr_in);
+               break;
+#ifdef HAVE_IPV6
+       case AF_INET6:
+               rlen = sizeof(struct sockaddr_in6);
+               break;
+#endif
+       default:
+               errno = EAFNOSUPPORT;
+               return -1;
+       }
+
+       if (sa_socklen < rlen) {
+               errno = EINVAL;
+               return -1;
+       }
+
+       if (sa_socklen > sizeof(struct sockaddr_storage)) {
+               memset(sa, 0, sa_socklen);
+               sa_socklen = sizeof(struct sockaddr_storage);
+       }
+
+       memcpy(sa, &bsda->u.ss, sa_socklen);
+       return rlen;
+}
+
 int _tsocket_address_inet_from_strings(TALLOC_CTX *mem_ctx,
                                       const char *fam,
                                       const char *addr,
index ed903c602727535b77aa3a3371c0bcf00b19cb3c..287fe8a4e5b7dec4a0d3e18dc3f825d7ff07141e 100644 (file)
@@ -421,6 +421,29 @@ int tstream_unix_socketpair(TALLOC_CTX *mem_ctx1,
                            TALLOC_CTX *mem_ctx2,
                            struct tstream_context **stream2);
 
+In some situations it's needed to create a tsocket_address from
+a given 'struct sockaddr'. You can use tsocket_address_bsd_from_sockaddr()
+for that. This should only be used if really needed, because of
+already existing fixed APIs. Only AF_INET, AF_INET6 and AF_UNIX
+sockets are allowed. The function returns -1 and set errno on error.
+Otherwise it returns 0.
+
+int tsocket_address_bsd_from_sockaddr(TALLOC_CTX *mem_ctx,
+                                     struct sockaddr *sa,
+                                     socklen_t sa_socklen,
+                                     struct tsocket_address **addr);
+
+In some situations it's needed to get a 'struct  a tsocket_address from
+a given 'struct sockaddr'. You can use tsocket_address_bsd_from_sockaddr()
+for that. This should only be used if really needed, because of
+already existing fixed APIs. Only AF_INET, AF_INET6 and AF_UNIX
+sockets are allowed. The function returns -1 and set errno on error.
+Otherwise it returns 0.
+
+int tsocket_address_bsd_sockaddr(const struct tsocket_address *addr,
+                                struct sockaddr *sa,
+                                socklen_t *sa_socklen);
+
 In some situations it's needed to wrap existing file descriptors
 into the tstream abstraction. You can use tstream_bsd_existing_socket()
 for that. But you should read the tsocket_bsd.c code and unterstand it