The branch, master has been updated
       via  86ff8cf s3: Allow more control over smbsock_[any_]connect
       via  65f4f22 Use sockaddr_storage in async sendto/recvfrom
      from  b222615 tdb: add ABI/tdb-1.2.9.sigs

http://gitweb.samba.org/?p=samba.git;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit 86ff8cf227c759189080ade0deb4f5b184bb14f7
Author: Volker Lendecke <[email protected]>
Date:   Thu Dec 23 15:20:22 2010 +0100

    s3: Allow more control over smbsock_[any_]connect
    
    Autobuild-User: Volker Lendecke <[email protected]>
    Autobuild-Date: Wed Dec 29 23:30:44 CET 2010 on sn-devel-104

commit 65f4f22cb4a201fb3f4f4adbb576d3a8909d4bfd
Author: Volker Lendecke <[email protected]>
Date:   Wed Dec 29 08:46:08 2010 +0100

    Use sockaddr_storage in async sendto/recvfrom

-----------------------------------------------------------------------

Summary of changes:
 lib/async_req/async_sock.c                 |   33 ++++++--
 lib/async_req/async_sock.h                 |    6 +-
 source3/include/proto.h                    |   31 ++++++--
 source3/libsmb/smbsock_connect.c           |  113 +++++++++++++++++++++------
 source3/torture/test_smbsock_any_connect.c |    5 +-
 source3/winbindd/winbindd_cm.c             |    7 +-
 6 files changed, 145 insertions(+), 50 deletions(-)


Changeset truncated at 500 lines:

diff --git a/lib/async_req/async_sock.c b/lib/async_req/async_sock.c
index 9b2a625..7ea66f5 100644
--- a/lib/async_req/async_sock.c
+++ b/lib/async_req/async_sock.c
@@ -41,7 +41,7 @@ struct sendto_state {
        const void *buf;
        size_t len;
        int flags;
-       const struct sockaddr *addr;
+       const struct sockaddr_storage *addr;
        socklen_t addr_len;
        ssize_t sent;
 };
