X-Git-Url: https://git.decadent.org.uk/gitweb/?a=blobdiff_plain;ds=sidebyside;f=utils%2Fstatd%2Fstatd.c;h=6c5dbde419ed6d932b569d740669efecc10467c0;hb=03534540a25fe4c0679928a2f3f023e596c78dc4;hp=62009111edd5a0a594c823c3dc62972fa58f2193;hpb=f113db5225e2954a53fd7eecccfc08326904909f;p=nfs-utils.git diff --git a/utils/statd/statd.c b/utils/statd/statd.c index 6200911..6c5dbde 100644 --- a/utils/statd/statd.c +++ b/utils/statd/statd.c @@ -70,6 +70,7 @@ static struct option longopts[] = { "state-directory-path", 1, 0, 'P' }, { "notify-mode", 0, 0, 'N' }, { "ha-callout", 1, 0, 'H' }, + { "no-notify", 0, 0, 'L' }, { NULL, 0, 0, 0 } }; @@ -158,6 +159,7 @@ usage() fprintf(stderr," -n, --name Specify a local hostname.\n"); fprintf(stderr," -P State directory path.\n"); fprintf(stderr," -N Run in notify only mode.\n"); + fprintf(stderr," -L, --no-notify Do not perform any notification.\n"); fprintf(stderr," -H Specify a high-availability callout program.\n"); } @@ -228,12 +230,10 @@ static void run_sm_notify(int outport) av[ac++] = op; } if (run_mode & STATIC_HOSTNAME) { - av[ac++] = "-N"; + av[ac++] = "-v"; av[ac++] = MY_NAME; } av[ac] = NULL; - fprintf(stderr, "%s: -N deprecated, consider using /usr/sbin/sm-notify directly\n", - name_p); execv(av[0], av); fprintf(stderr, "%s: failed to run %s\n", name_p, av[0]); exit(2); @@ -249,6 +249,7 @@ int main (int argc, char **argv) int arg; int port = 0, out_port = 0; struct rlimit rlim; + int once = 1; int pipefds[2] = { -1, -1}; char status; @@ -274,7 +275,7 @@ int main (int argc, char **argv) MY_NAME = NULL; /* Process command line switches */ - while ((arg = getopt_long(argc, argv, "h?vVFNH:dn:p:o:P:", longopts, NULL)) != EOF) { + while ((arg = getopt_long(argc, argv, "h?vVFNH:dn:p:o:P:L", longopts, NULL)) != EOF) { switch (arg) { case 'V': /* Version */ case 'v': @@ -286,6 +287,9 @@ int main (int argc, char **argv) case 'N': run_mode |= MODE_NOTIFY_ONLY; break; + case 'L': /* Listen only */ + run_mode |= MODE_NO_NOTIFY; + break; case 'd': /* No daemon only - log to stderr */ run_mode |= MODE_LOG_STDERR; break; @@ -363,8 +367,11 @@ int main (int argc, char **argv) exit(-1); } - if (run_mode & MODE_NOTIFY_ONLY) + if (run_mode & MODE_NOTIFY_ONLY) { + fprintf(stderr, "%s: -N deprecated, consider using /usr/sbin/sm-notify directly\n", + name_p); run_sm_notify(out_port); + } if (!(run_mode & MODE_NODAEMON)) { @@ -458,17 +465,19 @@ int main (int argc, char **argv) create_pidfile(); atexit(truncate_pidfile); - switch (pid = fork()) { - case 0: - run_sm_notify(out_port); - break; - case -1: - break; - default: - waitpid(pid, NULL, 0); - } + if (! (run_mode & MODE_NO_NOTIFY)) + switch (pid = fork()) { + case 0: + run_sm_notify(out_port); + break; + case -1: + break; + default: + waitpid(pid, NULL, 0); + } - drop_privs(); + /* Make sure we have a privilege port for calling into the kernel */ + statd_get_socket(); for (;;) { pmap_unset (SM_PROG, SM_VERS); @@ -484,6 +493,10 @@ int main (int argc, char **argv) /* this registers both UDP and TCP services */ rpc_init("statd", SM_PROG, SM_VERS, sm_prog_1, port); + if (once) { + once = 0; + drop_privs(); + } /* * Handle incoming requests: SM_NOTIFY socket requests, as * well as callbacks from lockd. @@ -496,15 +509,17 @@ int main (int argc, char **argv) * responding to SM_SIMU_CRASH is an important use cases to * get perfect. */ - switch (pid = fork()) { - case 0: - run_sm_notify(out_port); - break; - case -1: - break; - default: - waitpid(pid, NULL, 0); - } + if (! (run_mode & MODE_NO_NOTIFY)) + switch (pid = fork()) { + case 0: + run_sm_notify(out_port); + break; + case -1: + break; + default: + waitpid(pid, NULL, 0); + } + } return 0; }