diff --git a/Makefile.conf.in b/Makefile.conf.in index ea5fe1d..09c3129 100644 --- a/Makefile.conf.in +++ b/Makefile.conf.in @@ -71,6 +71,9 @@ autofsconfdir = @confdir@ # Location for autofs maps autofsmapdir = @mapdir@ +# Location for autofs fifos +autofsfifodir = @fifodir@ + # Where to install the automount program sbindir = @sbindir@ diff --git a/aclocal.m4 b/aclocal.m4 index ffeb232..118ef0d 100644 --- a/aclocal.m4 +++ b/aclocal.m4 @@ -120,6 +120,22 @@ AC_DEFUN(AF_MAP_D, done fi]) +dnl -------------------------------------------------------------------------- +dnl AF_FIFO_D +dnl +dnl Check the location of the autofs fifos directory +dnl -------------------------------------------------------------------------- +AC_DEFUN(AF_FIFO_D, +[if test -z "$fifodir"; then + for fifo_d in /var/run /tmp; do + if test -z "$fifodir"; then + if test -d "$fifo_d"; then + fifodir="$fifo_d" + fi + fi + done +fi]) + dnl ----------------------------------- ## -*- Autoconf -*- dnl Check if --with-dmalloc was given. ## dnl From Franc,ois Pinard ## diff --git a/configure b/configure index 3508224..0360086 100755 --- a/configure +++ b/configure @@ -654,6 +654,7 @@ target_alias initdir confdir mapdir +fifodir DMALLOCLIB MOUNT HAVE_MOUNT @@ -1293,6 +1294,7 @@ Optional Packages: --with-path=PATH look in PATH for binaries needed by the automounter --with-confdir=DIR use DIR for autofs configuration files --with-mapdir=PATH look in PATH for mount maps used by the automounter + --with-fifodir=PATH use PATH as the directory for fifos used by the automounter --with-dmalloc use dmalloc, as in http://www.dmalloc.com/dmalloc.tar.gz --with-hesiod=DIR enable Hesiod support (libs and includes in DIR) @@ -1844,6 +1846,36 @@ echo "${ECHO_T}$mapdir" >&6; } # +# The user can specify --with-fifodir=PATH to specify where autofs fifos go +# +if test -z "$fifodir"; then + for fifo_d in /var/run /tmp; do + if test -z "$fifodir"; then + if test -d "$fifo_d"; then + fifodir="$fifo_d" + fi + fi + done +fi + +# Check whether --with-fifodir was given. +if test "${with_fifodir+set}" = set; then + withval=$with_fifodir; if test -z "$withval" -o "$withval" = "yes" -o "$withval" = "no" + then + : + else + fifodir="${withval}" + fi + +fi + +{ echo "$as_me:$LINENO: checking for autofs fifos directory" >&5 +echo $ECHO_N "checking for autofs fifos directory... $ECHO_C" >&6; } +{ echo "$as_me:$LINENO: result: $fifodir" >&5 +echo "${ECHO_T}$fifodir" >&6; } + + +# # Optional include dmalloc # { echo "$as_me:$LINENO: checking if malloc debugging is wanted" >&5 @@ -6074,6 +6106,7 @@ target_alias!$target_alias$ac_delim initdir!$initdir$ac_delim confdir!$confdir$ac_delim mapdir!$mapdir$ac_delim +fifodir!$fifodir$ac_delim DMALLOCLIB!$DMALLOCLIB$ac_delim MOUNT!$MOUNT$ac_delim HAVE_MOUNT!$HAVE_MOUNT$ac_delim @@ -6124,7 +6157,7 @@ LIBOBJS!$LIBOBJS$ac_delim LTLIBOBJS!$LTLIBOBJS$ac_delim _ACEOF - if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.sed | grep -c X` = 88; then + if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.sed | grep -c X` = 89; then break elif $ac_last_try; then { { echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5 diff --git a/configure.in b/configure.in index 8cddf90..a83b3f1 100644 --- a/configure.in +++ b/configure.in @@ -79,6 +79,23 @@ AC_MSG_RESULT([$mapdir]) AC_SUBST(mapdir) # +# The user can specify --with-fifodir=PATH to specify where autofs fifos go +# +AF_FIFO_D() +AC_ARG_WITH(fifodir, +[ --with-fifodir=PATH use PATH as the directory for fifos used by the automounter], + if test -z "$withval" -o "$withval" = "yes" -o "$withval" = "no" + then + : + else + fifodir="${withval}" + fi +) +AC_MSG_CHECKING([for autofs fifos directory]) +AC_MSG_RESULT([$fifodir]) +AC_SUBST(fifodir) + +# # Optional include dmalloc # AM_WITH_DMALLOC() diff --git a/daemon/Makefile b/daemon/Makefile index 4ee70eb..528a684 100644 --- a/daemon/Makefile +++ b/daemon/Makefile @@ -16,6 +16,7 @@ CFLAGS += -rdynamic $(DAEMON_CFLAGS) -D_GNU_SOURCE -I../include CFLAGS += -DAUTOFS_LIB_DIR=\"$(autofslibdir)\" CFLAGS += -DAUTOFS_MAP_DIR=\"$(autofsmapdir)\" CFLAGS += -DAUTOFS_CONF_DIR=\"$(autofsconfdir)\" +CFLAGS += -DAUTOFS_FIFO_DIR=\"$(autofsfifodir)\" CFLAGS += -DVERSION_STRING=\"$(version)\" LDFLAGS += -rdynamic LIBS = -ldl diff --git a/daemon/automount.c b/daemon/automount.c index 7e7d1e6..a12b6da 100644 --- a/daemon/automount.c +++ b/daemon/automount.c @@ -50,6 +50,9 @@ const char *libdir = AUTOFS_LIB_DIR; /* Location of library modules */ const char *mapdir = AUTOFS_MAP_DIR; /* Location of mount maps */ const char *confdir = AUTOFS_CONF_DIR; /* Location of autofs config file */ +/* autofs fifo name prefix */ +const char *fifodir = AUTOFS_FIFO_DIR "/autofs.fifo"; + const char *global_options; /* Global option, from command line */ static char *pid_file = NULL; /* File in which to keep pid */ @@ -650,14 +653,13 @@ static int fullread(int fd, void *ptr, size_t len) static char *automount_path_to_fifo(unsigned logopt, const char *path) { char *fifo_name, *p; - int name_len = strlen(path) + strlen(AUTOFS_LOGPRI_FIFO) + 1; + int name_len = strlen(path) + strlen(fifodir) + 1; int ret; fifo_name = malloc(name_len); if (!fifo_name) return NULL; - ret = snprintf(fifo_name, name_len, "%s%s", - AUTOFS_LOGPRI_FIFO, path); + ret = snprintf(fifo_name, name_len, "%s%s", fifodir, path); if (ret >= name_len) { info(logopt, "fifo path for \"%s\" truncated to \"%s\". This may " @@ -670,7 +672,7 @@ static char *automount_path_to_fifo(unsigned logopt, const char *path) * create the fifo name, we will just replace instances of '/' with * '-'. */ - p = fifo_name + strlen(AUTOFS_LOGPRI_FIFO); + p = fifo_name + strlen(fifodir); while (*p != '\0') { if (*p == '/') *p = '-'; @@ -685,8 +687,9 @@ static char *automount_path_to_fifo(unsigned logopt, const char *path) static int create_logpri_fifo(struct autofs_point *ap) { int ret = -1; - int fd; + int fd, cl_flags; char *fifo_name; + char buf[MAX_ERR_BUF]; fifo_name = automount_path_to_fifo(ap->logopt, ap->path); if (!fifo_name) { @@ -704,18 +707,27 @@ static int create_logpri_fifo(struct autofs_point *ap) ret = mkfifo(fifo_name, S_IRUSR|S_IWUSR); if (ret != 0) { + char *estr = strerror_r(errno, buf, MAX_ERR_BUF); crit(ap->logopt, - "mkfifo for %s returned %d", fifo_name, errno); + "mkfifo for %s failed: %s", fifo_name, estr); goto out_free; } fd = open(fifo_name, O_RDWR|O_NONBLOCK); if (fd < 0) { + char *estr = strerror_r(errno, buf, MAX_ERR_BUF); crit(ap->logopt, - "Failed to open %s, errno %d", fifo_name, errno); + "Failed to open %s: %s", fifo_name, estr); + unlink(fifo_name); + ret = -1; goto out_free; } + if ((cl_flags = fcntl(fd, F_GETFD, 0)) != -1) { + cl_flags |= FD_CLOEXEC; + fcntl(fd, F_SETFD, cl_flags); + } + ap->logpri_fifo = fd; out_free: @@ -728,6 +740,10 @@ static int destroy_logpri_fifo(struct autofs_point *ap) int ret = -1; int fd = ap->logpri_fifo; char *fifo_name; + char buf[MAX_ERR_BUF]; + + if (fd == -1) + return 0; fifo_name = automount_path_to_fifo(ap->logopt, ap->path); if (!fifo_name) { @@ -739,8 +755,9 @@ static int destroy_logpri_fifo(struct autofs_point *ap) ret = close(fd); if (ret != 0) { + char *estr = strerror_r(errno, buf, MAX_ERR_BUF); warn(ap->logopt, - "close for fifo %s returned %d", fifo_name, errno); + "close for fifo %s: %s", fifo_name, estr); } ret = unlink(fifo_name); @@ -760,11 +777,13 @@ static void handle_fifo_message(struct autofs_point *ap, int fd) char buffer[PIPE_BUF]; char *end; long pri; + char buf[MAX_ERR_BUF]; memset(buffer, 0, sizeof(buffer)); ret = read(fd, &buffer, sizeof(buffer)); if (ret < 0) { - warn(ap->logopt, "read on fifo returned error %d", errno); + char *estr = strerror_r(errno, buf, MAX_ERR_BUF); + warn(ap->logopt, "read on fifo returned error: %s", estr); return; } @@ -846,16 +865,18 @@ static int set_log_priority(const char *path, int priority) */ fd = open(fifo_name, O_WRONLY|O_NONBLOCK); if (fd < 0) { - fprintf(stderr, "%s: open of %s failed with %d\n", - __FUNCTION__, fifo_name, errno); + fprintf(stderr, "%s: open of %s failed with %s\n", + __FUNCTION__, fifo_name, strerror(errno)); + fprintf(stderr, "%s: perhaps the fifo wasn't setup," + " please check your log for more information\n", __FUNCTION__); free(fifo_name); return -1; } if (write(fd, buf, sizeof(buf)) != sizeof(buf)) { fprintf(stderr, "Failed to change logging priority. "); - fprintf(stderr, "write to fifo failed with errno %d.\n", - errno); + fprintf(stderr, "write to fifo failed: %s.\n", + strerror(errno)); close(fd); free(fifo_name); return -1; @@ -870,6 +891,7 @@ static int set_log_priority(const char *path, int priority) static int get_pkt(struct autofs_point *ap, union autofs_packet_union *pkt) { struct pollfd fds[3]; + int pollfds = 3; char buf[MAX_ERR_BUF]; fds[0].fd = ap->pipefd; @@ -878,9 +900,11 @@ static int get_pkt(struct autofs_point *ap, union autofs_packet_union *pkt) fds[1].events = POLLIN; fds[2].fd = ap->logpri_fifo; fds[2].events = POLLIN; + if (fds[2].fd == -1) + pollfds--; for (;;) { - if (poll(fds, 3, -1) == -1) { + if (poll(fds, pollfds, -1) == -1) { char *estr; if (errno == EINTR) continue; @@ -930,7 +954,7 @@ static int get_pkt(struct autofs_point *ap, union autofs_packet_union *pkt) if (fds[0].revents & POLLIN) return fullread(ap->pipefd, pkt, kpkt_len); - if (fds[2].revents & POLLIN) { + if (fds[2].fd != -1 && fds[2].revents & POLLIN) { debug(ap->logopt, "message pending on control fifo."); handle_fifo_message(ap, fds[2].fd); } @@ -983,7 +1007,6 @@ static int autofs_init_ap(struct autofs_point *ap) crit(ap->logopt, "failed to create commumication pipe for autofs path %s", ap->path); - free(ap->path); return -1; } @@ -1006,7 +1029,6 @@ static int autofs_init_ap(struct autofs_point *ap) "failed create state pipe for autofs path %s", ap->path); close(ap->pipefd); close(ap->kpipefd); /* Close kernel pipe end */ - free(ap->path); return -1; } @@ -1021,15 +1043,8 @@ static int autofs_init_ap(struct autofs_point *ap) } if (create_logpri_fifo(ap) < 0) { - crit(ap->logopt, - "failed to create FIFO for path %s\n", ap->path); - destroy_logpri_fifo(ap); - close(ap->pipefd); - close(ap->kpipefd); - free(ap->path); - close(ap->state_pipe[0]); - close(ap->state_pipe[1]); - return -1; + logmsg("could not create FIFO for path %s\n", ap->path); + logmsg("dynamic log level changes not available for %s", ap->path); } return 0; diff --git a/include/automount.h b/include/automount.h index 37a3c0a..b0d1a9c 100644 --- a/include/automount.h +++ b/include/automount.h @@ -223,8 +223,6 @@ int rmdir_path(struct autofs_point *ap, const char *path, dev_t dev); #define MAPENT_MAX_LEN 4095 #define PARSE_MAX_BUF KEY_MAX_LEN + MAPENT_MAX_LEN + 2 -#define AUTOFS_LOGPRI_FIFO "/tmp/autofs.fifo" - int lookup_nss_read_master(struct master *master, time_t age); int lookup_nss_read_map(struct autofs_point *ap, struct map_source *source, time_t age); int lookup_enumerate(struct autofs_point *ap, diff --git a/lib/master.c b/lib/master.c index 2e24ad0..2188bca 100644 --- a/lib/master.c +++ b/lib/master.c @@ -56,6 +56,7 @@ int master_add_autofs_point(struct master_mapent *entry, ap->state_pipe[0] = -1; ap->state_pipe[1] = -1; + ap->logpri_fifo = -1; ap->path = strdup(entry->path); if (!ap->path) {