This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
+ the Free Software Foundation; either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef _CLIENT_H
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 */
#define CLI_BUFFER_SIZE (0xFFFF)
-
+#define CLI_SAMBA_MAX_LARGE_READX_SIZE (127*1024) /* Works for Samba servers */
+#define CLI_SAMBA_MAX_LARGE_WRITEX_SIZE (127*1024) /* Works for Samba servers */
+#define CLI_WINDOWS_MAX_LARGE_READX_SIZE ((64*1024)-2) /* Windows servers are broken.... */
+#define CLI_WINDOWS_MAX_LARGE_WRITEX_SIZE ((64*1024)-2) /* Windows servers are broken.... */
+#define CLI_SAMBA_MAX_POSIX_LARGE_READX_SIZE (0xFFFF00) /* 24-bit len. */
+#define CLI_SAMBA_MAX_POSIX_LARGE_WRITEX_SIZE (0xFFFF00) /* 24-bit len. */
/*
* These definitions depend on smb.h
*/
-typedef struct file_info
-{
- SMB_OFF_T size;
- uint16 mode;
- uid_t uid;
- gid_t gid;
- /* these times are normally kept in GMT */
- time_t mtime;
- time_t atime;
- time_t ctime;
- pstring name;
- char short_name[13*3]; /* the *3 is to cope with multi-byte */
-} file_info;
-
-struct print_job_info
-{
+struct print_job_info {
uint16 id;
uint16 priority;
size_t size;
time_t t;
};
-typedef struct smb_sign_info {
- BOOL use_smb_signing;
- BOOL negotiated_smb_signing;
- size_t mac_key_len;
- uint8 mac_key[44];
- uint32 send_seq_num;
- uint32 reply_seq_num;
-} smb_sign_info;
+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 *);
+};
+
+struct rpc_pipe_client {
+ struct rpc_pipe_client *prev, *next;
+
+ struct cli_state *cli;
+
+ const char *pipe_name;
+ uint16 fnum;
+
+ 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;
+ struct pwd_info pwd;
+
+ 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;
+};
+
+/* 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 {
int port;
int fd;
+ /* Last read or write error. */
+ enum smb_read_errors smb_rw_error;
uint16 cnum;
uint16 pid;
uint16 mid;
int privileges;
fstring desthost;
- fstring user_name;
+
+ /* The credentials used to open the cli_state connection. */
fstring domain;
+ fstring user_name;
+ struct pwd_info pwd;
/*
* The following strings are the
struct nmb_name called;
struct nmb_name calling;
fstring full_dest_host_name;
- struct in_addr dest_ip;
+ struct sockaddr_storage dest_ss;
- struct pwd_info pwd;
DATA_BLOB secblob; /* cryptkey or negTokenInit */
uint32 sesskey;
int serverzone;
int readbraw_supported;
int writebraw_supported;
int timeout; /* in milliseconds. */
- int max_xmit;
- int max_mux;
+ size_t max_xmit;
+ size_t max_mux;
char *outbuf;
char *inbuf;
- int bufsize;
+ unsigned int bufsize;
int initialised;
int win95;
+ bool is_samba;
uint32 capabilities;
+ uint32 posix_capabilities;
+ bool dfsroot;
- TALLOC_CTX *mem_ctx;
+#if 0
+ TALLOC_CTX *longterm_mem_ctx;
+ TALLOC_CTX *call_mem_ctx;
+#endif
smb_sign_info sign_info;
- /*
- * Only used in NT domain calls.
- */
+ struct smb_trans_enc_state *trans_enc_state; /* Setup if we're encrypting SMB's. */
- uint16 nt_pipe_fnum; /* Pipe handle. */
- unsigned char sess_key[16]; /* Current session key. */
- unsigned char ntlmssp_hash[258]; /* ntlmssp data. */
- uint32 ntlmssp_cli_flgs; /* ntlmssp client flags */
- uint32 ntlmssp_srv_flgs; /* ntlmssp server flags */
- uint32 ntlmssp_seq_num; /* ntlmssp sequence number */
- DOM_CRED clnt_cred; /* Client credential. */
- fstring mach_acct; /* MYNAME$. */
- fstring srv_name_slash; /* \\remote server. */
- fstring clnt_name_slash; /* \\local client. */
- uint16 max_xmit_frag;
- uint16 max_recv_frag;
- uint32 ntlmssp_flags;
- BOOL use_kerberos;
- BOOL use_spnego;
+ /* the session key for this CLI, outside
+ any per-pipe authenticaion */
+ DATA_BLOB user_session_key;
+
+ /* The list of pipes currently open on this connection. */
+ struct rpc_pipe_client *pipe_list;
+
+ bool use_kerberos;
+ bool fallback_after_kerberos;
+ bool use_spnego;
- BOOL use_oplocks; /* should we use oplocks? */
- BOOL use_level_II_oplocks; /* should we use level II oplocks? */
+ 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 (*oplock_handler)(struct cli_state *cli, int fnum, unsigned char level);
- BOOL force_dos_errors;
+ bool force_dos_errors;
+ bool case_sensitive; /* False by default. */
- /* was this structure allocated by cli_initialise? If so, then
- free in cli_shutdown() */
- BOOL allocated;
+ struct event_context *event_ctx;
+ struct fd_event *fd_event;
+ char *evt_inbuf;
- /* Name of the pipe we're talking to, if any */
- fstring pipe_name;
+ 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;
+
+ union {
+ struct {
+ off_t ofs;
+ size_t size;
+ ssize_t received;
+ uint8_t *rcvbuf;
+ } read;
+ } data;
+};
+
+typedef struct file_info {
+ struct cli_state *cli;
+ SMB_BIG_UINT size;
+ uint16 mode;
+ uid_t uid;
+ gid_t gid;
+ /* these times are normally kept in GMT */
+ struct timespec mtime_ts;
+ 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;
+
#define CLI_FULL_CONNECTION_DONT_SPNEGO 0x0001
#define CLI_FULL_CONNECTION_USE_KERBEROS 0x0002
-#define CLI_FULL_CONNECTION_ANNONYMOUS_FALLBACK 0x0004
+#define CLI_FULL_CONNECTION_ANONYMOUS_FALLBACK 0x0004
+#define CLI_FULL_CONNECTION_FALLBACK_AFTER_KERBEROS 0x0008
#endif /* _CLIENT_H */