s4:libcli/raw: setup a smbXcli_session for each smbcli_session
[kai/samba.git] / source4 / libcli / raw / libcliraw.h
index d55b4cc42c160f341913e274d391d975bcc8322b..8cdccc1f4516a851ff9d6eb226c1ff58a1833864 100644 (file)
 #ifndef __LIBCLI_RAW_H__
 #define __LIBCLI_RAW_H__
 
+#include "../libcli/smb/smb_common.h"
 #include "libcli/raw/request.h"
 #include "librpc/gen_ndr/nbt.h"
+#include "libcli/raw/interfaces.h"
 
 struct smbcli_tree;  /* forward declare */
 struct smbcli_request;  /* forward declare */
@@ -32,6 +34,7 @@ struct smbcli_transport;  /* forward declare */
 
 struct resolve_context;
 struct cli_credentials;
+struct gensec_settings;
 
 /* default timeout for all smb requests */
 #define SMB_REQUEST_TIMEOUT 60
@@ -50,22 +53,18 @@ struct smbcli_negotiate {
        enum protocol_types protocol;
 
        uint8_t sec_mode;               /* security mode returned by negprot */
-       uint8_t key_len;
-       DATA_BLOB server_guid;      /* server_guid */
        DATA_BLOB secblob;      /* cryptkey or negTokenInit blob */
        uint32_t sesskey;
-       
-       struct smb_signing_context sign_info;
 
        /* capabilities that the server reported */
        uint32_t capabilities;
        
        int server_zone;
        time_t server_time;
-       uint_t readbraw_supported:1;
-       uint_t writebraw_supported:1;
 
-       char *server_domain;
+       unsigned int readbraw_supported:1;
+       unsigned int writebraw_supported:1;
+       unsigned int lockread_supported:1;
 };
        
 /* this is the context for a SMB socket associated with the socket itself */
@@ -80,9 +79,9 @@ struct smbcli_socket {
 
        /* the event handle for waiting for socket IO */
        struct {
-               struct event_context *ctx;
-               struct fd_event *fde;
-               struct timed_event *te;
+               struct tevent_context *ctx;
+               struct tevent_fd *fde;
+               struct tevent_timer *te;
        } event;
 };
 
@@ -91,44 +90,37 @@ struct smbcli_socket {
   client library
 */
 struct smbcli_options {
-       uint_t use_oplocks:1;
-       uint_t use_level2_oplocks:1;
-       uint_t use_spnego:1;
-       uint_t unicode:1;
-       uint_t ntstatus_support:1;
+       unsigned int use_oplocks:1;
+       unsigned int use_level2_oplocks:1;
+       unsigned int use_spnego:1;
+       unsigned int unicode:1;
+       unsigned int ntstatus_support:1;
        int max_protocol;
        uint32_t max_xmit;
        uint16_t max_mux;
        int request_timeout;
-       enum smb_signing_state signing;
+       enum smb_signing_setting signing;
 };
 
 /* this is the context for the client transport layer */
 struct smbcli_transport {
-       /* socket level info */
-       struct smbcli_socket *socket;
+       struct tevent_context *ev; /* TODO: remove this !!! */
+       struct smbXcli_conn *conn;
 
-       /* the next mid to be allocated - needed for signing and
-          request matching */
-       uint16_t next_mid;
-       
        /* negotiated protocol information */
        struct smbcli_negotiate negotiate;
 
        /* options to control the behaviour of the client code */
        struct smbcli_options options;
 
-       /* is a readbraw pending? we need to handle that case
-          specially on receiving packets */
-       uint_t readbraw_pending:1;
-       
        /* an idle function - if this is defined then it will be
           called once every period microseconds while we are waiting
           for a packet */
        struct {
                void (*func)(struct smbcli_transport *, void *);
-               void *private;
-               uint_t period;
+               void *private_data;
+               unsigned int period;
+               struct tevent_timer *te;
        } idle;
 
        /* the error fields from the last message */
@@ -141,27 +133,18 @@ struct smbcli_transport {
                              SOCKET_READ_ERROR,
                              SOCKET_WRITE_ERROR,
                              SOCKET_READ_BAD_SIG} socket_error;
-                       uint_t nbt_error;
+                       unsigned int nbt_error;
                } e;
        } error;
 
        struct {
                /* a oplock break request handler */
                bool (*handler)(struct smbcli_transport *transport, 
-                               uint16_t tid, uint16_t fnum, uint8_t level, void *private);
+                               uint16_t tid, uint16_t fnum, uint8_t level, void *private_data);
                /* private data passed to the oplock handler */
