summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndreas Schneider <asn@samba.org>2013-09-24 15:03:48 +0200
committerStefan Metzmacher <metze@samba.org>2013-10-29 15:36:56 +0100
commit0733836b0e7f0797dc9ab331fb4f0ebf48d204b5 (patch)
tree8a5b9b02879b34cd221e86f35581215576514bff
parent1e66a8e674da00c2a110466e74311f54283104c6 (diff)
downloadsamba-0733836b0e7f0797dc9ab331fb4f0ebf48d204b5.tar.gz
samba-0733836b0e7f0797dc9ab331fb4f0ebf48d204b5.tar.xz
samba-0733836b0e7f0797dc9ab331fb4f0ebf48d204b5.zip
s3-rpc_server: Use new rpc named pipe functions.
Signed-off-by: Andreas Schneider <asn@samba.org> Reviewed-by: Stefan Metzmacher <metze@samba.org>
-rw-r--r--source3/rpc_server/srv_pipe_hnd.c92
1 files changed, 58 insertions, 34 deletions
diff --git a/source3/rpc_server/srv_pipe_hnd.c b/source3/rpc_server/srv_pipe_hnd.c
index fcbfa77c7b6..6bf6f0c63fb 100644
--- a/source3/rpc_server/srv_pipe_hnd.c
+++ b/source3/rpc_server/srv_pipe_hnd.c
@@ -426,6 +426,9 @@ NTSTATUS np_open(TALLOC_CTX *mem_ctx, const char *name,
const char **proxy_list;
struct fake_file_handle *handle;
struct ndr_syntax_id syntax;
+ struct npa_state *npa = NULL;
+ NTSTATUS status;
+ bool ok;
proxy_list = lp_parm_string_list(-1, "np", "proxy", NULL);
@@ -445,37 +448,49 @@ NTSTATUS np_open(TALLOC_CTX *mem_ctx, const char *name,
switch (pipe_mode) {
case RPC_SERVICE_MODE_EXTERNAL:
+ status = make_external_rpc_pipe(handle,
+ name,
+ local_address,
+ remote_address,
+ session_info,
+ &npa);
+ if (!NT_STATUS_IS_OK(status)) {
+ talloc_free(handle);
+ return status;
+ }
- handle->private_data = (void *)make_external_rpc_pipe_p(
- handle, name,
- local_address,
- remote_address,
- session_info);
-
+ handle->private_data = (void *)npa;
handle->type = FAKE_FILE_TYPE_NAMED_PIPE_PROXY;
- break;
+ break;
case RPC_SERVICE_MODE_EMBEDDED:
-
- if (!is_known_pipename(name, &syntax)) {
- TALLOC_FREE(handle);
+ /* Check if we this daemon handles this pipe */
+ ok = is_known_pipename(name, &syntax);
+ if (!ok) {
+ DEBUG(0, ("ERROR! '%s' is not a registred pipe!\n",
+ name));
+ talloc_free(handle);
return NT_STATUS_OBJECT_NAME_NOT_FOUND;
}
- handle->private_data = (void *)make_internal_rpc_pipe_p(
- handle, &syntax, remote_address,
- session_info, msg_ctx);
+ status = make_internal_rpc_pipe(handle,
+ msg_ctx,
+ name,
+ &syntax,
+ remote_address,
+ session_info,
+ &npa);
+ if (!NT_STATUS_IS_OK(status)) {
+ talloc_free(handle);
+ return status;
+ }
+ handle->private_data = (void *)npa;
handle->type = FAKE_FILE_TYPE_NAMED_PIPE;
- break;
- case RPC_SERVICE_MODE_DISABLED:
- handle->private_data = NULL;
break;
- }
-
- if (handle->private_data == NULL) {
- TALLOC_FREE(handle);
+ case RPC_SERVICE_MODE_DISABLED:
+ talloc_free(handle);
return NT_STATUS_OBJECT_NAME_NOT_FOUND;
}
@@ -491,8 +506,9 @@ bool np_read_in_progress(struct fake_file_handle *handle)
}
if (handle->type == FAKE_FILE_TYPE_NAMED_PIPE_PROXY) {
- struct np_proxy_state *p = talloc_get_type_abort(
- handle->private_data, struct np_proxy_state);
+ struct npa_state *p =
+ talloc_get_type_abort(handle->private_data,
+ struct npa_state);
size_t read_count;
read_count = tevent_queue_length(p->read_queue);
@@ -508,7 +524,7 @@ bool np_read_in_progress(struct fake_file_handle *handle)
struct np_write_state {
struct tevent_context *ev;
- struct np_proxy_state *p;
+ struct npa_state *p;
struct iovec iov;
ssize_t nwritten;
};
@@ -538,8 +554,12 @@ struct tevent_req *np_write_send(TALLOC_CTX *mem_ctx, struct tevent_context *ev,
}
if (handle->type == FAKE_FILE_TYPE_NAMED_PIPE) {
- struct pipes_struct *p = talloc_get_type_abort(
- handle->private_data, struct pipes_struct);
+ struct npa_state *npa =
+ talloc_get_type_abort(handle->private_data,
+ struct npa_state);
+ struct pipes_struct *p =
+ talloc_get_type_abort(npa->private_data,
+ struct pipes_struct);
state->nwritten = write_to_internal_pipe(p, (const char *)data, len);
@@ -549,8 +569,8 @@ struct tevent_req *np_write_send(TALLOC_CTX *mem_ctx, struct tevent_context *ev,
}
if (handle->type == FAKE_FILE_TYPE_NAMED_PIPE_PROXY) {
- struct np_proxy_state *p = talloc_get_type_abort(
- handle->private_data, struct np_proxy_state);
+ struct npa_state *p = talloc_get_type_abort(
+ handle->private_data, struct npa_state);
struct tevent_req *subreq;
state->ev = ev;
@@ -559,7 +579,7 @@ struct tevent_req *np_write_send(TALLOC_CTX *mem_ctx, struct tevent_context *ev,
state->iov.iov_len = len;
subreq = tstream_writev_queue_send(state, ev,
- p->npipe,
+ p->stream,
p->write_queue,
&state->iov, 1);
if (subreq == NULL) {
@@ -690,7 +710,7 @@ static int np_ipc_readv_next_vector(struct tstream_context *stream,
}
struct np_read_state {
- struct np_proxy_state *p;
+ struct npa_state *p;
struct np_ipc_readv_next_vector_state next_vector;
ssize_t nread;
@@ -713,8 +733,12 @@ struct tevent_req *np_read_send(TALLOC_CTX *mem_ctx, struct tevent_context *ev,
}
if (handle->type == FAKE_FILE_TYPE_NAMED_PIPE) {
- struct pipes_struct *p = talloc_get_type_abort(
- handle->private_data, struct pipes_struct);
+ struct npa_state *npa =
+ talloc_get_type_abort(handle->private_data,
+ struct npa_state);
+ struct pipes_struct *p =
+ talloc_get_type_abort(npa->private_data,
+ struct pipes_struct);
state->nread = read_from_internal_pipe(
p, (char *)data, len, &state->is_data_outstanding);
@@ -725,8 +749,8 @@ struct tevent_req *np_read_send(TALLOC_CTX *mem_ctx, struct tevent_context *ev,
}
if (handle->type == FAKE_FILE_TYPE_NAMED_PIPE_PROXY) {
- struct np_proxy_state *p = talloc_get_type_abort(
- handle->private_data, struct np_proxy_state);
+ struct npa_state *p = talloc_get_type_abort(
+ handle->private_data, struct npa_state);
struct tevent_req *subreq;
np_ipc_readv_next_vector_init(&state->next_vector,
@@ -734,7 +758,7 @@ struct tevent_req *np_read_send(TALLOC_CTX *mem_ctx, struct tevent_context *ev,
subreq = tstream_readv_pdu_queue_send(state,
ev,
- p->npipe,
+ p->stream,
p->read_queue,
np_ipc_readv_next_vector,
&state->next_vector);