- check for "*" when looking up wildcard in LDAP.
- fix couple of edge case parse fails of timeout option.
- add SEARCH_BASE configuration option.
- add random selection as a master map entry option.
- re-read config on HUP signal.
- add LDAP_URI, LDAP_TIMEOUT and LDAP_NETWORK_TIMEOUT configuration
options.
- fix deadlock in submount mount module.
- fix lack of ferror() checking when reading files.
- fix typo in autofs(5) man page.
- fix map entry expansion when undefined macro is present.
- remove unused export validation code.
- add dynamic logging (adapted from v4 patch from Jeff Moyer).
- fix recursive loopback mounts (Matthias Koenig).
- add map re-load to verbose logging.
- fix handling of LDAP base dns with spaces.
- handle MTAB_NOTUPDATED status return from mount.
- when default master map, auto.master, is used also check for auto_master.
- update negative mount timeout handling.
- fix large group handling (Ryan Thomas).
- fix for dynamic logging breaking non-sasl build (Guillaume Rousse).
- eliminate NULL proc ping for singleton host or local mounts.
386 lines
12 KiB
Diff
386 lines
12 KiB
Diff
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) {
|