r1654: rename cli_ -> smbcli_
[amitay/samba.git] / source4 / include / cli_context.h
index b94d83ffa1db12ca3e58c3a96d43f782df71db5a..1f179ff45280282e69478b1297f606e13a649621 100644 (file)
    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 */
 
-#ifndef _CLI_CONTEXT_H
-#define _CLI_CONTEXT_H
+#ifndef _SMBCLI_CONTEXT_H
+#define _SMBCLI_CONTEXT_H
 
-struct cli_tree;  /* forward declare */
-struct cli_request;  /* forward declare */
-struct cli_session;  /* forward declare */
-struct cli_transport;  /* forward declare */
-
-typedef struct smb_sign_info {
-       void (*sign_outgoing_message)(struct cli_request *req);
-       BOOL (*check_incoming_message)(struct cli_request *req);
-       void (*free_signing_context)(struct cli_transport *transport);
-       void *signing_context;
-
-       BOOL doing_signing;
-} smb_sign_info;
+struct smbcli_tree;  /* forward declare */
+struct smbcli_request;  /* forward declare */
+struct smbcli_session;  /* forward declare */
+struct smbcli_transport;  /* forward declare */
 
 /* context that will be and has been negotiated between the client and server */
-struct cli_negotiate {
+struct smbcli_negotiate {
        /* 
         * negotiated maximum transmit size - this is given to us by the server
         */
-       unsigned max_xmit;
+       uint32_t max_xmit;
 
        /* maximum number of requests that can be multiplexed */
        uint16_t max_mux;
@@ -51,31 +42,45 @@ struct cli_negotiate {
        /* the negotiatiated protocol */
        enum protocol_types protocol;
 
-       int sec_mode;           /* security mode returned by negprot */
+       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;
        
-       smb_sign_info sign_info;
+       struct {
+               void (*sign_outgoing_message)(struct smbcli_request *req);
+               BOOL (*check_incoming_message)(struct smbcli_request *req);
+               void (*free_signing_context)(struct smbcli_transport *transport);
+               void *signing_context;
+               BOOL negotiated_smb_signing;
+               BOOL allow_smb_signing;
+               BOOL doing_signing;
+               BOOL mandatory_signing;
+               BOOL seen_valid; /* Have I ever seen a validly signed packet? */
+       } sign_info;
 
        /* capabilities that the server reported */
        uint32_t capabilities;
        
        int server_zone;
        time_t server_time;
-       unsigned int readbraw_supported:1;
-       unsigned int writebraw_supported:1;
+       uint_t readbraw_supported:1;
+       uint_t writebraw_supported:1;
 
        const char *server_domain;
 };
        
 /* this is the context for a SMB socket associated with the socket itself */
-struct cli_socket {
+struct smbcli_socket {
        TALLOC_CTX *mem_ctx;    /* life of socket pool */
 
        /* when the reference count reaches zero then the socket is destroyed */
        int reference_count;
 
        struct in_addr dest_ip;
+       /* dest hostname (which may or may not be a DNS name) */
+       char *hostname;
 
        /* the port used */
        int port;
@@ -85,7 +90,7 @@ struct cli_socket {
 
        /* a count of the number of packets we have received. We
         * actually only care about zero/non-zero at this stage */
-       unsigned pkt_count;
+       uint_t pkt_count;
 
        /* the network address of the client */
        char *client_addr;
@@ -98,41 +103,41 @@ struct cli_socket {
   this structure allows applications to control the behaviour of the
   client library
 */
-struct cli_options {
-       unsigned int use_oplocks:1;
-       unsigned int use_level2_oplocks:1;
-       unsigned int use_spnego:1;
+struct smbcli_options {
+       uint_t use_oplocks:1;
+       uint_t use_level2_oplocks:1;
+       uint_t use_spnego:1;
 };
 
 /* this is the context for the client transport layer */
-struct cli_transport {
+struct smbcli_transport {
        TALLOC_CTX *mem_ctx;
 
        /* when the reference count reaches zero then the transport is destroyed */
        int reference_count;
 
        /* socket level info */
-       struct cli_socket *socket;
+       struct smbcli_socket *socket;
 
        /* the next mid to be allocated - needed for signing and
           request matching */
        uint16_t next_mid;
        
        /* negotiated protocol information */
-       struct cli_negotiate negotiate;
+       struct smbcli_negotiate negotiate;
 
        /* options to control the behaviour of the client code */
-       struct cli_options options;
+       struct smbcli_options options;
 
        /* is a readbraw pending? we need to handle that case
           specially on receiving packets */
-       unsigned int readbraw_pending:1;
+       uint_t readbraw_pending:1;
        
        /* an idle function - if this is defined then it will be
-          called once every period milliseconds while we are waiting
+          called once every period seconds while we are waiting
           for a packet */
        struct {
-               void (*func)(struct cli_transport *, void *);
+               void (*func)(struct smbcli_transport *, void *);
                void *private;
                uint_t period;
        } idle;
@@ -142,42 +147,64 @@ struct cli_transport {
                enum {ETYPE_NONE, ETYPE_DOS, ETYPE_NT, ETYPE_SOCKET, ETYPE_NBT} etype;
                union {
                        struct {
-                               uint8 eclass;
+                               uint8_t eclass;
                                uint16_t ecode;
                        } dos;
                        NTSTATUS nt_status;
-                       enum socket_error socket_error;
-                       unsigned nbt_error;
+                       enum {SOCKET_READ_TIMEOUT,
+                             SOCKET_READ_EOF,
+                             SOCKET_READ_ERROR,
+                             SOCKET_WRITE_ERROR,
+                             SOCKET_READ_BAD_SIG} socket_error;
+                       uint_t nbt_error;
                } e;
        } error;
 
        struct {
                /* a oplock break request handler */
-               BOOL (*handler)(struct cli_transport *transport, 
-                               uint16_t tid, uint16_t fnum, uint8 level, void *private);
+               BOOL (*handler)(struct smbcli_transport *transport, 
+                               uint16_t tid, uint16_t fnum, uint8_t level, void *private);
                /* private data passed to the oplock handler */
                void *private;
        } oplock;
 
-       /* a list of async requests that are pending on this connection */
-       struct cli_request *pending_requests;
+       /* a list of async requests that are pending for send on this connection */
+       struct smbcli_request *pending_send;
+
+       /* 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 nmb_name called;
+
+       /* a buffer for partially received SMB packets. */
+       struct {
+               uint8_t header[NBT_HDR_SIZE];
+               size_t req_size;
+               size_t received;
+               uint8_t *buffer;
+       } recv_buffer;
+
+       /* the event handle for waiting for socket IO */
+       struct {
+               struct event_context *ctx;
+               struct fd_event *fde;
+               struct timed_event *te;
+       } event;
 };
 
 /* this is the context for the user */
 
 /* this is the context for the session layer */
-struct cli_session {   
+struct smbcli_session {        
        TALLOC_CTX *mem_ctx;    /* life of session */
 
        /* when the reference count reaches zero then the session is destroyed */
        int reference_count;    
        
        /* transport layer info */
-       struct cli_transport *transport;
+       struct smbcli_transport *transport;
        
        /* after a session setup the server provides us with
           a vuid identifying the security context */
@@ -187,12 +214,15 @@ struct cli_session {
        uint32_t pid;
 
        DATA_BLOB user_session_key;
+
+       /* the spnego context if we use extented security */
+       struct gensec_security *gensec;
 };
 
 /* 
-   cli_tree context: internal state for a tree connection. 
+   smbcli_tree context: internal state for a tree connection. 
  */
-struct cli_tree {
+struct smbcli_tree {
        /* life of tree tree */
        TALLOC_CTX *mem_ctx;
 
@@ -200,28 +230,41 @@ struct cli_tree {
        int reference_count;    
 
        /* session layer info */
-       struct cli_session *session;
+       struct smbcli_session *session;
 
        uint16_t tid;                   /* tree id, aka cnum */
        char *device;
        char *fs_type;
 };
 
+
+/*
+  a client request moves between the following 4 states.
+*/
+enum smbcli_request_state {SMBCLI_REQUEST_INIT, /* we are creating the request */
+                       SMBCLI_REQUEST_SEND, /* the request is in the outgoing socket Q */
+                       SMBCLI_REQUEST_RECV, /* we are waiting for a matching reply */
+                       SMBCLI_REQUEST_DONE, /* the request is finished */
+                       SMBCLI_REQUEST_ERROR}; /* a packet or transport level error has occurred */
+
 /* the context for a single SMB request. This is passed to any request-context 
  * functions (similar to context.h, the server version).
  * This will allow requests to be multi-threaded. */
-struct cli_request {
+struct smbcli_request {
        /* allow a request to be part of a list of requests */
-       struct cli_request *next, *prev;
+       struct smbcli_request *next, *prev;
 
        /* a talloc context for the lifetime of this request */
        TALLOC_CTX *mem_ctx;
        
+       /* each request is in one of 4 possible states */
+       enum smbcli_request_state state;
+       
        /* a request always has a transport context, nearly always has
           a session context and usually has a tree context */
-       struct cli_transport *transport;
-       struct cli_session *session;
-       struct cli_tree *tree;
+       struct smbcli_transport *transport;
+       struct smbcli_session *session;
+       struct smbcli_tree *tree;
 
        /* the flags2 from the SMB request, in raw form (host byte
           order). Used to parse strings */
@@ -232,46 +275,21 @@ struct cli_request {
        NTSTATUS status;
        
        /* the sequence number of this packet - used for signing */
-       unsigned seq_num;
+       uint_t seq_num;
 
        /* set if this is a one-way request, meaning we are not
           expecting a reply from the server. */
-       unsigned int one_way_request:1;
+       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 mid of this packet - used to match replies */
        uint16_t mid;
 
-       struct {
-               /* the raw SMB buffer, including the 4 byte length header */
-               char *buffer;
-               
-               /* the size of the raw buffer, including 4 byte header */
-               unsigned size;
-
-               /* how much has been allocated - on reply the buffer is over-allocated to 
-                  prevent too many realloc() calls 
-               */
-               unsigned allocated;
-
-               /* the start of the SMB header - this is always buffer+4 */
-               char *hdr;
-
-               /* the command words and command word count. vwv points
-                  into the raw buffer */
-               char *vwv;
-               unsigned wct;
-
-               /* the data buffer and size. data points into the raw buffer */
-               char *data;
-               unsigned data_size;
-
-               /* ptr is used as a moving pointer into the data area
-                * of the packet. The reason its here and not a local
-                * variable in each function is that when a realloc of
-                * a send packet is done we need to move this
-                * pointer */
-               char *ptr;
-       } in, out;
+       struct request_buffer in;
+       struct request_buffer out;
 
        /* information on what to do with a reply when it is received
           asyncronously. If this is not setup when a reply is received then
@@ -281,34 +299,34 @@ struct cli_request {
           library (the application), not private to the library
        */
        struct {
-               void (*fn)(struct cli_request *);
+               void (*fn)(struct smbcli_request *);
                void *private;
        } async;
 };
 
 /* 
-   cli_state: internal state used in libcli library for single-threaded callers, 
+   smbcli_state: internal state used in libcli library for single-threaded callers, 
    i.e. a single session on a single socket. 
  */
-struct cli_state {
+struct smbcli_state {
        TALLOC_CTX *mem_ctx;    /* life of client pool */
-       struct cli_transport *transport;
-       struct cli_session *session;
-       struct cli_tree *tree;
+       struct smbcli_transport *transport;
+       struct smbcli_session *session;
+       struct smbcli_tree *tree;
        struct substitute_context substitute;
 };
 
 /* useful way of catching wct errors with file and line number */
-#define CLI_CHECK_MIN_WCT(req, wcount) if ((req)->in.wct < (wcount)) { \
+#define SMBCLI_CHECK_MIN_WCT(req, wcount) if ((req)->in.wct < (wcount)) { \
       DEBUG(1,("Unexpected WCT %d at %s(%d) - expected min %d\n", (req)->in.wct, __FILE__, __LINE__, wcount)); \
       req->status = NT_STATUS_INVALID_PARAMETER; \
       goto failed; \
 }
 
-#define CLI_CHECK_WCT(req, wcount) if ((req)->in.wct != (wcount)) { \
+#define SMBCLI_CHECK_WCT(req, wcount) if ((req)->in.wct != (wcount)) { \
       DEBUG(1,("Unexpected WCT %d at %s(%d) - expected %d\n", (req)->in.wct, __FILE__, __LINE__, wcount)); \
       req->status = NT_STATUS_INVALID_PARAMETER; \
       goto failed; \
 }
 
-#endif /* _CLI_CONTEXT_H */
+#endif /* _SMBCLI_CONTEXT_H */