s3:libsmb: abstract the incoming dispatch function via a function pointer
[idra/samba.git] / source3 / include / client.h
index c10d2109d8d86bdc37f480bd92fa84822160dd28..79ce709069c5c5bbe8cfbe3891c4a5fd94172129 100644 (file)
@@ -46,152 +46,15 @@ struct print_job_info {
        time_t t;
 };
 
-struct cli_pipe_auth_data {
-       enum pipe_auth_type auth_type; /* switch for the union below. Defined in ntdomain.h */
-       enum pipe_auth_level auth_level; /* defined in ntdomain.h */
-
-       char *domain;
-       char *user_name;
-       DATA_BLOB user_session_key;
-
-       union {
-               struct schannel_auth_struct *schannel_auth;
-               NTLMSSP_STATE *ntlmssp_state;
-               struct kerberos_auth_struct *kerberos_auth;
-       } a_u;
-};
-
-/**
- * rpc_cli_transport defines a transport mechanism to ship rpc requests
- * asynchronously to a server and receive replies
- */
-
-struct rpc_cli_transport {
-
-       /**
-        * Trigger an async read from the server. May return a short read.
-        */
-       struct tevent_req *(*read_send)(TALLOC_CTX *mem_ctx,
-                                       struct event_context *ev,
-                                       uint8_t *data, size_t size,
-                                       void *priv);
-       /**
-        * Get the result from the read_send operation.
-        */
-       NTSTATUS (*read_recv)(struct tevent_req *req, ssize_t *preceived);
-
-       /**
-        * Trigger an async write to the server. May return a short write.
-        */
-       struct tevent_req *(*write_send)(TALLOC_CTX *mem_ctx,
-                                        struct event_context *ev,
-                                        const uint8_t *data, size_t size,
-                                        void *priv);
-       /**
-        * Get the result from the read_send operation.
-        */
-       NTSTATUS (*write_recv)(struct tevent_req *req, ssize_t *psent);
-
-       /**
-        * This is an optimization for the SMB transport. It models the
-        * TransactNamedPipe API call: Send and receive data in one round
-        * trip. The transport implementation is free to set this to NULL,
-        * cli_pipe.c will fall back to the explicit write/read routines.
-        */
-       struct tevent_req *(*trans_send)(TALLOC_CTX *mem_ctx,
-                                        struct event_context *ev,
-                                        uint8_t *data, size_t data_len,
-                                        uint32_t max_rdata_len,
-                                        void *priv);
-       /**
-        * Get the result from the trans_send operation.
-        */
-       NTSTATUS (*trans_recv)(struct tevent_req *req, TALLOC_CTX *mem_ctx,
-                              uint8_t **prdata, uint32_t *prdata_len);
-       void *priv;
-};
-
-struct rpc_pipe_client {
-       struct rpc_pipe_client *prev, *next;
-
-       struct rpc_cli_transport *transport;
-
-       struct ndr_syntax_id abstract_syntax;
-       struct ndr_syntax_id transfer_syntax;
-
-       NTSTATUS (*dispatch) (struct rpc_pipe_client *cli,
-                       TALLOC_CTX *mem_ctx,
-                       const struct ndr_interface_table *table,
-                       uint32_t opnum, void *r);
-
-       char *desthost;
-       char *srv_name_slash;
-
-       uint16 max_xmit_frag;
-       uint16 max_recv_frag;
-
-       struct cli_pipe_auth_data *auth;
-
-       /* The following is only non-null on a netlogon pipe. */
-       struct dcinfo *dc;
-
-       /* Used by internal rpc_pipe_client */
-       pipes_struct *pipes_struct;
-};
-
-/* Transport encryption state. */
-enum smb_trans_enc_type {
-               SMB_TRANS_ENC_NTLM
-#if defined(HAVE_GSSAPI) && defined(HAVE_KRB5)
-               , SMB_TRANS_ENC_GSS
-#endif
-};
-
-#if defined(HAVE_GSSAPI) && defined(HAVE_KRB5)
-struct smb_tran_enc_state_gss {
-        gss_ctx_id_t gss_ctx;
-        gss_cred_id_t creds;
-};
-#endif
-
-struct smb_trans_enc_state {
-        enum smb_trans_enc_type smb_enc_type;
-        uint16 enc_ctx_num;
-        bool enc_on;
-        union {
-                NTLMSSP_STATE *ntlmssp_state;
-#if defined(HAVE_GSSAPI) && defined(HAVE_KRB5)
-                struct smb_tran_enc_state_gss *gss_state;
-#endif
-        } s;
-};
-
-struct cli_state_seqnum {
-       struct cli_state_seqnum *prev, *next;
-       uint16_t mid;
-       uint32_t seqnum;
-       bool persistent;
-};
-
 struct cli_state {
        /**
         * A list of subsidiary connections for DFS.
         */
         struct cli_state *prev, *next;
-       int port;
-       int fd;
-       /* Last read or write error. */
-       enum smb_read_errors smb_rw_error;
-       uint16 cnum;
-       uint16 pid;
-       uint16 mid;
-       uint16 vuid;
-       int protocol;
+       enum protocol_types protocol;
        int sec_mode;
        int rap_error;
-       int privileges;
-
-       fstring desthost;
+       NTSTATUS raw_status; /* maybe via NT_STATUS_DOS() */
 
        /* The credentials used to open the cli_state connection. */
        char *domain;
@@ -203,16 +66,12 @@ struct cli_state {
         * ones returned by the server if
         * the protocol > NT1.
         */
-       fstring server_type;
-       fstring server_os;
-       fstring server_domain;
+       char *server_type;
+       char *server_os;
+       char *server_domain;
 
-       fstring share;
-       fstring dev;
-       struct nmb_name called;
-       struct nmb_name calling;
-       fstring full_dest_host_name;
-       struct sockaddr_storage dest_ss;
+       char *share;
+       char *dev;
 
        DATA_BLOB secblob; /* cryptkey or negTokenInit */
        uint32 sesskey;
@@ -223,22 +82,17 @@ struct cli_state {
        int timeout; /* in milliseconds. */
        size_t max_xmit;
        size_t max_mux;
-       char *outbuf;
-       struct cli_state_seqnum *seqnum;
-       char *inbuf;
-       unsigned int bufsize;
        int initialised;
        int win95;
        bool is_samba;
+       bool is_guestlogin;
        uint32 capabilities;
-       uint32 posix_capabilities;
+       /* What the server offered. */
+       uint32_t server_posix_capabilities;
+       /* What the client requested. */
+       uint32_t requested_posix_capabilities;
        bool dfsroot;
 
-#if 0
-       TALLOC_CTX *longterm_mem_ctx;
-       TALLOC_CTX *call_mem_ctx;
-#endif
-
        struct smb_signing_state *signing_state;
 
        struct smb_trans_enc_state *trans_enc_state; /* Setup if we're encrypting SMB's. */
@@ -253,51 +107,73 @@ struct cli_state {
        bool use_kerberos;
        bool fallback_after_kerberos;
        bool use_spnego;
+       bool use_ccache;
        bool got_kerberos_mechanism; /* Server supports krb5 in SPNEGO. */
 
        bool use_oplocks; /* should we use oplocks? */
        bool use_level_II_oplocks; /* should we use level II oplocks? */
 
-       /* a oplock break request handler */
-       bool (*oplock_handler)(struct cli_state *cli, int fnum, unsigned char level);
-
        bool force_dos_errors;
        bool case_sensitive; /* False by default. */
 
-       /**
-        * fd_event is around while we have async requests outstanding or are
-        * building a chained request.
-        *
-        * (fd_event!=NULL) &&
-        *  ((outstanding_request!=NULL)||(chain_accumulator!=NULL))
-        *
-        * should always be true, as well as the reverse: If both cli_request
-        * pointers are NULL, no fd_event is around.
-        */
-       struct fd_event *fd_event;
-       char *evt_inbuf;
-
-       /**
-        * A linked list of requests that are waiting for a reply
-        */
-       struct cli_request *outstanding_requests;
-
-       /**
-        * The place to build up the list of chained requests. In CIFS, a
-        * single cli_request corresponds to a MID and can serve more than one
-        * chained async_req.
-        */
-       struct cli_request *chain_accumulator;
-
        /* Where (if anywhere) this is mounted under DFS. */
        char *dfs_mountpoint;
 
-       struct tevent_queue *outgoing;
-       struct tevent_req **pending;
+       struct {
+               int fd;
+               struct sockaddr_storage local_ss;
+               struct sockaddr_storage remote_ss;
+               const char *remote_name;
+               const char *remote_realm;
+               struct tevent_req *read_smb_req;
+               struct tevent_queue *outgoing;
+               struct tevent_req **pending;
+               /*
+                * The incoming dispatch function should return:
+                * - NT_STATUS_RETRY, if more incoming PDUs are expected.
+                * - NT_STATUS_OK, if no more processing is desired, e.g.
+                *                 the dispatch function called
+                *                 tevent_req_done().
+                * - All other return values disconnect the connection.
+                */
+               NTSTATUS (*dispatch_incoming)(struct cli_state *cli,
+                                             TALLOC_CTX *frame,
+                                             uint8_t *inbuf);
+       } conn;
+
+       struct {
+               uint16_t mid;
+               uint16_t pid;
+               uint16_t vc_num;
+               uint16_t tid;
+               uint16_t uid;
+       } smb1;
+
+       struct {
+               uint64_t mid;
+               uint32_t pid;
+               uint32_t tid;
+               uint64_t uid;
+
+               /* SMB2 negprot */
+               uint16_t security_mode;
+               uint16_t dialect_revision;
+               struct GUID server_guid;
+               uint16_t server_capabilities;
+               uint32_t max_transact_size;
+               uint32_t max_read_size;
+               uint32_t max_write_size;
+               struct timespec system_time;
+               struct timespec server_start_time;
+
+               /* SMB2 tcon */
+               uint8_t share_type;
+               uint32_t share_flags;
+               uint32_t maximal_access;
+       } smb2;
 };
 
-typedef struct file_info {
-       struct cli_state *cli;
+struct file_info {
        uint64_t size;
        uint16 mode;
        uid_t uid;
@@ -307,12 +183,15 @@ typedef struct file_info {
        struct timespec atime_ts;
        struct timespec ctime_ts;
        char *name;
-       char short_name[13*3]; /* the *3 is to cope with multi-byte */
-} file_info;
+       char *short_name;
+};
 
 #define CLI_FULL_CONNECTION_DONT_SPNEGO 0x0001
 #define CLI_FULL_CONNECTION_USE_KERBEROS 0x0002
 #define CLI_FULL_CONNECTION_ANONYMOUS_FALLBACK 0x0004
 #define CLI_FULL_CONNECTION_FALLBACK_AFTER_KERBEROS 0x0008
+#define CLI_FULL_CONNECTION_OPLOCKS 0x0010
+#define CLI_FULL_CONNECTION_LEVEL_II_OPLOCKS 0x0020
+#define CLI_FULL_CONNECTION_USE_CCACHE 0x0040
 
 #endif /* _CLIENT_H */