X-Git-Url: https://git.decadent.org.uk/gitweb/?p=nfs-utils.git;a=blobdiff_plain;f=utils%2Fstatd%2Fstatd.c;h=6148952bee523701a2be9b295c1cb3d0b0911fd8;hp=8337b64b993918fb8704daeb49cae711447779d3;hb=e4719f90f77de2ea2c083cbc304b5cc7a7b516bd;hpb=dda3455d8b96a7b078bc00c113e1af15ed421d5b diff --git a/utils/statd/statd.c b/utils/statd/statd.c index 8337b64..6148952 100644 --- a/utils/statd/statd.c +++ b/utils/statd/statd.c @@ -26,7 +26,6 @@ #include #include #include "statd.h" -#include "version.h" #include "nfslib.h" /* Socket operations */ @@ -50,8 +49,7 @@ int run_mode = 0; /* foreground logging mode */ /* LH - I had these local to main, but it seemed silly to have * 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; -const char *version_p = NULL; +static char *name_p = NULL; /* PRC: a high-availability callout program can be specified with -H * When this is done, the program will receive callouts whenever clients @@ -75,7 +73,6 @@ 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 @@ -89,9 +86,11 @@ extern void simulator (int, char **); static void sm_prog_1_wrapper (struct svc_req *rqstp, register SVCXPRT *transp) { + struct sockaddr_in *sin = nfs_getrpccaller_in(transp); + /* remote host authorization check */ - if (!check_default("statd", svc_getcaller(transp), - rqstp->rq_proc, SM_PROG)) { + if (sin->sin_family == AF_INET && + !check_default("statd", sin, rqstp->rq_proc, SM_PROG)) { svcerr_auth (transp, AUTH_FAILED); return; } @@ -108,17 +107,15 @@ sm_prog_1_wrapper (struct svc_req *rqstp, register SVCXPRT *transp) static void killer (int sig) { - note (N_FATAL, "Caught signal %d, un-registering and exiting.", sig); pmap_unset (SM_PROG, SM_VERS); - - exit (0); + xlog_err ("Caught signal %d, un-registering and exiting", sig); } static void sigusr (int sig) { extern void my_svc_exit (void); - dprintf (N_DEBUG, "Caught signal %d, re-notifying (state %d).", sig, + xlog(D_GENERAL, "Caught signal %d, re-notifying (state %d)", sig, MY_STATE); my_svc_exit(); } @@ -140,7 +137,7 @@ static void log_modes(void) if (run_mode & MODE_LOG_STDERR) strcat(buf,"Log-STDERR "); - note(N_WARNING,buf); + xlog_warn(buf); } /* @@ -148,7 +145,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"); @@ -174,18 +171,23 @@ static void create_pidfile(void) unlink(pidfile); fp = fopen(pidfile, "w"); if (!fp) - die("Opening %s failed: %s\n", - pidfile, strerror(errno)); + xlog_err("Opening %s failed: %m\n", pidfile); fprintf(fp, "%d\n", getpid()); pidfd = dup(fileno(fp)); - if (fclose(fp) < 0) - note(N_WARNING, "Flushing pid file failed.\n"); + if (fclose(fp) < 0) { + xlog_warn("Flushing pid file failed: errno %d (%m)\n", + errno); + } } static void truncate_pidfile(void) { - if (pidfd >= 0) - ftruncate(pidfd, 0); + if (pidfd >= 0) { + if (ftruncate(pidfd, 0) < 0) { + xlog_warn("truncating pid file failed: errno %d (%m)\n", + errno); + } + } } static void drop_privs(void) @@ -199,20 +201,23 @@ static void drop_privs(void) } if (st.st_uid == 0) { - note(N_WARNING, "statd running as root. chown %s to choose different user\n", - SM_DIR); + xlog_warn("Running as 'root'. " + "chown %s to choose different user\n", SM_DIR); return; } /* better chown the pid file before dropping, as if it * if over nfs we might loose access */ - if (pidfd >= 0) - fchown(pidfd, st.st_uid, st.st_gid); - + if (pidfd >= 0) { + if (fchown(pidfd, st.st_uid, st.st_gid) < 0) { + xlog(L_ERROR, "Unable to change owner of %s: %d (%s)", + SM_DIR, strerror (errno)); + } + } setgroups(0, NULL); if (setgid(st.st_gid) == -1 || setuid(st.st_uid) == -1) { - note(N_ERROR, "Fail to drop privileges"); + xlog(L_ERROR, "Fail to drop privileges"); exit(1); } } @@ -256,6 +261,8 @@ int main (int argc, char **argv) /* Default: daemon mode, no other options */ run_mode = 0; + xlog_stderr(0); + xlog_syslog(1); /* Set the basename */ if ((name_p = strrchr(argv[0],'/')) != NULL) { @@ -264,13 +271,6 @@ int main (int argc, char **argv) name_p = argv[0]; } - /* Get the version */ - if ((version_p = strrchr(VERSION,' ')) != NULL) { - version_p++; - } else { - version_p = VERSION; - } - /* Set hostname */ MY_NAME = NULL; @@ -279,7 +279,7 @@ int main (int argc, char **argv) switch (arg) { case 'V': /* Version */ case 'v': - printf("%s version %s\n",name_p,version_p); + printf("%s version " VERSION "\n",name_p); exit(0); case 'F': /* Foreground/nodaemon mode */ run_mode |= MODE_NODAEMON; @@ -373,7 +373,6 @@ int main (int argc, char **argv) run_sm_notify(out_port); } - if (!(run_mode & MODE_NODAEMON)) { run_mode &= ~MODE_LOG_STDERR; /* Never log to console in daemon mode. */ @@ -445,7 +444,13 @@ int main (int argc, char **argv) /* Child. */ - log_init (name_p,version_p); + if (run_mode & MODE_LOG_STDERR) { + xlog_syslog(0); + xlog_stderr(1); + xlog_config(D_ALL, 1); + } + xlog_open(name_p); + xlog(L_NOTICE, "Version " VERSION " starting"); log_modes(); @@ -477,7 +482,8 @@ 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 @@ -493,7 +499,10 @@ int main (int argc, char **argv) /* If we got this far, we have successfully started, so notify parent */ if (pipefds[1] > 0) { status = 0; - write(pipefds[1], &status, 1); + if (write(pipefds[1], &status, 1) != 1) { + xlog_warn("writing to parent pipe failed: errno %d (%s)\n", + errno, strerror(errno)); + } close(pipefds[1]); pipefds[1] = -1; } @@ -532,17 +541,23 @@ static void load_state_number(void) { int fd; + const char *file = "/proc/sys/fs/nfs/nsm_local_state"; if ((fd = open(SM_STAT_PATH, O_RDONLY)) == -1) return; - read(fd, &MY_STATE, sizeof(MY_STATE)); + if (read(fd, &MY_STATE, sizeof(MY_STATE)) != sizeof(MY_STATE)) { + xlog_warn("Unable to read state from '%s': errno %d (%s)", + SM_STAT_PATH, errno, strerror(errno)); + } close(fd); - fd = open("/proc/sys/fs/nfs/nsm_local_state",O_WRONLY); + fd = open(file, O_WRONLY); if (fd >= 0) { char buf[20]; snprintf(buf, sizeof(buf), "%d", MY_STATE); - write(fd, buf, strlen(buf)); + if (write(fd, buf, strlen(buf)) != strlen(buf)) + xlog_warn("Writing to '%s' failed: errno %d (%s)", + file, errno, strerror(errno)); close(fd); }