summaryrefslogtreecommitdiffstats
path: root/contrib/amd/amd/nfs_start.c
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/amd/amd/nfs_start.c')
-rw-r--r--contrib/amd/amd/nfs_start.c166
1 files changed, 83 insertions, 83 deletions
diff --git a/contrib/amd/amd/nfs_start.c b/contrib/amd/amd/nfs_start.c
index 1bf6df1..f6aba94 100644
--- a/contrib/amd/amd/nfs_start.c
+++ b/contrib/amd/amd/nfs_start.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997-2004 Erez Zadok
+ * Copyright (c) 1997-2006 Erez Zadok
* Copyright (c) 1990 Jan-Simon Pendry
* Copyright (c) 1990 Imperial College of Science, Technology & Medicine
* Copyright (c) 1990 The Regents of the University of California.
@@ -36,9 +36,8 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * %W% (Berkeley) %G%
*
- * $Id: nfs_start.c,v 1.5.2.7 2004/01/06 03:15:16 ezk Exp $
+ * File: am-utils/amd/nfs_start.c
*
*/
@@ -52,8 +51,8 @@
# define SELECT_MAXWAIT 16
#endif /* not SELECT_MAXWAIT */
-SVCXPRT *nfsxprt;
-u_short nfs_port;
+SVCXPRT *nfsxprt = NULL;
+u_short nfs_port = 0;
#ifndef HAVE_SIGACTION
# define MASKED_SIGS (sigmask(SIGINT)|sigmask(SIGTERM)|sigmask(SIGCHLD)|sigmask(SIGHUP))
@@ -92,7 +91,9 @@ checkup(void)
}
}
-#endif /* DEBUG */
+#else /* not DEBUG */
+#define checkup()
+#endif /* not DEBUG */
static int
@@ -121,10 +122,6 @@ do_select(int smask, int fds, fd_set *fdp, struct timeval *tvp)
} else {
select_intr_valid = 1;
/*
- * Invalidate the current clock value
- */
- clock_valid = 0;
- /*
* Allow interrupts. If a signal
* occurs, then it will cause a longjmp
* up above.
@@ -151,9 +148,9 @@ do_select(int smask, int fds, fd_set *fdp, struct timeval *tvp)
/*
* Perhaps reload the cache?
*/
- if (do_mapc_reload < clocktime()) {
+ if (do_mapc_reload < clocktime(NULL)) {
mapc_reload();
- do_mapc_reload = clocktime() + ONE_HOUR;
+ do_mapc_reload = clocktime(NULL) + gopt.map_reload_interval;
}
return nsel;
}
@@ -168,26 +165,17 @@ rpc_pending_now(void)
{
struct timeval tvv;
int nsel;
-#ifdef FD_SET
fd_set readfds;
FD_ZERO(&readfds);
FD_SET(fwd_sock, &readfds);
-#else /* not FD_SET */
- int readfds = (1 << fwd_sock);
-#endif /* not FD_SET */
tvv.tv_sec = tvv.tv_usec = 0;
nsel = select(FD_SETSIZE, &readfds, (fd_set *) 0, (fd_set *) 0, &tvv);
if (nsel < 1)
return (0);
-#ifdef FD_SET
if (FD_ISSET(fwd_sock, &readfds))
return (1);
-#else /* not FD_SET */
- if (readfds & (1 << fwd_sock))
- return (1);
-#endif /* not FD_SET */
return (0);
}
@@ -203,7 +191,7 @@ run_rpc(void)
int smask = sigblock(MASKED_SIGS);
#endif /* not HAVE_SIGACTION */
- next_softclock = clocktime();
+ next_softclock = clocktime(NULL);
amd_state = Run;
@@ -216,31 +204,27 @@ run_rpc(void)
struct timeval tvv;
int nsel;
time_t now;
-#ifdef HAVE_SVC_GETREQSET
fd_set readfds;
+#ifdef HAVE_SVC_GETREQSET
memmove(&readfds, &svc_fdset, sizeof(svc_fdset));
- FD_SET(fwd_sock, &readfds);
#else /* not HAVE_SVC_GETREQSET */
-# ifdef FD_SET
- fd_set readfds;
FD_ZERO(&readfds);
+# ifdef HAVE_FD_SET_FDS_BITS
readfds.fds_bits[0] = svc_fds;
- FD_SET(fwd_sock, &readfds);
-# else /* not FD_SET */
- int readfds = svc_fds | (1 << fwd_sock);
-# endif /* not FD_SET */
+# else /* not HAVE_FD_SET_FDS_BITS */
+ readfds = svc_fds;
+# endif /* not HAVE_FD_SET_FDS_BITS */
#endif /* not HAVE_SVC_GETREQSET */
+ FD_SET(fwd_sock, &readfds);
-#ifdef DEBUG
checkup();
-#endif /* DEBUG */
/*
* If the full timeout code is not called,
* then recompute the time delta manually.
*/
- now = clocktime();
+ now = clocktime(NULL);
if (next_softclock <= now) {
if (amd_state == Finishing)
@@ -251,29 +235,30 @@ run_rpc(void)
}
tvv.tv_usec = 0;
- if (amd_state == Finishing && last_used_map < 0) {
+ if (amd_state == Finishing && get_exported_ap(0) == NULL) {
flush_mntfs();
amd_state = Quit;
break;
}
+
+#ifdef HAVE_FS_AUTOFS
+ autofs_add_fdset(&readfds);
+#endif /* HAVE_FS_AUTOFS */
+
if (tvv.tv_sec <= 0)
tvv.tv_sec = SELECT_MAXWAIT;
-#ifdef DEBUG
if (tvv.tv_sec) {
dlog("Select waits for %ds", (int) tvv.tv_sec);
} else {
dlog("Select waits for Godot");
}
-#endif /* DEBUG */
nsel = do_select(smask, FD_SETSIZE, &readfds, &tvv);
switch (nsel) {
case -1:
if (errno == EINTR) {
-#ifdef DEBUG
dlog("select interrupted");
-#endif /* DEBUG */
continue;
}
plog(XLOG_ERROR, "select: %m");
@@ -284,22 +269,22 @@ run_rpc(void)
default:
/*
- * Read all pending NFS responses at once to avoid having responses.
+ * Read all pending NFS responses at once to avoid having responses
* queue up as a consequence of retransmissions.
*/
-#ifdef FD_SET
if (FD_ISSET(fwd_sock, &readfds)) {
FD_CLR(fwd_sock, &readfds);
-#else /* not FD_SET */
- if (readfds & (1 << fwd_sock)) {
- readfds &= ~(1 << fwd_sock);
-#endif /* not FD_SET */
--nsel;
do {
fwd_reply();
} while (rpc_pending_now() > 0);
}
+#ifdef HAVE_FS_AUTOFS
+ if (nsel)
+ nsel = autofs_handle_fdset(&readfds, nsel);
+#endif /* HAVE_FS_AUTOFS */
+
if (nsel) {
/*
* Anything left must be a normal
@@ -308,11 +293,11 @@ run_rpc(void)
#ifdef HAVE_SVC_GETREQSET
svc_getreqset(&readfds);
#else /* not HAVE_SVC_GETREQSET */
-# ifdef FD_SET
+# ifdef HAVE_FD_SET_FDS_BITS
svc_getreq(readfds.fds_bits[0]);
-# else /* not FD_SET */
+# else /* not HAVE_FD_SET_FDS_BITS */
svc_getreq(readfds);
-# endif /* not FD_SET */
+# endif /* not HAVE_FD_SET_FDS_BITS */
#endif /* not HAVE_SVC_GETREQSET */
}
break;
@@ -344,26 +329,16 @@ mount_automounter(int ppid)
int nmount, ret;
int soNFS;
int udp_soAMQ, tcp_soAMQ;
-#ifdef HAVE_TRANSPORT_TYPE_TLI
struct netconfig *udp_amqncp, *tcp_amqncp;
-#endif /* HAVE_TRANSPORT_TYPE_TLI */
/*
- * Create the nfs service for amd
+ * This must be done first, because it attempts to bind
+ * to various UDP ports and we don't want anything else
+ * potentially taking over those ports before we get a chance
+ * to reserve them.
*/
-#ifdef HAVE_TRANSPORT_TYPE_TLI
- ret = create_nfs_service(&soNFS, &nfs_port, &nfsxprt, nfs_program_2);
- if (ret != 0)
- return ret;
- ret = create_amq_service(&udp_soAMQ, &udp_amqp, &udp_amqncp, &tcp_soAMQ, &tcp_amqp, &tcp_amqncp);
-#else /* not HAVE_TRANSPORT_TYPE_TLI */
- ret = create_nfs_service(&soNFS, &nfs_port, &nfsxprt, nfs_program_2);
- if (ret != 0)
- return ret;
- ret = create_amq_service(&udp_soAMQ, &udp_amqp, &tcp_soAMQ, &tcp_amqp);
-#endif /* not HAVE_TRANSPORT_TYPE_TLI */
- if (ret != 0)
- return ret;
+ if (gopt.flags & CFM_RESTART_EXISTING_MOUNTS)
+ restart_automounter_nodes();
/*
* Start RPC forwarding
@@ -385,6 +360,46 @@ mount_automounter(int ppid)
restart();
/*
+ * Create the nfs service for amd
+ * If nfs_port is already initialized, it means we
+ * already created the service during restart_automounter_nodes().
+ */
+ if (nfs_port == 0) {
+ ret = create_nfs_service(&soNFS, &nfs_port, &nfsxprt, nfs_program_2);
+ if (ret != 0)
+ return ret;
+ }
+ xsnprintf(pid_fsname, sizeof(pid_fsname), "%s:(pid%ld,port%u)",
+ am_get_hostname(), (long) am_mypid, nfs_port);
+
+ /* security: if user sets -D amq, don't even create listening socket */
+ if (!amuDebug(D_AMQ)) {
+ ret = create_amq_service(&udp_soAMQ,
+ &udp_amqp,
+ &udp_amqncp,
+ &tcp_soAMQ,
+ &tcp_amqp,
+ &tcp_amqncp,
+ gopt.preferred_amq_port);
+ if (ret != 0)
+ return ret;
+ }
+
+#ifdef HAVE_FS_AUTOFS
+ if (amd_use_autofs) {
+ /*
+ * Create the autofs service for amd.
+ */
+ ret = create_autofs_service();
+ /* if autofs service fails it is OK if using a test amd */
+ if (ret != 0) {
+ plog(XLOG_WARNING, "autofs service registration failed, turning off autofs support");
+ amd_use_autofs = 0;
+ }
+ }
+#endif /* HAVE_FS_AUTOFS */
+
+ /*
* Mount the top-level auto-mountpoints
*/
nmount = mount_exported();
@@ -401,41 +416,26 @@ mount_automounter(int ppid)
return 0;
}
-#ifdef DEBUG
- amuDebug(D_AMQ) {
-#endif /* DEBUG */
+ if (!amuDebug(D_AMQ)) {
/*
* Complete registration of amq (first TCP service then UDP)
*/
unregister_amq();
-#ifdef HAVE_TRANSPORT_TYPE_TLI
- ret = svc_reg(tcp_amqp, get_amd_program_number(), AMQ_VERSION,
- amq_program_1, tcp_amqncp);
-#else /* not HAVE_TRANSPORT_TYPE_TLI */
- ret = svc_register(tcp_amqp, get_amd_program_number(), AMQ_VERSION,
- amq_program_1, IPPROTO_TCP);
-#endif /* not HAVE_TRANSPORT_TYPE_TLI */
+ ret = amu_svc_register(tcp_amqp, get_amd_program_number(), AMQ_VERSION,
+ amq_program_1, IPPROTO_TCP, tcp_amqncp);
if (ret != 1) {
plog(XLOG_FATAL, "unable to register (AMQ_PROGRAM=%d, AMQ_VERSION, tcp)", get_amd_program_number());
return 3;
}
-#ifdef HAVE_TRANSPORT_TYPE_TLI
- ret = svc_reg(udp_amqp, get_amd_program_number(), AMQ_VERSION,
- amq_program_1, udp_amqncp);
-#else /* not HAVE_TRANSPORT_TYPE_TLI */
- ret = svc_register(udp_amqp, get_amd_program_number(), AMQ_VERSION,
- amq_program_1, IPPROTO_UDP);
-#endif /* not HAVE_TRANSPORT_TYPE_TLI */
+ ret = amu_svc_register(udp_amqp, get_amd_program_number(), AMQ_VERSION,
+ amq_program_1, IPPROTO_UDP, udp_amqncp);
if (ret != 1) {
plog(XLOG_FATAL, "unable to register (AMQ_PROGRAM=%d, AMQ_VERSION, udp)", get_amd_program_number());
return 4;
}
-
-#ifdef DEBUG
}
-#endif /* DEBUG */
/*
* Start timeout_mp rolling
OpenPOWER on IntegriCloud