@@ -52,8 +52,7 @@ static void sendto_handler(struct tevent_context *ev,
 
 struct tevent_req *sendto_send(TALLOC_CTX *mem_ctx, struct tevent_context *ev,
                               int fd, const void *buf, size_t len, int flags,
-                              const struct sockaddr *addr,
-                              socklen_t addr_len)
+                              const struct sockaddr_storage *addr)
 {
        struct tevent_req *result;
        struct sendto_state *state;
@@ -68,7 +67,23 @@ struct tevent_req *sendto_send(TALLOC_CTX *mem_ctx, struct 
tevent_context *ev,
        state->len = len;
        state->flags = flags;
        state->addr = addr;
-       state->addr_len = addr_len;
+
+       switch (addr->ss_family) {
+       case AF_INET:
+               state->addr_len = sizeof(struct sockaddr_in);
+               break;
+#if defined(HAVE_IPV6)
+       case AF_INET6:
+               state->addr_len = sizeof(struct sockaddr_in6);
+               break;
+#endif
+       case AF_UNIX:
+               state->addr_len = sizeof(struct sockaddr_un);
+               break;
+       default:
+               state->addr_len = sizeof(struct sockaddr_storage);
+               break;
+       }
 
        fde = tevent_add_fd(ev, state, fd, TEVENT_FD_WRITE, sendto_handler,
                            result);
@@ -89,7 +104,7 @@ static void sendto_handler(struct tevent_context *ev,
                tevent_req_data(req, struct sendto_state);
 
        state->sent = sendto(state->fd, state->buf, state->len, state->flags,
-                            state->addr, state->addr_len);
+                            (struct sockaddr *)state->addr, state->addr_len);
        if ((state->sent == -1) && (errno == EINTR)) {
                /* retry */
                return;
@@ -117,7 +132,7 @@ struct recvfrom_state {
        void *buf;
        size_t len;
        int flags;
-       struct sockaddr *addr;
+       struct sockaddr_storage *addr;
        socklen_t *addr_len;
        ssize_t received;
 };
@@ -129,7 +144,8 @@ static void recvfrom_handler(struct tevent_context *ev,
 struct tevent_req *recvfrom_send(TALLOC_CTX *mem_ctx,
                                 struct tevent_context *ev,
                                 int fd, void *buf, size_t len, int flags,
-                                struct sockaddr *addr, socklen_t *addr_len)
+                                struct sockaddr_storage *addr,
+                                socklen_t *addr_len)
 {
        struct tevent_req *result;
        struct recvfrom_state *state;
@@ -165,7 +181,8 @@ static void recvfrom_handler(struct tevent_context *ev,
                tevent_req_data(req, struct recvfrom_state);
 
        state->received = recvfrom(state->fd, state->buf, state->len,
-                                  state->flags, state->addr, state->addr_len);
+                                  state->flags, (struct sockaddr *)state->addr,
+                                  state->addr_len);
        if ((state->received == -1) && (errno == EINTR)) {
                /* retry */
                return;
diff --git a/lib/async_req/async_sock.h b/lib/async_req/async_sock.h
index d87b2c1..8d98886 100644
--- a/lib/async_req/async_sock.h
+++ b/lib/async_req/async_sock.h
@@ -29,14 +29,14 @@
 
 struct tevent_req *sendto_send(TALLOC_CTX *mem_ctx, struct tevent_context *ev,
                               int fd, const void *buf, size_t len, int flags,
-                              const struct sockaddr *addr,
-                              socklen_t addr_len);
+                              const struct sockaddr_storage *addr);
 ssize_t sendto_recv(struct tevent_req *req, int *perrno);
 
 struct tevent_req *recvfrom_send(TALLOC_CTX *mem_ctx,
                                 struct tevent_context *ev,
                                 int fd, void *buf, size_t len, int flags,
-                                struct sockaddr *addr, socklen_t *addr_len);
+                                struct sockaddr_storage *addr,
+                                socklen_t *addr_len);
 ssize_t recvfrom_recv(struct tevent_req *req, int *perrno);
 
 struct tevent_req *async_connect_send(TALLOC_CTX *mem_ctx,
diff --git a/source3/include/proto.h b/source3/include/proto.h
index c469888..385a537 100644
--- a/source3/include/proto.h
+++ b/source3/include/proto.h
@@ -5621,24 +5621,37 @@ int fncall_recv(struct tevent_req *req, int *perr);
 struct tevent_req *smbsock_connect_send(TALLOC_CTX *mem_ctx,
                                        struct tevent_context *ev,
                                        const struct sockaddr_storage *addr,
+                                       uint16_t port,
                                        const char *called_name,
-                                       const char *calling_name);
+                                       int called_type,
+                                       const char *calling_name,
+                                       int calling_type);
 NTSTATUS smbsock_connect_recv(struct tevent_req *req, int *sock,
-                             uint16_t *port);
-NTSTATUS smbsock_connect(const struct sockaddr_storage *addr,
-                        const char *called_name, const char *calling_name,
-                        int *pfd, uint16_t *port);
+                             uint16_t *ret_port);
+NTSTATUS smbsock_connect(const struct sockaddr_storage *addr, uint16_t port,
+                        const char *called_name, int called_type,
+                        const char *calling_name, int calling_type,
+                        int *pfd, uint16_t *ret_port);
 
 struct tevent_req *smbsock_any_connect_send(TALLOC_CTX *mem_ctx,
                                            struct tevent_context *ev,
                                            const struct sockaddr_storage 
*addrs,
                                            const char **called_names,
-                                           size_t num_addrs);
+                                           int *called_types,
+                                           const char **calling_names,
+                                           int *calling_types,
+                                           size_t num_addrs, uint16_t port);
 NTSTATUS smbsock_any_connect_recv(struct tevent_req *req, int *pfd,
-                                 size_t *chosen_index, uint16_t *port);
+                                 size_t *chosen_index, uint16_t *chosen_port);
 NTSTATUS smbsock_any_connect(const struct sockaddr_storage *addrs,
-                            const char **called_names, size_t num_addrs,
-                            int *pfd, size_t *chosen_index, uint16_t *port);
+                            const char **called_names,
+                            int *called_types,
+                            const char **calling_names,
+                            int *calling_types,
+                            size_t num_addrs,
+                            uint16_t port,
+                            int *pfd, size_t *chosen_index,
+                            uint16_t *chosen_port);
 
 /* The following definitions come from rpc_server/srv_samr_nt.c */
 NTSTATUS access_check_object( struct security_descriptor *psd, struct 
security_token *token,
diff --git a/source3/libsmb/smbsock_connect.c b/source3/libsmb/smbsock_connect.c
index 8ab12c5..174d2aa 100644
--- a/source3/libsmb/smbsock_connect.c
+++ b/source3/libsmb/smbsock_connect.c
@@ -176,7 +176,9 @@ struct smbsock_connect_state {
        struct tevent_context *ev;
        const struct sockaddr_storage *addr;
        const char *called_name;
+       uint8_t called_type;
        const char *calling_name;
+       uint8_t calling_type;
        struct tevent_req *req_139;
        struct tevent_req *req_445;
        int sock;
@@ -191,8 +193,11 @@ static void smbsock_connect_do_139(struct tevent_req 
*subreq);
 struct tevent_req *smbsock_connect_send(TALLOC_CTX *mem_ctx,
                                        struct tevent_context *ev,
                                        const struct sockaddr_storage *addr,
+                                       uint16_t port,
                                        const char *called_name,
-                                       const char *calling_name)
+                                       int called_type,
+                                       const char *calling_name,
+                                       int calling_type)
 {
        struct tevent_req *req, *subreq;
        struct smbsock_connect_state *state;
@@ -206,11 +211,38 @@ struct tevent_req *smbsock_connect_send(TALLOC_CTX 
*mem_ctx,
        state->sock = -1;
        state->called_name =
                (called_name != NULL) ? called_name : "*SMBSERVER";
+       state->called_type =
+               (called_type != -1) ? called_type : 0x20;
        state->calling_name =
                (calling_name != NULL) ? calling_name : global_myname();
+       state->calling_type =
+               (calling_type != -1) ? calling_type : 0x00;
 
        talloc_set_destructor(state, smbsock_connect_state_destructor);
 
+       if (port == 139) {
+               subreq = tevent_wakeup_send(state, ev, timeval_set(0, 0));
+               if (tevent_req_nomem(subreq, req)) {
+                       return tevent_req_post(req, ev);
+               }
+               tevent_req_set_callback(subreq, smbsock_connect_do_139, req);
+               return req;
+       }
+       if (port != 0) {
+               state->req_445 = open_socket_out_send(state, ev, addr, port,
+                                                     5000);
+               if (tevent_req_nomem(state->req_445, req)) {
+                       return tevent_req_post(req, ev);
+               }
+               tevent_req_set_callback(
+                       state->req_445, smbsock_connect_connected, req);
+               return req;
+       }
+
+       /*
+        * port==0, try both
+        */
+
        state->req_445 = open_socket_out_send(state, ev, addr, 445, 5000);
        if (tevent_req_nomem(state->req_445, req)) {
                return tevent_req_post(req, ev);
@@ -254,8 +286,10 @@ static void smbsock_connect_do_139(struct tevent_req 
*subreq)
                return;
        }
        state->req_139 = nb_connect_send(state, state->ev, state->addr,
-                                        state->called_name, 0x20,
-                                        state->calling_name, 0x0);
+                                        state->called_name,
+                                        state->called_type,
+                                        state->calling_name,
+                                        state->calling_type);
        if (tevent_req_nomem(state->req_139, req)) {
                return;
        }
@@ -311,7 +345,7 @@ static void smbsock_connect_connected(struct tevent_req 
*subreq)
 }
 
 NTSTATUS smbsock_connect_recv(struct tevent_req *req, int *sock,
-                         uint16_t *port)
+                             uint16_t *ret_port)
 {
        struct smbsock_connect_state *state = tevent_req_data(
                req, struct smbsock_connect_state);
@@ -322,15 +356,16 @@ NTSTATUS smbsock_connect_recv(struct tevent_req *req, int 
*sock,
        }
        *sock = state->sock;
        state->sock = -1;
-       if (port != NULL) {
-               *port = state->port;
+       if (ret_port != NULL) {
+               *ret_port = state->port;
        }
        return NT_STATUS_OK;
 }
 
-NTSTATUS smbsock_connect(const struct sockaddr_storage *addr,
-                        const char *called_name, const char *calling_name,
-                        int *pfd, uint16_t *port)
+NTSTATUS smbsock_connect(const struct sockaddr_storage *addr, uint16_t port,
+                        const char *called_name, int called_type,
+                        const char *calling_name, int calling_type,
+                        int *pfd, uint16_t *ret_port)
 {
        TALLOC_CTX *frame = talloc_stackframe();
        struct event_context *ev;
@@ -341,14 +376,16 @@ NTSTATUS smbsock_connect(const struct sockaddr_storage 
*addr,
        if (ev == NULL) {
                goto fail;
        }
-       req = smbsock_connect_send(frame, ev, addr, called_name, calling_name);
+       req = smbsock_connect_send(frame, ev, addr, port,
+                                  called_name, called_type,
+                                  calling_name, calling_type);
        if (req == NULL) {
                goto fail;
        }
        if (!tevent_req_poll_ntstatus(req, ev, &status)) {
                goto fail;
        }
-       status = smbsock_connect_recv(req, pfd, port);
+       status = smbsock_connect_recv(req, pfd, ret_port);
  fail:
        TALLOC_FREE(frame);
        return status;
@@ -358,14 +395,18 @@ struct smbsock_any_connect_state {
        struct tevent_context *ev;
        const struct sockaddr_storage *addrs;
        const char **called_names;
+       int *called_types;
+       const char **calling_names;
+       int *calling_types;
        size_t num_addrs;
+       uint16_t port;
 
        struct tevent_req **requests;
        size_t num_sent;
        size_t num_received;
 
        int fd;
-       uint16_t port;
+       uint16_t chosen_port;
        size_t chosen_index;
 };
 
@@ -378,7 +419,10 @@ struct tevent_req *smbsock_any_connect_send(TALLOC_CTX 
*mem_ctx,
                                            struct tevent_context *ev,
                                            const struct sockaddr_storage 
*addrs,
                                            const char **called_names,
-                                           size_t num_addrs)
+                                           int *called_types,
+                                           const char **calling_names,
+                                           int *calling_types,
+                                           size_t num_addrs, uint16_t port)
 {
        struct tevent_req *req, *subreq;
        struct smbsock_any_connect_state *state;
@@ -392,6 +436,10 @@ struct tevent_req *smbsock_any_connect_send(TALLOC_CTX 
*mem_ctx,
        state->addrs = addrs;
        state->num_addrs = num_addrs;
        state->called_names = called_names;
+       state->called_types = called_types;
+       state->calling_names = calling_names;
+       state->calling_types = calling_types;
+       state->port = port;
 
        if (num_addrs == 0) {
                tevent_req_nterror(req, NT_STATUS_INVALID_PARAMETER);
@@ -456,9 +504,15 @@ static bool smbsock_any_connect_send_next(
        }
        subreq = smbsock_connect_send(
                state->requests, state->ev, &state->addrs[state->num_sent],
+               state->port,
                (state->called_names != NULL)
                ? state->called_names[state->num_sent] : NULL,
-               NULL);
+               (state->called_types != NULL)
+               ? state->called_types[state->num_sent] : -1,
+               (state->calling_names != NULL)
+               ? state->calling_names[state->num_sent] : NULL,
+               (state->calling_types != NULL)
+               ? state->calling_types[state->num_sent] : -1);
        if (tevent_req_nomem(subreq, req)) {
                return false;
        }
@@ -478,7 +532,7 @@ static void smbsock_any_connect_connected(struct tevent_req 
*subreq)
                req, struct smbsock_any_connect_state);
        NTSTATUS status;
        int fd;
-       uint16_t port;
+       uint16_t chosen_port;
        size_t i;
        size_t chosen_index = 0;
 
@@ -493,7 +547,7 @@ static void smbsock_any_connect_connected(struct tevent_req 
*subreq)
                return;
        }
 
-       status = smbsock_connect_recv(subreq, &fd, &port);
+       status = smbsock_connect_recv(subreq, &fd, &chosen_port);
 
        TALLOC_FREE(subreq);
        state->requests[chosen_index] = NULL;
@@ -504,7 +558,7 @@ static void smbsock_any_connect_connected(struct tevent_req 
*subreq)
                 */
                TALLOC_FREE(state->requests);
                state->fd = fd;
-               state->port = port;
+               state->chosen_port = chosen_port;
                state->chosen_index = chosen_index;
                tevent_req_done(req);
                return;
@@ -526,7 +580,8 @@ static void smbsock_any_connect_connected(struct tevent_req 
*subreq)
 }
 
 NTSTATUS smbsock_any_connect_recv(struct tevent_req *req, int *pfd,
-                                 size_t *chosen_index, uint16_t *port)
+                                 size_t *chosen_index,
+                                 uint16_t *chosen_port)
 {
        struct smbsock_any_connect_state *state = tevent_req_data(
                req, struct smbsock_any_connect_state);
@@ -539,15 +594,21 @@ NTSTATUS smbsock_any_connect_recv(struct tevent_req *req, 
int *pfd,
        if (chosen_index != NULL) {
                *chosen_index = state->chosen_index;
        }
-       if (port != NULL) {
-               *port = state->port;
+       if (chosen_port != NULL) {
+               *chosen_port = state->chosen_port;
        }
        return NT_STATUS_OK;
 }
 
 NTSTATUS smbsock_any_connect(const struct sockaddr_storage *addrs,
-                            const char **called_names, size_t num_addrs,
-                            int *pfd, size_t *chosen_index, uint16_t *port)
+                            const char **called_names,
+                            int *called_types,
+                            const char **calling_names,
+                            int *calling_types,
+                            size_t num_addrs,
+                            uint16_t port,
+                            int *pfd, size_t *chosen_index,
+                            uint16_t *chosen_port)
 {
        TALLOC_CTX *frame = talloc_stackframe();
        struct event_context *ev;
@@ -558,15 +619,17 @@ NTSTATUS smbsock_any_connect(const struct 
sockaddr_storage *addrs,
        if (ev == NULL) {
                goto fail;
        }
-       req = smbsock_any_connect_send(frame, ev, addrs, called_names,
-                                      num_addrs);
+       req = smbsock_any_connect_send(frame, ev, addrs,
+                                      called_names, called_types,
+                                      calling_names, calling_types,
+                                      num_addrs, port);
        if (req == NULL) {
                goto fail;
        }
        if (!tevent_req_poll_ntstatus(req, ev, &status)) {
                goto fail;
        }
-       status = smbsock_any_connect_recv(req, pfd, chosen_index, port);
+       status = smbsock_any_connect_recv(req, pfd, chosen_index, chosen_port);
  fail:
        TALLOC_FREE(frame);
        return status;
diff --git a/source3/torture/test_smbsock_any_connect.c 
b/source3/torture/test_smbsock_any_connect.c
index 4ebb4f9..28a9981 100644
--- a/source3/torture/test_smbsock_any_connect.c
+++ b/source3/torture/test_smbsock_any_connect.c
@@ -34,8 +34,9 @@ bool run_smb_any_connect(int dummy)
        interpret_string_addr(&addrs[3], "192.168.99.8", 0);
        interpret_string_addr(&addrs[4], "192.168.99.9", 0);
 
-       status = smbsock_any_connect(addrs, NULL, ARRAY_SIZE(addrs), &fd,
-                                    &chosen_index, &port);
+       status = smbsock_any_connect(addrs, NULL, NULL, NULL, NULL,
+                                    ARRAY_SIZE(addrs), 0,
+                                    &fd, &chosen_index, &port);
 
        d_printf("smbsock_any_connect returned %s (fd %d)\n",
                 nt_errstr(status), NT_STATUS_IS_OK(status) ? fd : -1);
diff --git a/source3/winbindd/winbindd_cm.c b/source3/winbindd/winbindd_cm.c
index f3eba90..5f42120 100644
--- a/source3/winbindd/winbindd_cm.c
+++ b/source3/winbindd/winbindd_cm.c
@@ -1382,8 +1382,8 @@ static bool find_new_dc(TALLOC_CTX *mem_ctx,
        if ((addrs == NULL) || (dcnames == NULL))
                return False;
 
-       status = smbsock_any_connect(addrs, dcnames, num_addrs,
-                                    fd, &fd_index, NULL);
+       status = smbsock_any_connect(addrs, dcnames, NULL, NULL, NULL,
+                                    num_addrs, 0, fd, &fd_index, NULL);
        if (!NT_STATUS_IS_OK(status)) {
                for (i=0; i<num_dcs; i++) {
                        char ab[INET6_ADDRSTRLEN];
@@ -1494,7 +1494,8 @@ static NTSTATUS cm_open_connection(struct winbindd_domain 
*domain,
                {
                        NTSTATUS status;
 
-                       status = smbsock_connect(&domain->dcaddr, NULL, NULL,
+                       status = smbsock_connect(&domain->dcaddr, 0,
+                                                NULL, -1, NULL, -1,
                                                 &fd, NULL);
                        if (!NT_STATUS_IS_OK(status)) {
                                fd = -1;


-- 
Samba Shared Repository

Reply via email to