1
0
mirror of https://github.com/samba-team/samba.git synced 2025-12-09 00:23:50 +03:00

samba: share select wrappers.

Guenther
This commit is contained in:
Günther Deschner
2010-10-01 10:08:15 +02:00
parent 0adc1645e2
commit b38d0542e1
19 changed files with 60 additions and 65 deletions

View File

@@ -35,7 +35,8 @@ LIBSAMBA-UTIL_OBJ_FILES = $(addprefix $(libutilsrcdir)/, \
smb_threads.o \ smb_threads.o \
params.o \ params.o \
parmlist.o \ parmlist.o \
util_id.o) util_id.o
select.o)
PUBLIC_HEADERS += $(addprefix $(libutilsrcdir)/, util.h \ PUBLIC_HEADERS += $(addprefix $(libutilsrcdir)/, util.h \
dlinklist.h \ dlinklist.h \

View File

@@ -1,29 +1,32 @@
/* /*
Unix SMB/Netbios implementation. Unix SMB/Netbios implementation.
Version 3.0 Version 3.0
Samba select/poll implementation Samba select/poll implementation
Copyright (C) Andrew Tridgell 1992-1998 Copyright (C) Andrew Tridgell 1992-1998
This program is free software; you can redistribute it and/or modify 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 it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3 of the License, or the Free Software Foundation; either version 3 of the License, or
(at your option) any later version. (at your option) any later version.
This program is distributed in the hope that it will be useful, This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details. GNU General Public License for more details.
You should have received a copy of the GNU General Public License You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>. along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
#include "includes.h" #include "includes.h"
#include "system/filesys.h"
#include "system/select.h"
#include "lib/util/select.h"
/* This is here because it allows us to avoid a nasty race in signal handling. /* This is here because it allows us to avoid a nasty race in signal handling.
We need to guarantee that when we get a signal we get out of a select immediately We need to guarantee that when we get a signal we get out of a select immediately
but doing that involves a race condition. We can avoid the race by getting the but doing that involves a race condition. We can avoid the race by getting the
signal handler to write to a pipe that is in the select/poll list signal handler to write to a pipe that is in the select/poll list
This means all Samba signal handlers should call sys_select_signal(). This means all Samba signal handlers should call sys_select_signal().
*/ */
@@ -33,7 +36,7 @@ static int select_pipe[2];
static volatile unsigned pipe_written, pipe_read; static volatile unsigned pipe_written, pipe_read;
/******************************************************************* /*******************************************************************
Call this from all Samba signal handlers if you want to avoid a Call this from all Samba signal handlers if you want to avoid a
nasty signal race condition. nasty signal race condition.
********************************************************************/ ********************************************************************/

29
lib/util/select.h Normal file
View File

@@ -0,0 +1,29 @@
/*
Unix SMB/Netbios implementation.
Samba select/poll implementation
Copyright (C) Andrew Tridgell 1992-1998
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/>.
*/
#ifndef _select_h_
#define _select_h_
/* The following definitions come from lib/util/select.c */
void sys_select_signal(char c);
int sys_select(int maxfd, fd_set *readfds, fd_set *writefds, fd_set *errorfds, struct timeval *tval);
int sys_select_intr(int maxfd, fd_set *readfds, fd_set *writefds, fd_set *errorfds, struct timeval *tval);
#endif

View File

@@ -1,7 +1,7 @@
#!/usr/bin/env python #!/usr/bin/env python
bld.SAMBA_LIBRARY('LIBSAMBA-UTIL', bld.SAMBA_LIBRARY('LIBSAMBA-UTIL',
source='xfile.c debug.c fault.c signal.c system.c time.c genrand.c dprintf.c util_str.c rfc1738.c substitute.c util_strlist.c util_file.c data_blob.c util.c blocking.c util_net.c fsusage.c ms_fnmatch.c mutex.c idtree.c become_daemon.c rbtree.c talloc_stack.c smb_threads.c params.c parmlist.c util_id.c', source='xfile.c debug.c fault.c signal.c system.c time.c genrand.c dprintf.c util_str.c rfc1738.c substitute.c util_strlist.c util_file.c data_blob.c util.c blocking.c util_net.c fsusage.c ms_fnmatch.c mutex.c idtree.c become_daemon.c rbtree.c talloc_stack.c smb_threads.c params.c parmlist.c util_id.c select.c',
public_deps='talloc LIBCRYPTO CHARSET execinfo UID_WRAPPER tevent', public_deps='talloc LIBCRYPTO CHARSET execinfo UID_WRAPPER tevent',
public_headers='attr.h byteorder.h data_blob.h debug.h memory.h mutex.h safe_string.h time.h talloc_stack.h xfile.h dlinklist.h util.h tevent_ntstatus.h tevent_unix.h', public_headers='attr.h byteorder.h data_blob.h debug.h memory.h mutex.h safe_string.h time.h talloc_stack.h xfile.h dlinklist.h util.h tevent_ntstatus.h tevent_unix.h',
header_path= [ ('dlinklist.h util.h', '.'), ('*', 'util') ], header_path= [ ('dlinklist.h util.h', '.'), ('*', 'util') ],

View File

@@ -430,7 +430,8 @@ UTIL_OBJ = ../lib/util/rbtree.o ../lib/util/signal.o ../lib/util/time.o \
../lib/util/become_daemon.o ../lib/util/system.o \ ../lib/util/become_daemon.o ../lib/util/system.o \
../lib/util/tevent_unix.o ../lib/util/tevent_ntstatus.o \ ../lib/util/tevent_unix.o ../lib/util/tevent_ntstatus.o \
../lib/util/smb_threads.o ../lib/util/util_id.o \ ../lib/util/smb_threads.o ../lib/util/util_id.o \
../lib/util/blocking.o ../lib/util/rfc1738.o ../lib/util/blocking.o ../lib/util/rfc1738.o \
../lib/util/select.o
CRYPTO_OBJ = ../lib/crypto/crc32.o ../lib/crypto/md5.o \ CRYPTO_OBJ = ../lib/crypto/crc32.o ../lib/crypto/md5.o \
../lib/crypto/hmacmd5.o ../lib/crypto/arcfour.o \ ../lib/crypto/hmacmd5.o ../lib/crypto/arcfour.o \
@@ -460,7 +461,7 @@ LIB_OBJ = $(LIBSAMBAUTIL_OBJ) $(UTIL_OBJ) $(CRYPTO_OBJ) \
lib/util.o lib/util_names.o \ lib/util.o lib/util_names.o \
lib/util_sock.o lib/sock_exec.o lib/util_sec.o \ lib/util_sock.o lib/sock_exec.o lib/util_sec.o \
lib/substitute.o lib/dbwrap_util.o \ lib/substitute.o lib/dbwrap_util.o \
lib/ms_fnmatch.o lib/select.o lib/errmap_unix.o \ lib/ms_fnmatch.o lib/errmap_unix.o \
lib/tallocmsg.o lib/dmallocmsg.o \ lib/tallocmsg.o lib/dmallocmsg.o \
libsmb/clisigning.o libsmb/smb_signing.o \ libsmb/clisigning.o libsmb/smb_signing.o \
lib/iconv.o lib/pam_errors.o intl/lang_tdb.o \ lib/iconv.o lib/pam_errors.o intl/lang_tdb.o \

View File

@@ -25,6 +25,7 @@
#include "popt_common.h" #include "popt_common.h"
#include "client/client_proto.h" #include "client/client_proto.h"
#include "../librpc/gen_ndr/cli_srvsvc.h" #include "../librpc/gen_ndr/cli_srvsvc.h"
#include "../lib/util/select.h"
#ifndef REGISTER #ifndef REGISTER
#define REGISTER 0 #define REGISTER 0

View File

@@ -716,12 +716,6 @@ NTSTATUS se_create_child_secdesc_buf(TALLOC_CTX *ctx,
const struct security_descriptor *parent_ctr, const struct security_descriptor *parent_ctr,
bool container); bool container);
/* The following definitions come from lib/select.c */
void sys_select_signal(char c);
int sys_select(int maxfd, fd_set *readfds, fd_set *writefds, fd_set *errorfds, struct timeval *tval);
int sys_select_intr(int maxfd, fd_set *readfds, fd_set *writefds, fd_set *errorfds, struct timeval *tval);
/* The following definitions come from lib/sendfile.c */ /* The following definitions come from lib/sendfile.c */
ssize_t sys_sendfile(int tofd, int fromfd, const DATA_BLOB *header, SMB_OFF_T offset, size_t count); ssize_t sys_sendfile(int tofd, int fromfd, const DATA_BLOB *header, SMB_OFF_T offset, size_t count);

View File

@@ -20,6 +20,7 @@
#include "includes.h" #include "includes.h"
#include <tevent_internal.h> #include <tevent_internal.h>
#include "../lib/util/select.h"
/* /*
* Return if there's something in the queue * Return if there's something in the queue

View File

@@ -21,6 +21,7 @@
#include "g_lock.h" #include "g_lock.h"
#include "librpc/gen_ndr/messaging.h" #include "librpc/gen_ndr/messaging.h"
#include "ctdbd_conn.h" #include "ctdbd_conn.h"
#include "../lib/util/select.h"
static NTSTATUS g_lock_force_unlock(struct g_lock_ctx *ctx, const char *name, static NTSTATUS g_lock_force_unlock(struct g_lock_ctx *ctx, const char *name,
struct server_id pid); struct server_id pid);

View File

@@ -18,6 +18,7 @@
*/ */
#include "includes.h" #include "includes.h"
#include "../lib/util/select.h"
struct packet_context { struct packet_context {
int fd; int fd;

View File

@@ -19,6 +19,7 @@
*/ */
#include "includes.h" #include "includes.h"
#include "../lib/util/select.h"
#ifdef HAVE_LIBREADLINE #ifdef HAVE_LIBREADLINE
# ifdef HAVE_READLINE_READLINE_H # ifdef HAVE_READLINE_READLINE_H

View File

@@ -22,6 +22,7 @@
#include "includes.h" #include "includes.h"
#include "memcache.h" #include "memcache.h"
#include "../lib/async_req/async_sock.h" #include "../lib/async_req/async_sock.h"
#include "../lib/util/select.h"
/**************************************************************************** /****************************************************************************
Get a port number in host byte order from a sockaddr_storage. Get a port number in host byte order from a sockaddr_storage.

View File

@@ -20,6 +20,7 @@
*/ */
#include "includes.h" #include "includes.h"
#include "../lib/util/select.h"
static const struct opcode_names { static const struct opcode_names {
const char *nmb_opcode_name; const char *nmb_opcode_name;

View File

@@ -22,6 +22,7 @@
#include "includes.h" #include "includes.h"
#include "nmbd/nmbd.h" #include "nmbd/nmbd.h"
#include "../lib/util/select.h"
extern int ClientNMB; extern int ClientNMB;
extern int ClientDGRAM; extern int ClientDGRAM;

View File

@@ -24,6 +24,7 @@
#include "librpc/gen_ndr/messaging.h" #include "librpc/gen_ndr/messaging.h"
#include "../lib/async_req/async_sock.h" #include "../lib/async_req/async_sock.h"
#include "ctdbd_conn.h" #include "ctdbd_conn.h"
#include "../lib/util/select.h"
extern bool global_machine_password_needs_changing; extern bool global_machine_password_needs_changing;

View File

@@ -18,6 +18,7 @@
*/ */
#include "includes.h" #include "includes.h"
#include "../lib/util/select.h"
#define SECURITY_MASK 0 #define SECURITY_MASK 0
#define SECURITY_SET 0 #define SECURITY_SET 0

View File

@@ -32,6 +32,7 @@
#include "../../nsswitch/libwbclient/wbc_async.h" #include "../../nsswitch/libwbclient/wbc_async.h"
#include "librpc/gen_ndr/messaging.h" #include "librpc/gen_ndr/messaging.h"
#include "secrets.h" #include "secrets.h"
#include "../lib/util/select.h"
#undef DBGC_CLASS #undef DBGC_CLASS
#define DBGC_CLASS DBGC_WINBIND #define DBGC_CLASS DBGC_WINBIND

View File

@@ -162,7 +162,8 @@ UTIL_SRC = '''../lib/util/rbtree.c ../lib/util/signal.c ../lib/util/time.c
../lib/util/become_daemon.c ../lib/util/system.c ../lib/util/become_daemon.c ../lib/util/system.c
../lib/util/tevent_unix.c ../lib/util/tevent_ntstatus.c ../lib/util/tevent_unix.c ../lib/util/tevent_ntstatus.c
../lib/util/smb_threads.c ../lib/util/util_id.c ../lib/util/smb_threads.c ../lib/util/util_id.c
../lib/util/blocking.c ../lib/util/rfc1738.c ''' ../lib/util/blocking.c ../lib/util/rfc1738.c
../lib/util/select.c'''
LIBTEVENT_SRC0 = '' LIBTEVENT_SRC0 = ''
@@ -194,7 +195,7 @@ LIB_SRC = '''${LIBSAMBAUTIL_SRC} ${UTIL_SRC}
lib/util.c lib/util_names.c lib/util.c lib/util_names.c
lib/util_sock.c lib/sock_exec.c lib/util_sec.c lib/util_sock.c lib/sock_exec.c lib/util_sec.c
lib/substitute.c lib/dbwrap_util.c lib/substitute.c lib/dbwrap_util.c
lib/ms_fnmatch.c lib/select.c lib/errmap_unix.c lib/ms_fnmatch.c lib/errmap_unix.c
lib/tallocmsg.c lib/dmallocmsg.c lib/tallocmsg.c lib/dmallocmsg.c
libsmb/clisigning.c libsmb/smb_signing.c libsmb/clisigning.c libsmb/smb_signing.c
lib/iconv.c lib/pam_errors.c intl/lang_tdb.c lib/iconv.c lib/pam_errors.c intl/lang_tdb.c

View File

@@ -24,51 +24,6 @@
#include "system/readline.h" #include "system/readline.h"
#include "lib/smbreadline/smbreadline.h" #include "lib/smbreadline/smbreadline.h"
/*******************************************************************
Similar to sys_select() but catch EINTR and continue.
This is what sys_select() used to do in Samba.
********************************************************************/
static int sys_select_intr(int maxfd, fd_set *readfds, fd_set *writefds, fd_set *errorfds, struct timeval *tval)
{
int ret;
fd_set *readfds2, readfds_buf, *writefds2, writefds_buf, *errorfds2, errorfds_buf;
struct timeval tval2, *ptval;
readfds2 = (readfds ? &readfds_buf : NULL);
writefds2 = (writefds ? &writefds_buf : NULL);
errorfds2 = (errorfds ? &errorfds_buf : NULL);
ptval = (tval ? &tval2 : NULL);
do {
if (readfds)
readfds_buf = *readfds;
if (writefds)
writefds_buf = *writefds;
if (errorfds)
errorfds_buf = *errorfds;
if (tval)
tval2 = *tval;
/* We must use select and not sys_select here. If we use
sys_select we'd lose the fact a signal occurred when sys_select
read a byte from the pipe. Fix from Mark Weaver
<mark-clist@npsl.co.uk>
*/
ret = select(maxfd, readfds2, writefds2, errorfds2, ptval);
} while (ret == -1 && errno == EINTR);
if (readfds)
*readfds = readfds_buf;
if (writefds)
*writefds = writefds_buf;
if (errorfds)
*errorfds = errorfds_buf;
return ret;
}
/**************************************************************************** /****************************************************************************
Display the prompt and wait for input. Call callback() regularly Display the prompt and wait for input. Call callback() regularly
****************************************************************************/ ****************************************************************************/