The branch, master has been updated via c320c1a lib/util: Add tevent WERROR wrappers via 79c6572 tsocket: let tstream_inet_tcp_connect_recv() optionally return the used local address via d2c6536 tsocket: ask the kernel for the specific local address after a tcp connect via 96601ca lib/replace: use snprintf() in test code to avoid warnings in the IBM-Checker via d65896c lib/replace: fix rep_strtoull() prototype from 272feb7 Revert "Wrap security_token_has_privilege() with a check for lp_enable_privileges(). Needed"
http://gitweb.samba.org/?p=samba.git;a=shortlog;h=master - Log ----------------------------------------------------------------- commit c320c1ab989cf809da6effb4a47e8355c94357f5 Author: Kai Blin <k...@samba.org> Date: Fri Oct 22 16:40:38 2010 +0200 lib/util: Add tevent WERROR wrappers Signed-off-by: Stefan Metzmacher <me...@samba.org> Autobuild-User: Stefan Metzmacher <me...@samba.org> Autobuild-Date: Sat Oct 23 07:35:28 UTC 2010 on sn-devel-104 commit 79c6572256a01279d9e4f0b436d334f4fd739866 Author: Stefan Metzmacher <me...@samba.org> Date: Thu Oct 21 23:31:41 2010 +0200 tsocket: let tstream_inet_tcp_connect_recv() optionally return the used local address tstream_inet_tcp_connect_send() usually only gets no local port number and it may use the wildcard address '0.0.0.0' or '::'. tstream_inet_tcp_connect_recv() provides the used local address and port which are used on the wire. metze commit d2c653629cdc3df8549c6faabfcdbe3045cd013c Author: Stefan Metzmacher <me...@samba.org> Date: Thu Oct 21 23:26:14 2010 +0200 tsocket: ask the kernel for the specific local address after a tcp connect metze commit 96601cab1cb0bd47051cd9fb30f0464c0734cb8a Author: Stefan Metzmacher <me...@samba.org> Date: Fri Oct 22 14:41:47 2010 +0200 lib/replace: use snprintf() in test code to avoid warnings in the IBM-Checker metze commit d65896cc3c5e67508e295e6d64193210e958971c Author: Stefan Metzmacher <me...@samba.org> Date: Fri Oct 22 08:44:29 2010 +0200 lib/replace: fix rep_strtoull() prototype metze ----------------------------------------------------------------------- Summary of changes: lib/replace/replace.c | 2 +- lib/replace/replace.h | 4 +- lib/replace/test/os2_delete.c | 4 +- lib/tsocket/tsocket.h | 13 ++++-- lib/tsocket/tsocket_bsd.c | 58 +++++++++++++++++++++- lib/util/{tevent_ntstatus.c => tevent_werror.c} | 44 +++++++++-------- lib/util/{tevent_ntstatus.h => tevent_werror.h} | 30 ++++++------ lib/util/wscript_build | 4 +- source3/Makefile.in | 1 + source3/wscript_build | 1 + source4/libcli/wrepl/winsrepl.c | 2 +- 11 files changed, 112 insertions(+), 51 deletions(-) copy lib/util/{tevent_ntstatus.c => tevent_werror.c} (59%) copy lib/util/{tevent_ntstatus.h => tevent_werror.h} (55%) Changeset truncated at 500 lines: diff --git a/lib/replace/replace.c b/lib/replace/replace.c index 5ecda92..d9a96ff 100644 --- a/lib/replace/replace.c +++ b/lib/replace/replace.c @@ -558,7 +558,7 @@ unsigned long long int rep_strtoull(const char *str, char **endptr, int base) #else #ifdef HAVE_BSD_STRTOLL #ifdef HAVE_STRTOUQ -long long int rep_strtoull(const char *str, char **endptr, int base) +unsigned long long int rep_strtoull(const char *str, char **endptr, int base) { unsigned long long int nb = strtouq(str, endptr, base); /* In linux EINVAL is only returned if base is not ok */ diff --git a/lib/replace/replace.h b/lib/replace/replace.h index 8f820a9..15ec80a 100644 --- a/lib/replace/replace.h +++ b/lib/replace/replace.h @@ -299,8 +299,8 @@ long long int rep_strtoll(const char *str, char **endptr, int base); #define strtoull rep_strtoull unsigned long long int rep_strtoull(const char *str, char **endptr, int base); #else -#ifdef HAVE_BSD_STRTOLL -long long int rep_strtoull(const char *str, char **endptr, int base); +#ifdef HAVE_BSD_STRTOLL /* yes, it's not HAVE_BSD_STRTOULL */ +unsigned long long int rep_strtoull(const char *str, char **endptr, int base); #define strtoull rep_strtoull #endif #endif diff --git a/lib/replace/test/os2_delete.c b/lib/replace/test/os2_delete.c index 8b52837..9d760bf 100644 --- a/lib/replace/test/os2_delete.c +++ b/lib/replace/test/os2_delete.c @@ -46,7 +46,7 @@ static void create_files(void) for (i=0;i<NUM_FILES;i++) { char fname[40]; int fd; - sprintf(fname, TESTDIR "/test%u.txt", i); + snprintf(fname, sizeof(fname), TESTDIR "/test%u.txt", i); fd = open(fname, O_CREAT|O_RDWR, 0600); if (fd < 0) { FAILED("open"); @@ -79,7 +79,7 @@ static int os2_delete(DIR *d) /* delete the first few */ for (j=0; j<MIN(i, DELETE_SIZE); j++) { char fname[40]; - sprintf(fname, TESTDIR "/%s", names[j]); + snprintf(fname, sizeof(fname), TESTDIR "/%s", names[j]); unlink(fname) == 0 || FAILED("unlink"); } diff --git a/lib/tsocket/tsocket.h b/lib/tsocket/tsocket.h index 3dd9666..3aca536 100644 --- a/lib/tsocket/tsocket.h +++ b/lib/tsocket/tsocket.h @@ -724,23 +724,28 @@ struct tevent_req *tstream_inet_tcp_connect_send(TALLOC_CTX *mem_ctx, * * @param[in] mem_ctx The talloc memory context to use. * - * @param[in] stream A tstream_context pointer to setup the tcp communication + * @param[out] stream A tstream_context pointer to setup the tcp communication * on. This function will allocate the memory. * + * @param[out] local The real 'inet' tsocket_address of the local endpoint. + * This parameter is optional and can be NULL. + * * @return 0 on success, -1 on error with perrno set. */ int tstream_inet_tcp_connect_recv(struct tevent_req *req, int *perrno, TALLOC_CTX *mem_ctx, - struct tstream_context **stream); + struct tstream_context **stream, + struct tsocket_address **local) #else int _tstream_inet_tcp_connect_recv(struct tevent_req *req, int *perrno, TALLOC_CTX *mem_ctx, struct tstream_context **stream, + struct tsocket_address **local, const char *location); -#define tstream_inet_tcp_connect_recv(req, perrno, mem_ctx, stream) \ - _tstream_inet_tcp_connect_recv(req, perrno, mem_ctx, stream, \ +#define tstream_inet_tcp_connect_recv(req, perrno, mem_ctx, stream, local) \ + _tstream_inet_tcp_connect_recv(req, perrno, mem_ctx, stream, local, \ __location__) #endif diff --git a/lib/tsocket/tsocket_bsd.c b/lib/tsocket/tsocket_bsd.c index bc7cfe3..019bf42 100644 --- a/lib/tsocket/tsocket_bsd.c +++ b/lib/tsocket/tsocket_bsd.c @@ -1973,6 +1973,7 @@ struct tstream_bsd_connect_state { int fd; struct tevent_fd *fde; struct tstream_conext *stream; + struct tsocket_address *local; }; static int tstream_bsd_connect_destructor(struct tstream_bsd_connect_state *state) @@ -1991,7 +1992,7 @@ static void tstream_bsd_connect_fde_handler(struct tevent_context *ev, uint16_t flags, void *private_data); -static struct tevent_req * tstream_bsd_connect_send(TALLOC_CTX *mem_ctx, +static struct tevent_req *tstream_bsd_connect_send(TALLOC_CTX *mem_ctx, struct tevent_context *ev, int sys_errno, const struct tsocket_address *local, @@ -2002,6 +2003,7 @@ static struct tevent_req * tstream_bsd_connect_send(TALLOC_CTX *mem_ctx, struct tsocket_address_bsd *lbsda = talloc_get_type_abort(local->private_data, struct tsocket_address_bsd); + struct tsocket_address_bsd *lrbsda = NULL; struct tsocket_address_bsd *rbsda = talloc_get_type_abort(remote->private_data, struct tsocket_address_bsd); @@ -2081,6 +2083,20 @@ static struct tevent_req * tstream_bsd_connect_send(TALLOC_CTX *mem_ctx, } } + if (is_inet) { + state->local = tsocket_address_create(state, + &tsocket_address_bsd_ops, + &lrbsda, + struct tsocket_address_bsd, + __location__ "bsd_connect"); + if (tevent_req_nomem(state->local, req)) { + goto post; + } + + ZERO_STRUCTP(lrbsda); + lrbsda->sa_socklen = sizeof(lrbsda->u.ss); + } + state->fd = socket(sa_fam, SOCK_STREAM, 0); if (state->fd == -1) { tevent_req_error(req, errno); @@ -2140,6 +2156,17 @@ static struct tevent_req * tstream_bsd_connect_send(TALLOC_CTX *mem_ctx, goto post; } + if (!state->local) { + tevent_req_done(req); + goto post; + } + + ret = getsockname(state->fd, &lrbsda->u.sa, &lrbsda->sa_socklen); + if (ret == -1) { + tevent_req_error(req, errno); + goto post; + } + tevent_req_done(req); goto post; @@ -2169,6 +2196,7 @@ static void tstream_bsd_connect_fde_handler(struct tevent_context *ev, struct tevent_req); struct tstream_bsd_connect_state *state = tevent_req_data(req, struct tstream_bsd_connect_state); + struct tsocket_address_bsd *lrbsda = NULL; int ret; int error=0; socklen_t len = sizeof(error); @@ -2191,6 +2219,20 @@ static void tstream_bsd_connect_fde_handler(struct tevent_context *ev, return; } + if (!state->local) { + tevent_req_done(req); + return; + } + + lrbsda = talloc_get_type_abort(state->local->private_data, + struct tsocket_address_bsd); + + ret = getsockname(state->fd, &lrbsda->u.sa, &lrbsda->sa_socklen); + if (ret == -1) { + tevent_req_error(req, errno); + return; + } + tevent_req_done(req); } @@ -2198,6 +2240,7 @@ static int tstream_bsd_connect_recv(struct tevent_req *req, int *perrno, TALLOC_CTX *mem_ctx, struct tstream_context **stream, + struct tsocket_address **local, const char *location) { struct tstream_bsd_connect_state *state = tevent_req_data(req, @@ -2216,6 +2259,10 @@ static int tstream_bsd_connect_recv(struct tevent_req *req, } TALLOC_FREE(state->fde); state->fd = -1; + + if (local) { + *local = talloc_move(mem_ctx, &state->local); + } } done: @@ -2255,9 +2302,12 @@ int _tstream_inet_tcp_connect_recv(struct tevent_req *req, int *perrno, TALLOC_CTX *mem_ctx, struct tstream_context **stream, + struct tsocket_address **local, const char *location) { - return tstream_bsd_connect_recv(req, perrno, mem_ctx, stream, location); + return tstream_bsd_connect_recv(req, perrno, + mem_ctx, stream, local, + location); } struct tevent_req * tstream_unix_connect_send(TALLOC_CTX *mem_ctx, @@ -2290,7 +2340,9 @@ int _tstream_unix_connect_recv(struct tevent_req *req, struct tstream_context **stream, const char *location) { - return tstream_bsd_connect_recv(req, perrno, mem_ctx, stream, location); + return tstream_bsd_connect_recv(req, perrno, + mem_ctx, stream, NULL, + location); } int _tstream_unix_socketpair(TALLOC_CTX *mem_ctx1, diff --git a/lib/util/tevent_ntstatus.c b/lib/util/tevent_werror.c similarity index 59% copy from lib/util/tevent_ntstatus.c copy to lib/util/tevent_werror.c index c4dd074..d8956b3 100644 --- a/lib/util/tevent_ntstatus.c +++ b/lib/util/tevent_werror.c @@ -1,7 +1,7 @@ /* Unix SMB/CIFS implementation. - Wrap unix errno around tevent_req - Copyright (C) Volker Lendecke 2009 + Wrap win32 errors around tevent_req + Copyright (C) Kai Blin 2010 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 @@ -18,17 +18,17 @@ */ #include "../replace/replace.h" -#include "tevent_ntstatus.h" +#include "tevent_werror.h" -bool _tevent_req_nterror(struct tevent_req *req, - NTSTATUS status, - const char *location) +bool _tevent_req_werror(struct tevent_req *req, + WERROR werror, + const char *location) { - return _tevent_req_error(req, NT_STATUS_V(status), + return _tevent_req_error(req, W_ERROR_V(werror), location); } -bool tevent_req_is_nterror(struct tevent_req *req, NTSTATUS *status) +bool tevent_req_is_werror(struct tevent_req *req, WERROR *error) { enum tevent_req_state state; uint64_t err; @@ -38,41 +38,43 @@ bool tevent_req_is_nterror(struct tevent_req *req, NTSTATUS *status) } switch (state) { case TEVENT_REQ_TIMED_OUT: - *status = NT_STATUS_IO_TIMEOUT; + *error = WERR_TIMEOUT; break; case TEVENT_REQ_NO_MEMORY: - *status = NT_STATUS_NO_MEMORY; + *error = WERR_NOMEM; break; case TEVENT_REQ_USER_ERROR: - *status = NT_STATUS(err); + *error = W_ERROR(err); break; default: - *status = NT_STATUS_INTERNAL_ERROR; + *error = WERR_INTERNAL_ERROR; break; } return true; } -NTSTATUS tevent_req_simple_recv_ntstatus(struct tevent_req *req) +WERROR tevent_req_simple_recv_werror(struct tevent_req *req) { - NTSTATUS status; + WERROR werror; - if (tevent_req_is_nterror(req, &status)) { - return status; + if (tevent_req_is_werror(req, &werror)) { + tevent_req_received(req); + return werror; } - return NT_STATUS_OK; + tevent_req_received(req); + return WERR_OK; } -void tevent_req_simple_finish_ntstatus(struct tevent_req *subreq, - NTSTATUS subreq_status) +void tevent_req_simple_finish_werror(struct tevent_req *subreq, + WERROR subreq_error) { struct tevent_req *req = tevent_req_callback_data( subreq, struct tevent_req); TALLOC_FREE(subreq); - if (!NT_STATUS_IS_OK(subreq_status)) { - tevent_req_nterror(req, subreq_status); + if (!W_ERROR_IS_OK(subreq_error)) { + tevent_req_werror(req, subreq_error); return; } tevent_req_done(req); diff --git a/lib/util/tevent_ntstatus.h b/lib/util/tevent_werror.h similarity index 55% copy from lib/util/tevent_ntstatus.h copy to lib/util/tevent_werror.h index 4ac9243..0e24382 100644 --- a/lib/util/tevent_ntstatus.h +++ b/lib/util/tevent_werror.h @@ -1,7 +1,7 @@ /* Unix SMB/CIFS implementation. - Wrap unix errno around tevent_req - Copyright (C) Volker Lendecke 2009 + Wrap win32 errors around tevent_req + Copyright (C) Kai Blin 2010 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 @@ -17,27 +17,27 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. */ -#ifndef _TEVENT_NTSTATUS_H -#define _TEVENT_NTSTATUS_H +#ifndef _TEVENT_WERROR_H +#define _TEVENT_WERROR_H #include <stdint.h> #include <stdbool.h> -#include "../libcli/util/ntstatus.h" +#include "../libcli/util/werror.h" #include <tevent.h> -bool _tevent_req_nterror(struct tevent_req *req, - NTSTATUS status, - const char *location); -#define tevent_req_nterror(req, status) \ - _tevent_req_nterror(req, status, __location__) -bool tevent_req_is_nterror(struct tevent_req *req, NTSTATUS *pstatus); -NTSTATUS tevent_req_simple_recv_ntstatus(struct tevent_req *req); +bool _tevent_req_werror(struct tevent_req *req, + WERROR werror, + const char *location); +#define tevent_req_werror(req, werror) \ + _tevent_req_werror(req, werror, __location__) +bool tevent_req_is_werror(struct tevent_req *req, WERROR *error); +WERROR tevent_req_simple_recv_werror(struct tevent_req *req); /* - * Helper routine to pass the subreq_ntstatus to the req embedded in + * Helper routine to pass the subreq_werror to the req embedded in * tevent_req_callback_data(subreq), which will be freed. */ -void tevent_req_simple_finish_ntstatus(struct tevent_req *subreq, - NTSTATUS subreq_status); +void tevent_req_simple_finish_werror(struct tevent_req *subreq, + WERROR subreq_error); #endif diff --git a/lib/util/wscript_build b/lib/util/wscript_build index 9162bcb..e1030c8 100644 --- a/lib/util/wscript_build +++ b/lib/util/wscript_build @@ -41,10 +41,10 @@ bld.SAMBA_SUBSYSTEM('UTIL_TDB', ) bld.SAMBA_SUBSYSTEM('UTIL_TEVENT', - source='tevent_unix.c tevent_ntstatus.c', + source='tevent_unix.c tevent_ntstatus.c tevent_werror.c', local_include=False, public_deps='tevent', - public_headers='tevent_ntstatus.h tevent_unix.h', + public_headers='tevent_ntstatus.h tevent_unix.h tevent_werror.h', header_path=[ ('*', 'util') ], ) diff --git a/source3/Makefile.in b/source3/Makefile.in index 5d390de..b287784 100644 --- a/source3/Makefile.in +++ b/source3/Makefile.in @@ -429,6 +429,7 @@ UTIL_OBJ = ../lib/util/rbtree.o ../lib/util/signal.o ../lib/util/time.o \ ../lib/util/genrand.o ../lib/util/util_net.o \ ../lib/util/become_daemon.o ../lib/util/system.o \ ../lib/util/tevent_unix.o ../lib/util/tevent_ntstatus.o \ + ../lib/util/tevent_werror.o \ ../lib/util/smb_threads.o ../lib/util/util_id.o \ ../lib/util/blocking.o ../lib/util/rfc1738.o \ ../lib/util/select.o diff --git a/source3/wscript_build b/source3/wscript_build index 7516f7a..9ee2cbc 100644 --- a/source3/wscript_build +++ b/source3/wscript_build @@ -152,6 +152,7 @@ UTIL_SRC = '''../lib/util/rbtree.c ../lib/util/signal.c ../lib/util/time.c ../lib/util/genrand.c ../lib/util/util_net.c ../lib/util/become_daemon.c ../lib/util/system.c ../lib/util/tevent_unix.c ../lib/util/tevent_ntstatus.c + ../lib/util/tevent_werror.c ../lib/util/smb_threads.c ../lib/util/util_id.c ../lib/util/blocking.c ../lib/util/rfc1738.c ../lib/util/select.c''' diff --git a/source4/libcli/wrepl/winsrepl.c b/source4/libcli/wrepl/winsrepl.c index 83da217..842a351 100644 --- a/source4/libcli/wrepl/winsrepl.c +++ b/source4/libcli/wrepl/winsrepl.c @@ -248,7 +248,7 @@ static void wrepl_connect_done(struct tevent_req *subreq) int sys_errno; ret = tstream_inet_tcp_connect_recv(subreq, &sys_errno, - state, &state->stream); + state, &state->stream, NULL); if (ret != 0) { NTSTATUS status = map_nt_error_from_unix(sys_errno); tevent_req_nterror(req, status); -- Samba Shared Repository