#ifndef __LIBCLI_RAW_H__
#define __LIBCLI_RAW_H__
+#include "../libcli/smb/smb_common.h"
#include "libcli/raw/request.h"
#include "librpc/gen_ndr/nbt.h"
+#include "libcli/raw/interfaces.h"
struct smbcli_tree; /* forward declare */
struct smbcli_request; /* forward declare */
enum protocol_types protocol;
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;
-
- struct smb_signing_context sign_info;
/* capabilities that the server reported */
uint32_t capabilities;
int server_zone;
time_t server_time;
- uint_t readbraw_supported:1;
- uint_t writebraw_supported:1;
- char *server_domain;
+ unsigned int readbraw_supported:1;
+ unsigned int writebraw_supported:1;
+ unsigned int lockread_supported:1;
};
/* this is the context for a SMB socket associated with the socket itself */
client library
*/
struct smbcli_options {
- uint_t use_oplocks:1;
- uint_t use_level2_oplocks:1;
- uint_t use_spnego:1;
- uint_t unicode:1;
- uint_t ntstatus_support:1;
+ unsigned int use_oplocks:1;
+ unsigned int use_level2_oplocks:1;
+ unsigned int use_spnego:1;
+ unsigned int unicode:1;
+ unsigned int ntstatus_support:1;
+ int min_protocol;
int max_protocol;
uint32_t max_xmit;
uint16_t max_mux;
int request_timeout;
- enum smb_signing_state signing;
+ enum smb_signing_setting signing;
+ uint32_t smb2_capabilities;
+ struct GUID client_guid;
};
/* this is the context for the client transport layer */
struct smbcli_transport {
- /* socket level info */
- struct smbcli_socket *socket;
+ struct tevent_context *ev; /* TODO: remove this !!! */
+ struct smbXcli_conn *conn;
- /* the next mid to be allocated - needed for signing and
- request matching */
- uint16_t next_mid;
-
/* negotiated protocol information */
struct smbcli_negotiate negotiate;
/* options to control the behaviour of the client code */
struct smbcli_options options;
- /* is a readbraw pending? we need to handle that case
- specially on receiving packets */
- uint_t readbraw_pending:1;
-
/* an idle function - if this is defined then it will be
called once every period microseconds while we are waiting
for a packet */
struct {
void (*func)(struct smbcli_transport *, void *);
void *private_data;
- uint_t period;
+ unsigned int period;
+ struct tevent_timer *te;
} idle;
/* the error fields from the last message */
SOCKET_READ_ERROR,
SOCKET_WRITE_ERROR,
SOCKET_READ_BAD_SIG} socket_error;
- uint_t nbt_error;
+ unsigned int nbt_error;
} e;
} error;
/* private data passed to the oplock handler */
void *private_data;
} oplock;
-
- /* 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 nbt_name called;
-
- /* context of the stream -> packet parser */
- struct packet_context *packet;
-
- /* iconv convenience */
- struct smb_iconv_convenience *iconv_convenience;
+ struct tevent_req *break_subreq;
};
/* this is the context for the user */
/* after a session setup the server provides us with
a vuid identifying the security context */
+ struct smbXcli_session *smbXcli;
uint16_t vuid;
/* default pid for this session */
the user to control these for torture testing */
uint16_t flags2;
- DATA_BLOB user_session_key;
-
/* the spnego context if we use extented security */
struct gensec_security *gensec;
struct smbcli_session_options {
- uint_t lanman_auth:1;
- uint_t ntlmv2_auth:1;
- uint_t plaintext_auth:1;
+ unsigned int lanman_auth:1;
+ unsigned int ntlmv2_auth:1;
+ unsigned int plaintext_auth:1;
} options;
const char *os;
/* session layer info */
struct smbcli_session *session;
+ struct smbXcli_tcon *smbXcli;
uint16_t tid; /* tree id, aka cnum */
char *device;
char *fs_type;
* functions (similar to context.h, the server version).
* This will allow requests to be multi-threaded. */
struct smbcli_request {
- /* allow a request to be part of a list of requests */
- struct smbcli_request *next, *prev;
+ /* smbXcli_req */
+ struct tevent_req *subreqs[2];
/* each request is in one of 4 possible states */
enum smbcli_request_state state;
struct smbcli_session *session;
struct smbcli_tree *tree;
- /* a receive helper, smbcli_transport_finish_recv will not call
- req->async.fn callback handler unless the recv_helper returns
- a value > SMBCLI_REQUEST_RECV. */
- struct {
- enum smbcli_request_state (*fn)(struct smbcli_request *);
- void *private_data;
- } recv_helper;
-
/* the flags2 from the SMB request, in raw form (host byte
order). Used to parse strings */
uint16_t flags2;
/* the NT status for this request. Set by packet receive code
or code detecting error. */
NTSTATUS status;
-
- /* the sequence number of this packet - used for signing */
- uint_t seq_num;
-
- /* list of ntcancel request for this requests */
- struct smbcli_request *ntcancel;
-
- /* set if this is a one-way request, meaning we are not
- expecting a reply from the server. */
- 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 caller wants to do the signing check */
bool sign_caller_checks;
/* give the caller a chance to prevent the talloc_free() in the _recv() function */
bool do_not_free;
- /* the mid of this packet - used to match replies */
- uint16_t mid;
-
struct smb_request_buffer in;
struct smb_request_buffer out;
+ struct smb_trans2 trans2;
+ struct smb_nttrans nttrans;
+
/* information on what to do with a reply when it is received
asyncronously. If this is not setup when a reply is received then
the reply is discarded
goto failed; \
}
-#include "libcli/raw/interfaces.h"
-
NTSTATUS smb_raw_read_recv(struct smbcli_request *req, union smb_read *parms);
struct smbcli_request *smb_raw_read_send(struct smbcli_tree *tree, union smb_read *parms);
NTSTATUS smb_raw_trans_recv(struct smbcli_request *req,
struct smbcli_request *smb_raw_trans_send(struct smbcli_tree *tree, struct smb_trans2 *parms);
NTSTATUS smbcli_request_destroy(struct smbcli_request *req);
struct smbcli_request *smb_raw_write_send(struct smbcli_tree *tree, union smb_write *parms);
+NTSTATUS smb_raw_write_recv(struct smbcli_request *req, union smb_write *parms);
struct smbcli_request *smb_raw_close_send(struct smbcli_tree *tree, union smb_close *parms);
NTSTATUS smb_raw_open_recv(struct smbcli_request *req, TALLOC_CTX *mem_ctx, union smb_open *parms);
struct smbcli_request *smb_raw_open_send(struct smbcli_tree *tree, union smb_open *parms);
bool smbcli_transport_process(struct smbcli_transport *transport);
const char *smbcli_errstr(struct smbcli_tree *tree);
NTSTATUS smb_raw_fsinfo(struct smbcli_tree *tree, TALLOC_CTX *mem_ctx, union smb_fsinfo *fsinfo);
+NTSTATUS smb_raw_setfsinfo(struct smbcli_tree *tree, TALLOC_CTX *mem_ctx, union smb_setfsinfo *set_fsinfo);
NTSTATUS smb_raw_pathinfo(struct smbcli_tree *tree, TALLOC_CTX *mem_ctx, union smb_fileinfo *parms);
NTSTATUS smb_raw_shadow_data(struct smbcli_tree *tree, TALLOC_CTX *mem_ctx, struct smb_shadow_copy *info);
NTSTATUS smb_raw_fileinfo(struct smbcli_tree *tree, TALLOC_CTX *mem_ctx, union smb_fileinfo *parms);
TALLOC_CTX *mem_ctx,
struct smb_trans2 *parms);
-struct smbcli_socket *smbcli_sock_connect_byname(const char *host, const char **ports,
- TALLOC_CTX *mem_ctx,
- struct resolve_context *resolve_ctx,
- struct tevent_context *event_ctx,
- const char *socket_options);
-void smbcli_sock_dead(struct smbcli_socket *sock);
-
#endif /* __LIBCLI_RAW__H__ */