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:
@@ -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 \
|
||||||
|
|||||||
@@ -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
29
lib/util/select.h
Normal 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
|
||||||
@@ -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') ],
|
||||||
|
|||||||
@@ -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 \
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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.
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|||||||
Reference in New Issue
Block a user