[SCM] Samba Shared Repository - branch master updated -
release-4-0-0alpha8-89-g8e22e38
Volker Lendecke
vlendec at samba.org
Sat Jun 27 21:18:53 GMT 2009
The branch, master has been updated
via 8e22e38c9c4a08f9f49f3f8f29dab8d6a948948e (commit)
via f5321ffea8fd9e3b4cbf236883664832a0425075 (commit)
via 55dae4469c1c2ba571bfaeb93de7494480e0d72b (commit)
via c687eb15d953006f1de1e02abad40365040a29f1 (commit)
from 53b9a24ce38acc79d8086b502f0e8ff048ef67bc (commit)
http://gitweb.samba.org/?p=samba.git;a=shortlog;h=master
- Log -----------------------------------------------------------------
commit 8e22e38c9c4a08f9f49f3f8f29dab8d6a948948e
Author: Volker Lendecke <vl at samba.org>
Date: Sat Jun 27 20:03:55 2009 +0200
Move read_ldap_done after read_ldap_send
commit f5321ffea8fd9e3b4cbf236883664832a0425075
Author: Volker Lendecke <vl at samba.org>
Date: Sat Jun 27 18:14:25 2009 +0200
Convert tldap to tstream
commit 55dae4469c1c2ba571bfaeb93de7494480e0d72b
Author: Volker Lendecke <vl at samba.org>
Date: Sat Jun 27 17:21:19 2009 +0200
Add tstream_read_packet
commit c687eb15d953006f1de1e02abad40365040a29f1
Author: Volker Lendecke <vl at samba.org>
Date: Sat Jun 27 20:04:37 2009 +0200
Properly free a downlevel readv request. Metze, please check
-----------------------------------------------------------------------
Summary of changes:
lib/tsocket/tsocket.c | 1 +
source3/Makefile.in | 6 +-
source3/include/includes.h | 1 +
source3/include/proto.h | 10 +++
source3/lib/tldap.c | 71 ++++++++++++----------
source3/lib/util_tsock.c | 139 ++++++++++++++++++++++++++++++++++++++++++++
6 files changed, 193 insertions(+), 35 deletions(-)
create mode 100644 source3/lib/util_tsock.c
Changeset truncated at 500 lines:
diff --git a/lib/tsocket/tsocket.c b/lib/tsocket/tsocket.c
index e05c8d5..55f1af3 100644
--- a/lib/tsocket/tsocket.c
+++ b/lib/tsocket/tsocket.c
@@ -594,6 +594,7 @@ static void tstream_readv_done(struct tevent_req *subreq)
int sys_errno;
ret = state->ops->readv_recv(subreq, &sys_errno);
+ TALLOC_FREE(subreq);
if (ret == -1) {
tevent_req_error(req, sys_errno);
return;
diff --git a/source3/Makefile.in b/source3/Makefile.in
index ddc344d..cdca9c1 100644
--- a/source3/Makefile.in
+++ b/source3/Makefile.in
@@ -486,7 +486,7 @@ CLDAP_OBJ = libads/cldap.o \
../lib/util/idtree.o \
$(LIBCLI_LDAP_MESSAGE_OBJ) $(LIBCLI_LDAP_NDR_OBJ) $(LIBTSOCKET_OBJ)
-TLDAP_OBJ = lib/tldap.o lib/tldap_util.o
+TLDAP_OBJ = lib/tldap.o lib/tldap_util.o lib/util_tsock.o
LIBSMB_OBJ = libsmb/clientgen.o libsmb/cliconnect.o libsmb/clifile.o \
libsmb/clikrb5.o libsmb/clispnego.o ../lib/util/asn1.o \
@@ -859,7 +859,7 @@ SMBPASSWD_OBJ = utils/smbpasswd.o $(PASSWD_UTIL_OBJ) $(PASSCHANGE_OBJ) \
$(LIBMSRPC_GEN_OBJ) $(LIBMSRPC_OBJ) $(LDB_OBJ)
PDBEDIT_OBJ = utils/pdbedit.o $(PASSWD_UTIL_OBJ) $(PARAM_OBJ) $(PASSDB_OBJ) \
- $(LIBSAMBA_OBJ) \
+ $(LIBSAMBA_OBJ) $(LIBTSOCKET_OBJ) \
$(LIB_NONSMBD_OBJ) $(GROUPDB_OBJ) \
$(POPT_LIB_OBJ) $(SMBLDAP_OBJ) ../lib/util/asn1.o \
$(LDB_OBJ)
@@ -1219,7 +1219,7 @@ NTLM_AUTH_OBJ1 = utils/ntlm_auth.o utils/ntlm_auth_diagnostics.o
NTLM_AUTH_OBJ = ${NTLM_AUTH_OBJ1} $(LIBSAMBA_OBJ) $(POPT_LIB_OBJ) \
../lib/util/asn1.o libsmb/spnego.o libsmb/clikrb5.o libads/kerberos.o \
$(LIBADS_SERVER_OBJ) \
- $(PASSDB_OBJ) $(GROUPDB_OBJ) \
+ $(PASSDB_OBJ) $(LIBTSOCKET_OBJ) $(GROUPDB_OBJ) \
$(SMBLDAP_OBJ) $(LIBNMB_OBJ) \
$(LDB_OBJ) $(WBCOMMON_OBJ) \
$(LIBNDR_GEN_OBJ0) $(LIBNDR_GEN_OBJ1) @BUILD_INIPARSER@
diff --git a/source3/include/includes.h b/source3/include/includes.h
index b7ba703..c1aeaf9 100644
--- a/source3/include/includes.h
+++ b/source3/include/includes.h
@@ -611,6 +611,7 @@ struct smb_iconv_convenience *lp_iconv_convenience(void *lp_ctx);
#include "event.h"
#include "../lib/util/tevent_unix.h"
#include "../lib/util/tevent_ntstatus.h"
+#include "../lib/tsocket/tsocket.h"
#include "../lib/util/data_blob.h"
#include "../lib/util/time.h"
diff --git a/source3/include/proto.h b/source3/include/proto.h
index 3da1caf..07a749d 100644
--- a/source3/include/proto.h
+++ b/source3/include/proto.h
@@ -1418,6 +1418,16 @@ struct tevent_req *getaddrinfo_send(TALLOC_CTX *mem_ctx,
const char *service,
const struct addrinfo *hints);
int getaddrinfo_recv(struct tevent_req *req, struct addrinfo **res);
+struct tevent_req *tstream_read_packet_send(TALLOC_CTX *mem_ctx,
+ struct tevent_context *ev,
+ struct tstream_context *stream,
+ size_t initial,
+ ssize_t (*more)(uint8_t *buf,
+ size_t buflen,
+ void *private_data),
+ void *private_data);
+ssize_t tstream_read_packet_recv(struct tevent_req *req, TALLOC_CTX *mem_ctx,
+ uint8_t **pbuf, int *perrno);
/* The following definitions come from lib/util_str.c */
diff --git a/source3/lib/tldap.c b/source3/lib/tldap.c
index 0f9e678..aba8a25 100644
--- a/source3/lib/tldap.c
+++ b/source3/lib/tldap.c
@@ -54,7 +54,7 @@ struct tldap_context {
int ld_deref;
int ld_sizelimit;
int ld_timelimit;
- int fd;
+ struct tstream_context *conn;
int msgid;
struct tevent_queue *outgoing;
struct tevent_req **pending;
@@ -132,12 +132,17 @@ static int tldap_next_msgid(struct tldap_context *ld)
struct tldap_context *tldap_context_create(TALLOC_CTX *mem_ctx, int fd)
{
struct tldap_context *ctx;
+ int ret;
ctx = talloc_zero(mem_ctx, struct tldap_context);
if (ctx == NULL) {
return NULL;
}
- ctx->fd = fd;
+ ret = tstream_bsd_existing_socket(ctx, fd, &ctx->conn);
+ if (ret == -1) {
+ TALLOC_FREE(ctx);
+ return NULL;
+ }
ctx->msgid = 1;
ctx->ld_version = 3;
ctx->outgoing = tevent_queue_create(ctx, "tldap_outgoing");
@@ -224,6 +229,31 @@ struct read_ldap_state {
bool done;
};
+static ssize_t read_ldap_more(uint8_t *buf, size_t buflen, void *private_data);
+static void read_ldap_done(struct tevent_req *subreq);
+
+static struct tevent_req *read_ldap_send(TALLOC_CTX *mem_ctx,
+ struct tevent_context *ev,
+ struct tstream_context *conn)
+{
+ struct tevent_req *req, *subreq;
+ struct read_ldap_state *state;
+
+ req = tevent_req_create(mem_ctx, &state, struct read_ldap_state);
+ if (req == NULL) {
+ return NULL;
+ }
+ state->done = false;
+
+ subreq = tstream_read_packet_send(state, ev, conn, 2, read_ldap_more,
+ state);
+ if (tevent_req_nomem(subreq, req)) {
+ return tevent_req_post(req, ev);
+ }
+ tevent_req_set_callback(subreq, read_ldap_done, req);
+ return req;
+}
+
static ssize_t read_ldap_more(uint8_t *buf, size_t buflen, void *private_data)
{
struct read_ldap_state *state = talloc_get_type_abort(
@@ -270,29 +300,6 @@ static ssize_t read_ldap_more(uint8_t *buf, size_t buflen, void *private_data)
return len;
}
-static void read_ldap_done(struct tevent_req *subreq);
-
-static struct tevent_req *read_ldap_send(TALLOC_CTX *mem_ctx,
- struct tevent_context *ev,
- int fd)
-{
- struct tevent_req *req, *subreq;
- struct read_ldap_state *state;
-
- req = tevent_req_create(mem_ctx, &state, struct read_ldap_state);
- if (req == NULL) {
- return NULL;
- }
- state->done = false;
-
- subreq = read_packet_send(state, ev, fd, 2, read_ldap_more, state);
- if (tevent_req_nomem(subreq, req)) {
- return tevent_req_post(req, ev);
- }
- tevent_req_set_callback(subreq, read_ldap_done, req);
- return req;
-}
-
static void read_ldap_done(struct tevent_req *subreq)
{
struct tevent_req *req = tevent_req_callback_data(
@@ -302,7 +309,7 @@ static void read_ldap_done(struct tevent_req *subreq)
ssize_t nread;
int err;
- nread = read_packet_recv(subreq, state, &state->buf, &err);
+ nread = tstream_read_packet_recv(subreq, state, &state->buf, &err);
TALLOC_FREE(subreq);
if (nread == -1) {
tevent_req_error(req, err);
@@ -400,8 +407,8 @@ static struct tevent_req *tldap_msg_send(TALLOC_CTX *mem_ctx,
state->iov.iov_base = blob.data;
state->iov.iov_len = blob.length;
- subreq = writev_send(state, ev, ld->outgoing, ld->fd, false,
- &state->iov, 1);
+ subreq = tstream_writev_queue_send(state, ev, ld->conn, ld->outgoing,
+ &state->iov, 1);
if (tevent_req_nomem(subreq, req)) {
return tevent_req_post(req, ev);
}
@@ -487,7 +494,7 @@ static bool tldap_msg_set_pending(struct tevent_req *req)
* We're the first ones, add the read_ldap request that waits for the
* answer from the server
*/
- subreq = read_ldap_send(ld->pending, state->ev, ld->fd);
+ subreq = read_ldap_send(ld->pending, state->ev, ld->conn);
if (subreq == NULL) {
tldap_msg_unset_pending(req);
return false;
@@ -503,7 +510,7 @@ static void tldap_msg_sent(struct tevent_req *subreq)
ssize_t nwritten;
int err;
- nwritten = writev_recv(subreq, &err);
+ nwritten = tstream_writev_queue_recv(subreq, &err);
TALLOC_FREE(subreq);
if (nwritten == -1) {
tevent_req_error(req, TLDAP_SERVER_DOWN);
@@ -610,8 +617,8 @@ static void tldap_msg_received(struct tevent_req *subreq)
return;
}
- state = tevent_req_data(ld->pending[0], struct tldap_msg_state);
- subreq = read_ldap_send(ld->pending, state->ev, ld->fd);
+ state = tevent_req_data(ld->pending[0], struct tldap_msg_state);
+ subreq = read_ldap_send(ld->pending, state->ev, ld->conn);
if (subreq == NULL) {
status = TLDAP_NO_MEMORY;
goto fail;
diff --git a/source3/lib/util_tsock.c b/source3/lib/util_tsock.c
new file mode 100644
index 0000000..7588857
--- /dev/null
+++ b/source3/lib/util_tsock.c
@@ -0,0 +1,139 @@
+/*
+ Unix SMB/CIFS implementation.
+ Utilities around tsocket
+ Copyright (C) Volker Lendecke 2009
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include "includes.h"
+
+struct tstream_read_packet_state {
+ struct tevent_context *ev;
+ struct tstream_context *stream;
+ ssize_t (*more)(uint8_t *buf, size_t buflen, void *private_data);
+ void *private_data;
+ uint8_t *buf;
+ struct iovec iov;
+};
+
+static void tstream_read_packet_done(struct tevent_req *subreq);
+
+struct tevent_req *tstream_read_packet_send(TALLOC_CTX *mem_ctx,
+ struct tevent_context *ev,
+ struct tstream_context *stream,
+ size_t initial,
+ ssize_t (*more)(uint8_t *buf,
+ size_t buflen,
+ void *private_data),
+ void *private_data)
+{
+ struct tevent_req *req, *subreq;
+ struct tstream_read_packet_state *state;
+
+ req = tevent_req_create(mem_ctx, &state,
+ struct tstream_read_packet_state);
+ if (req == NULL) {
+ return NULL;
+ }
+ state->buf = talloc_array(state, uint8_t, initial);
+ if (tevent_req_nomem(state->buf, req)) {
+ return tevent_req_post(req, ev);
+ }
+ state->iov.iov_base = state->buf;
+ state->iov.iov_len = initial;
+
+ state->ev = ev;
+ state->stream = stream;
+ state->more = more;
+ state->private_data = private_data;
+
+ subreq = tstream_readv_send(state, ev, stream, &state->iov, 1);
+ if (tevent_req_nomem(subreq, req)) {
+ return tevent_req_post(req, ev);
+ }
+ tevent_req_set_callback(subreq, tstream_read_packet_done, req);
+
+ return req;
+}
+
+static void tstream_read_packet_done(struct tevent_req *subreq)
+{
+ struct tevent_req *req = tevent_req_callback_data(
+ subreq, struct tevent_req);
+ struct tstream_read_packet_state *state = tevent_req_data(
+ req, struct tstream_read_packet_state);
+ int ret, err;
+ size_t total;
+ ssize_t more;
+ uint8_t *tmp;
+
+ ret = tstream_readv_recv(subreq, &err);
+ TALLOC_FREE(subreq);
+ if (ret == 0) {
+ err = EPIPE;
+ }
+ if (ret <= 0) {
+ tevent_req_error(req, err);
+ return;
+ }
+
+ if (state->more == NULL) {
+ /* Nobody to ask, this is a async read_data */
+ tevent_req_done(req);
+ return;
+ }
+ total = talloc_array_length(state->buf);
+
+ more = state->more(state->buf, total, state->private_data);
+ if (more == -1) {
+ /* We got an invalid packet, tell the caller */
+ tevent_req_error(req, EIO);
+ return;
+ }
+ if (more == 0) {
+ /* We're done, full packet received */
+ tevent_req_done(req);
+ return;
+ }
+
+ tmp = talloc_realloc(state, state->buf, uint8_t, total+more);
+ if (tevent_req_nomem(tmp, req)) {
+ return;
+ }
+ state->buf = tmp;
+
+ state->iov.iov_base = state->buf + total;
+ state->iov.iov_len = more;
+
+ subreq = tstream_readv_send(state, state->ev, state->stream,
+ &state->iov, 1);
+ if (tevent_req_nomem(subreq, req)) {
+ return;
+ }
+ tevent_req_set_callback(subreq, tstream_read_packet_done, req);
+}
+
+ssize_t tstream_read_packet_recv(struct tevent_req *req, TALLOC_CTX *mem_ctx,
+ uint8_t **pbuf, int *perrno)
+{
+ struct tstream_read_packet_state *state =
+ tevent_req_data(req, struct tstream_read_packet_state);
+
+ if (tevent_req_is_unix_error(req, perrno)) {
+ return -1;
+ }
+ *pbuf = talloc_move(mem_ctx, &state->buf);
+ return talloc_array_length(*pbuf);
+}
--
Samba Shared Repository
More information about the samba-cvs
mailing list