The branch, master has been updated
       via  4afbda2 s4:libcli/raw: implement on top of smbXcli_conn/req
       via  99ef6a4 s4:libcli: do the nbss session request within 
smbcli_sock_connect_*()
       via  52dd549 s4:libcli/raw: remove unused functions
       via  b21f344 s4:libcli: use smbcli_sock_connect() in 
smbcli_socket_connect()
       via  4877be53 s4:libcli: move smbcli_transport_establish() logic into 
smbcli_socket_connect()
       via  b51c92a s4:libcli: convert smbcli_transport_connect_* to tevent_req
       via  706e108 s4:lib/socket: add socket_connect_multi_ex_*
      from  99f2177 s3-ctdb: Make use of CTDB_CONTROL_CHECK_SRVIDS

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


- Log -----------------------------------------------------------------
commit 4afbda221c20ffa36a1d1e37ef11f86073a49da6
Author: Stefan Metzmacher <[email protected]>
Date:   Fri Sep 23 08:35:17 2011 +0200

    s4:libcli/raw: implement on top of smbXcli_conn/req
    
    metze
    
    Autobuild-User: Stefan Metzmacher <[email protected]>
    Autobuild-Date: Wed Nov 30 15:13:36 CET 2011 on sn-devel-104

commit 99ef6a4bec1058b3649e5e72f8ea85f6df93a154
Author: Stefan Metzmacher <[email protected]>
Date:   Wed Nov 30 08:50:11 2011 +0100

    s4:libcli: do the nbss session request within smbcli_sock_connect_*()
    
    metze

commit 52dd549eb64ea9b79bd4cbeba0fa4183aad7bb4c
Author: Stefan Metzmacher <[email protected]>
Date:   Wed Nov 30 08:35:33 2011 +0100

    s4:libcli/raw: remove unused functions
    
    metze

commit b21f344079920194f94bbee7f44d8a6582e4d1a2
Author: Stefan Metzmacher <[email protected]>
Date:   Wed Nov 30 08:33:29 2011 +0100

    s4:libcli: use smbcli_sock_connect() in smbcli_socket_connect()
    
    metze

commit 4877be53df1181f75d603fa4edc67c34e1ba5141
Author: Stefan Metzmacher <[email protected]>
Date:   Wed Nov 30 07:17:31 2011 +0100

    s4:libcli: move smbcli_transport_establish() logic into 
smbcli_socket_connect()
    
    metze

commit b51c92a903877015acf268ab8ff0e07d3a82b295
Author: Stefan Metzmacher <[email protected]>
Date:   Tue Nov 29 11:57:11 2011 +0100

    s4:libcli: convert smbcli_transport_connect_* to tevent_req
    
    metze

commit 706e10820d490e0865b73f66a8665951aa6a71e3
Author: Stefan Metzmacher <[email protected]>
Date:   Tue Nov 29 16:25:03 2011 +0100

    s4:lib/socket: add socket_connect_multi_ex_*
    
    This add an async establish hook, that gets called
    before a connection success is detected.
    
    This can be used to do a NBT session request
    and it makes sure that we don't cancel the connection
    on port 445, just because the tcp connect on port
    139 worked.
    
    metze

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

Summary of changes:
 source4/client/client.c                  |   18 +-
 source4/lib/socket/connect_multi.c       |  129 ++++-
 source4/lib/socket/socket.h              |   28 +
 source4/libcli/cliconnect.c              |   46 +-
 source4/libcli/libcli.h                  |   10 +-
 source4/libcli/raw/clioplock.c           |   11 +-
 source4/libcli/raw/clisession.c          |    3 +-
 source4/libcli/raw/clisocket.c           |  407 ++++++-----
 source4/libcli/raw/clitransport.c        |  713 ++++++++++---------
 source4/libcli/raw/libcliraw.h           |   73 +--
 source4/libcli/raw/rawnegotiate.c        |  253 +++----
 source4/libcli/raw/rawnotify.c           |   64 +--
 source4/libcli/raw/rawreadwrite.c        |    6 -
 source4/libcli/raw/rawrequest.c          |  227 ++++---
 source4/libcli/raw/rawtrans.c            | 1126 ++++++++----------------------
 source4/libcli/raw/smb_signing.c         |  175 -----
 source4/libcli/smb2/connect.c            |   56 +-
 source4/libcli/smb_composite/connect.c   |   94 +--
 source4/libcli/smb_composite/sesssetup.c |   42 +-
 source4/librpc/rpc/dcerpc_smb.c          |   10 +-
 source4/ntvfs/cifs/vfs_cifs.c            |    3 +-
 source4/torture/basic/base.c             |   36 +-
 source4/torture/raw/lockbench.c          |   26 +-
 source4/torture/raw/openbench.c          |   25 +-
 24 files changed, 1486 insertions(+), 2095 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source4/client/client.c b/source4/client/client.c
