#include "client.h"
#include "async_smb.h"
#include "../libcli/smb/read_smb.h"
+#include "../libcli/smb/smb_transport.h"
#include "libsmb/nmblib.h"
struct cli_session_request_state {
uint8_t calling_type;
struct tevent_req *req_139;
struct tevent_req *req_445;
+ struct tevent_req *req_5445;
+ struct smb_transport *smb_direct;
int sock;
uint16_t port;
};
enum tevent_req_state req_state);
static void smbsock_connect_connected(struct tevent_req *subreq);
static void smbsock_connect_do_139(struct tevent_req *subreq);
+static void smbsock_connect_do_5445(struct tevent_req *subreq);
struct tevent_req *smbsock_connect_send(TALLOC_CTX *mem_ctx,
struct tevent_context *ev,
{
struct tevent_req *req;
struct smbsock_connect_state *state;
+ NTSTATUS status;
req = tevent_req_create(mem_ctx, &state, struct smbsock_connect_state);
if (req == NULL) {
* port==0, try both
*/
+ status = smb_transport_direct_create(state, &state->smb_direct);
+ if (tevent_req_nterror(req, status)) {
+ return tevent_req_post(req, ev);
+ }
+ state->req_5445 = smb_transport_direct_connect_rdma_send(state, ev, state->smb_direct,
+ addr, NULL, NULL);
+ if (tevent_req_nomem(state->req_5445, req)) {
+ return tevent_req_post(req, ev);
+ }
+ tevent_req_set_callback(state->req_5445, smbsock_connect_do_5445,
+ req);
+
+#if 0
state->req_445 = open_socket_out_send(state, ev, addr, TCP_SMB_PORT, 5000);
if (tevent_req_nomem(state->req_445, req)) {
return tevent_req_post(req, ev);
}
tevent_req_set_callback(state->req_139, smbsock_connect_do_139,
req);
+#endif
return req;
}
req);
}
+static void smbsock_connect_do_5445(struct tevent_req *subreq)
+{
+ struct tevent_req *req = tevent_req_callback_data(
+ subreq, struct tevent_req);
+ struct smbsock_connect_state *state = tevent_req_data(
+ req, struct smbsock_connect_state);
+ NTSTATUS status;
+
+ status = smb_transport_direct_connect_rdma_recv(subreq);
+ TALLOC_FREE(subreq);
+ if (tevent_req_nterror(req, status)) {
+ return;
+ }
+
+ state->req_5445 = smb_transport_direct_connect_negotiate_send(state,
+ state->ev,
+ state->smb_direct);
+ if (tevent_req_nomem(state->req_5445, req)) {
+ return;
+ }
+ tevent_req_set_callback(state->req_5445, smbsock_connect_connected,
+ req);
+}
+
static void smbsock_connect_connected(struct tevent_req *subreq)
{
struct tevent_req *req = tevent_req_callback_data(
subreq, struct tevent_req);
struct smbsock_connect_state *state = tevent_req_data(
req, struct smbsock_connect_state);
- struct tevent_req *unfinished_req;
NTSTATUS status;
- if (subreq == state->req_445) {
+ if (subreq == state->req_5445) {
+
+ status = smb_transport_direct_connect_negotiate_recv(subreq);
+ TALLOC_FREE(state->req_5445);
+ talloc_steal(NULL, state->smb_direct);
+ state->sock = (intptr_t)state->smb_direct;
+ state->port = 5445;
+
+ } else if (subreq == state->req_445) {
status = open_socket_out_recv(subreq, &state->sock);
TALLOC_FREE(state->req_445);
- unfinished_req = state->req_139;
state->port = TCP_SMB_PORT;
} else if (subreq == state->req_139) {
status = nb_connect_recv(subreq, &state->sock);
TALLOC_FREE(state->req_139);
- unfinished_req = state->req_445;
state->port = NBT_SMB_PORT;
} else {
}
if (NT_STATUS_IS_OK(status)) {
- TALLOC_FREE(unfinished_req);
- state->req_139 = NULL;
- state->req_445 = NULL;
+ TALLOC_FREE(state->req_5445);
+ TALLOC_FREE(state->req_445);
+ TALLOC_FREE(state->req_139);
tevent_req_done(req);
return;
}
- if (unfinished_req == NULL) {
+ if ((state->req_5445 == NULL) &&
+ (state->req_445 == NULL) &&
+ (state->req_139 == NULL))
+ {
/*
- * Both requests failed
+ * All requests failed
*/
tevent_req_nterror(req, status);
return;