The branch, master has been updated via 811e0e6 lib: Make DEBUG a subsystem of its own via a7c243b lib: Make close_low_fd() independently linkable via 4ac12fb debug: Use close_low_fd in reopen_logs_internal via b310ea6 lib: Use close_low_fd in close_low_fds via 2dd8b6b lib: Add close_low_fd from 9b24abe fix unstrcpy
http://gitweb.samba.org/?p=samba.git;a=shortlog;h=master - Log ----------------------------------------------------------------- commit 811e0e6f9962adbf0d12448044f17542b92ad15e Author: Volker Lendecke <v...@samba.org> Date: Wed Jul 30 14:12:54 2014 +0000 lib: Make DEBUG a subsystem of its own In the future this might become a library, but even with the SUBSYSTEM it should be clear what debug.c depends upon. Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> Autobuild-User(master): Jeremy Allison <j...@samba.org> Autobuild-Date(master): Sat Aug 2 00:36:50 CEST 2014 on sn-devel-104 commit a7c243b62c6eaaca317fefa41e12a44b664c12ac Author: Volker Lendecke <v...@samba.org> Date: Thu Jul 31 09:40:04 2014 +0000 lib: Make close_low_fd() independently linkable Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit 4ac12fb2f7b0c949448d38feb0e6dbdb1b928993 Author: Volker Lendecke <v...@samba.org> Date: Tue Jul 29 20:43:05 2014 +0200 debug: Use close_low_fd in reopen_logs_internal Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit b310ea63536dd81fee6c5c94dac4666aa7080f1f Author: Volker Lendecke <v...@samba.org> Date: Tue Jul 29 20:42:18 2014 +0200 lib: Use close_low_fd in close_low_fds Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit 2dd8b6b25c76bd426ea0ed9fa9cce6cc09297503 Author: Volker Lendecke <v...@samba.org> Date: Tue Jul 29 20:35:10 2014 +0200 lib: Add close_low_fd This factors out the essential code from close_low_fds for one file descriptor: Redirect a fd to /dev/null Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> ----------------------------------------------------------------------- Summary of changes: lib/util/become_daemon.c | 51 ++++++---------- lib/util/close_low_fd.c | 65 ++++++++++++++++++++ .../srv_epmapper.h => lib/util/close_low_fd.h | 22 +++---- lib/util/debug.c | 3 +- lib/util/samba_util.h | 2 - lib/util/wscript_build | 14 ++++- 6 files changed, 106 insertions(+), 51 deletions(-) create mode 100644 lib/util/close_low_fd.c copy source3/rpc_server/epmapper/srv_epmapper.h => lib/util/close_low_fd.h (64%) Changeset truncated at 500 lines: diff --git a/lib/util/become_daemon.c b/lib/util/become_daemon.c index 0671a1e..17e0baf 100644 --- a/lib/util/become_daemon.c +++ b/lib/util/become_daemon.c @@ -27,6 +27,7 @@ #if HAVE_SYSTEMD #include <systemd/sd-daemon.h> #endif +#include "lib/util/close_low_fd.h" /******************************************************************* Close the low 3 fd's and open dev/null in their place. @@ -34,42 +35,28 @@ _PUBLIC_ void close_low_fds(bool stdin_too, bool stdout_too, bool stderr_too) { -#ifndef VALGRIND - int fd; - int i; - if (stdin_too) - close(0); - if (stdout_too) - close(1); - - if (stderr_too) - close(2); - - /* try and use up these file descriptors, so silly - library routines writing to stdout etc won't cause havoc */ - for (i=0;i<3;i++) { - if (i == 0 && !stdin_too) - continue; - if (i == 1 && !stdout_too) - continue; - if (i == 2 && !stderr_too) - continue; - - fd = open("/dev/null",O_RDWR,0); - if (fd < 0) - fd = open("/dev/null",O_WRONLY,0); - if (fd < 0) { - DEBUG(0,("Can't open /dev/null\n")); - return; + if (stdin_too) { + int ret = close_low_fd(0); + if (ret != 0) { + DEBUG(0, ("%s: close_low_fd(0) failed: %s\n", + __func__, strerror(ret))); } - if (fd != i) { - DEBUG(0,("Didn't get file descriptor %d\n",i)); - close(fd); - return; + } + if (stdout_too) { + int ret = close_low_fd(1); + if (ret != 0) { + DEBUG(0, ("%s: close_low_fd(1) failed: %s\n", + __func__, strerror(ret))); + } + } + if (stderr_too) { + int ret = close_low_fd(2); + if (ret != 0) { + DEBUG(0, ("%s: close_low_fd(2) failed: %s\n", + __func__, strerror(ret))); } } -#endif } /**************************************************************************** diff --git a/lib/util/close_low_fd.c b/lib/util/close_low_fd.c new file mode 100644 index 0000000..b11d25f --- /dev/null +++ b/lib/util/close_low_fd.c @@ -0,0 +1,65 @@ +/* + * Unix SMB/CIFS implementation. + * Samba utility functions + * Copyright (C) Volker Lendecke 2014 + * + * 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 "replace.h" +#include "system/filesys.h" +#include "close_low_fd.h" + +_PUBLIC_ int close_low_fd(int fd) +{ +#ifndef VALGRIND + int ret, dev_null; + + dev_null = open("/dev/null", O_RDWR, 0); + + if ((dev_null == -1) && (errno = ENFILE)) { + /* + * Try to free up an fd + */ + ret = close(fd); + if (ret != 0) { + return errno; + } + } + + dev_null = open("/dev/null", O_RDWR, 0); + if (dev_null == -1) { + dev_null = open("/dev/null", O_WRONLY, 0); + } + if (dev_null == -1) { + return errno; + } + + if (dev_null == fd) { + /* + * This can happen in the ENFILE case above + */ + return 0; + } + + ret = dup2(dev_null, fd); + if (ret == -1) { + int err = errno; + close(dev_null); + return err; + } + close(dev_null); +#endif + return 0; +} diff --git a/source3/rpc_server/epmapper/srv_epmapper.h b/lib/util/close_low_fd.h similarity index 64% copy from source3/rpc_server/epmapper/srv_epmapper.h copy to lib/util/close_low_fd.h index 1abc583..954d1d2 100644 --- a/source3/rpc_server/epmapper/srv_epmapper.h +++ b/lib/util/close_low_fd.h @@ -1,9 +1,7 @@ /* * Unix SMB/CIFS implementation. - * - * Endpoint server for the epmapper pipe - * - * Copyright (C) 2010-2011 Andreas Schneider <a...@samba.org> + * Samba utility functions + * Copyright (C) Volker Lendecke 2014 * * 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 @@ -19,16 +17,12 @@ * along with this program. If not, see <http://www.gnu.org/licenses/>. */ -#ifndef _SRV_EPMAPPER_H_ -#define _SRV_EPMAPPER_H_ +#ifndef _CLOSE_LOW_FD_H +#define _CLOSE_LOW_FD_H -/** - * @brief Cleanup memory and other stuff. +/* + * Redirect "fd" to /dev/null */ -void srv_epmapper_cleanup(void); - -bool srv_epmapper_delete_endpoints(struct pipes_struct *p); - -#endif /*_SRV_EPMAPPER_H_ */ +int close_low_fd(int fd); -/* vim: set ts=8 sw=8 noet cindent syntax=c.doxygen: */ +#endif diff --git a/lib/util/debug.c b/lib/util/debug.c index 33cbed2..2779dd3 100644 --- a/lib/util/debug.c +++ b/lib/util/debug.c @@ -23,6 +23,7 @@ #include "system/filesys.h" #include "system/syslog.h" #include "lib/util/time_basic.h" +#include "lib/util/close_low_fd.h" /* define what facility to use for syslog */ #ifndef SYSLOG_FACILITY @@ -617,7 +618,7 @@ bool reopen_logs_internal(void) at the logfile. There really isn't much that can be done on such a fundamental failure... */ - close_low_fds(false, false, true); + close_low_fd(2); } } diff --git a/lib/util/samba_util.h b/lib/util/samba_util.h index 2ffe028..233b5fd 100644 --- a/lib/util/samba_util.h +++ b/lib/util/samba_util.h @@ -836,8 +836,6 @@ _PUBLIC_ void *idr_find(struct idr_context *idp, int id); */ _PUBLIC_ int idr_remove(struct idr_context *idp, int id); -/* The following definitions come from lib/util/become_daemon.c */ - /** Close the low 3 fd's and open dev/null in their place **/ diff --git a/lib/util/wscript_build b/lib/util/wscript_build index 8be2c2e..7c4abf9 100755 --- a/lib/util/wscript_build +++ b/lib/util/wscript_build @@ -5,16 +5,26 @@ bld.SAMBA_SUBSYSTEM('time-basic', deps='replace', local_include=False) +bld.SAMBA_SUBSYSTEM('close-low-fd', + source='close_low_fd.c', + deps='replace', + local_include=False) + +bld.SAMBA_SUBSYSTEM('samba-debug', + source='debug.c', + deps='replace time-basic close-low-fd talloc', + local_include=False) + bld.SAMBA_LIBRARY('samba-util', source='''talloc_stack.c smb_threads.c xfile.c data_blob.c util_file.c time.c rbtree.c rfc1738.c select.c getpass.c genrand.c fsusage.c blocking.c become_daemon.c signal.c system.c params.c util.c util_id.c util_net.c - util_strlist.c util_paths.c idtree.c debug.c fault.c base64.c + util_strlist.c util_paths.c idtree.c fault.c base64.c util_str.c util_str_common.c substitute.c ms_fnmatch.c server_id.c dprintf.c parmlist.c bitmap.c pidfile.c tevent_debug.c util_process.c memcache.c''', - deps='DYNCONFIG time-basic', + deps='DYNCONFIG time-basic close-low-fd samba-debug', public_deps='talloc tevent execinfo pthread LIBCRYPTO charset util_setid systemd-daemon', public_headers='debug.h attr.h byteorder.h data_blob.h memory.h safe_string.h time.h talloc_stack.h xfile.h dlinklist.h samba_util.h string_wrappers.h', header_path= [ ('dlinklist.h samba_util.h', '.'), ('*', 'util') ], -- Samba Shared Repository