index 57686bb..d7adc41 100644
--- a/source4/client/client.c
+++ b/source4/client/client.c
@@ -3184,6 +3184,7 @@ static int do_message_op(const char *netbios_name, const 
char *desthost,
        struct nbt_name called, calling;
        const char *server_name;
        struct smbcli_state *cli;
+       bool ok;
 
        make_nbt_name_client(&calling, netbios_name);
 
@@ -3191,17 +3192,18 @@ static int do_message_op(const char *netbios_name, 
const char *desthost,
 
        server_name = destip ? destip : desthost;
 
-       if (!(cli = smbcli_state_init(NULL)) ||
-           !smbcli_socket_connect(cli, server_name, destports,
-                                  ev_ctx, resolve_ctx, options,
-                   socket_options)) {
-               d_printf("Connection to %s failed\n", server_name);
+       cli = smbcli_state_init(NULL);
+       if (cli == NULL) {
+               d_printf("smbcli_state_init() failed\n");
                return 1;
        }
 
-       if (!smbcli_transport_establish(cli, &calling, &called)) {
-               d_printf("session request failed\n");
-               talloc_free(cli);
+       ok = smbcli_socket_connect(cli, server_name, destports,
+                                  ev_ctx, resolve_ctx, options,
+                                  socket_options,
+                                  &calling, &called);
+       if (!ok) {
+               d_printf("Connection to %s failed\n", server_name);
                return 1;
        }
 
diff --git a/source4/lib/socket/connect_multi.c 
b/source4/lib/socket/connect_multi.c
index 2b926c8..c8231b3 100644
--- a/source4/lib/socket/connect_multi.c
+++ b/source4/lib/socket/connect_multi.c
@@ -42,6 +42,8 @@ struct connect_multi_state {
        uint16_t result_port;
 
        int num_connects_sent, num_connects_recv;
+
+       struct socket_connect_multi_ex *ex;
 };
 
 /*
@@ -59,17 +61,19 @@ static void connect_multi_timer(struct tevent_context *ev,
                                    struct timeval tv, void *p);
 static void connect_multi_next_socket(struct composite_context *result);
 static void continue_one(struct composite_context *creq);
+static void continue_one_ex(struct tevent_req *subreq);
 
 /*
   setup an async socket_connect, with multiple ports
 */
-_PUBLIC_ struct composite_context *socket_connect_multi_send(
+_PUBLIC_ struct composite_context *socket_connect_multi_ex_send(
                                                    TALLOC_CTX *mem_ctx,
                                                    const char *server_name,
                                                    int num_server_ports,
                                                    uint16_t *server_ports,
                                                    struct resolve_context 
*resolve_ctx,
-                                                   struct tevent_context 
*event_ctx)
+                                                   struct tevent_context 
*event_ctx,
+                                                   struct 
socket_connect_multi_ex *ex)
 {
        struct composite_context *result;
        struct connect_multi_state *multi;
@@ -95,6 +99,8 @@ _PUBLIC_ struct composite_context *socket_connect_multi_send(
                multi->ports[i] = server_ports[i];
        }
 
+       multi->ex = ex;
+
        /*  
            we don't want to do the name resolution separately
                    for each port, so start it now, then only start on
@@ -225,10 +231,61 @@ static void continue_one(struct composite_context *creq)
        struct connect_multi_state *multi = 
talloc_get_type(result->private_data, 
                                                            struct 
connect_multi_state);
        NTSTATUS status;
-       multi->num_connects_recv++;
 
        status = socket_connect_recv(creq);
 
+       if (multi->ex) {
+               struct tevent_req *subreq;
+
+               subreq = multi->ex->establish_send(state,
+                                                  result->event_ctx,
+                                                  state->sock,
+                                                  state->addr,
+                                                  multi->ex->private_data);
+               if (composite_nomem(subreq, result)) return;
+               tevent_req_set_callback(subreq, continue_one_ex, state);
+               return;
+       }
+
+       multi->num_connects_recv++;
+
+       if (NT_STATUS_IS_OK(status)) {
+               multi->sock = talloc_steal(multi, state->sock);
+               multi->result_port = state->addr->port;
+       }
+
+       talloc_free(state);
+
+       if (NT_STATUS_IS_OK(status) ||
+           multi->num_connects_recv == (multi->num_address * 
multi->num_ports)) {
+               result->status = status;
+               composite_done(result);
+               return;
+       }
+
+       /* try the next port */
+       connect_multi_next_socket(result);
+}
+
+/*
+  one of our multi->ex->establish_send() calls hash finished. If it got a
+  connection or there are none left then we are done
+*/
+static void continue_one_ex(struct tevent_req *subreq)
+{
+       struct connect_one_state *state =
+               tevent_req_callback_data(subreq,
+               struct connect_one_state);
+       struct composite_context *result = state->result;
+       struct connect_multi_state *multi =
+               talloc_get_type_abort(result->private_data,
+               struct connect_multi_state);
+       NTSTATUS status;
+       multi->num_connects_recv++;
+
+       status = multi->ex->establish_recv(subreq);
+       TALLOC_FREE(subreq);
+
        if (NT_STATUS_IS_OK(status)) {
                multi->sock = talloc_steal(multi, state->sock);
                multi->result_port = state->addr->port;
@@ -250,7 +307,7 @@ static void continue_one(struct composite_context *creq)
 /*
   async recv routine for socket_connect_multi()
  */
-_PUBLIC_ NTSTATUS socket_connect_multi_recv(struct composite_context *ctx,
+_PUBLIC_ NTSTATUS socket_connect_multi_ex_recv(struct composite_context *ctx,
                                   TALLOC_CTX *mem_ctx,
                                   struct socket_context **sock,
                                   uint16_t *port)
@@ -267,6 +324,55 @@ _PUBLIC_ NTSTATUS socket_connect_multi_recv(struct 
composite_context *ctx,
        return status;
 }
 
+NTSTATUS socket_connect_multi_ex(TALLOC_CTX *mem_ctx,
+                                const char *server_address,
+                                int num_server_ports, uint16_t *server_ports,
+                                struct resolve_context *resolve_ctx,
+                                struct tevent_context *event_ctx,
+                                struct socket_connect_multi_ex *ex,
+                                struct socket_context **result,
+                                uint16_t *result_port)
+{
+       struct composite_context *ctx =
+               socket_connect_multi_ex_send(mem_ctx, server_address,
+                                            num_server_ports, server_ports,
+                                            resolve_ctx,
+                                            event_ctx,
+                                            ex);
+       return socket_connect_multi_ex_recv(ctx, mem_ctx, result, result_port);
+}
+
+/*
+  setup an async socket_connect, with multiple ports
+*/
+_PUBLIC_ struct composite_context *socket_connect_multi_send(
+                                                   TALLOC_CTX *mem_ctx,
+                                                   const char *server_name,
+                                                   int num_server_ports,
+                                                   uint16_t *server_ports,
+                                                   struct resolve_context 
*resolve_ctx,
+                                                   struct tevent_context 
*event_ctx)
+{
+       return socket_connect_multi_ex_send(mem_ctx,
+                                           server_name,
+                                           num_server_ports,
+                                           server_ports,
+                                           resolve_ctx,
+                                           event_ctx,
+                                           NULL); /* ex */
+}
+
+/*
+  async recv routine for socket_connect_multi()
+ */
+_PUBLIC_ NTSTATUS socket_connect_multi_recv(struct composite_context *ctx,
+                                  TALLOC_CTX *mem_ctx,
+                                  struct socket_context **sock,
+                                  uint16_t *port)
+{
+       return socket_connect_multi_ex_recv(ctx, mem_ctx, sock, port);
+}
+
 NTSTATUS socket_connect_multi(TALLOC_CTX *mem_ctx,
                              const char *server_address,
                              int num_server_ports, uint16_t *server_ports,
@@ -275,10 +381,13 @@ NTSTATUS socket_connect_multi(TALLOC_CTX *mem_ctx,
                              struct socket_context **result,
                              uint16_t *result_port)
 {
-       struct composite_context *ctx =
-               socket_connect_multi_send(mem_ctx, server_address,
-                                         num_server_ports, server_ports,
-                                         resolve_ctx,
-                                         event_ctx);
-       return socket_connect_multi_recv(ctx, mem_ctx, result, result_port);
+       return socket_connect_multi_ex(mem_ctx,
+                                      server_address,
+                                      num_server_ports,
+                                      server_ports,
+                                      resolve_ctx,
+                                      event_ctx,
+                                      NULL, /* ex */
+                                      result,
+                                      result_port);
 }
diff --git a/source4/lib/socket/socket.h b/source4/lib/socket/socket.h
index e00b61b..403a723 100644
--- a/source4/lib/socket/socket.h
+++ b/source4/lib/socket/socket.h
@@ -202,6 +202,34 @@ NTSTATUS socket_connect_ev(struct socket_context *sock,
                           uint32_t flags, 
                           struct tevent_context *ev);
 
+struct socket_connect_multi_ex {
+       void *private_data;
+       struct tevent_req *(*establish_send)(TALLOC_CTX *mem_ctx,
+                                            struct tevent_context *ev,
+                                            struct socket_context *sock,
+                                            struct socket_address *addr,
+                                            void *private_data);
+       NTSTATUS (*establish_recv)(struct tevent_req *req);
+};
+struct composite_context *socket_connect_multi_ex_send(TALLOC_CTX *mem_ctx,
+                                                      const char 
*server_address,
+                                                      int num_server_ports,
+                                                      uint16_t *server_ports,
+                                                      struct resolve_context 
*resolve_ctx,
+                                                      struct tevent_context 
*event_ctx,
+                                                      struct 
socket_connect_multi_ex *ex);
+NTSTATUS socket_connect_multi_ex_recv(struct composite_context *ctx,
+                                     TALLOC_CTX *mem_ctx,
+                                     struct socket_context **result,
+                                     uint16_t *port);
+NTSTATUS socket_connect_multi_ex(TALLOC_CTX *mem_ctx, const char 
*server_address,
+                                int num_server_ports, uint16_t *server_ports,
+                                struct resolve_context *resolve_ctx,
+                                struct tevent_context *event_ctx,
+                                struct socket_connect_multi_ex *ex,
+                                struct socket_context **result,
+                                uint16_t *port);
+
 struct composite_context *socket_connect_multi_send(TALLOC_CTX *mem_ctx,
                                                    const char *server_address,
                                                    int num_server_ports,
diff --git a/source4/libcli/cliconnect.c b/source4/libcli/cliconnect.c
index d670324..45d8d2a 100644
--- a/source4/libcli/cliconnect.c
+++ b/source4/libcli/cliconnect.c
@@ -35,35 +35,47 @@ bool smbcli_socket_connect(struct smbcli_state *cli, const 
char *server,
                           struct tevent_context *ev_ctx,
                           struct resolve_context *resolve_ctx,
                           struct smbcli_options *options,
-               const char *socket_options)
+                          const char *socket_options,
+                          struct nbt_name *calling,
+                          struct nbt_name *called)
 {
-       struct smbcli_socket *sock;
-
-       sock = smbcli_sock_connect_byname(server, ports, NULL,
-                                         resolve_ctx, ev_ctx,
-                      socket_options);
+       NTSTATUS status;
 
-       if (sock == NULL) return false;
-       
-       cli->transport = smbcli_transport_init(sock, cli, true, options);
-       if (!cli->transport) {
+       cli->options = *options;
+
+       status = smbcli_sock_connect(cli,
+                                    NULL, /* host_addr */
+                                    ports,
+                                    server,
+                                    resolve_ctx,
+                                    ev_ctx,
+                                    socket_options,
+                                    calling,
+                                    called,
+                                    &cli->sock);
+       if (!NT_STATUS_IS_OK(status)) {
                return false;
        }
 
        return true;
 }
 
-/* wrapper around smbcli_transport_connect() */
-bool smbcli_transport_establish(struct smbcli_state *cli, 
-                               struct nbt_name *calling,
-                               struct nbt_name *called)
-{
-       return smbcli_transport_connect(cli->transport, calling, called);
-}
-
 /* wrapper around smb_raw_negotiate() */
 NTSTATUS smbcli_negprot(struct smbcli_state *cli, bool unicode, int 
maxprotocol)
 {
+       if (unicode) {
+               cli->options.unicode = 1;
+       } else {
+               cli->options.unicode = 0;
+       }
+
+       cli->transport = smbcli_transport_init(cli->sock, cli,
+                                              true, &cli->options);
+       cli->sock = NULL;
+       if (!cli->transport) {
+               return NT_STATUS_NO_MEMORY;
+       }
+
        return smb_raw_negotiate(cli->transport, unicode, maxprotocol);
 }
 
diff --git a/source4/libcli/libcli.h b/source4/libcli/libcli.h
index 81a31d1..9e81740 100644
--- a/source4/libcli/libcli.h
+++ b/source4/libcli/libcli.h
@@ -22,6 +22,7 @@
 #define __LIBCLI_H__
 
 #include "librpc/gen_ndr/nbt.h"
+#include "libcli/raw/libcliraw.h"
 
 struct substitute_context;
 
@@ -30,6 +31,8 @@ struct substitute_context;
    i.e. a single session on a single socket. 
  */
 struct smbcli_state {
+       struct smbcli_options options;
+       struct smbcli_socket *sock; /* NULL if connected */
        struct smbcli_transport *transport;
        struct smbcli_session *session;
        struct smbcli_tree *tree;
@@ -88,10 +91,9 @@ bool smbcli_socket_connect(struct smbcli_state *cli, const 
char *server,
                           struct tevent_context *ev_ctx,
                           struct resolve_context *resolve_ctx,
                           struct smbcli_options *options,
-               const char *socket_options);
-bool smbcli_transport_establish(struct smbcli_state *cli, 
-                               struct nbt_name *calling,
-                               struct nbt_name *called);
+                          const char *socket_options,
+                          struct nbt_name *calling,
+                          struct nbt_name *called);
 NTSTATUS smbcli_negprot(struct smbcli_state *cli, bool unicode, int 
maxprotocol);
 NTSTATUS smbcli_session_setup(struct smbcli_state *cli, 
                              struct cli_credentials *credentials,
diff --git a/source4/libcli/raw/clioplock.c b/source4/libcli/raw/clioplock.c
index 42ac6b5..396ab96 100644
--- a/source4/libcli/raw/clioplock.c
+++ b/source4/libcli/raw/clioplock.c
@@ -40,11 +40,12 @@ _PUBLIC_ bool smbcli_oplock_ack(struct smbcli_tree *tree, 
uint16_t fnum, uint16_
        SSVAL(req->out.vwv,VWV(6),0);
        SSVAL(req->out.vwv,VWV(7),0);
 
-       /* this request does not expect a reply, so tell the signing
-          subsystem not to allocate an id for a reply */
-       req->one_way_request = 1;
-
-       ret = smbcli_request_send(req); 
+       /*
+        * The low level code knows it is a
+        * one way request by looking at SMBlockingX,
+        * wct == 8 and LOCKING_ANDX_OPLOCK_RELEASE
+        */
+       ret = smbcli_request_send(req);
 
        return ret;
 }
diff --git a/source4/libcli/raw/clisession.c b/source4/libcli/raw/clisession.c
index 41765bf..d68f309 100644
--- a/source4/libcli/raw/clisession.c
+++ b/source4/libcli/raw/clisession.c
@@ -23,6 +23,7 @@
 #include "libcli/raw/libcliraw.h"
 #include "libcli/raw/raw_proto.h"
 #include "system/filesys.h"
+#include "../libcli/smb/smbXcli_base.h"
 
 #define SETUP_REQUEST_SESSION(cmd, wct, buflen) do { \
        req = smbcli_request_setup_session(session, cmd, wct, buflen); \
@@ -68,7 +69,7 @@ struct smbcli_session *smbcli_session_init(struct 
smbcli_transport *transport,
        if (capabilities & CAP_EXTENDED_SECURITY) {
                flags2 |= FLAGS2_EXTENDED_SECURITY;
        }
-       if (session->transport->negotiate.sign_info.doing_signing) {
+       if (smb1cli_conn_signing_is_active(session->transport->conn)) {
                flags2 |= FLAGS2_SMB_SECURITY_SIGNATURES;
        }
 
diff --git a/source4/libcli/raw/clisocket.c b/source4/libcli/raw/clisocket.c
index 70a83a4..dd3ea39 100644
--- a/source4/libcli/raw/clisocket.c
+++ b/source4/libcli/raw/clisocket.c
@@ -21,6 +21,9 @@
 */
 
 #include "includes.h"
+#include "system/network.h"
+#include "../lib/async_req/async_sock.h"
+#include "../lib/util/tevent_ntstatus.h"
 #include "lib/events/events.h"
 #include "libcli/raw/libcliraw.h"
 #include "libcli/composite/composite.h"
@@ -28,128 +31,220 @@
 #include "libcli/resolve/resolve.h"
 #include "param/param.h"
 #include "libcli/raw/raw_proto.h"
+#include "../libcli/smb/read_smb.h"
 
-/*
-  send a session request
-*/
-struct smbcli_request *smbcli_transport_connect_send(struct smbcli_transport 
*transport,
-                                                    struct nbt_name *calling, 
-                                                    struct nbt_name *called)
+struct smbcli_transport_connect_state {
+       struct tevent_context *ev;
+       struct socket_context *sock;
+       uint8_t *request;
+       struct iovec iov;
+       uint8_t *response;
+};
+
+static void smbcli_transport_connect_writev_done(struct tevent_req *subreq);
+static void smbcli_transport_connect_read_smb_done(struct tevent_req *subreq);
+
+static struct tevent_req *smbcli_transport_connect_send(TALLOC_CTX *mem_ctx,
+                                                struct tevent_context *ev,
+                                                struct socket_context *sock,
+                                                uint16_t port,
+                                                uint32_t timeout_msec,
+                                                struct nbt_name *calling,
+                                                struct nbt_name *called)
 {
-       uint8_t *p;
-       struct smbcli_request *req;
+       struct tevent_req *req;
+       struct smbcli_transport_connect_state *state;
+       struct tevent_req *subreq;
        DATA_BLOB calling_blob, called_blob;
-       TALLOC_CTX *tmp_ctx = talloc_new(transport);
+       uint8_t *p;
        NTSTATUS status;
 
-       status = nbt_name_dup(transport, called, &transport->called);
-       if (!NT_STATUS_IS_OK(status)) goto failed;
-       
-       status = nbt_name_to_blob(tmp_ctx, &calling_blob, calling);
-       if (!NT_STATUS_IS_OK(status)) goto failed;
+       req = tevent_req_create(mem_ctx, &state,
+                               struct smbcli_transport_connect_state);
+       if (req == NULL) {
+               return NULL;
+       }
+       state->ev = ev;
+       state->sock = sock;
 
-       status = nbt_name_to_blob(tmp_ctx, &called_blob, called);
-       if (!NT_STATUS_IS_OK(status)) goto failed;
+       if (port != 139) {
+               tevent_req_done(req);
+               return tevent_req_post(req, ev);
+       }
 
-       /* allocate output buffer */
-       req = smbcli_request_setup_nonsmb(transport, 
-                                         NBT_HDR_SIZE + 
-                                         calling_blob.length + 
called_blob.length);
-       if (req == NULL) goto failed;
+       status = nbt_name_to_blob(state, &calling_blob, calling);
+       if (tevent_req_nterror(req, status)) {


-- 
Samba Shared Repository

Reply via email to