From c565ac103a1814d919301d11faa118feb50c5f2b Mon Sep 17 00:00:00 2001 From: obrien Date: Wed, 5 Dec 2007 16:00:42 +0000 Subject: Merge rev. 1.7 (change mounting directory to match traditional FreeBSD /etc/defaults/rc.conf) into 6.1.5. --- contrib/amd/amd/amd.c | 252 +++++++++++++++++++++++++++----------------------- 1 file changed, 138 insertions(+), 114 deletions(-) (limited to 'contrib/amd') diff --git a/contrib/amd/amd/amd.c b/contrib/amd/amd/amd.c index f724bd8..3fc25f8 100644 --- a/contrib/amd/amd/amd.c +++ b/contrib/amd/amd/amd.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997-2004 Erez Zadok + * Copyright (c) 1997-2006 Erez Zadok * Copyright (c) 1989 Jan-Simon Pendry * Copyright (c) 1989 Imperial College of Science, Technology & Medicine * Copyright (c) 1989 The Regents of the University of California. @@ -36,13 +36,15 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * %W% (Berkeley) %G% * * $Id: amd.c,v 1.8.2.6 2004/01/06 03:15:16 ezk Exp $ - * $FreeBSD$ + * File: am-utils/amd/amd.c * */ +#include +__FBSDID("$FreeBSD$"); + /* * Automounter */ @@ -55,9 +57,10 @@ struct amu_global_options gopt; /* where global options are stored */ -char pid_fsname[16 + MAXHOSTNAMELEN]; /* "kiska.southseas.nz:(pid%d)" */ +char pid_fsname[SIZEOF_PID_FSNAME]; /* "kiska.southseas.nz:(pid%d)" */ char *hostdomain = "unknown.domain"; -char hostd[2 * MAXHOSTNAMELEN + 1]; /* Host+domain */ +#define SIZEOF_HOSTD (2 * MAXHOSTNAMELEN + 1) /* Host+domain */ +char hostd[SIZEOF_HOSTD]; /* Host+domain */ char *endian = ARCH_ENDIAN; /* Big or Little endian */ char *cpu = HOST_CPU; /* CPU type */ char *PrimNetName; /* name of primary network */ @@ -72,6 +75,10 @@ struct amd_stats amd_stats; /* Server statistics */ struct in_addr myipaddr; /* (An) IP address of this host */ time_t do_mapc_reload = 0; /* mapc_reload() call required? */ +#ifdef HAVE_FS_AUTOFS +int amd_use_autofs = 0; +#endif /* HAVE_FS_AUTOFS */ + #ifdef HAVE_SIGACTION sigset_t masked_sigs; #endif /* HAVE_SIGACTION */ @@ -119,10 +126,8 @@ sighup(int sig) signal(sig, sighup); #endif /* REINSTALL_SIGNAL_HANDLER */ -#ifdef DEBUG if (sig != SIGHUP) dlog("spurious call to sighup"); -#endif /* DEBUG */ /* * Force a reload by zero'ing the timer */ @@ -134,7 +139,26 @@ sighup(int sig) static RETSIGTYPE parent_exit(int sig) { - exit(0); + /* + * This signal handler is called during Amd initialization. The parent + * forks a child to do all the hard automounting work, and waits for a + * SIGQUIT signal from the child. When the parent gets the signal it's + * supposed to call this handler and exit(3), thus completing the + * daemonizing process. Alas, on some systems, especially Linux 2.4/2.6 + * with Glibc, exit(3) doesn't always terminate the parent process. + * Worse, the parent process now refuses to accept any more SIGQUIT + * signals -- they are blocked. What's really annoying is that this + * doesn't happen all the time, suggesting a race condition somewhere. + * (This happens even if I change the logic to use another signal.) I + * traced this to something which exit(3) does in addition to exiting the + * process, probably some atexit() stuff or other side-effects related to + * signal handling. Either way, since at this stage the parent process + * just needs to terminate, I'm simply calling _exit(2). Note also that + * the OpenGroup doesn't list exit(3) as a recommended "Base Interface" + * but they do list _exit(2) as one. This fix seems to work reliably all + * the time. -Erez (2/27/2005) + */ + _exit(0); } @@ -146,6 +170,7 @@ daemon_mode(void) #ifdef HAVE_SIGACTION struct sigaction sa, osa; + memset(&sa, 0, sizeof(sa)); sa.sa_handler = parent_exit; sa.sa_flags = 0; sigemptyset(&(sa.sa_mask)); @@ -218,6 +243,7 @@ init_global_options(void) #if defined(HAVE_SYS_UTSNAME_H) && defined(HAVE_UNAME) static struct utsname un; #endif /* defined(HAVE_SYS_UTSNAME_H) && defined(HAVE_UNAME) */ + int i; memset(&gopt, 0, sizeof(struct amu_global_options)); @@ -227,9 +253,15 @@ init_global_options(void) /* automounter temp dir */ gopt.auto_dir = "/.amd_mnt"; + /* toplevel attribute cache timeout */ + gopt.auto_attrcache = 0; + /* cluster name */ gopt.cluster = NULL; + /* executable map timeout */ + gopt.exec_map_timeout = AMFS_EXEC_MAP_TIMEOUT; + /* * kernel architecture: this you must get from uname() if possible. */ @@ -261,11 +293,11 @@ init_global_options(void) /* local domain */ gopt.sub_domain = NULL; - /* NFS retransmit counter */ - gopt.amfs_auto_retrans = -1; - - /* NFS retry interval */ - gopt.amfs_auto_timeo = -1; + /* reset NFS (and toplvl) retransmit counter and retry interval */ + for (i=0; i