uint16_t fnum;
};
+static bool rpc_np_is_connected(void *priv)
+{
+ struct rpc_transport_np_state *np_transport = talloc_get_type_abort(
+ priv, struct rpc_transport_np_state);
+ bool ok;
+
+ if (np_transport->cli == NULL) {
+ return false;
+ }
+
+ ok = cli_state_is_connected(np_transport->cli);
+ if (!ok) {
+ np_transport->cli = NULL;
+ return false;
+ }
+
+ return true;
+}
+
static int rpc_transport_np_state_destructor(struct rpc_transport_np_state *s)
{
- if (!cli_state_is_connected(s->cli)) {
+ if (!rpc_np_is_connected(s)) {
DEBUG(10, ("socket was closed, no need to send close request.\n"));
return 0;
}
}
struct rpc_np_write_state {
+ struct rpc_transport_np_state *np_transport;
size_t size;
size_t written;
};
priv, struct rpc_transport_np_state);
struct tevent_req *req, *subreq;
struct rpc_np_write_state *state;
+ bool ok;
req = tevent_req_create(mem_ctx, &state, struct rpc_np_write_state);
if (req == NULL) {
return NULL;
}
+
+ ok = rpc_np_is_connected(np_transport);
+ if (!ok) {
+ tevent_req_nterror(req, NT_STATUS_CONNECTION_INVALID);
+ return tevent_req_post(req, ev);
+ }
+
+ state->np_transport = np_transport;
state->size = size;
+
subreq = cli_write_andx_send(mem_ctx, ev, np_transport->cli,
np_transport->fnum,
8, /* 8 means message mode. */
status = cli_write_andx_recv(subreq, &state->written);
TALLOC_FREE(subreq);
if (!NT_STATUS_IS_OK(status)) {
+ state->np_transport->cli = NULL;
tevent_req_nterror(req, status);
return;
}
}
struct rpc_np_read_state {
+ struct rpc_transport_np_state *np_transport;
uint8_t *data;
size_t size;
ssize_t received;
priv, struct rpc_transport_np_state);
struct tevent_req *req, *subreq;
struct rpc_np_read_state *state;
+ bool ok;
req = tevent_req_create(mem_ctx, &state, struct rpc_np_read_state);
if (req == NULL) {
return NULL;
}
+
+ ok = rpc_np_is_connected(np_transport);
+ if (!ok) {
+ tevent_req_nterror(req, NT_STATUS_CONNECTION_INVALID);
+ return tevent_req_post(req, ev);
+ }
+
+ state->np_transport = np_transport;
state->data = data;
state->size = size;
}
if (!NT_STATUS_IS_OK(status)) {
TALLOC_FREE(subreq);
+ state->np_transport->cli = NULL;
tevent_req_nterror(req, status);
return;
}
if (state->received > state->size) {
TALLOC_FREE(subreq);
+ state->np_transport->cli = NULL;
tevent_req_nterror(req, NT_STATUS_INVALID_NETWORK_RESPONSE);
return;
}
if (state->received == 0) {
TALLOC_FREE(subreq);
+ state->np_transport->cli = NULL;
tevent_req_nterror(req, NT_STATUS_PIPE_BROKEN);
return;
}
}
struct rpc_np_trans_state {
+ struct rpc_transport_np_state *np_transport;
uint16_t setup[2];
uint32_t max_rdata_len;
uint8_t *rdata;
priv, struct rpc_transport_np_state);
struct tevent_req *req, *subreq;
struct rpc_np_trans_state *state;
+ bool ok;
req = tevent_req_create(mem_ctx, &state, struct rpc_np_trans_state);
if (req == NULL) {
return NULL;
}
+ ok = rpc_np_is_connected(np_transport);
+ if (!ok) {
+ tevent_req_nterror(req, NT_STATUS_CONNECTION_INVALID);
+ return tevent_req_post(req, ev);
+ }
+
+ state->np_transport = np_transport;
state->max_rdata_len = max_rdata_len;
SSVAL(state->setup+0, 0, TRANSACT_DCERPCCMD);
status = NT_STATUS_OK;
}
if (!NT_STATUS_IS_OK(status)) {
+ state->np_transport->cli = NULL;
tevent_req_nterror(req, status);
return;
}
if (state->rdata_len > state->max_rdata_len) {
+ state->np_transport->cli = NULL;
tevent_req_nterror(req, NT_STATUS_INVALID_NETWORK_RESPONSE);
return;
}
if (state->rdata_len == 0) {
+ state->np_transport->cli = NULL;
tevent_req_nterror(req, NT_STATUS_PIPE_BROKEN);
return;
}
{
struct tevent_req *req, *subreq;
struct rpc_transport_np_init_state *state;
+ bool ok;
req = tevent_req_create(mem_ctx, &state,
struct rpc_transport_np_init_state);
return NULL;
}
+ ok = cli_state_is_connected(cli);
+ if (!ok) {
+ tevent_req_nterror(req, NT_STATUS_CONNECTION_INVALID);
+ return tevent_req_post(req, ev);
+ }
+
state->transport = talloc(state, struct rpc_cli_transport);
if (tevent_req_nomem(state->transport, req)) {
return tevent_req_post(req, ev);
state->transport->read_recv = rpc_np_read_recv;
state->transport->trans_send = rpc_np_trans_send;
state->transport->trans_recv = rpc_np_trans_recv;
+ state->transport->is_connected = rpc_np_is_connected;
*presult = talloc_move(mem_ctx, &state->transport);
return NT_STATUS_OK;