]> git.decadent.org.uk Git - nfs-utils.git/blobdiff - utils/statd/statd.c
statd: Support TI-RPC statd listener
[nfs-utils.git] / utils / statd / statd.c
index 72c9b41bd4c44c2fd3f632dda89ff0bf6d640dde..7be6454cbe171bef72b2577aa7cf2f1ec1b68253 100644 (file)
@@ -90,13 +90,18 @@ sm_prog_1_wrapper (struct svc_req *rqstp, register SVCXPRT *transp)
 #define sm_prog_1 sm_prog_1_wrapper
 #endif
 
+static void
+statd_unregister(void) {
+       nfs_svc_unregister(SM_PROG, SM_VERS);
+}
+
 /*
  * Signal handler.
  */
 static void 
 killer (int sig)
 {
-       pmap_unset (SM_PROG, SM_VERS);
+       statd_unregister ();
        xlog_err ("Caught signal %d, un-registering and exiting", sig);
 }
 
@@ -125,6 +130,9 @@ static void log_modes(void)
                strcat(buf,"No-Daemon ");
        if (run_mode & MODE_LOG_STDERR)
                strcat(buf,"Log-STDERR ");
+#ifdef HAVE_LIBTIRPC
+       strcat(buf, "TI-RPC ");
+#endif
 
        xlog_warn(buf);
 }
@@ -424,10 +432,29 @@ int main (int argc, char **argv)
        xlog(D_GENERAL, "Local NSM state number: %d", MY_STATE);
        nsm_update_kernel_state(MY_STATE);
 
-       pmap_unset (SM_PROG, SM_VERS);
+       /*
+        * ORDER
+        * Clear old listeners while still root, to override any
+        * permission checking done by rpcbind.
+        */
+       statd_unregister();
+
+       /*
+        * ORDER
+        */
+       if (!nsm_drop_privileges(pidfd))
+               exit(1);
 
-       /* this registers both UDP and TCP services */
-       rpc_init("statd", SM_PROG, SM_VERS, sm_prog_1, port);
+       /*
+        * ORDER
+        * Create RPC listeners after dropping privileges.  This permits
+        * statd to unregister its own listeners when it exits.
+        */
+       if (nfs_svc_create("statd", SM_PROG, SM_VERS, sm_prog_1, port) == 0) {
+               xlog(L_ERROR, "failed to create RPC listeners, exiting");
+               exit(1);
+       }
+       atexit(statd_unregister);
 
        /* If we got this far, we have successfully started, so notify parent */
        if (pipefds[1] > 0) {
@@ -440,9 +467,6 @@ int main (int argc, char **argv)
                pipefds[1] = -1;
        }
 
-       if (!nsm_drop_privileges(pidfd))
-               exit(1);
-
        for (;;) {
                /*
                 * Handle incoming requests:  SM_NOTIFY socket requests, as