X-Git-Url: https://git.decadent.org.uk/gitweb/?p=nfs-utils.git;a=blobdiff_plain;f=utils%2Fstatd%2Fstatd.c;h=321f7a945a81533da91ff8e1a8bc7b317c1e349f;hp=a44f39f2394097863c14de256801984d9e6907f3;hb=572efae32f6fb311dff0e065d0d1dd527db60d0c;hpb=7b01c4762ae242d2114cc6a59994f678b7d253fc diff --git a/utils/statd/statd.c b/utils/statd/statd.c index a44f39f..321f7a9 100644 --- a/utils/statd/statd.c +++ b/utils/statd/statd.c @@ -75,7 +75,7 @@ static struct option longopts[] = }; extern void sm_prog_1 (struct svc_req *, register SVCXPRT *); -extern int statd_get_socket(void); +static void load_state_number(void); #ifdef SIMULATIONS extern void simulator (int, char **); @@ -147,7 +147,7 @@ static void log_modes(void) * help the occasional admin. */ static void -usage() +usage(void) { fprintf(stderr,"usage: %s [options]\n", name_p); fprintf(stderr," -h, -?, --help Print this help screen.\n"); @@ -249,7 +249,6 @@ 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; @@ -445,7 +444,7 @@ int main (int argc, char **argv) /* Child. */ - log_init (name_p,version_p); + log_init (/*name_p,version_p*/); log_modes(); @@ -477,32 +476,31 @@ int main (int argc, char **argv) } /* Make sure we have a privilege port for calling into the kernel */ - statd_get_socket(); + if (statd_get_socket() < 0) + exit(1); /* If sm-notify didn't take all the state files, load * state information into our notify-list so we can * pass on any SM_NOTIFY that arrives */ load_state(); + load_state_number(); + pmap_unset (SM_PROG, SM_VERS); - for (;;) { - pmap_unset (SM_PROG, SM_VERS); + /* this registers both UDP and TCP services */ + rpc_init("statd", SM_PROG, SM_VERS, sm_prog_1, port); - /* If we got this far, we have successfully started, so notify parent */ - if (pipefds[1] > 0) { - status = 0; - write(pipefds[1], &status, 1); - close(pipefds[1]); - pipefds[1] = -1; - } + /* If we got this far, we have successfully started, so notify parent */ + if (pipefds[1] > 0) { + status = 0; + write(pipefds[1], &status, 1); + close(pipefds[1]); + pipefds[1] = -1; + } - /* this registers both UDP and TCP services */ - rpc_init("statd", SM_PROG, SM_VERS, sm_prog_1, port); + drop_privs(); - if (once) { - once = 0; - drop_privs(); - } + for (;;) { /* * Handle incoming requests: SM_NOTIFY socket requests, as * well as callbacks from lockd. @@ -529,3 +527,23 @@ int main (int argc, char **argv) } return 0; } + +static void +load_state_number(void) +{ + int fd; + + if ((fd = open(SM_STAT_PATH, O_RDONLY)) == -1) + return; + + read(fd, &MY_STATE, sizeof(MY_STATE)); + close(fd); + fd = open("/proc/sys/fs/nfs/nsm_local_state",O_WRONLY); + if (fd >= 0) { + char buf[20]; + snprintf(buf, sizeof(buf), "%d", MY_STATE); + write(fd, buf, strlen(buf)); + close(fd); + } + +}