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;
* 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;
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. */
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;
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 */