#ifndef _CLIENT_H
#define _CLIENT_H
+#include "../librpc/ndr/libndr.h"
+
/* the client asks for a smaller buffer to save ram and also to get more
overlap on the wire. This size gives us a nice read/write size, which
will be a multiple of the page size on almost any system */
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 */
- union {
- struct schannel_auth_struct *schannel_auth;
- NTLMSSP_STATE *ntlmssp_state;
- struct kerberos_auth_struct *kerberos_auth;
- } a_u;
- void (*cli_auth_data_free_func)(struct cli_pipe_auth_data *);
+/**
+ * rpc_cli_transport defines a transport mechanism to ship rpc requests
+ * asynchronously to a server and receive replies
+ */
+
+struct rpc_cli_transport {
+
+ enum dcerpc_transport_t 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);
+
+ bool (*is_connected)(void *priv);
+ unsigned int (*set_timeout)(void *priv, unsigned int timeout);
+
+ void *priv;
};
struct rpc_pipe_client {
struct rpc_pipe_client *prev, *next;
- struct cli_state *cli;
+ 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);
- const char *pipe_name;
- uint16 fnum;
+ struct tevent_req *(*dispatch_send)(
+ TALLOC_CTX *mem_ctx,
+ struct tevent_context *ev,
+ struct rpc_pipe_client *cli,
+ const struct ndr_interface_table *table,
+ uint32_t opnum,
+ void *r);
+ NTSTATUS (*dispatch_recv)(struct tevent_req *req,
+ TALLOC_CTX *mem_ctx);
- const struct ndr_syntax_id *abstract_syntax;
- const struct ndr_syntax_id *transfer_syntax;
char *desthost;
char *srv_name_slash;
- char *domain;
- char *user_name;
-
uint16 max_xmit_frag;
uint16 max_recv_frag;
- struct cli_pipe_auth_data *auth;
+ struct pipe_auth_data *auth;
+
+ /* The following is only non-null on a netlogon client pipe. */
+ struct netlogon_creds_CredentialState *dc;
- /* 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. */
uint16 enc_ctx_num;
bool enc_on;
union {
- NTLMSSP_STATE *ntlmssp_state;
+ struct 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. */
fstring desthost;
/* The credentials used to open the cli_state connection. */
- fstring domain;
- fstring user_name;
- struct pwd_info pwd;
+ char *domain;
+ char *user_name;
+ char *password; /* Can be null to force use of zero NTLMSSP session key. */
/*
* The following strings are the
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;
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 *call_mem_ctx;
#endif
- smb_sign_info sign_info;
+ 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);
+ NTSTATUS (*oplock_handler)(struct cli_state *cli, uint16_t fnum, unsigned char level);
bool force_dos_errors;
bool case_sensitive; /* False by default. */
- struct event_context *event_ctx;
- struct fd_event *fd_event;
- char *evt_inbuf;
-
- struct cli_request *outstanding_requests;
-};
-
-struct cli_request {
- struct cli_request *prev, *next;
- struct async_req *async;
-
- struct cli_state *cli;
-
- struct smb_trans_enc_state *enc_state;
-
- uint16_t mid;
-
- char *outbuf;
- size_t sent;
- char *inbuf;
+ /* Where (if anywhere) this is mounted under DFS. */
+ char *dfs_mountpoint;
- union {
- struct {
- off_t ofs;
- size_t size;
- ssize_t received;
- uint8_t *rcvbuf;
- } read;
- } data;
+ struct tevent_queue *outgoing;
+ struct tevent_req **pending;
};
typedef struct file_info {
struct cli_state *cli;
- SMB_BIG_UINT size;
+ uint64_t size;
uint16 mode;
uid_t uid;
gid_t gid;
#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 */