* NSM for Linux.
*/
-#include "config.h"
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <sys/stat.h>
#include <limits.h>
#include <signal.h>
#include <unistd.h>
#include <grp.h>
#include "statd.h"
#include "version.h"
+#include "nfslib.h"
/* Socket operations */
#include <sys/types.h>
* two copies of each - one in main(), one static in log.c...
* It also eliminates the 256-char static in log.c */
char *name_p = NULL;
-char *version_p = NULL;
+const char *version_p = NULL;
/* PRC: a high-availability callout program can be specified with -H
* When this is done, the program will receive callouts whenever clients
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;
}
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",
}
break;
case 'n': /* Specify local hostname */
+ run_mode |= STATIC_HOSTNAME;
MY_NAME = xstrdup(optarg);
break;
case 'P':
#endif
if (!(run_mode & MODE_NODAEMON)) {
- int filedes, fdmax, tempfd;
+ int tempfd;
if (pipe(pipefds)<0) {
perror("statd: unable to create pipe");
}
}
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. */
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);