summaryrefslogtreecommitdiff
path: root/source3/rpc_client/rpc_transport_smbd.c
diff options
context:
space:
mode:
authorStefan Metzmacher <metze@samba.org>2010-03-25 15:00:38 +0100
committerStefan Metzmacher <metze@samba.org>2010-03-29 18:11:16 +0200
commit4f41b53487ac9bc96c7960e8edab464558656373 (patch)
tree50a7e9cd9752249821e384ee35d0a8b6e3466622 /source3/rpc_client/rpc_transport_smbd.c
parentdc09b12681ea0e6d4c2b0f1c99dfeb1f23019c65 (diff)
downloadsamba-4f41b53487ac9bc96c7960e8edab464558656373.tar.gz
samba-4f41b53487ac9bc96c7960e8edab464558656373.tar.bz2
samba-4f41b53487ac9bc96c7960e8edab464558656373.zip
s3:rpc_client: add rpccli_is_connected()
metze
Diffstat (limited to 'source3/rpc_client/rpc_transport_smbd.c')
-rw-r--r--source3/rpc_client/rpc_transport_smbd.c76
1 files changed, 70 insertions, 6 deletions
diff --git a/source3/rpc_client/rpc_transport_smbd.c b/source3/rpc_client/rpc_transport_smbd.c
index 929e553c84..47c426f120 100644
--- a/source3/rpc_client/rpc_transport_smbd.c
+++ b/source3/rpc_client/rpc_transport_smbd.c
@@ -419,8 +419,53 @@ NTSTATUS rpc_cli_smbd_conn_init(TALLOC_CTX *mem_ctx,
return status;
}
+static void rpc_smbd_disconnect(struct rpc_transport_smbd_state *transp)
+{
+ if (transp == NULL) {
+ return;
+ }
+
+ if (transp->conn == NULL) {
+ return;
+ }
+
+ if (transp->conn->cli == NULL) {
+ return;
+ }
+
+ if (transp->conn->cli->fd != -1) {
+ close(transp->conn->cli->fd);
+ transp->conn->cli->fd = -1;
+ }
+
+ transp->conn = NULL;
+}
+
+static bool rpc_smbd_is_connected(void *priv)
+{
+ struct rpc_transport_smbd_state *transp = talloc_get_type_abort(
+ priv, struct rpc_transport_smbd_state);
+ bool ok;
+
+ if (transp->conn == NULL) {
+ return false;
+ }
+
+ if (transp->sub_transp == NULL) {
+ return false;
+ }
+
+ ok = transp->sub_transp->is_connected(transp->sub_transp->priv);
+ if (!ok) {
+ rpc_smbd_disconnect(transp);
+ return false;
+ }
+
+ return true;
+}
+
struct rpc_smbd_write_state {
- struct rpc_cli_transport *sub_transp;
+ struct rpc_transport_smbd_state *transp;
ssize_t written;
};
@@ -435,12 +480,20 @@ static struct tevent_req *rpc_smbd_write_send(TALLOC_CTX *mem_ctx,
priv, struct rpc_transport_smbd_state);
struct tevent_req *req, *subreq;
struct rpc_smbd_write_state *state;
+ bool ok;
req = tevent_req_create(mem_ctx, &state, struct rpc_smbd_write_state);
if (req == NULL) {
return NULL;
}
- state->sub_transp = transp->sub_transp;
+
+ ok = rpc_smbd_is_connected(transp);
+ if (!ok) {
+ tevent_req_nterror(req, NT_STATUS_CONNECTION_INVALID);
+ return tevent_req_post(req, ev);
+ }
+
+ state->transp = transp;
subreq = transp->sub_transp->write_send(state, ev, data, size,
transp->sub_transp->priv);
@@ -468,9 +521,10 @@ static void rpc_smbd_write_done(struct tevent_req *subreq)
req, struct rpc_smbd_write_state);
NTSTATUS status;
- status = state->sub_transp->write_recv(subreq, &state->written);
+ status = state->transp->sub_transp->write_recv(subreq, &state->written);
TALLOC_FREE(subreq);
if (!NT_STATUS_IS_OK(status)) {
+ rpc_smbd_disconnect(state->transp);
tevent_req_nterror(req, status);
return;
}
@@ -491,7 +545,7 @@ static NTSTATUS rpc_smbd_write_recv(struct tevent_req *req, ssize_t *pwritten)
}
struct rpc_smbd_read_state {
- struct rpc_cli_transport *sub_transp;
+ struct rpc_transport_smbd_state *transp;
ssize_t received;
};
@@ -506,12 +560,20 @@ static struct tevent_req *rpc_smbd_read_send(TALLOC_CTX *mem_ctx,
priv, struct rpc_transport_smbd_state);
struct tevent_req *req, *subreq;
struct rpc_smbd_read_state *state;
+ bool ok;
req = tevent_req_create(mem_ctx, &state, struct rpc_smbd_read_state);
if (req == NULL) {
return NULL;
}
- state->sub_transp = transp->sub_transp;
+
+ ok = rpc_smbd_is_connected(transp);
+ if (!ok) {
+ tevent_req_nterror(req, NT_STATUS_CONNECTION_INVALID);
+ return tevent_req_post(req, ev);
+ }
+
+ state->transp = transp;
subreq = transp->sub_transp->read_send(state, ev, data, size,
transp->sub_transp->priv);
@@ -538,9 +600,10 @@ static void rpc_smbd_read_done(struct tevent_req *subreq)
req, struct rpc_smbd_read_state);
NTSTATUS status;
- status = state->sub_transp->read_recv(subreq, &state->received);
+ status = state->transp->sub_transp->read_recv(subreq, &state->received);
TALLOC_FREE(subreq);
if (!NT_STATUS_IS_OK(status)) {
+ rpc_smbd_disconnect(state->transp);
tevent_req_nterror(req, status);
return;
}
@@ -645,6 +708,7 @@ NTSTATUS rpc_transport_smbd_init_recv(struct tevent_req *req,
state->transport->read_recv = rpc_smbd_read_recv;
state->transport->trans_send = NULL;
state->transport->trans_recv = NULL;
+ state->transport->is_connected = rpc_smbd_is_connected;
*presult = talloc_move(mem_ctx, &state->transport);
return NT_STATUS_OK;