-               void *private;
+               void *private_data;
        } oplock;
-
-       /* a list of async requests that are pending for receive on this connection */
-       struct smbcli_request *pending_recv;
-
-       /* remember the called name - some sub-protocols require us to
-          know the server name */
-       struct nbt_name called;
-
-       /* context of the stream -> packet parser */
-       struct packet_context *packet;
+       struct tevent_req *break_subreq;
 };
 
 /* this is the context for the user */
@@ -173,6 +156,7 @@ struct smbcli_session {
        
        /* after a session setup the server provides us with
           a vuid identifying the security context */
+       struct smbXcli_session *smbXcli;
        uint16_t vuid;
 
        /* default pid for this session */
@@ -188,10 +172,13 @@ struct smbcli_session {
        struct gensec_security *gensec;
 
        struct smbcli_session_options {
-               uint_t lanman_auth:1;
-               uint_t ntlmv2_auth:1;
-               uint_t plaintext_auth:1;
+               unsigned int lanman_auth:1;
+               unsigned int ntlmv2_auth:1;
+               unsigned int plaintext_auth:1;
        } options;
+
+       const char *os;
+       const char *lanman;
 };
 
 /* 
@@ -219,8 +206,8 @@ enum smbcli_request_state {SMBCLI_REQUEST_INIT, /* we are creating the request *
  * functions (similar to context.h, the server version).
  * This will allow requests to be multi-threaded. */
 struct smbcli_request {
-       /* allow a request to be part of a list of requests */
-       struct smbcli_request *next, *prev;
+       /* smbXcli_req */
+       struct tevent_req *subreqs[2];
 
        /* each request is in one of 4 possible states */
        enum smbcli_request_state state;
@@ -231,14 +218,6 @@ struct smbcli_request {
        struct smbcli_session *session;
        struct smbcli_tree *tree;
 
-       /* a receive helper, smbcli_transport_finish_recv will not call
-          req->async.fn callback handler unless the recv_helper returns
-          a value > SMBCLI_REQUEST_RECV. */
-       struct {
-               enum smbcli_request_state (*fn)(struct smbcli_request *);
-               void *private_data;
-       } recv_helper;
-
        /* the flags2 from the SMB request, in raw form (host byte
           order). Used to parse strings */
        uint16_t flags2;
@@ -246,27 +225,19 @@ struct smbcli_request {
        /* the NT status for this request. Set by packet receive code
           or code detecting error. */
        NTSTATUS status;
-       
-       /* the sequence number of this packet - used for signing */
-       uint_t seq_num;
-
-       /* list of ntcancel request for this requests */
-       struct smbcli_request *ntcancel;
-
-       /* set if this is a one-way request, meaning we are not
-          expecting a reply from the server. */
-       uint_t one_way_request:1;
 
-       /* set this when the request should only increment the signing
-          counter by one */
-       uint_t sign_single_increment:1;
+       /* the caller wants to do the signing check */
+       bool sign_caller_checks;
 
-       /* the mid of this packet - used to match replies */
-       uint16_t mid;
+       /* give the caller a chance to prevent the talloc_free() in the _recv() function */
+       bool do_not_free;
 
        struct smb_request_buffer in;
        struct smb_request_buffer out;
 
+       struct smb_trans2 trans2;
+       struct smb_nttrans nttrans;
+
        /* information on what to do with a reply when it is received
           asyncronously. If this is not setup when a reply is received then
           the reply is discarded
@@ -276,7 +247,7 @@ struct smbcli_request {
        */
        struct {
                void (*fn)(struct smbcli_request *);
-               void *private;
+               void *private_data;
        } async;
 };
 
@@ -293,8 +264,6 @@ struct smbcli_request {
       goto failed; \
 }
 
-#include "libcli/raw/interfaces.h" 
-
 NTSTATUS smb_raw_read_recv(struct smbcli_request *req, union smb_read *parms);
 struct smbcli_request *smb_raw_read_send(struct smbcli_tree *tree, union smb_read *parms);
 NTSTATUS smb_raw_trans_recv(struct smbcli_request *req,
@@ -304,6 +273,7 @@ size_t smb_raw_max_trans_data(struct smbcli_tree *tree, size_t param_size);
 struct smbcli_request *smb_raw_trans_send(struct smbcli_tree *tree, struct smb_trans2 *parms);
 NTSTATUS smbcli_request_destroy(struct smbcli_request *req);
 struct smbcli_request *smb_raw_write_send(struct smbcli_tree *tree, union smb_write *parms);
+NTSTATUS smb_raw_write_recv(struct smbcli_request *req, union smb_write *parms);
 struct smbcli_request *smb_raw_close_send(struct smbcli_tree *tree, union smb_close *parms);
 NTSTATUS smb_raw_open_recv(struct smbcli_request *req, TALLOC_CTX *mem_ctx, union smb_open *parms);
 struct smbcli_request *smb_raw_open_send(struct smbcli_tree *tree, union smb_open *parms);
@@ -311,6 +281,7 @@ struct smbcli_request *smb_raw_open_send(struct smbcli_tree *tree, union smb_ope
 bool smbcli_transport_process(struct smbcli_transport *transport);
 const char *smbcli_errstr(struct smbcli_tree *tree);
 NTSTATUS smb_raw_fsinfo(struct smbcli_tree *tree, TALLOC_CTX *mem_ctx, union smb_fsinfo *fsinfo);
+NTSTATUS smb_raw_setfsinfo(struct smbcli_tree *tree, TALLOC_CTX *mem_ctx, union smb_setfsinfo *set_fsinfo);
 NTSTATUS smb_raw_pathinfo(struct smbcli_tree *tree, TALLOC_CTX *mem_ctx, union smb_fileinfo *parms);
 NTSTATUS smb_raw_shadow_data(struct smbcli_tree *tree, TALLOC_CTX *mem_ctx, struct smb_shadow_copy *info);
 NTSTATUS smb_raw_fileinfo(struct smbcli_tree *tree, TALLOC_CTX *mem_ctx, union smb_fileinfo *parms);
@@ -318,11 +289,11 @@ struct smbcli_tree *smbcli_tree_init(struct smbcli_session *session, TALLOC_CTX
 NTSTATUS smb_raw_tcon(struct smbcli_tree *tree, TALLOC_CTX *mem_ctx, union smb_tcon *parms);
 void smbcli_oplock_handler(struct smbcli_transport *transport, 
                        bool (*handler)(struct smbcli_transport *, uint16_t, uint16_t, uint8_t, void *),
-                       void *private);
+                       void *private_data);
 void smbcli_transport_idle_handler(struct smbcli_transport *transport, 
                                   void (*idle_func)(struct smbcli_transport *, void *),
                                   uint64_t period,
-                                  void *private);
+                                  void *private_data);
 NTSTATUS smbcli_request_simple_recv(struct smbcli_request *req);
 bool smbcli_oplock_ack(struct smbcli_tree *tree, uint16_t fnum, uint16_t ack_level);
 NTSTATUS smb_raw_open(struct smbcli_tree *tree, TALLOC_CTX *mem_ctx, union smb_open *parms);
@@ -356,7 +327,7 @@ struct smbcli_request *smb_raw_echo_send(struct smbcli_transport *transport,
                                         struct smb_echo *p);
 NTSTATUS smb_raw_search_first(struct smbcli_tree *tree,
                              TALLOC_CTX *mem_ctx,
-                             union smb_search_first *io, void *private,
+                             union smb_search_first *io, void *private_data,
                              smbcli_search_callback callback);
 NTSTATUS smb_raw_flush(struct smbcli_tree *tree, union smb_flush *parms);
 
@@ -364,10 +335,4 @@ NTSTATUS smb_raw_trans(struct smbcli_tree *tree,
                       TALLOC_CTX *mem_ctx,
                       struct smb_trans2 *parms);
 
-struct smbcli_socket *smbcli_sock_connect_byname(const char *host, const char **ports,
-                                                TALLOC_CTX *mem_ctx,
-                                                struct resolve_context *resolve_ctx,
-                                                struct event_context *event_ctx);
-void smbcli_sock_dead(struct smbcli_socket *sock);
-
 #endif /* __LIBCLI_RAW__H__ */