[SCM] Samba Shared Repository - branch master updated -
release-4-0-0alpha7-1368-g3003853
Stefan Metzmacher
metze at samba.org
Fri May 1 15:43:58 GMT 2009
The branch, master has been updated
via 30038534f4e846b14ec737a2726213d8a8db9d44 (commit)
via fe9b552023620baffd5847325aa0fd4ded00605c (commit)
via 92a1890b90f5cb4bfb9988a521fcbfb22bebc82d (commit)
via 2ae92c759925023cc6d357c4f4d9cc3b308186aa (commit)
via 863c048d268fe75aded636859bd5c0689ac664db (commit)
via 6d27b48b3fc7a0f92335308b7a5581892a9f8584 (commit)
via 6ac61e6707079c8339ef8fa5f1c65ab173f3a79a (commit)
via eb723c2061ece9652638866b5336f3f377339c8f (commit)
via a0830f4cb93997e235acb95e1bdb438626601974 (commit)
via ee6d796c19e15f6a2e3044ce85ea9ff30dfeb5f0 (commit)
via 8a090c4b8bb805bdc8debc8ca8ced5cd6f362d2e (commit)
via 182a4b30dee11286b87431db09ec198e02b347cb (commit)
via b46599590f0b2801e1658dc32b6c074d5a14828c (commit)
via 0db3b944bd4720be0ea66b2033ce7fd4eb27027f (commit)
via b4c5387e9f10369ed18fcfbe55a6fc8f8a2e08aa (commit)
via cc75ff1a37b1e7d9e75e718731fa30e4901850c7 (commit)
via 66a2cd36c674bf4f235aa28f9c1786d9937ebe2a (commit)
via 997eb9eb4323ec117625ae0ad90f32049f33d83b (commit)
via 9dbb535aa5d79a748874d1a85ef8cb6f6b195e52 (commit)
from 5604e8d614c938876b0a8cbc6f8c38262588f961 (commit)
http://gitweb.samba.org/?p=samba.git;a=shortlog;h=master
- Log -----------------------------------------------------------------
commit 30038534f4e846b14ec737a2726213d8a8db9d44
Author: Stefan Metzmacher <metze at samba.org>
Date: Tue Apr 7 18:35:30 2009 +0200
s4:rpc_server: convert the socket based part to use the tstream interface
metze
commit fe9b552023620baffd5847325aa0fd4ded00605c
Author: Stefan Metzmacher <metze at samba.org>
Date: Mon Apr 6 11:05:59 2009 +0200
s4:smbd: depend on NAMED_PIPE_AUTH_TSTREAM...
metze
commit 92a1890b90f5cb4bfb9988a521fcbfb22bebc82d
Author: Stefan Metzmacher <metze at samba.org>
Date: Thu Mar 12 18:10:19 2009 +0100
libcli/named_pipe_auth: add tstream_npa_connect_send/recv()
Add a tstream client implemenation for the named pipe auth
code. This supports byte and message mode.
metze
commit 2ae92c759925023cc6d357c4f4d9cc3b308186aa
Author: Stefan Metzmacher <metze at samba.org>
Date: Tue Apr 21 04:55:42 2009 +0200
s4:smbd: add support for named_pipe_auth level 2 in service_named_pipe...
metze
commit 863c048d268fe75aded636859bd5c0689ac664db
Author: Stefan Metzmacher <metze at samba.org>
Date: Tue Apr 21 04:48:48 2009 +0200
rerun "make idl"
metze
commit 6d27b48b3fc7a0f92335308b7a5581892a9f8584
Author: Stefan Metzmacher <metze at samba.org>
Date: Tue Apr 21 04:44:08 2009 +0200
named_pipe_auth.idl: add level 2 and pass the client/server info and session key
We also return can return the named pipe mode now.
metze
commit 6ac61e6707079c8339ef8fa5f1c65ab173f3a79a
Author: Stefan Metzmacher <metze at samba.org>
Date: Fri Apr 3 18:49:24 2009 +0200
tsocket: add tstream_readv_pdu_queue_send/recv()
metze
commit eb723c2061ece9652638866b5336f3f377339c8f
Author: Stefan Metzmacher <metze at samba.org>
Date: Fri Apr 3 18:18:51 2009 +0200
tsocket: add tstream_writev_queue_send/recv()
metze
commit a0830f4cb93997e235acb95e1bdb438626601974
Author: Stefan Metzmacher <metze at samba.org>
Date: Fri Apr 3 17:17:15 2009 +0200
tsocket: add tstream_readv_pdu_send/recv()
metze
commit ee6d796c19e15f6a2e3044ce85ea9ff30dfeb5f0
Author: Stefan Metzmacher <metze at samba.org>
Date: Fri Apr 3 12:15:27 2009 +0200
tsocket: add tstream implementation for bsd sockets (inet and unix)
metze
commit 8a090c4b8bb805bdc8debc8ca8ced5cd6f362d2e
Author: Stefan Metzmacher <metze at samba.org>
Date: Fri Apr 3 18:08:10 2009 +0200
tsocket: add tstream_context infrastructure similar to tdgram_context
metze
commit 182a4b30dee11286b87431db09ec198e02b347cb
Author: Stefan Metzmacher <metze at samba.org>
Date: Thu Apr 30 13:10:54 2009 +0200
tsocket: rename tdgram_unix_dgram_socket() => tdgram_unix_socket()
metze
commit b46599590f0b2801e1658dc32b6c074d5a14828c
Author: Stefan Metzmacher <metze at samba.org>
Date: Fri Apr 3 17:54:08 2009 +0200
tsocket: move tsocket_simple_int_recv() to tsocket.c
metze
commit 0db3b944bd4720be0ea66b2033ce7fd4eb27027f
Author: Stefan Metzmacher <metze at samba.org>
Date: Fri Apr 3 17:52:15 2009 +0200
tsocket: move tsocket_sendto_queue_send/recv() to tsocket_helpers.c
metze
commit b4c5387e9f10369ed18fcfbe55a6fc8f8a2e08aa
Author: Stefan Metzmacher <metze at samba.org>
Date: Tue Apr 14 10:44:25 2009 +0200
tsocket: tdgram move input checks to the common code as there're needed for all backends
We need to make sure that we free the sendto and recvfrom requests before
the tdgram_context
metze
commit cc75ff1a37b1e7d9e75e718731fa30e4901850c7
Author: Stefan Metzmacher <metze at samba.org>
Date: Mon Apr 6 14:29:24 2009 +0200
tsocket: for unix domain sockets we need to use sizeof(struct sockaddr_un)
sizeof(struct sockaddr_storage) generates EINVAL.
metze
commit 66a2cd36c674bf4f235aa28f9c1786d9937ebe2a
Author: Stefan Metzmacher <metze at samba.org>
Date: Fri Apr 10 20:35:12 2009 +0200
tsocket: return EINVAL when tdgram_sendto_send() is used with len == 0
metze
commit 997eb9eb4323ec117625ae0ad90f32049f33d83b
Author: Stefan Metzmacher <metze at samba.org>
Date: Mon Apr 6 14:27:24 2009 +0200
tsocket: fix dependecies
metze
commit 9dbb535aa5d79a748874d1a85ef8cb6f6b195e52
Author: Stefan Metzmacher <metze at samba.org>
Date: Fri Apr 3 17:29:12 2009 +0200
tsocket: remove tsocket_context related stuff
It will be replaced by tdgram_context and tstream_context.
metze
-----------------------------------------------------------------------
Summary of changes:
lib/tsocket/config.mk | 8 +-
lib/tsocket/tsocket.c | 636 +++++++++-----
lib/tsocket/tsocket.h | 226 +++---
lib/tsocket/tsocket_bsd.c | 1644 +++++++++++++++++++---------------
lib/tsocket/tsocket_connect.c | 122 ---
lib/tsocket/tsocket_helpers.c | 599 ++++++++++---
lib/tsocket/tsocket_internal.h | 133 +--
lib/tsocket/tsocket_readv.c | 222 -----
lib/tsocket/tsocket_writev.c | 316 -------
libcli/named_pipe_auth/config.mk | 4 +
libcli/named_pipe_auth/npa_tstream.c | 1059 ++++++++++++++++++++++
libcli/named_pipe_auth/npa_tstream.h | 59 ++
librpc/gen_ndr/named_pipe_auth.h | 21 +-
librpc/gen_ndr/ndr_named_pipe_auth.c | 300 ++++++-
librpc/gen_ndr/ndr_named_pipe_auth.h | 2 +
librpc/idl/named_pipe_auth.idl | 20 +
source3/Makefile.in | 5 +-
source4/main.mk | 1 +
source4/rpc_server/dcerpc_server.h | 3 +
source4/rpc_server/service_rpc.c | 399 +++++++--
source4/smbd/config.mk | 2 +-
source4/smbd/service_named_pipe.c | 59 ++-
22 files changed, 3862 insertions(+), 1978 deletions(-)
delete mode 100644 lib/tsocket/tsocket_connect.c
delete mode 100644 lib/tsocket/tsocket_readv.c
delete mode 100644 lib/tsocket/tsocket_writev.c
create mode 100644 libcli/named_pipe_auth/config.mk
create mode 100644 libcli/named_pipe_auth/npa_tstream.c
create mode 100644 libcli/named_pipe_auth/npa_tstream.h
Changeset truncated at 500 lines:
diff --git a/lib/tsocket/config.mk b/lib/tsocket/config.mk
index 2e05f54..ca2978a 100644
--- a/lib/tsocket/config.mk
+++ b/lib/tsocket/config.mk
@@ -1,13 +1,11 @@
[SUBSYSTEM::LIBTSOCKET]
-PRIVATE_DEPENDENCIES = LIBTALLOC LIBTEVENT LIBREPLACE_NETWORK
+PRIVATE_DEPENDENCIES = LIBREPLACE_NETWORK
+PUBLIC_DEPENDENCIES = LIBTALLOC LIBTEVENT
LIBTSOCKET_OBJ_FILES = $(addprefix ../lib/tsocket/, \
tsocket.o \
tsocket_helpers.o \
- tsocket_bsd.o \
- tsocket_connect.o \
- tsocket_writev.o \
- tsocket_readv.o)
+ tsocket_bsd.o)
PUBLIC_HEADERS += $(addprefix ../lib/tsocket/, \
tsocket.h\
diff --git a/lib/tsocket/tsocket.c b/lib/tsocket/tsocket.c
index 076c647..e618fb7 100644
--- a/lib/tsocket/tsocket.c
+++ b/lib/tsocket/tsocket.c
@@ -22,144 +22,36 @@
*/
#include "replace.h"
-#include "system/network.h"
+#include "system/filesys.h"
#include "tsocket.h"
#include "tsocket_internal.h"
-static int tsocket_context_destructor(struct tsocket_context *sock)
+int tsocket_simple_int_recv(struct tevent_req *req, int *perrno)
{
- tsocket_disconnect(sock);
- return 0;
-}
-
-struct tsocket_context *_tsocket_context_create(TALLOC_CTX *mem_ctx,
- const struct tsocket_context_ops *ops,
- void *pstate,
- size_t psize,
- const char *type,
- const char *location)
-{
- void **ppstate = (void **)pstate;
- struct tsocket_context *sock;
+ enum tevent_req_state state;
+ uint64_t error;
- sock = talloc_zero(mem_ctx, struct tsocket_context);
- if (!sock) {
- return NULL;
+ if (!tevent_req_is_error(req, &state, &error)) {
+ return 0;
}
- sock->ops = ops;
- sock->location = location;
- sock->private_data = talloc_size(sock, psize);
- if (!sock->private_data) {
- talloc_free(sock);
- return NULL;
- }
- talloc_set_name_const(sock->private_data, type);
-
- talloc_set_destructor(sock, tsocket_context_destructor);
-
- *ppstate = sock->private_data;
- return sock;
-}
-
-int tsocket_set_event_context(struct tsocket_context *sock,
- struct tevent_context *ev)
-{
- return sock->ops->set_event_context(sock, ev);
-}
-
-int tsocket_set_readable_handler(struct tsocket_context *sock,
- tsocket_event_handler_t handler,
- void *private_data)
-{
- return sock->ops->set_read_handler(sock, handler, private_data);
-}
-
-int tsocket_set_writeable_handler(struct tsocket_context *sock,
- tsocket_event_handler_t handler,
- void *private_data)
-{
- return sock->ops->set_write_handler(sock, handler, private_data);
-}
-
-int tsocket_connect(struct tsocket_context *sock,
- const struct tsocket_address *remote_addr)
-{
- return sock->ops->connect_to(sock, remote_addr);
-}
-
-int tsocket_listen(struct tsocket_context *sock,
- int queue_size)
-{
- return sock->ops->listen_on(sock, queue_size);
-}
-
-int _tsocket_accept(struct tsocket_context *sock,
- TALLOC_CTX *mem_ctx,
- struct tsocket_context **new_sock,
- const char *location)
-{
- return sock->ops->accept_new(sock, mem_ctx, new_sock, location);
-}
-
-ssize_t tsocket_pending(struct tsocket_context *sock)
-{
- return sock->ops->pending_data(sock);
-}
-
-int tsocket_readv(struct tsocket_context *sock,
- const struct iovec *vector, size_t count)
-{
- return sock->ops->readv_data(sock, vector, count);
-}
-
-int tsocket_writev(struct tsocket_context *sock,
- const struct iovec *vector, size_t count)
-{
- return sock->ops->writev_data(sock, vector, count);
-}
-int tsocket_get_status(const struct tsocket_context *sock)
-{
- return sock->ops->get_status(sock);
-}
-
-int _tsocket_get_local_address(const struct tsocket_context *sock,
- TALLOC_CTX *mem_ctx,
- struct tsocket_address **local_addr,
- const char *location)
-{
- return sock->ops->get_local_address(sock, mem_ctx,
- local_addr, location);
-}
-
-int _tsocket_get_remote_address(const struct tsocket_context *sock,
- TALLOC_CTX *mem_ctx,
- struct tsocket_address **remote_addr,
- const char *location)
-{
- return sock->ops->get_remote_address(sock, mem_ctx,
- remote_addr, location);
-}
-
-int tsocket_get_option(const struct tsocket_context *sock,
- const char *option,
- TALLOC_CTX *mem_ctx,
- char **value)
-{
- return sock->ops->get_option(sock, option, mem_ctx, value);
-}
-
-int tsocket_set_option(const struct tsocket_context *sock,
- const char *option,
- bool force,
- const char *value)
-{
- return sock->ops->set_option(sock, option, force, value);
-}
+ switch (state) {
+ case TEVENT_REQ_NO_MEMORY:
+ *perrno = ENOMEM;
+ return -1;
+ case TEVENT_REQ_TIMED_OUT:
+ *perrno = ETIMEDOUT;
+ return -1;
+ case TEVENT_REQ_USER_ERROR:
+ *perrno = (int)error;
+ return -1;
+ default:
+ *perrno = EIO;
+ return -1;
+ }
-void tsocket_disconnect(struct tsocket_context *sock)
-{
- sock->ops->disconnect(sock);
+ *perrno = EIO;
+ return -1;
}
struct tsocket_address *_tsocket_address_create(TALLOC_CTX *mem_ctx,
@@ -205,21 +97,28 @@ struct tsocket_address *_tsocket_address_copy(const struct tsocket_address *addr
return addr->ops->copy(addr, mem_ctx, location);
}
-int _tsocket_address_create_socket(const struct tsocket_address *addr,
- enum tsocket_type type,
- TALLOC_CTX *mem_ctx,
- struct tsocket_context **sock,
- const char *location)
-{
- return addr->ops->create_socket(addr, type, mem_ctx, sock, location);
-}
-
struct tdgram_context {
const char *location;
const struct tdgram_context_ops *ops;
void *private_data;
+
+ struct tevent_req *recvfrom_req;
+ struct tevent_req *sendto_req;
};
+static int tdgram_context_destructor(struct tdgram_context *dgram)
+{
+ if (dgram->recvfrom_req) {
+ tevent_req_received(dgram->recvfrom_req);
+ }
+
+ if (dgram->sendto_req) {
+ tevent_req_received(dgram->sendto_req);
+ }
+
+ return 0;
+}
+
struct tdgram_context *_tdgram_context_create(TALLOC_CTX *mem_ctx,
const struct tdgram_context_ops *ops,
void *pstate,
@@ -235,8 +134,10 @@ struct tdgram_context *_tdgram_context_create(TALLOC_CTX *mem_ctx,
if (dgram == NULL) {
return NULL;
}
- dgram->location = location;
- dgram->ops = ops;
+ dgram->location = location;
+ dgram->ops = ops;
+ dgram->recvfrom_req = NULL;
+ dgram->sendto_req = NULL;
state = talloc_size(dgram, psize);
if (state == NULL) {
@@ -247,6 +148,8 @@ struct tdgram_context *_tdgram_context_create(TALLOC_CTX *mem_ctx,
dgram->private_data = state;
+ talloc_set_destructor(dgram, tdgram_context_destructor);
+
*ppstate = state;
return dgram;
}
@@ -258,11 +161,21 @@ void *_tdgram_context_data(struct tdgram_context *dgram)
struct tdgram_recvfrom_state {
const struct tdgram_context_ops *ops;
+ struct tdgram_context *dgram;
uint8_t *buf;
size_t len;
struct tsocket_address *src;
};
+static int tdgram_recvfrom_destructor(struct tdgram_recvfrom_state *state)
+{
+ if (state->dgram) {
+ state->dgram->recvfrom_req = NULL;
+ }
+
+ return 0;
+}
+
static void tdgram_recvfrom_done(struct tevent_req *subreq);
struct tevent_req *tdgram_recvfrom_send(TALLOC_CTX *mem_ctx,
@@ -280,6 +193,18 @@ struct tevent_req *tdgram_recvfrom_send(TALLOC_CTX *mem_ctx,
}
state->ops = dgram->ops;
+ state->dgram = dgram;
+ state->buf = NULL;
+ state->len = 0;
+ state->src = NULL;
+
+ if (dgram->recvfrom_req) {
+ tevent_req_error(req, EBUSY);
+ goto post;
+ }
+ dgram->recvfrom_req = req;
+
+ talloc_set_destructor(state, tdgram_recvfrom_destructor);
subreq = state->ops->recvfrom_send(state, ev, dgram);
if (tevent_req_nomem(subreq, req)) {
@@ -340,9 +265,19 @@ ssize_t tdgram_recvfrom_recv(struct tevent_req *req,
struct tdgram_sendto_state {
const struct tdgram_context_ops *ops;
+ struct tdgram_context *dgram;
ssize_t ret;
};
+static int tdgram_sendto_destructor(struct tdgram_sendto_state *state)
+{
+ if (state->dgram) {
+ state->dgram->sendto_req = NULL;
+ }
+
+ return 0;
+}
+
static void tdgram_sendto_done(struct tevent_req *subreq);
struct tevent_req *tdgram_sendto_send(TALLOC_CTX *mem_ctx,
@@ -362,8 +297,22 @@ struct tevent_req *tdgram_sendto_send(TALLOC_CTX *mem_ctx,
}
state->ops = dgram->ops;
+ state->dgram = dgram;
state->ret = -1;
+ if (len == 0) {
+ tevent_req_error(req, EINVAL);
+ goto post;
+ }
+
+ if (dgram->sendto_req) {
+ tevent_req_error(req, EBUSY);
+ goto post;
+ }
+ dgram->sendto_req = req;
+
+ talloc_set_destructor(state, tdgram_sendto_destructor);
+
subreq = state->ops->sendto_send(state, ev, dgram,
buf, len, dst);
if (tevent_req_nomem(subreq, req)) {
@@ -436,6 +385,11 @@ struct tevent_req *tdgram_disconnect_send(TALLOC_CTX *mem_ctx,
state->ops = dgram->ops;
+ if (dgram->recvfrom_req || dgram->sendto_req) {
+ tevent_req_error(req, EBUSY);
+ goto post;
+ }
+
subreq = state->ops->disconnect_send(state, ev, dgram);
if (tevent_req_nomem(subreq, req)) {
goto post;
@@ -478,75 +432,149 @@ int tdgram_disconnect_recv(struct tevent_req *req,
return ret;
}
-struct tdgram_sendto_queue_state {
- /* this structs are owned by the caller */
- struct {
- struct tevent_context *ev;
- struct tdgram_context *dgram;
- const uint8_t *buf;
- size_t len;
- const struct tsocket_address *dst;
- } caller;
- ssize_t ret;
+struct tstream_context {
+ const char *location;
+ const struct tstream_context_ops *ops;
+ void *private_data;
+
+ struct tevent_req *readv_req;
+ struct tevent_req *writev_req;
};
-static void tdgram_sendto_queue_trigger(struct tevent_req *req,
- void *private_data);
-static void tdgram_sendto_queue_done(struct tevent_req *subreq);
-
-/**
- * @brief Queue a dgram blob for sending through the socket
- * @param[in] mem_ctx The memory context for the result
- * @param[in] ev The event context the operation should work on
- * @param[in] dgram The tdgram_context to send the message buffer
- * @param[in] queue The existing dgram queue
- * @param[in] buf The message buffer
- * @param[in] len The message length
- * @param[in] dst The destination socket address
- * @retval The async request handle
- *
- * This function queues a blob for sending to destination through an existing
- * dgram socket. The async callback is triggered when the whole blob is
- * delivered to the underlying system socket.
- *
- * The caller needs to make sure that all non-scalar input parameters hang
- * arround for the whole lifetime of the request.
- */
-struct tevent_req *tdgram_sendto_queue_send(TALLOC_CTX *mem_ctx,
- struct tevent_context *ev,
- struct tdgram_context *dgram,
- struct tevent_queue *queue,
- const uint8_t *buf,
- size_t len,
- struct tsocket_address *dst)
+static int tstream_context_destructor(struct tstream_context *stream)
+{
+ if (stream->readv_req) {
+ tevent_req_received(stream->readv_req);
+ }
+
+ if (stream->writev_req) {
+ tevent_req_received(stream->writev_req);
+ }
+
+ return 0;
+}
+
+struct tstream_context *_tstream_context_create(TALLOC_CTX *mem_ctx,
+ const struct tstream_context_ops *ops,
+ void *pstate,
+ size_t psize,
+ const char *type,
+ const char *location)
+{
+ struct tstream_context *stream;
+ void **ppstate = (void **)pstate;
+ void *state;
+
+ stream = talloc(mem_ctx, struct tstream_context);
+ if (stream == NULL) {
+ return NULL;
+ }
+ stream->location = location;
+ stream->ops = ops;
+ stream->readv_req = NULL;
+ stream->writev_req = NULL;
+
+ state = talloc_size(stream, psize);
+ if (state == NULL) {
+ talloc_free(stream);
+ return NULL;
+ }
+ talloc_set_name_const(state, type);
+
+ stream->private_data = state;
+
+ talloc_set_destructor(stream, tstream_context_destructor);
+
+ *ppstate = state;
+ return stream;
+}
+
+void *_tstream_context_data(struct tstream_context *stream)
+{
+ return stream->private_data;
+}
+
+ssize_t tstream_pending_bytes(struct tstream_context *stream)
+{
+ return stream->ops->pending_bytes(stream);
+}
+
+struct tstream_readv_state {
+ const struct tstream_context_ops *ops;
+ struct tstream_context *stream;
+ int ret;
+};
+
+static int tstream_readv_destructor(struct tstream_readv_state *state)
+{
+ if (state->stream) {
+ state->stream->readv_req = NULL;
+ }
+
+ return 0;
+}
+
+static void tstream_readv_done(struct tevent_req *subreq);
+
+struct tevent_req *tstream_readv_send(TALLOC_CTX *mem_ctx,
+ struct tevent_context *ev,
+ struct tstream_context *stream,
+ struct iovec *vector,
+ size_t count)
{
struct tevent_req *req;
- struct tdgram_sendto_queue_state *state;
- bool ok;
+ struct tstream_readv_state *state;
+ struct tevent_req *subreq;
+ int to_read = 0;
+ size_t i;
req = tevent_req_create(mem_ctx, &state,
- struct tdgram_sendto_queue_state);
- if (!req) {
+ struct tstream_readv_state);
+ if (req == NULL) {
return NULL;
}
- state->caller.ev = ev;
- state->caller.dgram = dgram;
- state->caller.buf = buf;
--
Samba Shared Repository
More information about the samba-cvs
mailing list