X-Git-Url: https://git.decadent.org.uk/gitweb/?p=nfs-utils.git;a=blobdiff_plain;f=utils%2Fstatd%2Fstatd.c;h=8ebb8083b5832545dc4ea2fee9e71a715fbd2d16;hp=f666bcd4cba4e1e61247e715d293e06fc281fd88;hb=ac5b03be829b4c9369ebfb07a688308721103228;hpb=af93e0306d87bba3f703386fd6390e9bf8e76816 diff --git a/utils/statd/statd.c b/utils/statd/statd.c index f666bcd..8ebb808 100644 --- a/utils/statd/statd.c +++ b/utils/statd/statd.c @@ -7,7 +7,11 @@ * NSM for Linux. */ -#include "config.h" +#ifdef HAVE_CONFIG_H +#include +#endif + +#include #include #include #include @@ -22,6 +26,7 @@ #include #include "statd.h" #include "version.h" +#include "nfslib.h" /* Socket operations */ #include @@ -111,7 +116,8 @@ killer (int sig) static void sigusr (int sig) { - dprintf (N_DEBUG, "Caught signal %d, re-reading notify list.", sig); + dprintf (N_DEBUG, "Caught signal %d, re-notifying (state %d).", sig, + MY_STATE); re_notify = 1; } @@ -193,8 +199,10 @@ static void drop_privs(void) struct stat st; if (stat(SM_DIR, &st) == -1 && - stat(DIR_BASE, &st) == -1) + stat(DIR_BASE, &st) == -1) { st.st_uid = 0; + st.st_gid = 0; + } if (st.st_uid == 0) { note(N_WARNING, "statd running as root. chown %s to choose different user\n", @@ -284,6 +292,7 @@ int main (int argc, char **argv) } break; case 'n': /* Specify local hostname */ + run_mode |= STATIC_HOSTNAME; MY_NAME = xstrdup(optarg); break; case 'P': @@ -399,14 +408,12 @@ int main (int argc, char **argv) } } tempfd = open("/dev/null", O_RDWR); - close(0); dup2(tempfd, 0); - close(1); dup2(tempfd, 1); - close(2); dup2(tempfd, 2); - fdmax = sysconf (_SC_OPEN_MAX); - for (filedes = 3; filedes < fdmax; filedes++) - if (filedes != pipefds[1]) - close (filedes); - + dup2(tempfd, 0); + dup2(tempfd, 1); + dup2(tempfd, 2); + dup2(pipefds[1], 3); + pipefds[1] = 3; + closeall(4); } /* Child. */ @@ -422,6 +429,11 @@ int main (int argc, char **argv) signal(SIGUSR1, sigusr); /* WARNING: the following works on Linux and SysV, but not BSD! */ signal(SIGCHLD, SIG_IGN); + /* + * Ignore SIGPIPE to avoid statd dying when peers close their + * TCP connection while we're trying to reply to them. + */ + signal(SIGPIPE, SIG_IGN); /* initialize out_port */ statd_get_socket(out_port);