subreq, struct tevent_req);
struct cli_connect_nb_state *state = tevent_req_data(
req, struct cli_connect_nb_state);
+ struct smb_transport tp = { .type = SMB_TRANSPORT_TYPE_UNKNOWN, };
+ struct smbXcli_transport *xtp = NULL;
NTSTATUS status;
int fd = 0;
- uint16_t port;
- status = cli_connect_sock_recv(subreq, &fd, &port);
+ status = cli_connect_sock_recv(subreq, &fd, &tp.port);
TALLOC_FREE(subreq);
if (tevent_req_nterror(req, status)) {
return;
}
- state->cli = cli_state_create(state, fd, state->desthost,
+ xtp = smbXcli_transport_bsd(state, fd, &tp);
+ if (tevent_req_nomem(xtp, req)) {
+ close(fd);
+ return;
+ }
+
+ state->cli = cli_state_create(state, &xtp, state->desthost,
state->signing_state, state->flags);
if (tevent_req_nomem(state->cli, req)) {
- close(fd);
return;
}
tevent_req_done(req);
struct GUID cli_state_client_guid;
struct cli_state *cli_state_create(TALLOC_CTX *mem_ctx,
- int fd,
+ struct smbXcli_transport **ptransport,
const char *remote_name,
enum smb_signing_setting signing_state,
int flags)
{
- struct smb_transport tp = { .type = SMB_TRANSPORT_TYPE_UNKNOWN, };
- struct smbXcli_transport *transport = NULL;
struct cli_state *cli = NULL;
bool use_spnego = lp_client_use_spnego();
bool force_dos_errors = false;
smb2_capabilities = SMB2_CAP_ALL;
- transport = smbXcli_transport_bsd(cli, fd, &tp);
- if (transport == NULL) {
- goto error;
- }
-
cli->conn = smbXcli_conn_create(cli,
- &transport,
+ ptransport,
remote_name,
signing_state,
smb1_capabilities,
unsigned int cli_set_timeout(struct cli_state *cli, unsigned int timeout);
bool cli_set_backup_intent(struct cli_state *cli, bool flag);
extern struct GUID cli_state_client_guid;
+struct smbXcli_transport;
struct cli_state *cli_state_create(TALLOC_CTX *mem_ctx,
- int fd,
+ struct smbXcli_transport **ptransport,
const char *remote_name,
enum smb_signing_setting signing_state,
int flags);
const char *machine_domain = NULL;
int flags = 0;
struct cli_credentials *creds = NULL;
+ struct smb_transport tp = { .type = SMB_TRANSPORT_TYPE_UNKNOWN, };
+ struct smbXcli_transport *xtp = NULL;
struct named_mutex *mutex;
/*
* cm_prepare_connection() is responsible that sockfd does not leak.
- * Once cli_state_create() returns with success, the
- * smbXcli_conn_destructor() makes sure that close(sockfd) is finally
+ * Once smbXcli_transport_bsd() returns with success, the
+ * smbXcli_transport_destructor() makes sure that close(sockfd) is finally
* called. Till that, close(sockfd) must be called on every unsuccessful
* return.
*/
- *cli = cli_state_create(NULL, sockfd, controller,
+ set_socket_options(sockfd, lp_socket_options());
+ xtp = smbXcli_transport_bsd(NULL, sockfd, &tp);
+ if (xtp == NULL) {
+ close(sockfd);
+ DEBUG(1, ("Could not cli_initialize\n"));
+ result = NT_STATUS_NO_MEMORY;
+ goto done;
+ }
+
+ *cli = cli_state_create(NULL, &xtp, controller,
smb_sign_client_connections, flags);
if (*cli == NULL) {
- close(sockfd);
+ TALLOC_FREE(xtp);
DEBUG(1, ("Could not cli_initialize\n"));
result = NT_STATUS_NO_MEMORY;
goto done;
cli_set_timeout(*cli, 10000); /* 10 seconds */
- set_socket_options(sockfd, lp_socket_options());
-
result = smbXcli_negprot((*cli)->conn,
(*cli)->timeout,
lp_client_ipc_min_protocol(),