basebuilder_pel7x64builder0
7 years ago
402 changed files with 53980 additions and 0 deletions
@ -0,0 +1,78 @@ |
|||||||
|
autofs-5.0.6 - fix recursive mount deadlock |
||||||
|
|
||||||
|
From: Ian Kent <raven@themaw.net> |
||||||
|
|
||||||
|
Prior to the vfs-automount changes that went into 2.6.38 |
||||||
|
and were finalized in 3.1 it was not possible to block |
||||||
|
path walks into multi-mounts whose root was covered by |
||||||
|
another mount. To deal with that a write lock was used |
||||||
|
to ensure the mount tree construction was completed. This |
||||||
|
restricts the types of recursively defined mount maps that |
||||||
|
can be used and can lead to a deadlock during lookup. |
||||||
|
|
||||||
|
Now that we can prevent processes walking into multi-mounts |
||||||
|
that are under construction we no longer need to use a |
||||||
|
write lock. |
||||||
|
|
||||||
|
Also, in the patch below, a cache writelock is changed to |
||||||
|
a read lock because a write lock isn't needed since the |
||||||
|
map cache entry isn't being updated. |
||||||
|
--- |
||||||
|
|
||||||
|
CHANGELOG | 1 + |
||||||
|
daemon/direct.c | 14 ++++++++++++-- |
||||||
|
2 files changed, 13 insertions(+), 2 deletions(-) |
||||||
|
|
||||||
|
|
||||||
|
diff --git a/CHANGELOG b/CHANGELOG |
||||||
|
index 936c9ab..9cdad6e 100644 |
||||||
|
--- a/CHANGELOG |
||||||
|
+++ b/CHANGELOG |
||||||
|
@@ -12,6 +12,7 @@ |
||||||
|
- configure.in: allow cross compilation. |
||||||
|
- README: update mailing list subscription info. |
||||||
|
- allow non root user to check status. |
||||||
|
+- fix recursive mount deadlock. |
||||||
|
|
||||||
|
25/07/2012 autofs-5.0.7 |
||||||
|
======================= |
||||||
|
diff --git a/daemon/direct.c b/daemon/direct.c |
||||||
|
index 7e2f0d7..3e09c5d 100644 |
||||||
|
--- a/daemon/direct.c |
||||||
|
+++ b/daemon/direct.c |
||||||
|
@@ -1285,6 +1285,8 @@ int handle_packet_missing_direct(struct autofs_point *ap, autofs_packet_missing_ |
||||||
|
struct timespec wait; |
||||||
|
struct timeval now; |
||||||
|
int ioctlfd, len, state; |
||||||
|
+ unsigned int kver_major = get_kver_major(); |
||||||
|
+ unsigned int kver_minor = get_kver_minor(); |
||||||
|
|
||||||
|
pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &state); |
||||||
|
|
||||||
|
@@ -1297,8 +1299,16 @@ int handle_packet_missing_direct(struct autofs_point *ap, autofs_packet_missing_ |
||||||
|
* cache entry we will not be able to find the mapent. So |
||||||
|
* we must take the source writelock to ensure the parent |
||||||
|
* has mount is complete before we look for the entry. |
||||||
|
+ * |
||||||
|
+ * Since the vfs-automount kernel changes we can now block |
||||||
|
+ * on covered mounts during mount tree construction so a |
||||||
|
+ * write lock is no longer needed. So we now can handle a |
||||||
|
+ * wider class of recursively define mount lookups. |
||||||
|
*/ |
||||||
|
- master_source_writelock(ap->entry); |
||||||
|
+ if (kver_major > 5 || (kver_major == 5 && kver_minor > 1)) |
||||||
|
+ master_source_readlock(ap->entry); |
||||||
|
+ else |
||||||
|
+ master_source_writelock(ap->entry); |
||||||
|
map = ap->entry->maps; |
||||||
|
while (map) { |
||||||
|
/* |
||||||
|
@@ -1311,7 +1321,7 @@ int handle_packet_missing_direct(struct autofs_point *ap, autofs_packet_missing_ |
||||||
|
} |
||||||
|
|
||||||
|
mc = map->mc; |
||||||
|
- cache_writelock(mc); |
||||||
|
+ cache_readlock(mc); |
||||||
|
me = cache_lookup_ino(mc, pkt->dev, pkt->ino); |
||||||
|
if (me) |
||||||
|
break; |
@ -0,0 +1,38 @@ |
|||||||
|
autofs-5.0.6 - increase file map read buffer size |
||||||
|
|
||||||
|
From: Ian Kent <raven@themaw.net> |
||||||
|
|
||||||
|
The file map entry read buffer can be too small for larger |
||||||
|
multi-mount map entries so increase it. |
||||||
|
--- |
||||||
|
|
||||||
|
CHANGELOG | 1 + |
||||||
|
include/automount.h | 2 +- |
||||||
|
2 files changed, 2 insertions(+), 1 deletions(-) |
||||||
|
|
||||||
|
|
||||||
|
diff --git a/CHANGELOG b/CHANGELOG |
||||||
|
index 9cdad6e..3bdf8a4 100644 |
||||||
|
--- a/CHANGELOG |
||||||
|
+++ b/CHANGELOG |
||||||
|
@@ -13,6 +13,7 @@ |
||||||
|
- README: update mailing list subscription info. |
||||||
|
- allow non root user to check status. |
||||||
|
- fix recursive mount deadlock. |
||||||
|
+- increase file map read buffer size. |
||||||
|
|
||||||
|
25/07/2012 autofs-5.0.7 |
||||||
|
======================= |
||||||
|
diff --git a/include/automount.h b/include/automount.h |
||||||
|
index 561fcc2..37541f5 100644 |
||||||
|
--- a/include/automount.h |
||||||
|
+++ b/include/automount.h |
||||||
|
@@ -233,7 +233,7 @@ int rmdir_path(struct autofs_point *ap, const char *path, dev_t dev); |
||||||
|
#define AUTOFS_LOOKUP_VERSION 5 |
||||||
|
|
||||||
|
#define KEY_MAX_LEN NAME_MAX |
||||||
|
-#define MAPENT_MAX_LEN 4095 |
||||||
|
+#define MAPENT_MAX_LEN 16384 |
||||||
|
#define PARSE_MAX_BUF KEY_MAX_LEN + MAPENT_MAX_LEN + 2 |
||||||
|
|
||||||
|
int lookup_nss_read_master(struct master *master, time_t age); |
@ -0,0 +1,56 @@ |
|||||||
|
autofs-5.0.7 - README: update mailing list subscription info |
||||||
|
|
||||||
|
From: Chris Packham <chris.packham@alliedtelesis.co.nz> |
||||||
|
|
||||||
|
Following the kernel.org compromise the mailing list was moved to |
||||||
|
vger.kernel.org. Update the subscription info and add URLs for the gmane |
||||||
|
mailing list archive. |
||||||
|
|
||||||
|
Signed-off-by: Chris Packham <chris.packham@alliedtelesis.co.nz> |
||||||
|
--- |
||||||
|
|
||||||
|
CHANGELOG | 1 + |
||||||
|
README | 17 ++++++++++++++--- |
||||||
|
2 files changed, 15 insertions(+), 3 deletions(-) |
||||||
|
|
||||||
|
|
||||||
|
diff --git a/CHANGELOG b/CHANGELOG |
||||||
|
index fe801e8..44c9fb2 100644 |
||||||
|
--- a/CHANGELOG |
||||||
|
+++ b/CHANGELOG |
||||||
|
@@ -10,6 +10,7 @@ |
||||||
|
- fix null map entry order handling. |
||||||
|
- make description of default MOUNT_WAIT setting clear. |
||||||
|
- configure.in: allow cross compilation. |
||||||
|
+- README: update mailing list subscription info. |
||||||
|
|
||||||
|
25/07/2012 autofs-5.0.7 |
||||||
|
======================= |
||||||
|
diff --git a/README b/README |
||||||
|
index cef16a9..9024e64 100644 |
||||||
|
--- a/README |
||||||
|
+++ b/README |
||||||
|
@@ -43,9 +43,20 @@ Fitzhardinge's <jeremy@goop.org> work on autofs 3. Further enhancements |
||||||
|
have been made by Ian Kent <raven@themaw.net>. |
||||||
|
|
||||||
|
If you use or want to help develop autofs, please join the autofs |
||||||
|
-mailing list by visiting: |
||||||
|
+mailing list by sending an email to: |
||||||
|
|
||||||
|
- http://linux.kernel.org/mailman/listinfo/autofs |
||||||
|
+ majordomo@vger.kernel.org |
||||||
|
|
||||||
|
-and folling the instructions there to subscribe to the autofs mailing list. |
||||||
|
+With the body text: |
||||||
|
+ |
||||||
|
+ subscribe autofs |
||||||
|
+ |
||||||
|
+Once subscribed you can send patches to: |
||||||
|
+ |
||||||
|
+ autofs@vger.kernel.org |
||||||
|
+ |
||||||
|
+The autofs mailing list archive can be viewed on gmane: |
||||||
|
+ |
||||||
|
+ http://news.gmane.org/gmane.linux.kernel.autofs |
||||||
|
+ http://blog.gmane.org/gmane.linux.kernel.autofs |
||||||
|
|
@ -0,0 +1,35 @@ |
|||||||
|
autofs-5.0.7 - add after sssd dependency to unit file |
||||||
|
|
||||||
|
From: Ian Kent <ikent@redhat.com> |
||||||
|
|
||||||
|
When using sss as a map source autofs can sometimes start before |
||||||
|
sssd is ready. |
||||||
|
--- |
||||||
|
CHANGELOG | 1 + |
||||||
|
samples/autofs.service.in | 2 +- |
||||||
|
2 files changed, 2 insertions(+), 1 deletion(-) |
||||||
|
|
||||||
|
diff --git a/CHANGELOG b/CHANGELOG |
||||||
|
index 7749f01..2734fe3 100644 |
||||||
|
--- a/CHANGELOG |
||||||
|
+++ b/CHANGELOG |
||||||
|
@@ -55,6 +55,7 @@ |
||||||
|
- fix add null check in parse_server_string(). |
||||||
|
- don't override LDFLAGS in make rules. |
||||||
|
- fix a couple of compiler warnings. |
||||||
|
+- add after sssd dependency to unit file. |
||||||
|
|
||||||
|
25/07/2012 autofs-5.0.7 |
||||||
|
======================= |
||||||
|
diff --git a/samples/autofs.service.in b/samples/autofs.service.in |
||||||
|
index 056ab5e..777463d 100644 |
||||||
|
--- a/samples/autofs.service.in |
||||||
|
+++ b/samples/autofs.service.in |
||||||
|
@@ -1,6 +1,6 @@ |
||||||
|
[Unit] |
||||||
|
Description=Automounts filesystems on demand |
||||||
|
-After=network.target ypbind.service |
||||||
|
+After=network.target ypbind.service sssd.service |
||||||
|
|
||||||
|
[Service] |
||||||
|
Type=forking |
@ -0,0 +1,48 @@ |
|||||||
|
autofs-5.0.7 - add changlog entry for coverity fixes |
||||||
|
|
||||||
|
From: Ian Kent <raven@themaw.net> |
||||||
|
|
||||||
|
A bunch of changes have been made based on a Covarity report. |
||||||
|
Mostly I pust the changes into seperate patches so they can be kept simple. |
||||||
|
|
||||||
|
Changes: |
||||||
|
- fix fcntl return check. |
||||||
|
- fix spawn_umount() return check in mount_bind.c:lookup_init(). |
||||||
|
- fix check mkdir_path() in mount_bind.c:mount_mount(). |
||||||
|
- fix incorrect var name in test. |
||||||
|
- remove debug only code in alarm.c. |
||||||
|
- fix inconsistent use of cache lock in handle_packet_missing_direct(). |
||||||
|
- fix several off by one errors. |
||||||
|
- fix memory leak in get_dc_list(). |
||||||
|
- fix host_addr null reference in add_new_host(). |
||||||
|
- add null check in read_one(). |
||||||
|
- add pgrp check in do_spawn(). |
||||||
|
- fix inconsistent signed usage for __rpc_ping(). |
||||||
|
- add null check in extract_version(). |
||||||
|
- recheck valid map entry lookup return in do_readmap_mount(). |
||||||
|
- add null check in parse_server_string(). |
||||||
|
- add map entry null check in do_expire_direct(). |
||||||
|
- add mapent null check in lookup_nisplus.c:lookup_mount(). |
||||||
|
- fix potential null dereference in lookup_mount(). |
||||||
|
- fix leaked ldap percent hack allocation in lookup_one(). |
||||||
|
- fix incorrect value reference in parse_line(). |
||||||
|
- add debug alert for waitpid in check_nfs_mount_version(). |
||||||
|
- add initialization of bind_result in-do_sasl_bind(). |
||||||
|
- fix incorrect check in flag_is_owned(). |
||||||
|
- fix possible use after free in lookup_dir.c:lookup_init(). |
||||||
|
--- |
||||||
|
CHANGELOG | 1 + |
||||||
|
1 file changed, 1 insertion(+) |
||||||
|
|
||||||
|
diff --git a/CHANGELOG b/CHANGELOG |
||||||
|
index 48e9806..25179b1 100644 |
||||||
|
--- a/CHANGELOG |
||||||
|
+++ b/CHANGELOG |
||||||
|
@@ -49,6 +49,7 @@ |
||||||
|
- fix master map bogus keywork match. |
||||||
|
- fix fix map entry duplicate offset detection. |
||||||
|
- probe each nfs version in turn for singleton mounts. |
||||||
|
+- add changlog entry for coverity fixes. |
||||||
|
|
||||||
|
25/07/2012 autofs-5.0.7 |
||||||
|
======================= |
@ -0,0 +1,24 @@ |
|||||||
|
autofs-5.0.7 - add debug alert for waitpid in check_nfs_mount_version() |
||||||
|
|
||||||
|
From: Ian Kent <raven@themaw.net> |
||||||
|
|
||||||
|
We don't really case if there's no process to wait for but add a debug |
||||||
|
log alert for information. |
||||||
|
--- |
||||||
|
lib/mounts.c | 3 ++- |
||||||
|
1 file changed, 2 insertions(+), 1 deletion(-) |
||||||
|
|
||||||
|
diff --git a/lib/mounts.c b/lib/mounts.c |
||||||
|
index 7b959b8..a6f560e 100644 |
||||||
|
--- a/lib/mounts.c |
||||||
|
+++ b/lib/mounts.c |
||||||
|
@@ -287,7 +287,8 @@ int check_nfs_mount_version(struct nfs_mount_vers *vers, |
||||||
|
ret = 0; |
||||||
|
} |
||||||
|
|
||||||
|
- if (waitpid(f, &status, 0) != f) ; |
||||||
|
+ if (waitpid(f, &status, 0) != f) |
||||||
|
+ debug(LOGOPT_NONE, "no process found to wait for"); |
||||||
|
|
||||||
|
pthread_sigmask(SIG_SETMASK, &oldsig, NULL); |
||||||
|
pthread_setcancelstate(cancel_state, NULL); |
@ -0,0 +1,691 @@ |
|||||||
|
autofs-5.0.7 - add enable sloppy mount option to configure |
||||||
|
|
||||||
|
From: Ian Kent <ikent@redhat.com> |
||||||
|
|
||||||
|
Add an option --enable-sloppy-mount or --disable-sloppy-mount to force |
||||||
|
or prevent the use of the -s option to mount, thus avoiding the |
||||||
|
autodetection. This can be useful in setups where executing mount |
||||||
|
might be undesirable, particularly in packaging environments. |
||||||
|
|
||||||
|
2013-04-04 Martin von Gagern |
||||||
|
|
||||||
|
References: |
||||||
|
* https://bugs.gentoo.org/453778 |
||||||
|
--- |
||||||
|
CHANGELOG | 1 |
||||||
|
aclocal.m4 | 2 |
||||||
|
configure | 252 +++++++++++++++++++++++++++++++--------------------------- |
||||||
|
configure.in | 10 ++ |
||||||
|
4 files changed, 146 insertions(+), 119 deletions(-) |
||||||
|
|
||||||
|
diff --git a/CHANGELOG b/CHANGELOG |
||||||
|
index 61edddf..66c11de 100644 |
||||||
|
--- a/CHANGELOG |
||||||
|
+++ b/CHANGELOG |
||||||
|
@@ -42,6 +42,7 @@ |
||||||
|
- fix submount tree not all expiring. |
||||||
|
- make dump maps check for duplicate indirect mounts. |
||||||
|
- document allowed map sources in auto.master. |
||||||
|
+- add enable sloppy mount option to configure. |
||||||
|
|
||||||
|
25/07/2012 autofs-5.0.7 |
||||||
|
======================= |
||||||
|
diff --git a/aclocal.m4 b/aclocal.m4 |
||||||
|
index 47bca0c..c5de159 100644 |
||||||
|
--- a/aclocal.m4 |
||||||
|
+++ b/aclocal.m4 |
||||||
|
@@ -66,7 +66,7 @@ AC_DEFUN(AF_SLOPPY_MOUNT, |
||||||
|
[if test -n "$MOUNT" ; then |
||||||
|
AC_MSG_CHECKING([if mount accepts the -s option]) |
||||||
|
if "$MOUNT" -s > /dev/null 2>&1 ; then |
||||||
|
- AC_DEFINE(HAVE_SLOPPY_MOUNT, 1, [define if the mount command supports the -s option]) |
||||||
|
+ enable_sloppy_mount=yes |
||||||
|
AC_MSG_RESULT(yes) |
||||||
|
else |
||||||
|
AC_MSG_RESULT(no) |
||||||
|
diff --git a/configure b/configure |
||||||
|
index c1423d8..08b7ccc 100755 |
||||||
|
--- a/configure |
||||||
|
+++ b/configure |
||||||
|
@@ -1,11 +1,9 @@ |
||||||
|
#! /bin/sh |
||||||
|
# Guess values for system-dependent variables and create Makefiles. |
||||||
|
-# Generated by GNU Autoconf 2.68. |
||||||
|
+# Generated by GNU Autoconf 2.69. |
||||||
|
# |
||||||
|
# |
||||||
|
-# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, |
||||||
|
-# 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software |
||||||
|
-# Foundation, Inc. |
||||||
|
+# Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. |
||||||
|
# |
||||||
|
# |
||||||
|
# This configure script is free software; the Free Software Foundation |
||||||
|
@@ -134,6 +132,31 @@ export LANGUAGE |
||||||
|
# CDPATH. |
||||||
|
(unset CDPATH) >/dev/null 2>&1 && unset CDPATH |
||||||
|
|
||||||
|
+# Use a proper internal environment variable to ensure we don't fall |
||||||
|
+ # into an infinite loop, continuously re-executing ourselves. |
||||||
|
+ if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then |
||||||
|
+ _as_can_reexec=no; export _as_can_reexec; |
||||||
|
+ # We cannot yet assume a decent shell, so we have to provide a |
||||||
|
+# neutralization value for shells without unset; and this also |
||||||
|
+# works around shells that cannot unset nonexistent variables. |
||||||
|
+# Preserve -v and -x to the replacement shell. |
||||||
|
+BASH_ENV=/dev/null |
||||||
|
+ENV=/dev/null |
||||||
|
+(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV |
||||||
|
+case $- in # (((( |
||||||
|
+ *v*x* | *x*v* ) as_opts=-vx ;; |
||||||
|
+ *v* ) as_opts=-v ;; |
||||||
|
+ *x* ) as_opts=-x ;; |
||||||
|
+ * ) as_opts= ;; |
||||||
|
+esac |
||||||
|
+exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} |
||||||
|
+# Admittedly, this is quite paranoid, since all the known shells bail |
||||||
|
+# out after a failed `exec'. |
||||||
|
+$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 |
||||||
|
+as_fn_exit 255 |
||||||
|
+ fi |
||||||
|
+ # We don't want this to propagate to other subprocesses. |
||||||
|
+ { _as_can_reexec=; unset _as_can_reexec;} |
||||||
|
if test "x$CONFIG_SHELL" = x; then |
||||||
|
as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : |
||||||
|
emulate sh |
||||||
|
@@ -167,7 +190,8 @@ if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : |
||||||
|
else |
||||||
|
exitcode=1; echo positional parameters were not saved. |
||||||
|
fi |
||||||
|
-test x\$exitcode = x0 || exit 1" |
||||||
|
+test x\$exitcode = x0 || exit 1 |
||||||
|
+test -x / || exit 1" |
||||||
|
as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO |
||||||
|
as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO |
||||||
|
eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && |
||||||
|
@@ -212,21 +236,25 @@ IFS=$as_save_IFS |
||||||
|
|
||||||
|
|
||||||
|
if test "x$CONFIG_SHELL" != x; then : |
||||||
|
- # We cannot yet assume a decent shell, so we have to provide a |
||||||
|
- # neutralization value for shells without unset; and this also |
||||||
|
- # works around shells that cannot unset nonexistent variables. |
||||||
|
- # Preserve -v and -x to the replacement shell. |
||||||
|
- BASH_ENV=/dev/null |
||||||
|
- ENV=/dev/null |
||||||
|
- (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV |
||||||
|
- export CONFIG_SHELL |
||||||
|
- case $- in # (((( |
||||||
|
- *v*x* | *x*v* ) as_opts=-vx ;; |
||||||
|
- *v* ) as_opts=-v ;; |
||||||
|
- *x* ) as_opts=-x ;; |
||||||
|
- * ) as_opts= ;; |
||||||
|
- esac |
||||||
|
- exec "$CONFIG_SHELL" $as_opts "$as_myself" ${1+"$@"} |
||||||
|
+ export CONFIG_SHELL |
||||||
|
+ # We cannot yet assume a decent shell, so we have to provide a |
||||||
|
+# neutralization value for shells without unset; and this also |
||||||
|
+# works around shells that cannot unset nonexistent variables. |
||||||
|
+# Preserve -v and -x to the replacement shell. |
||||||
|
+BASH_ENV=/dev/null |
||||||
|
+ENV=/dev/null |
||||||
|
+(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV |
||||||
|
+case $- in # (((( |
||||||
|
+ *v*x* | *x*v* ) as_opts=-vx ;; |
||||||
|
+ *v* ) as_opts=-v ;; |
||||||
|
+ *x* ) as_opts=-x ;; |
||||||
|
+ * ) as_opts= ;; |
||||||
|
+esac |
||||||
|
+exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} |
||||||
|
+# Admittedly, this is quite paranoid, since all the known shells bail |
||||||
|
+# out after a failed `exec'. |
||||||
|
+$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 |
||||||
|
+exit 255 |
||||||
|
fi |
||||||
|
|
||||||
|
if test x$as_have_required = xno; then : |
||||||
|
@@ -328,6 +356,14 @@ $as_echo X"$as_dir" | |
||||||
|
|
||||||
|
|
||||||
|
} # as_fn_mkdir_p |
||||||
|
+ |
||||||
|
+# as_fn_executable_p FILE |
||||||
|
+# ----------------------- |
||||||
|
+# Test if FILE is an executable regular file. |
||||||
|
+as_fn_executable_p () |
||||||
|
+{ |
||||||
|
+ test -f "$1" && test -x "$1" |
||||||
|
+} # as_fn_executable_p |
||||||
|
# as_fn_append VAR VALUE |
||||||
|
# ---------------------- |
||||||
|
# Append the text in VALUE to the end of the definition contained in VAR. Take |
||||||
|
@@ -449,6 +485,10 @@ as_cr_alnum=$as_cr_Letters$as_cr_digits |
||||||
|
chmod +x "$as_me.lineno" || |
||||||
|
{ $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } |
||||||
|
|
||||||
|
+ # If we had to re-execute with $CONFIG_SHELL, we're ensured to have |
||||||
|
+ # already done that, so ensure we don't try to do so again and fall |
||||||
|
+ # in an infinite loop. This has already happened in practice. |
||||||
|
+ _as_can_reexec=no; export _as_can_reexec |
||||||
|
# Don't try to exec as it changes $[0], causing all sort of problems |
||||||
|
# (the dirname of $[0] is not the place where we might find the |
||||||
|
# original and so on. Autoconf is especially sensitive to this). |
||||||
|
@@ -483,16 +523,16 @@ if (echo >conf$$.file) 2>/dev/null; then |
||||||
|
# ... but there are two gotchas: |
||||||
|
# 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. |
||||||
|
# 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. |
||||||
|
- # In both cases, we have to default to `cp -p'. |
||||||
|
+ # In both cases, we have to default to `cp -pR'. |
||||||
|
ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || |
||||||
|
- as_ln_s='cp -p' |
||||||
|
+ as_ln_s='cp -pR' |
||||||
|
elif ln conf$$.file conf$$ 2>/dev/null; then |
||||||
|
as_ln_s=ln |
||||||
|
else |
||||||
|
- as_ln_s='cp -p' |
||||||
|
+ as_ln_s='cp -pR' |
||||||
|
fi |
||||||
|
else |
||||||
|
- as_ln_s='cp -p' |
||||||
|
+ as_ln_s='cp -pR' |
||||||
|
fi |
||||||
|
rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file |
||||||
|
rmdir conf$$.dir 2>/dev/null |
||||||
|
@@ -504,28 +544,8 @@ else |
||||||
|
as_mkdir_p=false |
||||||
|
fi |
||||||
|
|
||||||
|
-if test -x / >/dev/null 2>&1; then |
||||||
|
- as_test_x='test -x' |
||||||
|
-else |
||||||
|
- if ls -dL / >/dev/null 2>&1; then |
||||||
|
- as_ls_L_option=L |
||||||
|
- else |
||||||
|
- as_ls_L_option= |
||||||
|
- fi |
||||||
|
- as_test_x=' |
||||||
|
- eval sh -c '\'' |
||||||
|
- if test -d "$1"; then |
||||||
|
- test -d "$1/."; |
||||||
|
- else |
||||||
|
- case $1 in #( |
||||||
|
- -*)set "./$1";; |
||||||
|
- esac; |
||||||
|
- case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #(( |
||||||
|
- ???[sx]*):;;*)false;;esac;fi |
||||||
|
- '\'' sh |
||||||
|
- ' |
||||||
|
-fi |
||||||
|
-as_executable_p=$as_test_x |
||||||
|
+as_test_x='test -x' |
||||||
|
+as_executable_p=as_fn_executable_p |
||||||
|
|
||||||
|
# Sed expression to map a string onto a valid CPP name. |
||||||
|
as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" |
||||||
|
@@ -715,6 +735,7 @@ with_fifodir |
||||||
|
with_flagdir |
||||||
|
with_libtirpc |
||||||
|
with_dmalloc |
||||||
|
+enable_sloppy_mount |
||||||
|
with_hesiod |
||||||
|
with_openldap |
||||||
|
with_sasl |
||||||
|
@@ -1187,8 +1208,6 @@ target=$target_alias |
||||||
|
if test "x$host_alias" != x; then |
||||||
|
if test "x$build_alias" = x; then |
||||||
|
cross_compiling=maybe |
||||||
|
- $as_echo "$as_me: WARNING: if you wanted to set the --build type, don't use --host. |
||||||
|
- If a cross compiler is detected then cross compile mode will be used" >&2 |
||||||
|
elif test "x$build_alias" != "x$host_alias"; then |
||||||
|
cross_compiling=yes |
||||||
|
fi |
||||||
|
@@ -1341,6 +1360,7 @@ Optional Features: |
||||||
|
--disable-option-checking ignore unrecognized --enable/--with options |
||||||
|
--disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) |
||||||
|
--enable-FEATURE[=ARG] include FEATURE [ARG=yes] |
||||||
|
+ --enable-sloppy-mount enable the use of the -s option to mount |
||||||
|
--disable-ext-env disable search in environment for substitution variable |
||||||
|
--disable-mount-locking disable use of locking when spawning mount command |
||||||
|
--enable-force-shutdown enable USR1 signal to force unlink umount of any |
||||||
|
@@ -1442,9 +1462,9 @@ test -n "$ac_init_help" && exit $ac_status |
||||||
|
if $ac_init_version; then |
||||||
|
cat <<\_ACEOF |
||||||
|
configure |
||||||
|
-generated by GNU Autoconf 2.68 |
||||||
|
+generated by GNU Autoconf 2.69 |
||||||
|
|
||||||
|
-Copyright (C) 2010 Free Software Foundation, Inc. |
||||||
|
+Copyright (C) 2012 Free Software Foundation, Inc. |
||||||
|
This configure script is free software; the Free Software Foundation |
||||||
|
gives unlimited permission to copy, distribute and modify it. |
||||||
|
_ACEOF |
||||||
|
@@ -1520,7 +1540,7 @@ $as_echo "$ac_try_echo"; } >&5 |
||||||
|
test ! -s conftest.err |
||||||
|
} && test -s conftest$ac_exeext && { |
||||||
|
test "$cross_compiling" = yes || |
||||||
|
- $as_test_x conftest$ac_exeext |
||||||
|
+ test -x conftest$ac_exeext |
||||||
|
}; then : |
||||||
|
ac_retval=0 |
||||||
|
else |
||||||
|
@@ -1740,7 +1760,7 @@ This file contains any messages produced by compilers while |
||||||
|
running configure, to aid debugging if configure makes a mistake. |
||||||
|
|
||||||
|
It was created by $as_me, which was |
||||||
|
-generated by GNU Autoconf 2.68. Invocation command line was |
||||||
|
+generated by GNU Autoconf 2.69. Invocation command line was |
||||||
|
|
||||||
|
$ $0 $@ |
||||||
|
|
||||||
|
@@ -2324,7 +2344,7 @@ do |
||||||
|
IFS=$as_save_IFS |
||||||
|
test -z "$as_dir" && as_dir=. |
||||||
|
for ac_exec_ext in '' $ac_executable_extensions; do |
||||||
|
- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then |
||||||
|
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then |
||||||
|
ac_cv_prog_CC="${ac_tool_prefix}gcc" |
||||||
|
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 |
||||||
|
break 2 |
||||||
|
@@ -2364,7 +2384,7 @@ do |
||||||
|
IFS=$as_save_IFS |
||||||
|
test -z "$as_dir" && as_dir=. |
||||||
|
for ac_exec_ext in '' $ac_executable_extensions; do |
||||||
|
- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then |
||||||
|
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then |
||||||
|
ac_cv_prog_ac_ct_CC="gcc" |
||||||
|
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 |
||||||
|
break 2 |
||||||
|
@@ -2417,7 +2437,7 @@ do |
||||||
|
IFS=$as_save_IFS |
||||||
|
test -z "$as_dir" && as_dir=. |
||||||
|
for ac_exec_ext in '' $ac_executable_extensions; do |
||||||
|
- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then |
||||||
|
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then |
||||||
|
ac_cv_prog_CC="${ac_tool_prefix}cc" |
||||||
|
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 |
||||||
|
break 2 |
||||||
|
@@ -2458,7 +2478,7 @@ do |
||||||
|
IFS=$as_save_IFS |
||||||
|
test -z "$as_dir" && as_dir=. |
||||||
|
for ac_exec_ext in '' $ac_executable_extensions; do |
||||||
|
- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then |
||||||
|
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then |
||||||
|
if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then |
||||||
|
ac_prog_rejected=yes |
||||||
|
continue |
||||||
|
@@ -2516,7 +2536,7 @@ do |
||||||
|
IFS=$as_save_IFS |
||||||
|
test -z "$as_dir" && as_dir=. |
||||||
|
for ac_exec_ext in '' $ac_executable_extensions; do |
||||||
|
- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then |
||||||
|
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then |
||||||
|
ac_cv_prog_CC="$ac_tool_prefix$ac_prog" |
||||||
|
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 |
||||||
|
break 2 |
||||||
|
@@ -2560,7 +2580,7 @@ do |
||||||
|
IFS=$as_save_IFS |
||||||
|
test -z "$as_dir" && as_dir=. |
||||||
|
for ac_exec_ext in '' $ac_executable_extensions; do |
||||||
|
- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then |
||||||
|
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then |
||||||
|
ac_cv_prog_ac_ct_CC="$ac_prog" |
||||||
|
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 |
||||||
|
break 2 |
||||||
|
@@ -3006,8 +3026,7 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext |
||||||
|
/* end confdefs.h. */ |
||||||
|
#include <stdarg.h> |
||||||
|
#include <stdio.h> |
||||||
|
-#include <sys/types.h> |
||||||
|
-#include <sys/stat.h> |
||||||
|
+struct stat; |
||||||
|
/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ |
||||||
|
struct buf { int x; }; |
||||||
|
FILE * (*rcsopen) (struct buf *, struct stat *, int); |
||||||
|
@@ -3209,7 +3228,7 @@ do |
||||||
|
IFS=$as_save_IFS |
||||||
|
test -z "$as_dir" && as_dir=. |
||||||
|
for ac_exec_ext in '' $ac_executable_extensions; do |
||||||
|
- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then |
||||||
|
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then |
||||||
|
ac_cv_path_MOUNT="$as_dir/$ac_word$ac_exec_ext" |
||||||
|
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 |
||||||
|
break 2 |
||||||
|
@@ -3269,7 +3288,7 @@ do |
||||||
|
IFS=$as_save_IFS |
||||||
|
test -z "$as_dir" && as_dir=. |
||||||
|
for ac_exec_ext in '' $ac_executable_extensions; do |
||||||
|
- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then |
||||||
|
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then |
||||||
|
ac_cv_path_MOUNT_NFS="$as_dir/$ac_word$ac_exec_ext" |
||||||
|
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 |
||||||
|
break 2 |
||||||
|
@@ -3329,7 +3348,7 @@ do |
||||||
|
IFS=$as_save_IFS |
||||||
|
test -z "$as_dir" && as_dir=. |
||||||
|
for ac_exec_ext in '' $ac_executable_extensions; do |
||||||
|
- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then |
||||||
|
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then |
||||||
|
ac_cv_path_UMOUNT="$as_dir/$ac_word$ac_exec_ext" |
||||||
|
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 |
||||||
|
break 2 |
||||||
|
@@ -3389,7 +3408,7 @@ do |
||||||
|
IFS=$as_save_IFS |
||||||
|
test -z "$as_dir" && as_dir=. |
||||||
|
for ac_exec_ext in '' $ac_executable_extensions; do |
||||||
|
- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then |
||||||
|
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then |
||||||
|
ac_cv_path_E2FSCK="$as_dir/$ac_word$ac_exec_ext" |
||||||
|
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 |
||||||
|
break 2 |
||||||
|
@@ -3448,7 +3467,7 @@ do |
||||||
|
IFS=$as_save_IFS |
||||||
|
test -z "$as_dir" && as_dir=. |
||||||
|
for ac_exec_ext in '' $ac_executable_extensions; do |
||||||
|
- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then |
||||||
|
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then |
||||||
|
ac_cv_path_E3FSCK="$as_dir/$ac_word$ac_exec_ext" |
||||||
|
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 |
||||||
|
break 2 |
||||||
|
@@ -3507,7 +3526,7 @@ do |
||||||
|
IFS=$as_save_IFS |
||||||
|
test -z "$as_dir" && as_dir=. |
||||||
|
for ac_exec_ext in '' $ac_executable_extensions; do |
||||||
|
- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then |
||||||
|
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then |
||||||
|
ac_cv_path_E4FSCK="$as_dir/$ac_word$ac_exec_ext" |
||||||
|
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 |
||||||
|
break 2 |
||||||
|
@@ -3566,7 +3585,7 @@ do |
||||||
|
IFS=$as_save_IFS |
||||||
|
test -z "$as_dir" && as_dir=. |
||||||
|
for ac_exec_ext in '' $ac_executable_extensions; do |
||||||
|
- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then |
||||||
|
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then |
||||||
|
ac_cv_path_MODPROBE="$as_dir/$ac_word$ac_exec_ext" |
||||||
|
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 |
||||||
|
break 2 |
||||||
|
@@ -3626,7 +3645,7 @@ do |
||||||
|
IFS=$as_save_IFS |
||||||
|
test -z "$as_dir" && as_dir=. |
||||||
|
for ac_exec_ext in '' $ac_executable_extensions; do |
||||||
|
- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then |
||||||
|
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then |
||||||
|
ac_cv_path_LEX="$as_dir/$ac_word$ac_exec_ext" |
||||||
|
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 |
||||||
|
break 2 |
||||||
|
@@ -3682,7 +3701,7 @@ do |
||||||
|
IFS=$as_save_IFS |
||||||
|
test -z "$as_dir" && as_dir=. |
||||||
|
for ac_exec_ext in '' $ac_executable_extensions; do |
||||||
|
- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then |
||||||
|
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then |
||||||
|
ac_cv_path_YACC="$as_dir/$ac_word$ac_exec_ext" |
||||||
|
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 |
||||||
|
break 2 |
||||||
|
@@ -3738,7 +3757,7 @@ do |
||||||
|
IFS=$as_save_IFS |
||||||
|
test -z "$as_dir" && as_dir=. |
||||||
|
for ac_exec_ext in '' $ac_executable_extensions; do |
||||||
|
- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then |
||||||
|
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then |
||||||
|
ac_cv_path_RANLIB="$as_dir/$ac_word$ac_exec_ext" |
||||||
|
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 |
||||||
|
break 2 |
||||||
|
@@ -3794,7 +3813,7 @@ do |
||||||
|
IFS=$as_save_IFS |
||||||
|
test -z "$as_dir" && as_dir=. |
||||||
|
for ac_exec_ext in '' $ac_executable_extensions; do |
||||||
|
- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then |
||||||
|
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then |
||||||
|
ac_cv_path_RPCGEN="$as_dir/$ac_word$ac_exec_ext" |
||||||
|
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 |
||||||
|
break 2 |
||||||
|
@@ -3858,13 +3877,19 @@ fi |
||||||
|
# Newer mounts have the -s (sloppy) option to ignore unknown options, |
||||||
|
# good for portability |
||||||
|
# |
||||||
|
-if test -n "$MOUNT" ; then |
||||||
|
+# Check whether --enable-sloppy-mount was given. |
||||||
|
+if test "${enable_sloppy_mount+set}" = set; then : |
||||||
|
+ enableval=$enable_sloppy_mount; |
||||||
|
+else |
||||||
|
+ enable_sloppy_mount=auto |
||||||
|
+fi |
||||||
|
+ |
||||||
|
+if test x$enable_sloppy_mount = xauto; then |
||||||
|
+ if test -n "$MOUNT" ; then |
||||||
|
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if mount accepts the -s option" >&5 |
||||||
|
$as_echo_n "checking if mount accepts the -s option... " >&6; } |
||||||
|
if "$MOUNT" -s > /dev/null 2>&1 ; then |
||||||
|
- |
||||||
|
-$as_echo "#define HAVE_SLOPPY_MOUNT 1" >>confdefs.h |
||||||
|
- |
||||||
|
+ enable_sloppy_mount=yes |
||||||
|
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 |
||||||
|
$as_echo "yes" >&6; } |
||||||
|
else |
||||||
|
@@ -3872,6 +3897,12 @@ $as_echo "yes" >&6; } |
||||||
|
$as_echo "no" >&6; } |
||||||
|
fi |
||||||
|
fi |
||||||
|
+fi |
||||||
|
+if test x$enable_sloppy_mount = xyes; then |
||||||
|
+ |
||||||
|
+$as_echo "#define HAVE_SLOPPY_MOUNT 1" >>confdefs.h |
||||||
|
+ |
||||||
|
+fi |
||||||
|
|
||||||
|
# LDAP SASL auth needs libxml and Kerberos |
||||||
|
for ac_prog in xml2-config |
||||||
|
@@ -3894,7 +3925,7 @@ do |
||||||
|
IFS=$as_save_IFS |
||||||
|
test -z "$as_dir" && as_dir=. |
||||||
|
for ac_exec_ext in '' $ac_executable_extensions; do |
||||||
|
- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then |
||||||
|
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then |
||||||
|
ac_cv_path_XML_CONFIG="$as_dir/$ac_word$ac_exec_ext" |
||||||
|
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 |
||||||
|
break 2 |
||||||
|
@@ -3969,7 +4000,7 @@ do |
||||||
|
IFS=$as_save_IFS |
||||||
|
test -z "$as_dir" && as_dir=. |
||||||
|
for ac_exec_ext in '' $ac_executable_extensions; do |
||||||
|
- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then |
||||||
|
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then |
||||||
|
ac_cv_path_KRB5_CONFIG="$as_dir/$ac_word$ac_exec_ext" |
||||||
|
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 |
||||||
|
break 2 |
||||||
|
@@ -4387,7 +4418,7 @@ do |
||||||
|
for ac_prog in grep ggrep; do |
||||||
|
for ac_exec_ext in '' $ac_executable_extensions; do |
||||||
|
ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" |
||||||
|
- { test -f "$ac_path_GREP" && $as_test_x "$ac_path_GREP"; } || continue |
||||||
|
+ as_fn_executable_p "$ac_path_GREP" || continue |
||||||
|
# Check for GNU ac_path_GREP and select it if it is found. |
||||||
|
# Check for GNU $ac_path_GREP |
||||||
|
case `"$ac_path_GREP" --version 2>&1` in |
||||||
|
@@ -4453,7 +4484,7 @@ do |
||||||
|
for ac_prog in egrep; do |
||||||
|
for ac_exec_ext in '' $ac_executable_extensions; do |
||||||
|
ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" |
||||||
|
- { test -f "$ac_path_EGREP" && $as_test_x "$ac_path_EGREP"; } || continue |
||||||
|
+ as_fn_executable_p "$ac_path_EGREP" || continue |
||||||
|
# Check for GNU ac_path_EGREP and select it if it is found. |
||||||
|
# Check for GNU $ac_path_EGREP |
||||||
|
case `"$ac_path_EGREP" --version 2>&1` in |
||||||
|
@@ -4928,7 +4959,7 @@ do |
||||||
|
IFS=$as_save_IFS |
||||||
|
test -z "$as_dir" && as_dir=. |
||||||
|
for ac_exec_ext in '' $ac_executable_extensions; do |
||||||
|
- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then |
||||||
|
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then |
||||||
|
ac_cv_prog_CC="${ac_tool_prefix}gcc" |
||||||
|
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 |
||||||
|
break 2 |
||||||
|
@@ -4968,7 +4999,7 @@ do |
||||||
|
IFS=$as_save_IFS |
||||||
|
test -z "$as_dir" && as_dir=. |
||||||
|
for ac_exec_ext in '' $ac_executable_extensions; do |
||||||
|
- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then |
||||||
|
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then |
||||||
|
ac_cv_prog_ac_ct_CC="gcc" |
||||||
|
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 |
||||||
|
break 2 |
||||||
|
@@ -5021,7 +5052,7 @@ do |
||||||
|
IFS=$as_save_IFS |
||||||
|
test -z "$as_dir" && as_dir=. |
||||||
|
for ac_exec_ext in '' $ac_executable_extensions; do |
||||||
|
- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then |
||||||
|
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then |
||||||
|
ac_cv_prog_CC="${ac_tool_prefix}cc" |
||||||
|
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 |
||||||
|
break 2 |
||||||
|
@@ -5062,7 +5093,7 @@ do |
||||||
|
IFS=$as_save_IFS |
||||||
|
test -z "$as_dir" && as_dir=. |
||||||
|
for ac_exec_ext in '' $ac_executable_extensions; do |
||||||
|
- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then |
||||||
|
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then |
||||||
|
if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then |
||||||
|
ac_prog_rejected=yes |
||||||
|
continue |
||||||
|
@@ -5120,7 +5151,7 @@ do |
||||||
|
IFS=$as_save_IFS |
||||||
|
test -z "$as_dir" && as_dir=. |
||||||
|
for ac_exec_ext in '' $ac_executable_extensions; do |
||||||
|
- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then |
||||||
|
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then |
||||||
|
ac_cv_prog_CC="$ac_tool_prefix$ac_prog" |
||||||
|
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 |
||||||
|
break 2 |
||||||
|
@@ -5164,7 +5195,7 @@ do |
||||||
|
IFS=$as_save_IFS |
||||||
|
test -z "$as_dir" && as_dir=. |
||||||
|
for ac_exec_ext in '' $ac_executable_extensions; do |
||||||
|
- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then |
||||||
|
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then |
||||||
|
ac_cv_prog_ac_ct_CC="$ac_prog" |
||||||
|
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 |
||||||
|
break 2 |
||||||
|
@@ -5360,8 +5391,7 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext |
||||||
|
/* end confdefs.h. */ |
||||||
|
#include <stdarg.h> |
||||||
|
#include <stdio.h> |
||||||
|
-#include <sys/types.h> |
||||||
|
-#include <sys/stat.h> |
||||||
|
+struct stat; |
||||||
|
/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ |
||||||
|
struct buf { int x; }; |
||||||
|
FILE * (*rcsopen) (struct buf *, struct stat *, int); |
||||||
|
@@ -5882,16 +5912,16 @@ if (echo >conf$$.file) 2>/dev/null; then |
||||||
|
# ... but there are two gotchas: |
||||||
|
# 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. |
||||||
|
# 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. |
||||||
|
- # In both cases, we have to default to `cp -p'. |
||||||
|
+ # In both cases, we have to default to `cp -pR'. |
||||||
|
ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || |
||||||
|
- as_ln_s='cp -p' |
||||||
|
+ as_ln_s='cp -pR' |
||||||
|
elif ln conf$$.file conf$$ 2>/dev/null; then |
||||||
|
as_ln_s=ln |
||||||
|
else |
||||||
|
- as_ln_s='cp -p' |
||||||
|
+ as_ln_s='cp -pR' |
||||||
|
fi |
||||||
|
else |
||||||
|
- as_ln_s='cp -p' |
||||||
|
+ as_ln_s='cp -pR' |
||||||
|
fi |
||||||
|
rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file |
||||||
|
rmdir conf$$.dir 2>/dev/null |
||||||
|
@@ -5951,28 +5981,16 @@ else |
||||||
|
as_mkdir_p=false |
||||||
|
fi |
||||||
|
|
||||||
|
-if test -x / >/dev/null 2>&1; then |
||||||
|
- as_test_x='test -x' |
||||||
|
-else |
||||||
|
- if ls -dL / >/dev/null 2>&1; then |
||||||
|
- as_ls_L_option=L |
||||||
|
- else |
||||||
|
- as_ls_L_option= |
||||||
|
- fi |
||||||
|
- as_test_x=' |
||||||
|
- eval sh -c '\'' |
||||||
|
- if test -d "$1"; then |
||||||
|
- test -d "$1/."; |
||||||
|
- else |
||||||
|
- case $1 in #( |
||||||
|
- -*)set "./$1";; |
||||||
|
- esac; |
||||||
|
- case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #(( |
||||||
|
- ???[sx]*):;;*)false;;esac;fi |
||||||
|
- '\'' sh |
||||||
|
- ' |
||||||
|
-fi |
||||||
|
-as_executable_p=$as_test_x |
||||||
|
+ |
||||||
|
+# as_fn_executable_p FILE |
||||||
|
+# ----------------------- |
||||||
|
+# Test if FILE is an executable regular file. |
||||||
|
+as_fn_executable_p () |
||||||
|
+{ |
||||||
|
+ test -f "$1" && test -x "$1" |
||||||
|
+} # as_fn_executable_p |
||||||
|
+as_test_x='test -x' |
||||||
|
+as_executable_p=as_fn_executable_p |
||||||
|
|
||||||
|
# Sed expression to map a string onto a valid CPP name. |
||||||
|
as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" |
||||||
|
@@ -5994,7 +6012,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 |
||||||
|
# values after options handling. |
||||||
|
ac_log=" |
||||||
|
This file was extended by $as_me, which was |
||||||
|
-generated by GNU Autoconf 2.68. Invocation command line was |
||||||
|
+generated by GNU Autoconf 2.69. Invocation command line was |
||||||
|
|
||||||
|
CONFIG_FILES = $CONFIG_FILES |
||||||
|
CONFIG_HEADERS = $CONFIG_HEADERS |
||||||
|
@@ -6056,10 +6074,10 @@ cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 |
||||||
|
ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" |
||||||
|
ac_cs_version="\\ |
||||||
|
config.status |
||||||
|
-configured by $0, generated by GNU Autoconf 2.68, |
||||||
|
+configured by $0, generated by GNU Autoconf 2.69, |
||||||
|
with options \\"\$ac_cs_config\\" |
||||||
|
|
||||||
|
-Copyright (C) 2010 Free Software Foundation, Inc. |
||||||
|
+Copyright (C) 2012 Free Software Foundation, Inc. |
||||||
|
This config.status script is free software; the Free Software Foundation |
||||||
|
gives unlimited permission to copy, distribute and modify it." |
||||||
|
|
||||||
|
@@ -6147,7 +6165,7 @@ fi |
||||||
|
_ACEOF |
||||||
|
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 |
||||||
|
if \$ac_cs_recheck; then |
||||||
|
- set X '$SHELL' '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion |
||||||
|
+ set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion |
||||||
|
shift |
||||||
|
\$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 |
||||||
|
CONFIG_SHELL='$SHELL' |
||||||
|
diff --git a/configure.in b/configure.in |
||||||
|
index 4029375..559045a 100644 |
||||||
|
--- a/configure.in |
||||||
|
+++ b/configure.in |
||||||
|
@@ -157,7 +157,15 @@ AC_SUBST(sssldir) |
||||||
|
# Newer mounts have the -s (sloppy) option to ignore unknown options, |
||||||
|
# good for portability |
||||||
|
# |
||||||
|
-AF_SLOPPY_MOUNT() |
||||||
|
+AC_ARG_ENABLE(sloppy-mount, |
||||||
|
+[ --enable-sloppy-mount enable the use of the -s option to mount],, |
||||||
|
+ enable_sloppy_mount=auto) |
||||||
|
+if test x$enable_sloppy_mount = xauto; then |
||||||
|
+ AF_SLOPPY_MOUNT() |
||||||
|
+fi |
||||||
|
+if test x$enable_sloppy_mount = xyes; then |
||||||
|
+ AC_DEFINE(HAVE_SLOPPY_MOUNT, 1, [define if the mount command supports the -s option]) |
||||||
|
+fi |
||||||
|
|
||||||
|
# LDAP SASL auth needs libxml and Kerberos |
||||||
|
AF_CHECK_LIBXML() |
@ -0,0 +1,23 @@ |
|||||||
|
autofs-5.0.7 - add initialization of bind_result in-do_sasl_bind() |
||||||
|
|
||||||
|
From: Ian Kent <raven@themaw.net> |
||||||
|
|
||||||
|
There is an unlikley code path where bind_result could be used uninitialized |
||||||
|
so initialize it so it isn't incorrectly used if it has rubish in it. |
||||||
|
--- |
||||||
|
modules/cyrus-sasl.c | 2 +- |
||||||
|
1 file changed, 1 insertion(+), 1 deletion(-) |
||||||
|
|
||||||
|
diff --git a/modules/cyrus-sasl.c b/modules/cyrus-sasl.c |
||||||
|
index b456333..68f9242 100644 |
||||||
|
--- a/modules/cyrus-sasl.c |
||||||
|
+++ b/modules/cyrus-sasl.c |
||||||
|
@@ -210,7 +210,7 @@ int |
||||||
|
do_sasl_bind(unsigned logopt, LDAP *ld, sasl_conn_t *conn, const char **clientout, |
||||||
|
unsigned int *clientoutlen, const char *auth_mech, int sasl_result) |
||||||
|
{ |
||||||
|
- int ret, msgid, bind_result; |
||||||
|
+ int ret, msgid, bind_result = LDAP_OTHER; |
||||||
|
struct berval client_cred, *server_cred, temp_cred; |
||||||
|
LDAPMessage *results; |
||||||
|
int have_data, expected_data; |
@ -0,0 +1,25 @@ |
|||||||
|
autofs-5.0.7 - add map entry null check in do_expire_direct() |
||||||
|
|
||||||
|
From: Ian Kent <raven@themaw.net> |
||||||
|
|
||||||
|
Since we've seen a mount failure for this map entry it should exist |
||||||
|
but add a null check in case it's been removed while we waited on |
||||||
|
the lock. |
||||||
|
--- |
||||||
|
daemon/direct.c | 3 ++- |
||||||
|
1 file changed, 2 insertions(+), 1 deletion(-) |
||||||
|
|
||||||
|
diff --git a/daemon/direct.c b/daemon/direct.c |
||||||
|
index 399ad0a..f85e1b5 100644 |
||||||
|
--- a/daemon/direct.c |
||||||
|
+++ b/daemon/direct.c |
||||||
|
@@ -1019,7 +1019,8 @@ static void *do_expire_direct(void *arg) |
||||||
|
struct mapent *me; |
||||||
|
cache_writelock(mt.mc); |
||||||
|
me = cache_lookup_distinct(mt.mc, mt.name); |
||||||
|
- me->ioctlfd = -1; |
||||||
|
+ if (me) |
||||||
|
+ me->ioctlfd = -1; |
||||||
|
cache_unlock(mt.mc); |
||||||
|
ops->send_ready(ap->logopt, mt.ioctlfd, mt.wait_queue_token); |
||||||
|
ops->close(ap->logopt, mt.ioctlfd); |
@ -0,0 +1,24 @@ |
|||||||
|
autofs-5.0.7 - add mapent null check in lookup_nisplus.c:lookup_mount() |
||||||
|
|
||||||
|
From: Ian Kent <raven@themaw.net> |
||||||
|
|
||||||
|
malloc(3) could return null under low memory conditions, add a null check |
||||||
|
for this case. |
||||||
|
--- |
||||||
|
modules/lookup_nisplus.c | 3 ++- |
||||||
|
1 file changed, 2 insertions(+), 1 deletion(-) |
||||||
|
|
||||||
|
diff --git a/modules/lookup_nisplus.c b/modules/lookup_nisplus.c |
||||||
|
index 8237a1e..ef942a7 100644 |
||||||
|
--- a/modules/lookup_nisplus.c |
||||||
|
+++ b/modules/lookup_nisplus.c |
||||||
|
@@ -584,7 +584,8 @@ int lookup_mount(struct autofs_point *ap, const char *name, int name_len, void * |
||||||
|
if (me && (me->source == source || *me->key == '/')) { |
||||||
|
mapent_len = strlen(me->mapent); |
||||||
|
mapent = malloc(mapent_len + 1); |
||||||
|
- strcpy(mapent, me->mapent); |
||||||
|
+ if (mapent) |
||||||
|
+ strcpy(mapent, me->mapent); |
||||||
|
} |
||||||
|
} |
||||||
|
cache_unlock(mc); |
@ -0,0 +1,23 @@ |
|||||||
|
autofs-5.0.7 - add null check in extract_version() |
||||||
|
|
||||||
|
From: Ian Kent <raven@themaw.net> |
||||||
|
|
||||||
|
A space should always be found in the passed in string but a check |
||||||
|
should be done in case it isn't. |
||||||
|
--- |
||||||
|
lib/mounts.c | 2 ++ |
||||||
|
1 file changed, 2 insertions(+) |
||||||
|
|
||||||
|
diff --git a/lib/mounts.c b/lib/mounts.c |
||||||
|
index 0caa0aa..7b959b8 100644 |
||||||
|
--- a/lib/mounts.c |
||||||
|
+++ b/lib/mounts.c |
||||||
|
@@ -168,6 +168,8 @@ unsigned int get_kver_minor(void) |
||||||
|
static int extract_version(char *start, struct nfs_mount_vers *vers) |
||||||
|
{ |
||||||
|
char *s_ver = strchr(start, ' '); |
||||||
|
+ if (!s_ver) |
||||||
|
+ return 0; |
||||||
|
while (*s_ver && !isdigit(*s_ver)) { |
||||||
|
s_ver++; |
||||||
|
if (!*s_ver) |
@ -0,0 +1,26 @@ |
|||||||
|
autofs-5.0.7 - add null check in parse_server_string() |
||||||
|
|
||||||
|
From: Ian Kent <raven@themaw.net> |
||||||
|
|
||||||
|
Add an error check for the case there's no ':' server name delimiter in |
||||||
|
parse_server_string(). |
||||||
|
--- |
||||||
|
modules/lookup_ldap.c | 5 +++++ |
||||||
|
1 file changed, 5 insertions(+) |
||||||
|
|
||||||
|
diff --git a/modules/lookup_ldap.c b/modules/lookup_ldap.c |
||||||
|
index 17cbe9a..a59de92 100644 |
||||||
|
--- a/modules/lookup_ldap.c |
||||||
|
+++ b/modules/lookup_ldap.c |
||||||
|
@@ -1212,6 +1212,11 @@ static int parse_server_string(unsigned logopt, const char *url, struct lookup_c |
||||||
|
/* Isolate the server. Include the port spec */ |
||||||
|
if (*ptr != '[') |
||||||
|
q = strchr(ptr, ':'); |
||||||
|
+ if (!q) { |
||||||
|
+ crit(logopt, MODPREFIX |
||||||
|
+ "LDAP server name not found in %s", ptr); |
||||||
|
+ return 0; |
||||||
|
+ } |
||||||
|
else { |
||||||
|
q = ++ptr; |
||||||
|
while (*q == ':' || isxdigit(*q)) |
@ -0,0 +1,26 @@ |
|||||||
|
autofs-5.0.7 - add null check in read_one() |
||||||
|
|
||||||
|
From: Ian Kent <raven@themaw.net> |
||||||
|
|
||||||
|
The pointter p shouldn't be null here but add a chack anyway. |
||||||
|
--- |
||||||
|
modules/lookup_file.c | 6 ++++-- |
||||||
|
1 file changed, 4 insertions(+), 2 deletions(-) |
||||||
|
|
||||||
|
diff --git a/modules/lookup_file.c b/modules/lookup_file.c |
||||||
|
index 65e5ee6..2836996 100644 |
||||||
|
--- a/modules/lookup_file.c |
||||||
|
+++ b/modules/lookup_file.c |
||||||
|
@@ -302,8 +302,10 @@ static int read_one(unsigned logopt, FILE *f, char *key, unsigned int *k_len, ch |
||||||
|
if (gotten == got_real || gotten == getting) |
||||||
|
goto got_it; |
||||||
|
} else if (mapent_len < MAPENT_MAX_LEN) { |
||||||
|
- mapent_len++; |
||||||
|
- *(p++) = ch; |
||||||
|
+ if (p) { |
||||||
|
+ mapent_len++; |
||||||
|
+ *(p++) = ch; |
||||||
|
+ } |
||||||
|
nch = getc(f); |
||||||
|
if (nch == EOF && |
||||||
|
(gotten == got_real || gotten == getting)) |
@ -0,0 +1,23 @@ |
|||||||
|
autofs-5.0.7 - add pgrp check in do_spawn() |
||||||
|
|
||||||
|
From: Ian Kent <raven@themaw.net> |
||||||
|
|
||||||
|
The process group should never be negative here but add a check anyway. |
||||||
|
--- |
||||||
|
daemon/spawn.c | 3 ++- |
||||||
|
1 file changed, 2 insertions(+), 1 deletion(-) |
||||||
|
|
||||||
|
diff --git a/daemon/spawn.c b/daemon/spawn.c |
||||||
|
index 9b8d5a2..abb353a 100644 |
||||||
|
--- a/daemon/spawn.c |
||||||
|
+++ b/daemon/spawn.c |
||||||
|
@@ -201,7 +201,8 @@ static int do_spawn(unsigned logopt, unsigned int wait, |
||||||
|
|
||||||
|
seteuid(0); |
||||||
|
setegid(0); |
||||||
|
- setpgid(0, pgrp); |
||||||
|
+ if (pgrp >= 0) |
||||||
|
+ setpgid(0, pgrp); |
||||||
|
} |
||||||
|
|
||||||
|
execv(prog, (char *const *) argv); |
@ -0,0 +1,70 @@ |
|||||||
|
autofs-5.0.7 - add short host name standard marco variable |
||||||
|
|
||||||
|
From: Ian Kent <raven@themaw.net> |
||||||
|
|
||||||
|
Sometimes the short hostname (without the domain part) could be useful. |
||||||
|
Add this to the standard additional macro variables, in particular, to |
||||||
|
compliment the ${HOST} macro. |
||||||
|
--- |
||||||
|
CHANGELOG | 1 + |
||||||
|
man/autofs.5 | 2 +- |
||||||
|
modules/parse_sun.c | 13 +++++++++++++ |
||||||
|
3 files changed, 15 insertions(+), 1 deletion(-) |
||||||
|
|
||||||
|
--- autofs-5.0.7.orig/CHANGELOG |
||||||
|
+++ autofs-5.0.7/CHANGELOG |
||||||
|
@@ -77,6 +77,7 @@ |
||||||
|
- fix fix options compare. |
||||||
|
- fix max() declaration. |
||||||
|
- setup program map env from macro table. |
||||||
|
+- add short host name standard marco variable. |
||||||
|
|
||||||
|
25/07/2012 autofs-5.0.7 |
||||||
|
======================= |
||||||
|
--- autofs-5.0.7.orig/man/autofs.5 |
||||||
|
+++ autofs-5.0.7/man/autofs.5 |
||||||
|
@@ -170,7 +170,7 @@ UID The user login ID |
||||||
|
GROUP The user group name |
||||||
|
GID The user group ID |
||||||
|
HOME The user home directory |
||||||
|
-HOST Hostname (uname -n) |
||||||
|
+SHOST Short hostname (domain part removed if present) |
||||||
|
.fi |
||||||
|
.RE |
||||||
|
.sp |
||||||
|
--- autofs-5.0.7.orig/modules/parse_sun.c |
||||||
|
+++ autofs-5.0.7/modules/parse_sun.c |
||||||
|
@@ -107,6 +107,7 @@ static struct substvar *addstdenv(struct |
||||||
|
|
||||||
|
tsv = pthread_getspecific(key_thread_stdenv_vars); |
||||||
|
if (tsv) { |
||||||
|
+ struct substvar *mv; |
||||||
|
int ret; |
||||||
|
long num; |
||||||
|
|
||||||
|
@@ -121,6 +122,17 @@ static struct substvar *addstdenv(struct |
||||||
|
list = macro_addvar(list, "USER", 4, tsv->user); |
||||||
|
list = macro_addvar(list, "GROUP", 5, tsv->group); |
||||||
|
list = macro_addvar(list, "HOME", 4, tsv->home); |
||||||
|
+ mv = macro_findvar(list, "HOST", 4); |
||||||
|
+ if (mv) { |
||||||
|
+ char *shost = strdup(mv->val); |
||||||
|
+ if (shost) { |
||||||
|
+ char *dot = strchr(shost, '.'); |
||||||
|
+ if (dot) |
||||||
|
+ *dot = '\0'; |
||||||
|
+ list = macro_addvar(list, "SHOST", 5, shost); |
||||||
|
+ free(shost); |
||||||
|
+ } |
||||||
|
+ } |
||||||
|
} |
||||||
|
return list; |
||||||
|
} |
||||||
|
@@ -134,6 +146,7 @@ static struct substvar *removestdenv(str |
||||||
|
list = macro_removevar(list, "HOME", 4); |
||||||
|
list = macro_removevar(list, "GID", 3); |
||||||
|
list = macro_removevar(list, "GROUP", 5); |
||||||
|
+ list = macro_removevar(list, "SHOST", 5); |
||||||
|
return list; |
||||||
|
} |
||||||
|
|
@ -0,0 +1,171 @@ |
|||||||
|
autofs-5.0.7 - add std vars to program map invocation |
||||||
|
|
||||||
|
From: Ian Kent <ikent@redhat.com> |
||||||
|
|
||||||
|
Program maps currently don't have the standard macro variables set |
||||||
|
in the environemt when they run. |
||||||
|
|
||||||
|
Also, program maps aren't necessarily executed within a shell so |
||||||
|
setting the standard variables in the environment needs to be done |
||||||
|
the same way it's done by the Sun map parser. |
||||||
|
--- |
||||||
|
CHANGELOG | 1 |
||||||
|
include/mounts.h | 3 ++ |
||||||
|
lib/mounts.c | 51 +++++++++++++++++++++++++++++++++++++++++++++++ |
||||||
|
modules/lookup_program.c | 2 + |
||||||
|
modules/parse_sun.c | 51 ----------------------------------------------- |
||||||
|
5 files changed, 57 insertions(+), 51 deletions(-) |
||||||
|
|
||||||
|
--- autofs-5.0.7.orig/CHANGELOG |
||||||
|
+++ autofs-5.0.7/CHANGELOG |
||||||
|
@@ -79,6 +79,7 @@ |
||||||
|
- setup program map env from macro table. |
||||||
|
- add short host name standard marco variable. |
||||||
|
- fix symlink fail message in mount_bind.c. |
||||||
|
+- add std vars to program map invocation. |
||||||
|
|
||||||
|
25/07/2012 autofs-5.0.7 |
||||||
|
======================= |
||||||
|
--- autofs-5.0.7.orig/include/mounts.h |
||||||
|
+++ autofs-5.0.7/include/mounts.h |
||||||
|
@@ -85,6 +85,9 @@ unsigned int linux_version_code(void); |
||||||
|
int check_nfs_mount_version(struct nfs_mount_vers *, struct nfs_mount_vers *); |
||||||
|
extern unsigned int nfs_mount_uses_string_options; |
||||||
|
|
||||||
|
+struct substvar *addstdenv(struct substvar *sv); |
||||||
|
+struct substvar *removestdenv(struct substvar *sv); |
||||||
|
+ |
||||||
|
unsigned int query_kproto_ver(void); |
||||||
|
unsigned int get_kver_major(void); |
||||||
|
unsigned int get_kver_minor(void); |
||||||
|
--- autofs-5.0.7.orig/lib/mounts.c |
||||||
|
+++ autofs-5.0.7/lib/mounts.c |
||||||
|
@@ -303,6 +303,57 @@ int check_nfs_mount_version(struct nfs_m |
||||||
|
} |
||||||
|
#endif |
||||||
|
|
||||||
|
+struct substvar *addstdenv(struct substvar *sv) |
||||||
|
+{ |
||||||
|
+ struct substvar *list = sv; |
||||||
|
+ struct thread_stdenv_vars *tsv; |
||||||
|
+ char numbuf[16]; |
||||||
|
+ |
||||||
|
+ tsv = pthread_getspecific(key_thread_stdenv_vars); |
||||||
|
+ if (tsv) { |
||||||
|
+ const struct substvar *mv; |
||||||
|
+ int ret; |
||||||
|
+ long num; |
||||||
|
+ |
||||||
|
+ num = (long) tsv->uid; |
||||||
|
+ ret = sprintf(numbuf, "%ld", num); |
||||||
|
+ if (ret > 0) |
||||||
|
+ list = macro_addvar(list, "UID", 3, numbuf); |
||||||
|
+ num = (long) tsv->gid; |
||||||
|
+ ret = sprintf(numbuf, "%ld", num); |
||||||
|
+ if (ret > 0) |
||||||
|
+ list = macro_addvar(list, "GID", 3, numbuf); |
||||||
|
+ list = macro_addvar(list, "USER", 4, tsv->user); |
||||||
|
+ list = macro_addvar(list, "GROUP", 5, tsv->group); |
||||||
|
+ list = macro_addvar(list, "HOME", 4, tsv->home); |
||||||
|
+ mv = macro_findvar(list, "HOST", 4); |
||||||
|
+ if (mv) { |
||||||
|
+ char *shost = strdup(mv->val); |
||||||
|
+ if (shost) { |
||||||
|
+ char *dot = strchr(shost, '.'); |
||||||
|
+ if (dot) |
||||||
|
+ *dot = '\0'; |
||||||
|
+ list = macro_addvar(list, "SHOST", 5, shost); |
||||||
|
+ free(shost); |
||||||
|
+ } |
||||||
|
+ } |
||||||
|
+ } |
||||||
|
+ return list; |
||||||
|
+} |
||||||
|
+ |
||||||
|
+struct substvar *removestdenv(struct substvar *sv) |
||||||
|
+{ |
||||||
|
+ struct substvar *list = sv; |
||||||
|
+ |
||||||
|
+ list = macro_removevar(list, "UID", 3); |
||||||
|
+ list = macro_removevar(list, "USER", 4); |
||||||
|
+ list = macro_removevar(list, "HOME", 4); |
||||||
|
+ list = macro_removevar(list, "GID", 3); |
||||||
|
+ list = macro_removevar(list, "GROUP", 5); |
||||||
|
+ list = macro_removevar(list, "SHOST", 5); |
||||||
|
+ return list; |
||||||
|
+} |
||||||
|
+ |
||||||
|
/* |
||||||
|
* Make common autofs mount options string |
||||||
|
*/ |
||||||
|
--- autofs-5.0.7.orig/modules/lookup_program.c |
||||||
|
+++ autofs-5.0.7/modules/lookup_program.c |
||||||
|
@@ -271,6 +271,8 @@ int lookup_mount(struct autofs_point *ap |
||||||
|
*/ |
||||||
|
if (ctxt->mapfmt && strcmp(ctxt->mapfmt, "MAPFMT_DEFAULT")) { |
||||||
|
struct parse_context *pctxt = (struct parse_context *) ctxt->parse->context; |
||||||
|
+ /* Add standard environment as seen by sun map parser */ |
||||||
|
+ pctxt->subst = addstdenv(pctxt->subst); |
||||||
|
macro_setenv(pctxt->subst); |
||||||
|
} |
||||||
|
execl(ctxt->mapname, ctxt->mapname, name, NULL); |
||||||
|
--- autofs-5.0.7.orig/modules/parse_sun.c |
||||||
|
+++ autofs-5.0.7/modules/parse_sun.c |
||||||
|
@@ -99,57 +99,6 @@ static void kill_context(struct parse_co |
||||||
|
free(ctxt); |
||||||
|
} |
||||||
|
|
||||||
|
-static struct substvar *addstdenv(struct substvar *sv) |
||||||
|
-{ |
||||||
|
- struct substvar *list = sv; |
||||||
|
- struct thread_stdenv_vars *tsv; |
||||||
|
- char numbuf[16]; |
||||||
|
- |
||||||
|
- tsv = pthread_getspecific(key_thread_stdenv_vars); |
||||||
|
- if (tsv) { |
||||||
|
- struct substvar *mv; |
||||||
|
- int ret; |
||||||
|
- long num; |
||||||
|
- |
||||||
|
- num = (long) tsv->uid; |
||||||
|
- ret = sprintf(numbuf, "%ld", num); |
||||||
|
- if (ret > 0) |
||||||
|
- list = macro_addvar(list, "UID", 3, numbuf); |
||||||
|
- num = (long) tsv->gid; |
||||||
|
- ret = sprintf(numbuf, "%ld", num); |
||||||
|
- if (ret > 0) |
||||||
|
- list = macro_addvar(list, "GID", 3, numbuf); |
||||||
|
- list = macro_addvar(list, "USER", 4, tsv->user); |
||||||
|
- list = macro_addvar(list, "GROUP", 5, tsv->group); |
||||||
|
- list = macro_addvar(list, "HOME", 4, tsv->home); |
||||||
|
- mv = macro_findvar(list, "HOST", 4); |
||||||
|
- if (mv) { |
||||||
|
- char *shost = strdup(mv->val); |
||||||
|
- if (shost) { |
||||||
|
- char *dot = strchr(shost, '.'); |
||||||
|
- if (dot) |
||||||
|
- *dot = '\0'; |
||||||
|
- list = macro_addvar(list, "SHOST", 5, shost); |
||||||
|
- free(shost); |
||||||
|
- } |
||||||
|
- } |
||||||
|
- } |
||||||
|
- return list; |
||||||
|
-} |
||||||
|
- |
||||||
|
-static struct substvar *removestdenv(struct substvar *sv) |
||||||
|
-{ |
||||||
|
- struct substvar *list = sv; |
||||||
|
- |
||||||
|
- list = macro_removevar(list, "UID", 3); |
||||||
|
- list = macro_removevar(list, "USER", 4); |
||||||
|
- list = macro_removevar(list, "HOME", 4); |
||||||
|
- list = macro_removevar(list, "GID", 3); |
||||||
|
- list = macro_removevar(list, "GROUP", 5); |
||||||
|
- list = macro_removevar(list, "SHOST", 5); |
||||||
|
- return list; |
||||||
|
-} |
||||||
|
- |
||||||
|
/* |
||||||
|
* $- and &-expand a Sun-style map entry and return the length of the entry. |
||||||
|
* If "dst" is NULL, just count the length. |
@ -0,0 +1,217 @@ |
|||||||
|
autofs-5.0.7 - add symlink pseudo option |
||||||
|
|
||||||
|
From: Ian Kent <raven@themaw.net> |
||||||
|
|
||||||
|
Add a "symlink" pseudo option to tell the bind mount module to symlink |
||||||
|
instead of bind when mounting mounts other than direct mounts and |
||||||
|
non-root indirect mount offset mounts (aka. non-root multi-mount |
||||||
|
entries). |
||||||
|
--- |
||||||
|
CHANGELOG | 1 + |
||||||
|
include/automount.h | 3 +++ |
||||||
|
lib/master_parse.y | 8 +++++++- |
||||||
|
lib/master_tok.l | 1 + |
||||||
|
man/auto.master.5.in | 8 ++++++++ |
||||||
|
modules/mount_autofs.c | 5 +++++ |
||||||
|
modules/mount_bind.c | 36 +++++++++++++++++++++++++++++++++++- |
||||||
|
7 files changed, 60 insertions(+), 2 deletions(-) |
||||||
|
|
||||||
|
diff --git a/CHANGELOG b/CHANGELOG |
||||||
|
index c189483..247d334 100644 |
||||||
|
--- a/CHANGELOG |
||||||
|
+++ b/CHANGELOG |
||||||
|
@@ -32,6 +32,7 @@ |
||||||
|
- fix wildcard multi map regression. |
||||||
|
- fix file descriptor leak when reloading the daemon. |
||||||
|
- depricate nosymlink pseudo option. |
||||||
|
+- add symlink pseudo option. |
||||||
|
|
||||||
|
25/07/2012 autofs-5.0.7 |
||||||
|
======================= |
||||||
|
diff --git a/include/automount.h b/include/automount.h |
||||||
|
index 37541f5..e72fa0d 100644 |
||||||
|
--- a/include/automount.h |
||||||
|
+++ b/include/automount.h |
||||||
|
@@ -455,6 +455,9 @@ struct kernel_mod_version { |
||||||
|
/* Don't use bind mounts even when system supports them */ |
||||||
|
#define MOUNT_FLAG_NOBIND 0x0020 |
||||||
|
|
||||||
|
+/* Use symlinks instead of bind mounting local mounts */ |
||||||
|
+#define MOUNT_FLAG_SYMLINK 0x0040 |
||||||
|
+ |
||||||
|
struct autofs_point { |
||||||
|
pthread_t thid; |
||||||
|
char *path; /* Mount point name */ |
||||||
|
diff --git a/lib/master_parse.y b/lib/master_parse.y |
||||||
|
index f925b5a..11caf5b 100644 |
||||||
|
--- a/lib/master_parse.y |
||||||
|
+++ b/lib/master_parse.y |
||||||
|
@@ -57,6 +57,7 @@ static char *type; |
||||||
|
static char *format; |
||||||
|
static long timeout; |
||||||
|
static long negative_timeout; |
||||||
|
+static unsigned symlnk; |
||||||
|
static unsigned nobind; |
||||||
|
static unsigned ghost; |
||||||
|
extern unsigned global_selection_options; |
||||||
|
@@ -100,7 +101,7 @@ static int master_fprintf(FILE *, char *, ...); |
||||||
|
%token COMMENT |
||||||
|
%token MAP |
||||||
|
%token OPT_TIMEOUT OPT_NTIMEOUT OPT_NOBIND OPT_NOGHOST OPT_GHOST OPT_VERBOSE |
||||||
|
-%token OPT_DEBUG OPT_RANDOM OPT_USE_WEIGHT |
||||||
|
+%token OPT_DEBUG OPT_RANDOM OPT_USE_WEIGHT OPT_SYMLINK |
||||||
|
%token COLON COMMA NL DDASH |
||||||
|
%type <strtype> map |
||||||
|
%type <strtype> options |
||||||
|
@@ -186,6 +187,7 @@ line: |
||||||
|
| PATH OPT_USE_WEIGHT { master_notify($1); YYABORT; } |
||||||
|
| PATH OPT_DEBUG { master_notify($1); YYABORT; } |
||||||
|
| PATH OPT_TIMEOUT { master_notify($1); YYABORT; } |
||||||
|
+ | PATH OPT_SYMLINK { master_notify($1); YYABORT; } |
||||||
|
| PATH OPT_NOBIND { master_notify($1); YYABORT; } |
||||||
|
| PATH OPT_GHOST { master_notify($1); YYABORT; } |
||||||
|
| PATH OPT_NOGHOST { master_notify($1); YYABORT; } |
||||||
|
@@ -557,6 +559,7 @@ option: daemon_option |
||||||
|
|
||||||
|
daemon_option: OPT_TIMEOUT NUMBER { timeout = $2; } |
||||||
|
| OPT_NTIMEOUT NUMBER { negative_timeout = $2; } |
||||||
|
+ | OPT_SYMLINK { symlnk = 1; } |
||||||
|
| OPT_NOBIND { nobind = 1; } |
||||||
|
| OPT_NOGHOST { ghost = 0; } |
||||||
|
| OPT_GHOST { ghost = 1; } |
||||||
|
@@ -627,6 +630,7 @@ static void local_init_vars(void) |
||||||
|
debug = 0; |
||||||
|
timeout = -1; |
||||||
|
negative_timeout = 0; |
||||||
|
+ symlnk = 0; |
||||||
|
nobind = 0; |
||||||
|
ghost = defaults_get_browse_mode(); |
||||||
|
random_selection = global_selection_options & MOUNT_FLAG_RANDOM_SELECT; |
||||||
|
@@ -811,6 +815,8 @@ int master_parse_entry(const char *buffer, unsigned int default_timeout, unsigne |
||||||
|
entry->ap->flags |= MOUNT_FLAG_RANDOM_SELECT; |
||||||
|
if (use_weight) |
||||||
|
entry->ap->flags |= MOUNT_FLAG_USE_WEIGHT_ONLY; |
||||||
|
+ if (symlnk) |
||||||
|
+ entry->ap->flags |= MOUNT_FLAG_SYMLINK; |
||||||
|
if (negative_timeout) |
||||||
|
entry->ap->negative_timeout = negative_timeout; |
||||||
|
|
||||||
|
diff --git a/lib/master_tok.l b/lib/master_tok.l |
||||||
|
index 30abb15..f9b4e55 100644 |
||||||
|
--- a/lib/master_tok.l |
||||||
|
+++ b/lib/master_tok.l |
||||||
|
@@ -361,6 +361,7 @@ OPTNTOUT (-n{OPTWS}|-n{OPTWS}={OPTWS}|--negative-timeout{OPTWS}|--negative-timeo |
||||||
|
return(NUMBER); |
||||||
|
} |
||||||
|
|
||||||
|
+ -?symlink { return(OPT_SYMLINK); } |
||||||
|
-?nobind { return(OPT_NOBIND); } |
||||||
|
-?nobrowse { return(OPT_NOGHOST); } |
||||||
|
-g|--ghost|-?browse { return(OPT_GHOST); } |
||||||
|
diff --git a/man/auto.master.5.in b/man/auto.master.5.in |
||||||
|
index 8007542..bbea43a 100644 |
||||||
|
--- a/man/auto.master.5.in |
||||||
|
+++ b/man/auto.master.5.in |
||||||
|
@@ -159,6 +159,14 @@ on individual map entries of both types. Bind mounting of NFS file |
||||||
|
systems can also be prevented for specific map entrys by adding the |
||||||
|
"port=" mount option to the entries. |
||||||
|
.TP |
||||||
|
+.I "symlink" |
||||||
|
+This option makes bind mounting use a symlink instead of an actual bind |
||||||
|
+mount. It is an autofs specific option that is a pseudo mount option and |
||||||
|
+so is given without a leading dash. It may be used with indirect map |
||||||
|
+entries only, either in the master map (so it effects all map entries) |
||||||
|
+or with individual map entries. The option is ignored for direct mounts |
||||||
|
+and non-root offest mount entries. |
||||||
|
+.TP |
||||||
|
.I "\-r, \-\-random-multimount-selection" |
||||||
|
Enables the use of ramdom selection when choosing a host from a |
||||||
|
list of replicated servers. This option is applied to this mount |
||||||
|
diff --git a/modules/mount_autofs.c b/modules/mount_autofs.c |
||||||
|
index ef16020..8c1e600 100644 |
||||||
|
--- a/modules/mount_autofs.c |
||||||
|
+++ b/modules/mount_autofs.c |
||||||
|
@@ -51,6 +51,7 @@ int mount_mount(struct autofs_point *ap, const char *root, const char *name, |
||||||
|
int argc, status; |
||||||
|
int nobind = ap->flags & MOUNT_FLAG_NOBIND; |
||||||
|
int ghost = ap->flags & MOUNT_FLAG_GHOST; |
||||||
|
+ int symlnk = ap->flags & MOUNT_FLAG_SYMLINK; |
||||||
|
time_t timeout = ap->entry->maps->exp_timeout; |
||||||
|
unsigned logopt = ap->logopt; |
||||||
|
struct map_type_info *info; |
||||||
|
@@ -120,6 +121,8 @@ int mount_mount(struct autofs_point *ap, const char *root, const char *name, |
||||||
|
nobind = 1; |
||||||
|
else if (strncmp(cp, "browse", 6) == 0) |
||||||
|
ghost = 1; |
||||||
|
+ else if (strncmp(cp, "symlink", 7) == 0) |
||||||
|
+ symlnk = 1; |
||||||
|
else if (strncmp(cp, "timeout=", 8) == 0) { |
||||||
|
char *val = strchr(cp, '='); |
||||||
|
unsigned tout; |
||||||
|
@@ -158,6 +161,8 @@ int mount_mount(struct autofs_point *ap, const char *root, const char *name, |
||||||
|
} |
||||||
|
nap = entry->ap; |
||||||
|
nap->parent = ap; |
||||||
|
+ if (symlnk) |
||||||
|
+ nap->flags |= MOUNT_FLAG_SYMLINK; |
||||||
|
|
||||||
|
argc = 1; |
||||||
|
|
||||||
|
diff --git a/modules/mount_bind.c b/modules/mount_bind.c |
||||||
|
index 9bce686..4975294 100644 |
||||||
|
--- a/modules/mount_bind.c |
||||||
|
+++ b/modules/mount_bind.c |
||||||
|
@@ -73,10 +73,44 @@ int mount_mount(struct autofs_point *ap, const char *root, const char *name, int |
||||||
|
char buf[MAX_ERR_BUF]; |
||||||
|
int err; |
||||||
|
int i, len; |
||||||
|
+ int symlnk = (*name != '/' && (ap->flags & MOUNT_FLAG_SYMLINK)); |
||||||
|
|
||||||
|
if (ap->flags & MOUNT_FLAG_REMOUNT) |
||||||
|
return 0; |
||||||
|
|
||||||
|
+ /* Extract "symlink" pseudo-option which forces local filesystems |
||||||
|
+ * to be symlinked instead of bound. |
||||||
|
+ */ |
||||||
|
+ if (*name != '/' && !symlnk && options) { |
||||||
|
+ const char *comma; |
||||||
|
+ int o_len = strlen(options) + 1; |
||||||
|
+ |
||||||
|
+ for (comma = options; *comma != '\0';) { |
||||||
|
+ const char *cp; |
||||||
|
+ const char *end; |
||||||
|
+ |
||||||
|
+ while (*comma == ',') |
||||||
|
+ comma++; |
||||||
|
+ |
||||||
|
+ /* Skip leading white space */ |
||||||
|
+ while (*comma == ' ' || *comma == '\t') |
||||||
|
+ comma++; |
||||||
|
+ |
||||||
|
+ cp = comma; |
||||||
|
+ while (*comma != '\0' && *comma != ',') |
||||||
|
+ comma++; |
||||||
|
+ |
||||||
|
+ /* Skip trailing white space */ |
||||||
|
+ end = comma - 1; |
||||||
|
+ while (*comma == ' ' || *comma == '\t') |
||||||
|
+ end--; |
||||||
|
+ |
||||||
|
+ o_len = end - cp + 1; |
||||||
|
+ if (strncmp("symlink", cp, o_len) == 0) |
||||||
|
+ symlnk = 1; |
||||||
|
+ } |
||||||
|
+ } |
||||||
|
+ |
||||||
|
/* Root offset of multi-mount */ |
||||||
|
len = strlen(root); |
||||||
|
if (root[len - 1] == '/') { |
||||||
|
@@ -100,7 +134,7 @@ int mount_mount(struct autofs_point *ap, const char *root, const char *name, int |
||||||
|
if (options == NULL || *options == '\0') |
||||||
|
options = "defaults"; |
||||||
|
|
||||||
|
- if (bind_works) { |
||||||
|
+ if (!symlnk && bind_works) { |
||||||
|
int status, existed = 1; |
||||||
|
|
||||||
|
debug(ap->logopt, MODPREFIX "calling mkdir_path %s", fullpath); |
@ -0,0 +1,42 @@ |
|||||||
|
autofs-5.0.7 - add timeout option description to man page |
||||||
|
|
||||||
|
From: Ian Kent <ikent@redhat.com> |
||||||
|
|
||||||
|
The pseudo option used t set the timeout for map entries is one of |
||||||
|
the most most frequently used autofs options but is not mentioned |
||||||
|
in auto.master(5). |
||||||
|
--- |
||||||
|
|
||||||
|
CHANGELOG | 1 + |
||||||
|
man/auto.master.5.in | 5 +++++ |
||||||
|
2 files changed, 6 insertions(+), 0 deletions(-) |
||||||
|
|
||||||
|
|
||||||
|
diff --git a/CHANGELOG b/CHANGELOG |
||||||
|
index 93b9c26..7b8d185 100644 |
||||||
|
--- a/CHANGELOG |
||||||
|
+++ b/CHANGELOG |
||||||
|
@@ -6,6 +6,7 @@ |
||||||
|
- fix parse buffer initialization. |
||||||
|
- fix typo in automount(8). |
||||||
|
- dont wait forever to restart. |
||||||
|
+- add timeout option description to man page. |
||||||
|
|
||||||
|
25/07/2012 autofs-5.0.7 |
||||||
|
======================= |
||||||
|
diff --git a/man/auto.master.5.in b/man/auto.master.5.in |
||||||
|
index 54269f8..21d7544 100644 |
||||||
|
--- a/man/auto.master.5.in |
||||||
|
+++ b/man/auto.master.5.in |
||||||
|
@@ -167,6 +167,11 @@ server is specified in the map entry. If no server weights are given |
||||||
|
then each available server will be tried in the order listed, within |
||||||
|
proximity. |
||||||
|
.TP |
||||||
|
+.I "\-t, \-\-timeout <seconds>" |
||||||
|
+Set the expire timeout for map entries. This option can be used to |
||||||
|
+override the global default given either on the command line |
||||||
|
+or in the configuration. |
||||||
|
+.TP |
||||||
|
.I "\-n, \-\-negative\-timeout <seconds>" |
||||||
|
Set the timeout for caching failed key lookups. This option can be |
||||||
|
used to override the global default given either on the command line |
@ -0,0 +1,69 @@ |
|||||||
|
autofs-5.0.7 - allow non root user to check status |
||||||
|
|
||||||
|
From: Ian Kent <ikent@redhat.com> |
||||||
|
|
||||||
|
|
||||||
|
--- |
||||||
|
|
||||||
|
CHANGELOG | 1 + |
||||||
|
redhat/autofs.init.in | 20 +++++++++++++------- |
||||||
|
2 files changed, 14 insertions(+), 7 deletions(-) |
||||||
|
|
||||||
|
|
||||||
|
diff --git a/CHANGELOG b/CHANGELOG |
||||||
|
index 44c9fb2..936c9ab 100644 |
||||||
|
--- a/CHANGELOG |
||||||
|
+++ b/CHANGELOG |
||||||
|
@@ -11,6 +11,7 @@ |
||||||
|
- make description of default MOUNT_WAIT setting clear. |
||||||
|
- configure.in: allow cross compilation. |
||||||
|
- README: update mailing list subscription info. |
||||||
|
+- allow non root user to check status. |
||||||
|
|
||||||
|
25/07/2012 autofs-5.0.7 |
||||||
|
======================= |
||||||
|
diff --git a/redhat/autofs.init.in b/redhat/autofs.init.in |
||||||
|
index cd5cb34..fe18b3e 100644 |
||||||
|
--- a/redhat/autofs.init.in |
||||||
|
+++ b/redhat/autofs.init.in |
||||||
|
@@ -167,6 +167,19 @@ function usage_message() { |
||||||
|
|
||||||
|
RETVAL=0 |
||||||
|
|
||||||
|
+# allow non-root users to read status / usage |
||||||
|
+ |
||||||
|
+case "$1" in |
||||||
|
+ status) |
||||||
|
+ status -p @@autofspiddir@@/autofs.pid -l autofs $prog |
||||||
|
+ exit 0; |
||||||
|
+ ;; |
||||||
|
+ usage) |
||||||
|
+ usage_message |
||||||
|
+ exit 0; |
||||||
|
+ ;; |
||||||
|
+esac |
||||||
|
+ |
||||||
|
# Only the root user may change the service status |
||||||
|
if [ `id -u` -ne 0 ] && [ "$1" != "status" ]; then |
||||||
|
echo "insufficient privilege to change service status" |
||||||
|
@@ -184,9 +197,6 @@ case "$1" in |
||||||
|
stop) |
||||||
|
stop |
||||||
|
;; |
||||||
|
- status) |
||||||
|
- status -p @@autofspiddir@@/autofs.pid -l autofs $prog |
||||||
|
- ;; |
||||||
|
restart|force-reload) |
||||||
|
restart |
||||||
|
;; |
||||||
|
@@ -202,10 +212,6 @@ case "$1" in |
||||||
|
restart |
||||||
|
fi |
||||||
|
;; |
||||||
|
- usage) |
||||||
|
- usage_message |
||||||
|
- exit 0 |
||||||
|
- ;; |
||||||
|
*) |
||||||
|
usage_message |
||||||
|
exit 2 |
@ -0,0 +1,50 @@ |
|||||||
|
autofs-5.0.7 - Allow nsswitch.conf to not contain "automount:" lines |
||||||
|
|
||||||
|
From: Michael Tokarev <mjt@tls.msk.ru> |
||||||
|
|
||||||
|
Current code does not allow a case when nsswitch.conf |
||||||
|
does not mention automount map at all, like all new |
||||||
|
installations. It logs a rather unpleasant error |
||||||
|
message instead: |
||||||
|
|
||||||
|
syntax error in nsswitch config near [ syntax error ] |
||||||
|
|
||||||
|
this patch has a minimal fix, to allo "file" to be empty. |
||||||
|
|
||||||
|
Whole parser in C is about 25 lines of code, the "grammar" |
||||||
|
is trivial, and it is better to ditch all this yacc/lex |
||||||
|
stuff, but that will be much more intrusive change. |
||||||
|
|
||||||
|
Signed-off-by: Michael Tokarev <mjt@tls.msk.ru> |
||||||
|
Cc: 682266@bugs.debian.org |
||||||
|
--- |
||||||
|
|
||||||
|
CHANGELOG | 1 + |
||||||
|
lib/nss_parse.y | 1 + |
||||||
|
2 files changed, 2 insertions(+), 0 deletions(-) |
||||||
|
|
||||||
|
|
||||||
|
diff --git a/CHANGELOG b/CHANGELOG |
||||||
|
index bd0dd82..16ac2a0 100644 |
||||||
|
--- a/CHANGELOG |
||||||
|
+++ b/CHANGELOG |
||||||
|
@@ -16,6 +16,7 @@ |
||||||
|
- increase file map read buffer size. |
||||||
|
- handle new location of systemd. |
||||||
|
- fix map entry duplicate offset detection. |
||||||
|
+- Allow nsswitch.conf to not contain "automount:" lines. |
||||||
|
|
||||||
|
25/07/2012 autofs-5.0.7 |
||||||
|
======================= |
||||||
|
diff --git a/lib/nss_parse.y b/lib/nss_parse.y |
||||||
|
index a39fda4..055e9d7 100644 |
||||||
|
--- a/lib/nss_parse.y |
||||||
|
+++ b/lib/nss_parse.y |
||||||
|
@@ -72,6 +72,7 @@ file: { |
||||||
|
nss_debug = YYDEBUG; |
||||||
|
#endif |
||||||
|
} sources NL |
||||||
|
+ | /* empty */ |
||||||
|
; |
||||||
|
|
||||||
|
sources: nss_source |
@ -0,0 +1,231 @@ |
|||||||
|
autofs-5.0.7 - allow use of hosts map in maps |
||||||
|
|
||||||
|
From: Ian Kent <raven@themaw.net> |
||||||
|
|
||||||
|
At the moment the internal hosts map can only be use as an entry in the |
||||||
|
master map but there's no reason (I can think of so far) that it shouldn't |
||||||
|
be possible to use it in map entries. |
||||||
|
--- |
||||||
|
lib/parse_subs.c | 17 ++++++----- |
||||||
|
modules/mount_autofs.c | 29 ++++++++++++++++---- |
||||||
|
modules/parse_sun.c | 71 +++++++++++++++++++++++++++++++------------------ |
||||||
|
3 files changed, 80 insertions(+), 37 deletions(-) |
||||||
|
|
||||||
|
--- autofs-5.0.7.orig/lib/parse_subs.c |
||||||
|
+++ autofs-5.0.7/lib/parse_subs.c |
||||||
|
@@ -35,6 +35,7 @@ static struct types map_type[] = { |
||||||
|
{ "ldaps", 5 }, |
||||||
|
{ "hesiod", 6 }, |
||||||
|
{ "userdir", 7 }, |
||||||
|
+ { "hosts", 5 }, |
||||||
|
}; |
||||||
|
static unsigned int map_type_count = sizeof(map_type)/sizeof(struct types); |
||||||
|
|
||||||
|
@@ -384,7 +385,7 @@ struct map_type_info *parse_map_type_inf |
||||||
|
return NULL; |
||||||
|
} else { |
||||||
|
*pos++ = '\0'; |
||||||
|
- while (*pos == ' ') |
||||||
|
+ while (*pos && *pos == ' ') |
||||||
|
*pos++ = '\0'; |
||||||
|
map = pos; |
||||||
|
break; |
||||||
|
@@ -412,7 +413,7 @@ struct map_type_info *parse_map_type_inf |
||||||
|
return NULL; |
||||||
|
} else { |
||||||
|
*pos++ = '\0'; |
||||||
|
- while (*pos == ' ') |
||||||
|
+ while (*pos && *pos == ' ') |
||||||
|
*pos++ = '\0'; |
||||||
|
map = pos; |
||||||
|
break; |
||||||
|
@@ -458,11 +459,13 @@ struct map_type_info *parse_map_type_inf |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
- info->map = strdup(map); |
||||||
|
- if (!info->map) { |
||||||
|
- free(buf); |
||||||
|
- free_map_type_info(info); |
||||||
|
- return NULL; |
||||||
|
+ if (map) { |
||||||
|
+ info->map = strdup(map); |
||||||
|
+ if (!info->map) { |
||||||
|
+ free(buf); |
||||||
|
+ free_map_type_info(info); |
||||||
|
+ return NULL; |
||||||
|
+ } |
||||||
|
} |
||||||
|
|
||||||
|
free(buf); |
||||||
|
--- autofs-5.0.7.orig/modules/mount_autofs.c |
||||||
|
+++ autofs-5.0.7/modules/mount_autofs.c |
||||||
|
@@ -62,6 +62,7 @@ int mount_mount(struct autofs_point *ap, |
||||||
|
char buf[MAX_ERR_BUF]; |
||||||
|
char *options, *p; |
||||||
|
int len, ret; |
||||||
|
+ int hosts = 0; |
||||||
|
|
||||||
|
/* Root offset of multi-mount */ |
||||||
|
len = strlen(root); |
||||||
|
@@ -123,6 +124,8 @@ int mount_mount(struct autofs_point *ap, |
||||||
|
ghost = 1; |
||||||
|
else if (strncmp(cp, "symlink", 7) == 0) |
||||||
|
symlnk = 1; |
||||||
|
+ else if (strncmp(cp, "hosts", 5) == 0) |
||||||
|
+ hosts = 1; |
||||||
|
else if (strncmp(cp, "timeout=", 8) == 0) { |
||||||
|
char *val = strchr(cp, '='); |
||||||
|
unsigned tout; |
||||||
|
@@ -164,7 +167,10 @@ int mount_mount(struct autofs_point *ap, |
||||||
|
if (symlnk) |
||||||
|
nap->flags |= MOUNT_FLAG_SYMLINK; |
||||||
|
|
||||||
|
- argc = 1; |
||||||
|
+ if (hosts) |
||||||
|
+ argc = 0; |
||||||
|
+ else |
||||||
|
+ argc = 1; |
||||||
|
|
||||||
|
if (options) { |
||||||
|
char *t = options; |
||||||
|
@@ -176,14 +182,27 @@ int mount_mount(struct autofs_point *ap, |
||||||
|
} |
||||||
|
argv = (const char **) alloca((argc + 1) * sizeof(char *)); |
||||||
|
|
||||||
|
- argc = 1; |
||||||
|
- |
||||||
|
- if (!(info = parse_map_type_info(what))) { |
||||||
|
+ if (hosts) |
||||||
|
+ argc = 0; |
||||||
|
+ else |
||||||
|
+ argc = 1; |
||||||
|
+ |
||||||
|
+ /* |
||||||
|
+ * If a mount of a hosts map is being requested it will come |
||||||
|
+ * ro us via the options. Catch that below when processing the |
||||||
|
+ * option and create type info struct then. |
||||||
|
+ */ |
||||||
|
+ if (hosts) |
||||||
|
+ info = parse_map_type_info("hosts:"); |
||||||
|
+ else |
||||||
|
+ info = parse_map_type_info(what); |
||||||
|
+ if (!info) { |
||||||
|
error(ap->logopt, MODPREFIX "failed to parse map info"); |
||||||
|
master_free_mapent(entry); |
||||||
|
return 1; |
||||||
|
} |
||||||
|
- argv[0] = info->map; |
||||||
|
+ if (info->map) |
||||||
|
+ argv[0] = info->map; |
||||||
|
|
||||||
|
if (options) { |
||||||
|
p = options; |
||||||
|
--- autofs-5.0.7.orig/modules/parse_sun.c |
||||||
|
+++ autofs-5.0.7/modules/parse_sun.c |
||||||
|
@@ -695,14 +695,18 @@ static int sun_mount(struct autofs_point |
||||||
|
rv = mount_nfs->mount_mount(ap, root, mountpoint, strlen(mountpoint), |
||||||
|
what, fstype, options, mount_nfs->context); |
||||||
|
} else { |
||||||
|
- what = alloca(loclen + 1); |
||||||
|
- if (*loc == ':') { |
||||||
|
- loclen--; |
||||||
|
- memcpy(what, loc + 1, loclen); |
||||||
|
- what[loclen] = '\0'; |
||||||
|
- } else { |
||||||
|
- memcpy(what, loc, loclen); |
||||||
|
- what[loclen] = '\0'; |
||||||
|
+ if (!loclen) |
||||||
|
+ what = NULL; |
||||||
|
+ else { |
||||||
|
+ what = alloca(loclen + 1); |
||||||
|
+ if (*loc == ':') { |
||||||
|
+ loclen--; |
||||||
|
+ memcpy(what, loc + 1, loclen); |
||||||
|
+ what[loclen] = '\0'; |
||||||
|
+ } else { |
||||||
|
+ memcpy(what, loc, loclen); |
||||||
|
+ what[loclen] = '\0'; |
||||||
|
+ } |
||||||
|
} |
||||||
|
|
||||||
|
debug(ap->logopt, MODPREFIX |
||||||
|
@@ -799,7 +803,8 @@ update_offset_entry(struct autofs_point |
||||||
|
|
||||||
|
mc = source->mc; |
||||||
|
|
||||||
|
- if (!*path || !*loc) { |
||||||
|
+ /* Internal hosts map may have loc == NULL */ |
||||||
|
+ if (!*path) { |
||||||
|
error(ap->logopt, |
||||||
|
MODPREFIX "syntax error in offset %s -> %s", path, loc); |
||||||
|
return CHE_FAIL; |
||||||
|
@@ -833,8 +838,10 @@ update_offset_entry(struct autofs_point |
||||||
|
if (*myoptions) { |
||||||
|
strcpy(m_mapent, "-"); |
||||||
|
strcat(m_mapent, myoptions); |
||||||
|
- strcat(m_mapent, " "); |
||||||
|
- strcat(m_mapent, loc); |
||||||
|
+ if (loc) { |
||||||
|
+ strcat(m_mapent, " "); |
||||||
|
+ strcat(m_mapent, loc); |
||||||
|
+ } |
||||||
|
} else |
||||||
|
strcpy(m_mapent, loc); |
||||||
|
|
||||||
|
@@ -1435,13 +1442,17 @@ int parse_mount(struct autofs_point *ap, |
||||||
|
|
||||||
|
l = parse_mapent(p, options, &myoptions, &loc, ap->logopt); |
||||||
|
if (!l) { |
||||||
|
- cache_delete_offset_list(mc, name); |
||||||
|
- cache_multi_unlock(me); |
||||||
|
- cache_unlock(mc); |
||||||
|
- free(path); |
||||||
|
- free(options); |
||||||
|
- pthread_setcancelstate(cur_state, NULL); |
||||||
|
- return 1; |
||||||
|
+ if (!(strstr(myoptions, "fstype=autofs") && |
||||||
|
+ strstr(myoptions, "hosts"))) { |
||||||
|
+ error(LOGOPT_ANY, "I think I'm a hosts map? l %d", l); |
||||||
|
+ cache_delete_offset_list(mc, name); |
||||||
|
+ cache_multi_unlock(me); |
||||||
|
+ cache_unlock(mc); |
||||||
|
+ free(path); |
||||||
|
+ free(options); |
||||||
|
+ pthread_setcancelstate(cur_state, NULL); |
||||||
|
+ return 1; |
||||||
|
+ } |
||||||
|
} |
||||||
|
|
||||||
|
p += l; |
||||||
|
@@ -1592,13 +1603,23 @@ int parse_mount(struct autofs_point *ap, |
||||||
|
p = skipspace(p); |
||||||
|
} |
||||||
|
|
||||||
|
- loclen = strlen(loc); |
||||||
|
- if (loclen == 0) { |
||||||
|
- free(loc); |
||||||
|
- free(options); |
||||||
|
- error(ap->logopt, |
||||||
|
- MODPREFIX "entry %s is empty!", name); |
||||||
|
- return 1; |
||||||
|
+ /* |
||||||
|
+ * If options are asking for a hosts map loc should be |
||||||
|
+ * NULL but we see it can contain junk, so .... |
||||||
|
+ */ |
||||||
|
+ if ((strstr(options, "fstype=autofs") && |
||||||
|
+ strstr(options, "hosts"))) { |
||||||
|
+ loc = NULL; |
||||||
|
+ loclen = 0; |
||||||
|
+ } else { |
||||||
|
+ loclen = strlen(loc); |
||||||
|
+ if (loclen == 0) { |
||||||
|
+ free(loc); |
||||||
|
+ free(options); |
||||||
|
+ error(ap->logopt, |
||||||
|
+ MODPREFIX "entry %s is empty!", name); |
||||||
|
+ return 1; |
||||||
|
+ } |
||||||
|
} |
||||||
|
|
||||||
|
debug(ap->logopt, |
@ -0,0 +1,38 @@ |
|||||||
|
autofs-5.0.7 - check for protocol option |
||||||
|
|
||||||
|
From: Ian Kent <raven@themaw.net> |
||||||
|
|
||||||
|
When a specific protocol is requested in the mount options only |
||||||
|
that protocol should be probed for. |
||||||
|
--- |
||||||
|
modules/mount_nfs.c | 10 ++++++++++ |
||||||
|
1 file changed, 10 insertions(+) |
||||||
|
|
||||||
|
diff --git a/modules/mount_nfs.c b/modules/mount_nfs.c |
||||||
|
index 9de8a73..3d2ccea 100644 |
||||||
|
--- a/modules/mount_nfs.c |
||||||
|
+++ b/modules/mount_nfs.c |
||||||
|
@@ -156,6 +156,12 @@ int mount_mount(struct autofs_point *ap, const char *root, const char *name, int |
||||||
|
if (port < 0) |
||||||
|
port = 0; |
||||||
|
port_opt = cp; |
||||||
|
+ } else if (strncmp("proto=udp", cp, o_len) == 0 || |
||||||
|
+ strncmp("udp", cp, o_len) == 0) { |
||||||
|
+ vers &= ~TCP_SUPPORTED; |
||||||
|
+ } else if (strncmp("proto=tcp", cp, o_len) == 0 || |
||||||
|
+ strncmp("tcp", cp, o_len) == 0) { |
||||||
|
+ vers &= ~UDP_SUPPORTED; |
||||||
|
} |
||||||
|
/* Check for options that also make sense |
||||||
|
with bind mounts */ |
||||||
|
@@ -167,6 +173,10 @@ int mount_mount(struct autofs_point *ap, const char *root, const char *name, int |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
+ /* In case both tcp and udp options were given */ |
||||||
|
+ if ((vers & NFS_PROTO_MASK) == 0) |
||||||
|
+ vers |= NFS_PROTO_MASK; |
||||||
|
+ |
||||||
|
debug(ap->logopt, MODPREFIX |
||||||
|
"nfs options=\"%s\", nobind=%d, nosymlink=%d, ro=%d", |
||||||
|
nfsoptions, nobind, nosymlink, ro); |
@ -0,0 +1,28 @@ |
|||||||
|
autofs-5.0.7 - configure: allow cross compilation update |
||||||
|
|
||||||
|
From: Chris Packham <chris.packham@alliedtelesis.co.nz> |
||||||
|
|
||||||
|
Run "make distclean" to update configure. This should have been included |
||||||
|
in 5936c738 when configure.in was updated but it was missed. |
||||||
|
--- |
||||||
|
|
||||||
|
configure | 5 +---- |
||||||
|
1 files changed, 1 insertions(+), 4 deletions(-) |
||||||
|
|
||||||
|
|
||||||
|
diff --git a/configure b/configure |
||||||
|
index bf62203..ba3bba6 100755 |
||||||
|
--- a/configure |
||||||
|
+++ b/configure |
||||||
|
@@ -5378,10 +5378,7 @@ DAEMON_LDFLAGS= |
||||||
|
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether gcc -fPIE works" >&5 |
||||||
|
$as_echo_n "checking whether gcc -fPIE works... " >&6; } |
||||||
|
if test "$cross_compiling" = yes; then : |
||||||
|
- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 |
||||||
|
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} |
||||||
|
-as_fn_error $? "cannot run test program while cross compiling |
||||||
|
-See \`config.log' for more details" "$LINENO" 5; } |
||||||
|
+ gcc_supports_pie=no |
||||||
|
else |
||||||
|
cat confdefs.h - <<_ACEOF >conftest.$ac_ext |
||||||
|
/* end confdefs.h. */ |
@ -0,0 +1,41 @@ |
|||||||
|
autofs-5.0.7 - configure.in: allow cross compilation |
||||||
|
|
||||||
|
From: Chris Packham <chris.packham@alliedtelesis.co.nz> |
||||||
|
|
||||||
|
The default behaviour of AC_RUN_IFELSE is to stop with an error if cross |
||||||
|
compiling. Avoid this by providing the optional 4th argument to set |
||||||
|
gcc_supports_pie=no if support for PIE cannot be detected. |
||||||
|
|
||||||
|
Signed-off-by: Chris Packham <chris.packham@alliedtelesis.co.nz> |
||||||
|
--- |
||||||
|
|
||||||
|
CHANGELOG | 1 + |
||||||
|
configure.in | 2 +- |
||||||
|
2 files changed, 2 insertions(+), 1 deletions(-) |
||||||
|
|
||||||
|
|
||||||
|
diff --git a/CHANGELOG b/CHANGELOG |
||||||
|
index 961e340..fe801e8 100644 |
||||||
|
--- a/CHANGELOG |
||||||
|
+++ b/CHANGELOG |
||||||
|
@@ -9,6 +9,7 @@ |
||||||
|
- add timeout option description to man page. |
||||||
|
- fix null map entry order handling. |
||||||
|
- make description of default MOUNT_WAIT setting clear. |
||||||
|
+- configure.in: allow cross compilation. |
||||||
|
|
||||||
|
25/07/2012 autofs-5.0.7 |
||||||
|
======================= |
||||||
|
diff --git a/configure.in b/configure.in |
||||||
|
index 1a24e34..90bda62 100644 |
||||||
|
--- a/configure.in |
||||||
|
+++ b/configure.in |
||||||
|
@@ -307,7 +307,7 @@ DAEMON_CFLAGS= |
||||||
|
DAEMON_LDFLAGS= |
||||||
|
AC_MSG_CHECKING([whether gcc -fPIE works]) |
||||||
|
AC_RUN_IFELSE([AC_LANG_PROGRAM([[]], [[int main(void) {return 0;}]])], |
||||||
|
- [gcc_supports_pie=yes], [gcc_supports_pie=no]) |
||||||
|
+ [gcc_supports_pie=yes], [gcc_supports_pie=no], [gcc_supports_pie=no]) |
||||||
|
AC_MSG_RESULT([$gcc_supports_pie]) |
||||||
|
if test $gcc_supports_pie = yes ; then |
||||||
|
DAEMON_CFLAGS="-fPIE" |
@ -0,0 +1,40 @@ |
|||||||
|
autofs-5.0.7 - depricate nosymlink pseudo option |
||||||
|
|
||||||
|
From: Ian Kent <raven@themaw.net> |
||||||
|
|
||||||
|
The undocumented "nosymlink" option was the only way to force local |
||||||
|
NFS mounting until the more descriptive "nobind" option was added. |
||||||
|
|
||||||
|
So depricate the "nosymlink" option in favour of the "nobind" option. |
||||||
|
--- |
||||||
|
CHANGELOG | 1 + |
||||||
|
modules/mount_nfs.c | 4 ++++ |
||||||
|
2 files changed, 5 insertions(+) |
||||||
|
|
||||||
|
diff --git a/CHANGELOG b/CHANGELOG |
||||||
|
index a7ed212..c189483 100644 |
||||||
|
--- a/CHANGELOG |
||||||
|
+++ b/CHANGELOG |
||||||
|
@@ -31,6 +31,7 @@ |
||||||
|
- dont fail on master map self include. |
||||||
|
- fix wildcard multi map regression. |
||||||
|
- fix file descriptor leak when reloading the daemon. |
||||||
|
+- depricate nosymlink pseudo option. |
||||||
|
|
||||||
|
25/07/2012 autofs-5.0.7 |
||||||
|
======================= |
||||||
|
diff --git a/modules/mount_nfs.c b/modules/mount_nfs.c |
||||||
|
index bbbb1de..e61320b 100644 |
||||||
|
--- a/modules/mount_nfs.c |
||||||
|
+++ b/modules/mount_nfs.c |
||||||
|
@@ -125,6 +125,10 @@ int mount_mount(struct autofs_point *ap, const char *root, const char *name, int |
||||||
|
|
||||||
|
o_len = end - cp + 1; |
||||||
|
if (strncmp("nosymlink", cp, o_len) == 0) { |
||||||
|
+ warn(ap->logopt, MODPREFIX |
||||||
|
+ "the \"nosymlink\" option is depricated " |
||||||
|
+ "and will soon be removed, " |
||||||
|
+ "use the \"nobind\" option instead"); |
||||||
|
nosymlink = 1; |
||||||
|
} else if (strncmp("nobind", cp, o_len) == 0) { |
||||||
|
nobind = 1; |
@ -0,0 +1,48 @@ |
|||||||
|
autofs-5.0.7 - document allowed map sources in auto.master |
||||||
|
|
||||||
|
From: Ian Kent <raven@themaw.net> |
||||||
|
|
||||||
|
Direct map may have multiple map sources but indirect maps may have |
||||||
|
only one map source. |
||||||
|
--- |
||||||
|
CHANGELOG | 1 + |
||||||
|
man/auto.master.5.in | 7 +++++-- |
||||||
|
2 files changed, 6 insertions(+), 2 deletions(-) |
||||||
|
|
||||||
|
diff --git a/CHANGELOG b/CHANGELOG |
||||||
|
index 4576d47..61edddf 100644 |
||||||
|
--- a/CHANGELOG |
||||||
|
+++ b/CHANGELOG |
||||||
|
@@ -41,6 +41,7 @@ |
||||||
|
- syncronize handle_mounts() shutdown. |
||||||
|
- fix submount tree not all expiring. |
||||||
|
- make dump maps check for duplicate indirect mounts. |
||||||
|
+- document allowed map sources in auto.master. |
||||||
|
|
||||||
|
25/07/2012 autofs-5.0.7 |
||||||
|
======================= |
||||||
|
diff --git a/man/auto.master.5.in b/man/auto.master.5.in |
||||||
|
index c552e56..7907ffa 100644 |
||||||
|
--- a/man/auto.master.5.in |
||||||
|
+++ b/man/auto.master.5.in |
||||||
|
@@ -40,7 +40,8 @@ For direct maps the mount point is always specified as: |
||||||
|
.P |
||||||
|
/- |
||||||
|
.P |
||||||
|
-and the key used within the direct map is the full path to the mount point. |
||||||
|
+and the key used within the direct map is the full path to the mount point. The direct map |
||||||
|
+may have multiple entries in the master map. |
||||||
|
.P |
||||||
|
For indirect maps access is by using the path scheme: |
||||||
|
.P |
||||||
|
@@ -60,7 +61,9 @@ present in the master map by including a line of the form: |
||||||
|
and |
||||||
|
.BR automount (8) |
||||||
|
will process the map according to the specification described below for |
||||||
|
-map entries. |
||||||
|
+map entries. Indirect map entries must be unique in the master map so |
||||||
|
+second and subsequent entries for an indirect mount point are ignored by |
||||||
|
+.BR automount (8). |
||||||
|
.SH "FORMAT" |
||||||
|
Master map entries have three fields separated by an arbitrary number |
||||||
|
of spaces or tabs. Lines beginning with # are comments. The first field |
@ -0,0 +1,46 @@ |
|||||||
|
autofs-5.0.7 - document browse option in man page |
||||||
|
|
||||||
|
From: Ian Kent <raven@themaw.net> |
||||||
|
|
||||||
|
The "browse" option has remained undocumented for a long time. |
||||||
|
Finally add a section for it to auto.master(5) making special |
||||||
|
note of the potential performance implications. |
||||||
|
--- |
||||||
|
CHANGELOG | 1 + |
||||||
|
man/auto.master.5.in | 11 +++++++++++ |
||||||
|
2 files changed, 12 insertions(+) |
||||||
|
|
||||||
|
diff --git a/CHANGELOG b/CHANGELOG |
||||||
|
index ecdea0b..d8e4049 100644 |
||||||
|
--- a/CHANGELOG |
||||||
|
+++ b/CHANGELOG |
||||||
|
@@ -36,6 +36,7 @@ |
||||||
|
- fix requires in spec file. |
||||||
|
- fix libtirpc build option to require libtirpc-devel if needed. |
||||||
|
- fix systemd unidir in spec file. |
||||||
|
+- document browse option in man page. |
||||||
|
|
||||||
|
25/07/2012 autofs-5.0.7 |
||||||
|
======================= |
||||||
|
diff --git a/man/auto.master.5.in b/man/auto.master.5.in |
||||||
|
index bbea43a..c552e56 100644 |
||||||
|
--- a/man/auto.master.5.in |
||||||
|
+++ b/man/auto.master.5.in |
||||||
|
@@ -147,6 +147,17 @@ multiple file systems should be mounted (`multimounts'). If this option |
||||||
|
is given, no file system is mounted at all if at least one file system |
||||||
|
can't be mounted. |
||||||
|
.TP |
||||||
|
+.I "[no]browse" |
||||||
|
+This is an autofs specific option that is a pseudo mount option and |
||||||
|
+so is given without a leading dash. Use of the browse option pre-creates |
||||||
|
+mount point directories for indirect mount maps so the map keys can be |
||||||
|
+seen in a directory listing without being mounted. Use of this option |
||||||
|
+can cause performance problem if the indirect map is large so it should |
||||||
|
+be used with caution. The internal program default is to enable browse |
||||||
|
+mode for indirect mounts but the default installed configuration overrides |
||||||
|
+this by setting BROWSE_MODE to "no" because of the potential performance |
||||||
|
+problem. |
||||||
|
+.TP |
||||||
|
.I "nobind" |
||||||
|
This is an autofs specific option that is a pseudo mount option and |
||||||
|
so is given without a leading dash. It may be used either in the master |
@ -0,0 +1,59 @@ |
|||||||
|
autofs-5.0.7 - dont fail on master map self include |
||||||
|
|
||||||
|
From: Ian Kent <raven@themaw.net> |
||||||
|
|
||||||
|
When reading the master map a self included file map should skip the source |
||||||
|
and proceed to the next so, in this case, return an nss status that will |
||||||
|
allow the map read to continue. In particular not NSS_STATUS_UNAVAIL which |
||||||
|
causes the lookup to record a failure or NSS_STATUS_SUCCESS which indicates |
||||||
|
a successful lookup and termintes the reading of sources. |
||||||
|
--- |
||||||
|
CHANGELOG | 1 + |
||||||
|
modules/lookup_file.c | 7 ++++--- |
||||||
|
2 files changed, 5 insertions(+), 3 deletions(-) |
||||||
|
|
||||||
|
diff --git a/CHANGELOG b/CHANGELOG |
||||||
|
index 39388a5..97d6f48 100644 |
||||||
|
--- a/CHANGELOG |
||||||
|
+++ b/CHANGELOG |
||||||
|
@@ -28,6 +28,7 @@ |
||||||
|
- make yellow pages support optional. |
||||||
|
- modules/replicated.c: use sin6_addr.s6_addr32. |
||||||
|
- workaround missing GNU versionsort extension. |
||||||
|
+- dont fail on master map self include. |
||||||
|
|
||||||
|
25/07/2012 autofs-5.0.7 |
||||||
|
======================= |
||||||
|
diff --git a/modules/lookup_file.c b/modules/lookup_file.c |
||||||
|
index facb305..f37bed9 100644 |
||||||
|
--- a/modules/lookup_file.c |
||||||
|
+++ b/modules/lookup_file.c |
||||||
|
@@ -397,8 +397,9 @@ int lookup_read_master(struct master *master, time_t age, void *context) |
||||||
|
unsigned int path_len, ent_len; |
||||||
|
int entry, cur_state; |
||||||
|
|
||||||
|
+ /* Don't return fail on self include, skip source */ |
||||||
|
if (master->recurse) |
||||||
|
- return NSS_STATUS_UNAVAIL; |
||||||
|
+ return NSS_STATUS_TRYAGAIN; |
||||||
|
|
||||||
|
if (master->depth > MAX_INCLUDE_DEPTH) { |
||||||
|
error(logopt, MODPREFIX |
||||||
|
@@ -443,7 +444,7 @@ int lookup_read_master(struct master *master, time_t age, void *context) |
||||||
|
|
||||||
|
inc = check_master_self_include(master, ctxt); |
||||||
|
if (inc) |
||||||
|
- master->recurse = 1;; |
||||||
|
+ master->recurse = 1; |
||||||
|
master->depth++; |
||||||
|
status = lookup_nss_read_master(master, age); |
||||||
|
if (!status) { |
||||||
|
@@ -645,7 +646,7 @@ int lookup_read_map(struct autofs_point *ap, time_t age, void *context) |
||||||
|
mc = source->mc; |
||||||
|
|
||||||
|
if (source->recurse) |
||||||
|
- return NSS_STATUS_UNAVAIL; |
||||||
|
+ return NSS_STATUS_TRYAGAIN; |
||||||
|
|
||||||
|
if (source->depth > MAX_INCLUDE_DEPTH) { |
||||||
|
error(ap->logopt, |
@ -0,0 +1,46 @@ |
|||||||
|
autofs-5.0.7 - don't override LDFLAGS in make rules |
||||||
|
|
||||||
|
From: Ian Kent <ikent@redhat.com> |
||||||
|
|
||||||
|
Ensure that externally defined LDFLAGS is not overridden. |
||||||
|
--- |
||||||
|
CHANGELOG | 1 + |
||||||
|
Makefile.rules | 6 +++--- |
||||||
|
2 files changed, 4 insertions(+), 3 deletions(-) |
||||||
|
|
||||||
|
diff --git a/CHANGELOG b/CHANGELOG |
||||||
|
index 5d90139..37eac72 100644 |
||||||
|
--- a/CHANGELOG |
||||||
|
+++ b/CHANGELOG |
||||||
|
@@ -53,6 +53,7 @@ |
||||||
|
- fix probe each nfs version in turn for singleton mounts. |
||||||
|
- misc man page fixes. |
||||||
|
- fix add null check in parse_server_string(). |
||||||
|
+- don't override LDFLAGS in make rules. |
||||||
|
|
||||||
|
25/07/2012 autofs-5.0.7 |
||||||
|
======================= |
||||||
|
diff --git a/Makefile.rules b/Makefile.rules |
||||||
|
index f2ba386..6b5b2bd 100644 |
||||||
|
--- a/Makefile.rules |
||||||
|
+++ b/Makefile.rules |
||||||
|
@@ -24,16 +24,16 @@ endif |
||||||
|
|
||||||
|
ifdef DEBUG |
||||||
|
CFLAGS ?= -g -Wall -DDEBUG |
||||||
|
-LDFLAGS = -g |
||||||
|
+LDFLAGS ?= -g |
||||||
|
STRIP = : |
||||||
|
else |
||||||
|
ifdef DONTSTRIP |
||||||
|
CFLAGS ?= -O2 -g |
||||||
|
-LDFLAGS = -g |
||||||
|
+LDFLAGS ?= -g |
||||||
|
STRIP = : |
||||||
|
else |
||||||
|
CFLAGS ?= -O2 -Wall |
||||||
|
-LDFLAGS = -s |
||||||
|
+LDFLAGS ?= -s |
||||||
|
STRIP = strip --strip-debug |
||||||
|
endif |
||||||
|
endif |
@ -0,0 +1,68 @@ |
|||||||
|
autofs-5.0.7 - dont probe rdma mounts |
||||||
|
|
||||||
|
From: Ian Kent <raven@themaw.net> |
||||||
|
|
||||||
|
Since the change to pass text nfs mount options drectly to the kernel all autofs |
||||||
|
mount requests now probe server availability. This was because of long delays |
||||||
|
mounting from servers that aren't responding. |
||||||
|
|
||||||
|
This caused mounts requesting the rdma protocol to fail if udp or tcp was also |
||||||
|
not available from the server. |
||||||
|
|
||||||
|
Since, AFAICT the rmda protocol can't be used with RPC fromn userspace, the only |
||||||
|
way to work around it is to not probe servers when rdma is requested. |
||||||
|
--- |
||||||
|
CHANGELOG | 1 + |
||||||
|
modules/mount_nfs.c | 13 ++++++++++++- |
||||||
|
2 files changed, 13 insertions(+), 1 deletion(-) |
||||||
|
|
||||||
|
diff --git a/CHANGELOG b/CHANGELOG |
||||||
|
index 50e83d7..f9bc987 100644 |
||||||
|
--- a/CHANGELOG |
||||||
|
+++ b/CHANGELOG |
||||||
|
@@ -44,6 +44,7 @@ |
||||||
|
- document allowed map sources in auto.master. |
||||||
|
- add enable sloppy mount option to configure. |
||||||
|
- fix interface address null check. |
||||||
|
+- dont probe rdma mounts. |
||||||
|
|
||||||
|
25/07/2012 autofs-5.0.7 |
||||||
|
======================= |
||||||
|
diff --git a/modules/mount_nfs.c b/modules/mount_nfs.c |
||||||
|
index e61320b..5424d74 100644 |
||||||
|
--- a/modules/mount_nfs.c |
||||||
|
+++ b/modules/mount_nfs.c |
||||||
|
@@ -71,6 +71,7 @@ int mount_mount(struct autofs_point *ap, const char *root, const char *name, int |
||||||
|
int nosymlink = 0; |
||||||
|
int port = -1; |
||||||
|
int ro = 0; /* Set if mount bind should be read-only */ |
||||||
|
+ int rdma = 0; |
||||||
|
|
||||||
|
if (ap->flags & MOUNT_FLAG_REMOUNT) |
||||||
|
return 0; |
||||||
|
@@ -124,6 +125,11 @@ int mount_mount(struct autofs_point *ap, const char *root, const char *name, int |
||||||
|
end--; |
||||||
|
|
||||||
|
o_len = end - cp + 1; |
||||||
|
+ |
||||||
|
+ if (strncmp("proto=rdma", cp, o_len) == 0 || |
||||||
|
+ strncmp("rdma", cp, o_len) == 0) |
||||||
|
+ rdma = 1; |
||||||
|
+ |
||||||
|
if (strncmp("nosymlink", cp, o_len) == 0) { |
||||||
|
warn(ap->logopt, MODPREFIX |
||||||
|
"the \"nosymlink\" option is depricated " |
||||||
|
@@ -170,7 +176,12 @@ int mount_mount(struct autofs_point *ap, const char *root, const char *name, int |
||||||
|
info(ap->logopt, MODPREFIX "no hosts available"); |
||||||
|
return 1; |
||||||
|
} |
||||||
|
- prune_host_list(ap->logopt, &hosts, vers, port); |
||||||
|
+ /* |
||||||
|
+ * We can't probe protocol rdma so leave it to mount.nfs(8) |
||||||
|
+ * and and suffer the delay if a server isn't available. |
||||||
|
+ */ |
||||||
|
+ if (!rdma) |
||||||
|
+ prune_host_list(ap->logopt, &hosts, vers, port); |
||||||
|
|
||||||
|
if (!hosts) { |
||||||
|
info(ap->logopt, MODPREFIX "no hosts available"); |
@ -0,0 +1,69 @@ |
|||||||
|
autofs-5.0.7 - don't schedule new alarms after readmap |
||||||
|
|
||||||
|
From: Leonardo Chiquitto <leonardo.lists@gmail.com> |
||||||
|
|
||||||
|
Currently, a new alarm is scheduled every time the daemon receives |
||||||
|
a SIGHUP (map re-read) or SIGUSR1 (forced expiration). Besides that, |
||||||
|
map re-reads started on demand when a map is found to be outdated |
||||||
|
also generate a new alarm. |
||||||
|
|
||||||
|
Once added, these alarms are never deleted and hence increase the |
||||||
|
number of times the daemon wakes up to run the expiration procedure. |
||||||
|
After a couple of months, in setups with many mount points, it's |
||||||
|
normal to see automount waking up every second to handle the |
||||||
|
expiration timer. |
||||||
|
|
||||||
|
This patch removes the alarm scheduling from the readmap cleanup |
||||||
|
routine and makes sure the alarm is re-added after the expiration |
||||||
|
process only when it was not triggered by SIGUSR1. |
||||||
|
|
||||||
|
I couldn't think of any use case to justify keeping these alarms: |
||||||
|
it's critical to have the alarm ticking every timeout/4 seconds, |
||||||
|
but more than one periodic alarm running doesn't seem to make |
||||||
|
sense. |
||||||
|
--- |
||||||
|
|
||||||
|
CHANGELOG | 1 + |
||||||
|
daemon/state.c | 6 +----- |
||||||
|
2 files changed, 2 insertions(+), 5 deletions(-) |
||||||
|
|
||||||
|
|
||||||
|
diff --git a/CHANGELOG b/CHANGELOG |
||||||
|
index c9be73e..4cf5621 100644 |
||||||
|
--- a/CHANGELOG |
||||||
|
+++ b/CHANGELOG |
||||||
|
@@ -22,6 +22,7 @@ |
||||||
|
- fix init script status return. |
||||||
|
- fix use get_proximity() without libtirpc. |
||||||
|
- don't use dirent d_type to filter out files in scandir() |
||||||
|
+- don't schedule new alarms after readmap. |
||||||
|
|
||||||
|
25/07/2012 autofs-5.0.7 |
||||||
|
======================= |
||||||
|
diff --git a/daemon/state.c b/daemon/state.c |
||||||
|
index b451c56..6e23022 100644 |
||||||
|
--- a/daemon/state.c |
||||||
|
+++ b/daemon/state.c |
||||||
|
@@ -144,7 +144,7 @@ void expire_cleanup(void *arg) |
||||||
|
ap->submount = 2; |
||||||
|
} |
||||||
|
|
||||||
|
- if (!ap->submount) |
||||||
|
+ if (ap->state == ST_EXPIRE && !ap->submount) |
||||||
|
alarm_add(ap, ap->exp_runfreq); |
||||||
|
|
||||||
|
/* FALLTHROUGH */ |
||||||
|
@@ -330,13 +330,9 @@ static void do_readmap_cleanup(void *arg) |
||||||
|
ap = ra->ap; |
||||||
|
|
||||||
|
st_mutex_lock(); |
||||||
|
- |
||||||
|
ap->readmap_thread = 0; |
||||||
|
st_set_done(ap); |
||||||
|
- if (!ap->submount) |
||||||
|
- alarm_add(ap, ap->exp_runfreq); |
||||||
|
st_ready(ap); |
||||||
|
- |
||||||
|
st_mutex_unlock(); |
||||||
|
|
||||||
|
free(ra); |
@ -0,0 +1,41 @@ |
|||||||
|
autofs-5.0.7 - don't use dirent d_type to filter out files in scandir() |
||||||
|
|
||||||
|
From: Leonardo Chiquitto <leonardo.lists@gmail.com> |
||||||
|
|
||||||
|
The "d_type" field of a dirent structure is not filled in by all |
||||||
|
file systems (XFS being one example), so we can't rely on it to |
||||||
|
check file types. |
||||||
|
--- |
||||||
|
|
||||||
|
CHANGELOG | 1 + |
||||||
|
modules/lookup_dir.c | 4 ---- |
||||||
|
2 files changed, 1 insertions(+), 4 deletions(-) |
||||||
|
|
||||||
|
|
||||||
|
diff --git a/CHANGELOG b/CHANGELOG |
||||||
|
index 460bd27..c9be73e 100644 |
||||||
|
--- a/CHANGELOG |
||||||
|
+++ b/CHANGELOG |
||||||
|
@@ -21,6 +21,7 @@ |
||||||
|
- fix submount offset delete. |
||||||
|
- fix init script status return. |
||||||
|
- fix use get_proximity() without libtirpc. |
||||||
|
+- don't use dirent d_type to filter out files in scandir() |
||||||
|
|
||||||
|
25/07/2012 autofs-5.0.7 |
||||||
|
======================= |
||||||
|
diff --git a/modules/lookup_dir.c b/modules/lookup_dir.c |
||||||
|
index 658cc29..33901c0 100644 |
||||||
|
--- a/modules/lookup_dir.c |
||||||
|
+++ b/modules/lookup_dir.c |
||||||
|
@@ -103,10 +103,6 @@ static int acceptable_dirent_p(const struct dirent *e) |
||||||
|
{ |
||||||
|
size_t namesz; |
||||||
|
|
||||||
|
- |
||||||
|
- if (!(e->d_type == DT_REG || e->d_type == DT_LNK)) |
||||||
|
- return 0; |
||||||
|
- |
||||||
|
namesz = strlen(e->d_name); |
||||||
|
if (!namesz) |
||||||
|
return 0; |
@ -0,0 +1,54 @@ |
|||||||
|
autofs-5.0.7 - dont wait forever to restart |
||||||
|
|
||||||
|
From: Ian Kent <ikent@redhat.com> |
||||||
|
|
||||||
|
When restarting autofs the daemon must be stopped before it is started |
||||||
|
again if it is to function properly. At the moment the init script waits |
||||||
|
forever which is not ok if the daemon won't exit for some reason. |
||||||
|
|
||||||
|
So, if the daemon is still running after the stop, run stop() again, wait |
||||||
|
a bit longer and if it still hasn't stopped kill it with a SIGKILL to clear |
||||||
|
the way for the startup. |
||||||
|
--- |
||||||
|
|
||||||
|
CHANGELOG | 1 + |
||||||
|
redhat/autofs.init.in | 13 ++++++++++--- |
||||||
|
2 files changed, 11 insertions(+), 3 deletions(-) |
||||||
|
|
||||||
|
|
||||||
|
diff --git a/CHANGELOG b/CHANGELOG |
||||||
|
index 6051723..93b9c26 100644 |
||||||
|
--- a/CHANGELOG |
||||||
|
+++ b/CHANGELOG |
||||||
|
@@ -5,6 +5,7 @@ |
||||||
|
- fix ipv6 proximity calculation. |
||||||
|
- fix parse buffer initialization. |
||||||
|
- fix typo in automount(8). |
||||||
|
+- dont wait forever to restart. |
||||||
|
|
||||||
|
25/07/2012 autofs-5.0.7 |
||||||
|
======================= |
||||||
|
diff --git a/redhat/autofs.init.in b/redhat/autofs.init.in |
||||||
|
index ec6d5d6..cd5cb34 100644 |
||||||
|
--- a/redhat/autofs.init.in |
||||||
|
+++ b/redhat/autofs.init.in |
||||||
|
@@ -129,9 +129,16 @@ function restart() { |
||||||
|
status autofs > /dev/null 2>&1 |
||||||
|
if [ $? -eq 0 ]; then |
||||||
|
stop |
||||||
|
- while [ -n "`pidof $prog`" ] ; do |
||||||
|
- sleep 5 |
||||||
|
- done |
||||||
|
+ if [ -n "`pidof $prog`" ]; then |
||||||
|
+ # If we failed to stop, try at least one more time |
||||||
|
+ # after waiting a little while |
||||||
|
+ sleep 20 |
||||||
|
+ stop |
||||||
|
+ auto_pid=`pidof $prog` |
||||||
|
+ if [ -n "$auto_pid" ]; then |
||||||
|
+ kill -9 $auto_pid |
||||||
|
+ fi |
||||||
|
+ fi |
||||||
|
fi |
||||||
|
start |
||||||
|
} |
@ -0,0 +1,51 @@ |
|||||||
|
autofs-5.0.7 - fix a couple of compiler warnings |
||||||
|
|
||||||
|
From: Ian Kent <ikent@redhat.com> |
||||||
|
|
||||||
|
Quiet a couple of ompiler warnings by making intention explicit using brackets. |
||||||
|
--- |
||||||
|
CHANGELOG | 1 + |
||||||
|
modules/mount_bind.c | 2 +- |
||||||
|
modules/mount_nfs.c | 4 ++-- |
||||||
|
3 files changed, 4 insertions(+), 3 deletions(-) |
||||||
|
|
||||||
|
diff --git a/CHANGELOG b/CHANGELOG |
||||||
|
index 37eac72..7749f01 100644 |
||||||
|
--- a/CHANGELOG |
||||||
|
+++ b/CHANGELOG |
||||||
|
@@ -54,6 +54,7 @@ |
||||||
|
- misc man page fixes. |
||||||
|
- fix add null check in parse_server_string(). |
||||||
|
- don't override LDFLAGS in make rules. |
||||||
|
+- fix a couple of compiler warnings. |
||||||
|
|
||||||
|
25/07/2012 autofs-5.0.7 |
||||||
|
======================= |
||||||
|
diff --git a/modules/mount_bind.c b/modules/mount_bind.c |
||||||
|
index 61a773c..2b70104 100644 |
||||||
|
--- a/modules/mount_bind.c |
||||||
|
+++ b/modules/mount_bind.c |
||||||
|
@@ -208,7 +208,7 @@ int mount_mount(struct autofs_point *ap, const char *root, const char *name, int |
||||||
|
MODPREFIX |
||||||
|
"failed to create local mount %s -> %s", |
||||||
|
fullpath, what); |
||||||
|
- if (ap->flags & MOUNT_FLAG_GHOST && !status) |
||||||
|
+ if ((ap->flags & MOUNT_FLAG_GHOST) && !status) |
||||||
|
if (mkdir_path(fullpath, 0555) && errno != EEXIST) { |
||||||
|
char *estr = strerror_r(errno, buf, MAX_ERR_BUF); |
||||||
|
error(ap->logopt, |
||||||
|
diff --git a/modules/mount_nfs.c b/modules/mount_nfs.c |
||||||
|
index 3d2ccea..adf2002 100644 |
||||||
|
--- a/modules/mount_nfs.c |
||||||
|
+++ b/modules/mount_nfs.c |
||||||
|
@@ -202,8 +202,8 @@ int mount_mount(struct autofs_point *ap, const char *root, const char *name, int |
||||||
|
*/ |
||||||
|
if ((hosts && !hosts->next) && |
||||||
|
mount_default_proto == 4 && |
||||||
|
- vers & NFS_VERS_MASK != 0 && |
||||||
|
- vers & NFS4_VERS_MASK != 0) { |
||||||
|
+ (vers & NFS_VERS_MASK) != 0 && |
||||||
|
+ (vers & NFS4_VERS_MASK) != 0) { |
||||||
|
unsigned int v4_probe_ok = 0; |
||||||
|
struct host *tmp = new_host(hosts->name, |
||||||
|
hosts->addr, hosts->addr_len, |
@ -0,0 +1,45 @@ |
|||||||
|
autofs-5.0.7 - fix add null check in parse_server_string() |
||||||
|
|
||||||
|
From: Ian Kent <raven@themaw.net> |
||||||
|
|
||||||
|
In a recent patch that added an error check for the case there's no ':' server |
||||||
|
name delimiter parse_server_string() braces were not added which lead to an |
||||||
|
incorrect parse error. |
||||||
|
--- |
||||||
|
CHANGELOG | 1 + |
||||||
|
modules/lookup_ldap.c | 4 ++-- |
||||||
|
2 files changed, 3 insertions(+), 2 deletions(-) |
||||||
|
|
||||||
|
diff --git a/CHANGELOG b/CHANGELOG |
||||||
|
index 503a21e..5d90139 100644 |
||||||
|
--- a/CHANGELOG |
||||||
|
+++ b/CHANGELOG |
||||||
|
@@ -52,6 +52,7 @@ |
||||||
|
- add changlog entry for coverity fixes. |
||||||
|
- fix probe each nfs version in turn for singleton mounts. |
||||||
|
- misc man page fixes. |
||||||
|
+- fix add null check in parse_server_string(). |
||||||
|
|
||||||
|
25/07/2012 autofs-5.0.7 |
||||||
|
======================= |
||||||
|
diff --git a/modules/lookup_ldap.c b/modules/lookup_ldap.c |
||||||
|
index 35ea6ea..a2bfafd 100644 |
||||||
|
--- a/modules/lookup_ldap.c |
||||||
|
+++ b/modules/lookup_ldap.c |
||||||
|
@@ -1210,14 +1210,14 @@ static int parse_server_string(unsigned logopt, const char *url, struct lookup_c |
||||||
|
const char *q = NULL; |
||||||
|
|
||||||
|
/* Isolate the server. Include the port spec */ |
||||||
|
- if (*ptr != '[') |
||||||
|
+ if (*ptr != '[') { |
||||||
|
q = strchr(ptr, ':'); |
||||||
|
if (!q) { |
||||||
|
crit(logopt, MODPREFIX |
||||||
|
"LDAP server name not found in %s", ptr); |
||||||
|
return 0; |
||||||
|
} |
||||||
|
- else { |
||||||
|
+ } else { |
||||||
|
q = ++ptr; |
||||||
|
while (*q == ':' || isxdigit(*q)) |
||||||
|
q++; |
@ -0,0 +1,24 @@ |
|||||||
|
autofs-5.0.7 - fix automounter support on parisc |
||||||
|
|
||||||
|
From: Helge Deller <deller@gmx.de> |
||||||
|
|
||||||
|
This patch fixes automounter support on the parisc architecture with |
||||||
|
64-bit kernel and 32-bit userspace. |
||||||
|
|
||||||
|
Signed-off-by: Helge Deller <deller@gmx.de> |
||||||
|
--- |
||||||
|
daemon/automount.c | 1 + |
||||||
|
1 file changed, 1 insertion(+) |
||||||
|
|
||||||
|
diff --git a/daemon/automount.c b/daemon/automount.c |
||||||
|
index 4a3eb3d..4c651cf 100644 |
||||||
|
--- a/daemon/automount.c |
||||||
|
+++ b/daemon/automount.c |
||||||
|
@@ -610,6 +610,7 @@ static size_t get_kpkt_len(void) |
||||||
|
if (strcmp(un.machine, "alpha") == 0 || |
||||||
|
strcmp(un.machine, "ia64") == 0 || |
||||||
|
strcmp(un.machine, "x86_64") == 0 || |
||||||
|
+ strcmp(un.machine, "parisc64") == 0 || |
||||||
|
strcmp(un.machine, "ppc64") == 0) |
||||||
|
pkt_len += 4; |
||||||
|
|
@ -0,0 +1,38 @@ |
|||||||
|
autofs-5.0.7 - fix bad mkdir permission on create |
||||||
|
|
||||||
|
From: Ian Kent <raven@themaw.net> |
||||||
|
|
||||||
|
Reported by Gordon Lack (gordon[dot]m[dot]lack[at]gsk[dot]com). |
||||||
|
|
||||||
|
If the automount daemon needs to create a directory (hierarchy) for an |
||||||
|
automount and it is started up with a umask of 027 (or similar) then it |
||||||
|
creates unusable directories (permission == 550). |
||||||
|
--- |
||||||
|
CHANGELOG | 1 + |
||||||
|
daemon/automount.c | 5 ++++- |
||||||
|
2 files changed, 5 insertions(+), 1 deletion(-) |
||||||
|
|
||||||
|
--- autofs-5.0.7.orig/CHANGELOG |
||||||
|
+++ autofs-5.0.7/CHANGELOG |
||||||
|
@@ -88,6 +88,7 @@ |
||||||
|
- check for bind onto self in mount_bind.c. |
||||||
|
- fix symlink expire. |
||||||
|
- fix master map type check. |
||||||
|
+- fix bad mkdir permission on create. |
||||||
|
|
||||||
|
25/07/2012 autofs-5.0.7 |
||||||
|
======================= |
||||||
|
--- autofs-5.0.7.orig/daemon/automount.c |
||||||
|
+++ autofs-5.0.7/daemon/automount.c |
||||||
|
@@ -122,7 +122,10 @@ static int do_mkdir(const char *parent, |
||||||
|
status = statfs(parent, &fs); |
||||||
|
if ((status != -1 && fs.f_type == (__SWORD_TYPE) AUTOFS_SUPER_MAGIC) || |
||||||
|
contained_in_local_fs(path)) { |
||||||
|
- if (mkdir(path, mode) == -1) { |
||||||
|
+ mode_t mask = umask(0022); |
||||||
|
+ int ret = mkdir(path, mode); |
||||||
|
+ (void) umask(mask); |
||||||
|
+ if (ret == -1) { |
||||||
|
errno = EACCES; |
||||||
|
return 0; |
||||||
|
} |
@ -0,0 +1,27 @@ |
|||||||
|
autofs-5.0.7 - fix check mkdir_path() in mount_bind.c:mount_mount() |
||||||
|
|
||||||
|
From: Ian Kent <raven@themaw.net> |
||||||
|
|
||||||
|
|
||||||
|
--- |
||||||
|
modules/mount_bind.c | 7 ++++++- |
||||||
|
1 file changed, 6 insertions(+), 1 deletion(-) |
||||||
|
|
||||||
|
diff --git a/modules/mount_bind.c b/modules/mount_bind.c |
||||||
|
index d6c6fe7..61a773c 100644 |
||||||
|
--- a/modules/mount_bind.c |
||||||
|
+++ b/modules/mount_bind.c |
||||||
|
@@ -209,7 +209,12 @@ int mount_mount(struct autofs_point *ap, const char *root, const char *name, int |
||||||
|
"failed to create local mount %s -> %s", |
||||||
|
fullpath, what); |
||||||
|
if (ap->flags & MOUNT_FLAG_GHOST && !status) |
||||||
|
- mkdir_path(fullpath, 0555); |
||||||
|
+ if (mkdir_path(fullpath, 0555) && errno != EEXIST) { |
||||||
|
+ char *estr = strerror_r(errno, buf, MAX_ERR_BUF); |
||||||
|
+ error(ap->logopt, |
||||||
|
+ MODPREFIX "mkdir_path %s failed: %s", |
||||||
|
+ fullpath, estr); |
||||||
|
+ } |
||||||
|
else { |
||||||
|
if (ap->type == LKP_INDIRECT) |
||||||
|
rmdir_path(ap, fullpath, ap->dev); |
@ -0,0 +1,216 @@ |
|||||||
|
autofs-5.0.7 - fix compilation of lookup_ldap.c without sasl |
||||||
|
|
||||||
|
From: Dustin Polke <DuPol@gmx.de> |
||||||
|
|
||||||
|
See https://bugs.gentoo.org/show_bug.cgi?id=361899 for more info. |
||||||
|
|
||||||
|
Edited by: Ian Kent <raven@themaw.net> |
||||||
|
- fix parse_ldap_config() is needed by ldap but previously excluded. |
||||||
|
- exclude other references to ctxt->extern_cert and ctxt->extern_key. |
||||||
|
- prevent memory leak if present in config but not used. |
||||||
|
- remove now unused set_env(). |
||||||
|
--- |
||||||
|
CHANGELOG | 1 + |
||||||
|
include/lookup_ldap.h | 4 ++-- |
||||||
|
lib/Makefile | 4 ++++ |
||||||
|
modules/Makefile | 6 ++++-- |
||||||
|
modules/lookup_ldap.c | 18 +++++++++++++----- |
||||||
|
5 files changed, 24 insertions(+), 9 deletions(-) |
||||||
|
|
||||||
|
--- autofs-5.0.7.orig/CHANGELOG |
||||||
|
+++ autofs-5.0.7/CHANGELOG |
||||||
|
@@ -82,6 +82,7 @@ |
||||||
|
- add std vars to program map invocation. |
||||||
|
- check for existing offset mount before mounting. |
||||||
|
- fix cache readlock not taken on lookup. |
||||||
|
+- fix compilation of lookup_ldap.c without sasl. |
||||||
|
|
||||||
|
25/07/2012 autofs-5.0.7 |
||||||
|
======================= |
||||||
|
--- autofs-5.0.7.orig/include/lookup_ldap.h |
||||||
|
+++ autofs-5.0.7/include/lookup_ldap.h |
||||||
|
@@ -11,6 +11,8 @@ |
||||||
|
#include <krb5.h> |
||||||
|
#endif |
||||||
|
|
||||||
|
+#include <libxml/tree.h> |
||||||
|
+ |
||||||
|
#include "list.h" |
||||||
|
#include "dclist.h" |
||||||
|
|
||||||
|
@@ -92,7 +94,6 @@ struct lookup_context { |
||||||
|
}; |
||||||
|
|
||||||
|
|
||||||
|
-#ifdef WITH_SASL |
||||||
|
#define LDAP_AUTH_CONF_FILE "test" |
||||||
|
|
||||||
|
#define LDAP_TLS_DONT_USE 0 |
||||||
|
@@ -104,7 +105,6 @@ struct lookup_context { |
||||||
|
#define LDAP_AUTH_REQUIRED 0x0002 |
||||||
|
#define LDAP_AUTH_AUTODETECT 0x0004 |
||||||
|
#define LDAP_NEED_AUTH (LDAP_AUTH_REQUIRED|LDAP_AUTH_AUTODETECT) |
||||||
|
-#endif |
||||||
|
|
||||||
|
#define LDAP_AUTH_USESIMPLE 0x0008 |
||||||
|
|
||||||
|
--- autofs-5.0.7.orig/lib/Makefile |
||||||
|
+++ autofs-5.0.7/lib/Makefile |
||||||
|
@@ -24,6 +24,10 @@ CFLAGS += -I../include -fPIC -D_GNU_SOUR |
||||||
|
CFLAGS += -DAUTOFS_MAP_DIR=\"$(autofsmapdir)\" |
||||||
|
CFLAGS += -DAUTOFS_CONF_DIR=\"$(autofsconfdir)\" |
||||||
|
|
||||||
|
+ifeq ($(LDAP), 1) |
||||||
|
+ CFLAGS += $(XML_FLAGS) $(XML_LIBS) |
||||||
|
+endif |
||||||
|
+ |
||||||
|
.PHONY: all install clean |
||||||
|
|
||||||
|
all: autofs.a |
||||||
|
--- autofs-5.0.7.orig/modules/Makefile |
||||||
|
+++ autofs-5.0.7/modules/Makefile |
||||||
|
@@ -45,10 +45,12 @@ endif |
||||||
|
ifeq ($(LDAP), 1) |
||||||
|
SRCS += lookup_ldap.c |
||||||
|
MODS += lookup_ldap.so |
||||||
|
+ LDAP_FLAGS += $(XML_FLAGS) -DLDAP_THREAD_SAFE |
||||||
|
+ LIBLDAP += $(XML_LIBS) |
||||||
|
ifeq ($(SASL), 1) |
||||||
|
SASL_OBJ = cyrus-sasl.o cyrus-sasl-extern.o |
||||||
|
- LDAP_FLAGS += $(SASL_FLAGS) $(XML_FLAGS) $(KRB5_FLAGS) -DLDAP_THREAD_SAFE |
||||||
|
- LIBLDAP += $(LIBSASL) $(XML_LIBS) $(KRB5_LIBS) |
||||||
|
+ LDAP_FLAGS += $(SASL_FLAGS) $(KRB5_FLAGS) |
||||||
|
+ LIBLDAP += $(LIBSASL) $(KRB5_LIBS) |
||||||
|
endif |
||||||
|
endif |
||||||
|
|
||||||
|
--- autofs-5.0.7.orig/modules/lookup_ldap.c |
||||||
|
+++ autofs-5.0.7/modules/lookup_ldap.c |
||||||
|
@@ -66,6 +66,7 @@ struct ldap_search_params { |
||||||
|
|
||||||
|
static int decode_percent_hack(const char *, char **); |
||||||
|
|
||||||
|
+#ifdef WITH_SASL |
||||||
|
static int set_env(unsigned logopt, const char *name, const char *val) |
||||||
|
{ |
||||||
|
int ret = setenv(name, val, 1); |
||||||
|
@@ -75,6 +76,7 @@ static int set_env(unsigned logopt, cons |
||||||
|
} |
||||||
|
return 1; |
||||||
|
} |
||||||
|
+#endif |
||||||
|
|
||||||
|
#ifndef HAVE_LDAP_CREATE_PAGE_CONTROL |
||||||
|
int ldap_create_page_control(LDAP *ldap, ber_int_t pagesize, |
||||||
|
@@ -183,9 +185,9 @@ int unbind_ldap_connection(unsigned logo |
||||||
|
{ |
||||||
|
int rv; |
||||||
|
|
||||||
|
-#ifdef WITH_SASL |
||||||
|
if (ctxt->use_tls == LDAP_TLS_RELEASE) |
||||||
|
ctxt->use_tls = LDAP_TLS_INIT; |
||||||
|
+#ifdef WITH_SASL |
||||||
|
autofs_sasl_unbind(ctxt); |
||||||
|
#endif |
||||||
|
|
||||||
|
@@ -243,7 +245,6 @@ LDAP *init_ldap_connection(unsigned logo |
||||||
|
info(logopt, MODPREFIX "failed to set connection timeout to %d", |
||||||
|
net_timeout.tv_sec); |
||||||
|
|
||||||
|
-#ifdef WITH_SASL |
||||||
|
if (ctxt->use_tls) { |
||||||
|
if (ctxt->version == 2) { |
||||||
|
if (ctxt->tls_required) { |
||||||
|
@@ -272,7 +273,6 @@ LDAP *init_ldap_connection(unsigned logo |
||||||
|
} |
||||||
|
ctxt->use_tls = LDAP_TLS_RELEASE; |
||||||
|
} |
||||||
|
-#endif |
||||||
|
|
||||||
|
return ldap; |
||||||
|
} |
||||||
|
@@ -585,10 +585,12 @@ static LDAP *do_connect(unsigned logopt, |
||||||
|
{ |
||||||
|
LDAP *ldap; |
||||||
|
|
||||||
|
+#ifdef WITH_SASL |
||||||
|
if (ctxt->extern_cert && ctxt->extern_key) { |
||||||
|
set_env(logopt, ENV_LDAPTLS_CERT, ctxt->extern_cert); |
||||||
|
set_env(logopt, ENV_LDAPTLS_KEY, ctxt->extern_key); |
||||||
|
} |
||||||
|
+#endif |
||||||
|
|
||||||
|
ldap = init_ldap_connection(logopt, uri, ctxt); |
||||||
|
if (ldap) { |
||||||
|
@@ -791,7 +793,6 @@ find_server: |
||||||
|
return ldap; |
||||||
|
} |
||||||
|
|
||||||
|
-#ifdef WITH_SASL |
||||||
|
int get_property(unsigned logopt, xmlNodePtr node, const char *prop, char **value) |
||||||
|
{ |
||||||
|
xmlChar *ret; |
||||||
|
@@ -812,6 +813,7 @@ int get_property(unsigned logopt, xmlNod |
||||||
|
return 0; |
||||||
|
} |
||||||
|
|
||||||
|
+#ifdef WITH_SASL |
||||||
|
/* |
||||||
|
* For plain text, login and digest-md5 authentication types, we need |
||||||
|
* user and password credentials. |
||||||
|
@@ -824,6 +826,7 @@ int authtype_requires_creds(const char * |
||||||
|
return 1; |
||||||
|
return 0; |
||||||
|
} |
||||||
|
+#endif |
||||||
|
|
||||||
|
/* |
||||||
|
* Returns: |
||||||
|
@@ -1056,6 +1059,7 @@ auth_fail: |
||||||
|
} |
||||||
|
} else if (auth_required == LDAP_AUTH_REQUIRED && |
||||||
|
(authtype && !strncmp(authtype, "EXTERNAL", 8))) { |
||||||
|
+#ifdef WITH_SASL |
||||||
|
ret = get_property(logopt, root, "external_cert", &extern_cert); |
||||||
|
ret |= get_property(logopt, root, "external_key", &extern_key); |
||||||
|
/* |
||||||
|
@@ -1074,6 +1078,7 @@ auth_fail: |
||||||
|
if (extern_key) |
||||||
|
free(extern_key); |
||||||
|
} |
||||||
|
+#endif |
||||||
|
} |
||||||
|
|
||||||
|
/* |
||||||
|
@@ -1094,8 +1099,10 @@ auth_fail: |
||||||
|
ctxt->secret = secret; |
||||||
|
ctxt->client_princ = client_princ; |
||||||
|
ctxt->client_cc = client_cc; |
||||||
|
+#ifdef WITH_SASL |
||||||
|
ctxt->extern_cert = extern_cert; |
||||||
|
ctxt->extern_key = extern_key; |
||||||
|
+#endif |
||||||
|
|
||||||
|
debug(logopt, MODPREFIX |
||||||
|
"ldap authentication configured with the following options:"); |
||||||
|
@@ -1127,7 +1134,6 @@ out: |
||||||
|
|
||||||
|
return ret; |
||||||
|
} |
||||||
|
-#endif |
||||||
|
|
||||||
|
/* |
||||||
|
* Take an input string as specified in the master map, and break it |
||||||
|
@@ -1390,10 +1396,12 @@ static void free_context(struct lookup_c |
||||||
|
defaults_free_searchdns(ctxt->sdns); |
||||||
|
if (ctxt->dclist) |
||||||
|
free_dclist(ctxt->dclist); |
||||||
|
+#ifdef WITH_SASL |
||||||
|
if (ctxt->extern_cert) |
||||||
|
free(ctxt->extern_cert); |
||||||
|
if (ctxt->extern_key) |
||||||
|
free(ctxt->extern_key); |
||||||
|
+#endif |
||||||
|
free(ctxt); |
||||||
|
|
||||||
|
return; |
@ -0,0 +1,117 @@ |
|||||||
|
autofs-5.0.7 - fix crash due to thread unsafe use of libldap |
||||||
|
|
||||||
|
From: Leonardo Chiquitto <leonardo.lists@gmail.com> |
||||||
|
|
||||||
|
Add locking around LDAP initialization calls |
||||||
|
|
||||||
|
To prevent corruption inside SSL and LDAP libraries, it's necessary to |
||||||
|
serialize all calls to functions that initialize LDAP contexts. |
||||||
|
|
||||||
|
How to reproduce the problem: |
||||||
|
|
||||||
|
- Setup an LDAP server with SSL/TLS support enabled |
||||||
|
- Configure AutoFS to fetch the maps from LDAP |
||||||
|
- Make sure the OpenLDAP client library is configured to use SSL |
||||||
|
connections and "usetls" is set to yes in autofs_ldap_auth.conf. |
||||||
|
|
||||||
|
In one directory handled by AutoFS (an indirect mount point), trigger in |
||||||
|
parallel some dozens of invalid mounts (ie, try to access keys that do not |
||||||
|
exist in the AutoFS map). Repeat until it crashes. |
||||||
|
|
||||||
|
Here it always crashes in less than 20 minutes, normally inside OpenSSL. |
||||||
|
Core dump inspection shows that internal SSL structures are corrupted, |
||||||
|
with function pointers pointing to random addresses. |
||||||
|
|
||||||
|
Trying to find similar reports on the web, I found this email from an |
||||||
|
OpenLDAP developer (partial quote, emphasis mine) [1]: |
||||||
|
|
||||||
|
"As far as I know, libldap is thread safe in the sense that multiple |
||||||
|
threads can use separate LDAP* handles without running into concurrency |
||||||
|
issues; *except for library initialization*, all accesses to common data |
||||||
|
(i.e. global variables) is read-only." |
||||||
|
|
||||||
|
[1]http://www.openldap.org/cgi-bin/wilma_hiliter/openldap-software/200606/msg00252.html |
||||||
|
|
||||||
|
AutoFS implements no locking around LDAP initialization libraries and |
||||||
|
it's quite common to see multiple threads executing ldap_initialize() |
||||||
|
or ldap_start_tls_s() at the same time. |
||||||
|
--- |
||||||
|
CHANGELOG | 1 + |
||||||
|
modules/lookup_ldap.c | 35 ++++++++++++++++++++++++++++++++++- |
||||||
|
2 files changed, 35 insertions(+), 1 deletion(-) |
||||||
|
|
||||||
|
--- autofs-5.0.7.orig/CHANGELOG |
||||||
|
+++ autofs-5.0.7/CHANGELOG |
||||||
|
@@ -105,6 +105,7 @@ |
||||||
|
- fix incorrect append options description in README.v5-release. |
||||||
|
- fix mistake in assignment. |
||||||
|
- use open(2) instead of access(2) to trigger dependent mounts. |
||||||
|
+- fix crash due to thread unsafe use of libldap. |
||||||
|
|
||||||
|
25/07/2012 autofs-5.0.7 |
||||||
|
======================= |
||||||
|
--- autofs-5.0.7.orig/modules/lookup_ldap.c |
||||||
|
+++ autofs-5.0.7/modules/lookup_ldap.c |
||||||
|
@@ -52,6 +52,12 @@ static struct ldap_schema common_schema[ |
||||||
|
}; |
||||||
|
static unsigned int common_schema_count = sizeof(common_schema)/sizeof(struct ldap_schema); |
||||||
|
|
||||||
|
+/* |
||||||
|
+ * Initialization of LDAP and OpenSSL must be always serialized to |
||||||
|
+ * avoid corruption of context structures inside these libraries. |
||||||
|
+ */ |
||||||
|
+pthread_mutex_t ldapinit_mutex = PTHREAD_MUTEX_INITIALIZER; |
||||||
|
+ |
||||||
|
struct ldap_search_params { |
||||||
|
struct autofs_point *ap; |
||||||
|
LDAP *ldap; |
||||||
|
@@ -138,6 +144,22 @@ int ldap_parse_page_control(LDAP *ldap, |
||||||
|
} |
||||||
|
#endif /* HAVE_LDAP_PARSE_PAGE_CONTROL */ |
||||||
|
|
||||||
|
+static void ldapinit_mutex_lock(void) |
||||||
|
+{ |
||||||
|
+ int status = pthread_mutex_lock(&ldapinit_mutex); |
||||||
|
+ if (status) |
||||||
|
+ fatal(status); |
||||||
|
+ return; |
||||||
|
+} |
||||||
|
+ |
||||||
|
+static void ldapinit_mutex_unlock(void) |
||||||
|
+{ |
||||||
|
+ int status = pthread_mutex_unlock(&ldapinit_mutex); |
||||||
|
+ if (status) |
||||||
|
+ fatal(status); |
||||||
|
+ return; |
||||||
|
+} |
||||||
|
+ |
||||||
|
static void uris_mutex_lock(struct lookup_context *ctxt) |
||||||
|
{ |
||||||
|
int status = pthread_mutex_lock(&ctxt->uris_mutex); |
||||||
|
@@ -198,7 +220,7 @@ int unbind_ldap_connection(unsigned logo |
||||||
|
return rv; |
||||||
|
} |
||||||
|
|
||||||
|
-LDAP *init_ldap_connection(unsigned logopt, const char *uri, struct lookup_context *ctxt) |
||||||
|
+LDAP *__init_ldap_connection(unsigned logopt, const char *uri, struct lookup_context *ctxt) |
||||||
|
{ |
||||||
|
LDAP *ldap = NULL; |
||||||
|
struct timeval timeout = { ctxt->timeout, 0 }; |
||||||
|
@@ -276,6 +298,17 @@ LDAP *init_ldap_connection(unsigned logo |
||||||
|
|
||||||
|
return ldap; |
||||||
|
} |
||||||
|
+ |
||||||
|
+LDAP *init_ldap_connection(unsigned logopt, const char *uri, struct lookup_context *ctxt) |
||||||
|
+{ |
||||||
|
+ LDAP *ldap; |
||||||
|
+ |
||||||
|
+ ldapinit_mutex_lock(); |
||||||
|
+ ldap = __init_ldap_connection(logopt, uri, ctxt); |
||||||
|
+ ldapinit_mutex_unlock(); |
||||||
|
+ |
||||||
|
+ return ldap; |
||||||
|
+} |
||||||
|
|
||||||
|
static int get_query_dn(unsigned logopt, LDAP *ldap, struct lookup_context *ctxt, const char *class, const char *key) |
||||||
|
{ |
@ -0,0 +1,108 @@ |
|||||||
|
autofs-5.0.7 - fix dumpmaps multi output |
||||||
|
|
||||||
|
From: Ian Kent <raven@themaw.net> |
||||||
|
|
||||||
|
If the maps contain the old style "multi" type the dumped map information |
||||||
|
isn't right. |
||||||
|
--- |
||||||
|
CHANGELOG | 1 |
||||||
|
lib/master.c | 61 +++++++++++++++++++++++++++++++++++++++++++++++------------ |
||||||
|
2 files changed, 50 insertions(+), 12 deletions(-) |
||||||
|
|
||||||
|
--- autofs-5.0.7.orig/CHANGELOG |
||||||
|
+++ autofs-5.0.7/CHANGELOG |
||||||
|
@@ -58,6 +58,7 @@ |
||||||
|
- add after sssd dependency to unit file. |
||||||
|
- fix syncronize handle_mounts() shutdown. |
||||||
|
- fix fix wildcard multi map regression. |
||||||
|
+- fix dumpmaps multi output. |
||||||
|
|
||||||
|
25/07/2012 autofs-5.0.7 |
||||||
|
======================= |
||||||
|
--- autofs-5.0.7.orig/lib/master.c |
||||||
|
+++ autofs-5.0.7/lib/master.c |
||||||
|
@@ -1281,6 +1281,54 @@ static void list_source_instances(struct |
||||||
|
return; |
||||||
|
} |
||||||
|
|
||||||
|
+static void print_map_info(struct map_source *source) |
||||||
|
+{ |
||||||
|
+ int argc = source->argc; |
||||||
|
+ int i, multi, map_num; |
||||||
|
+ |
||||||
|
+ multi = (source->type && !strcmp(source->type, "multi")); |
||||||
|
+ map_num = 1; |
||||||
|
+ for (i = 0; i < argc; i++) { |
||||||
|
+ if (source->argv[i] && *source->argv[i] != '-') { |
||||||
|
+ if (!multi) |
||||||
|
+ printf(" map: %s\n", source->argv[i]); |
||||||
|
+ else |
||||||
|
+ printf(" map[%i]: %s\n", map_num, source->argv[i]); |
||||||
|
+ i++; |
||||||
|
+ } |
||||||
|
+ |
||||||
|
+ if (i >= argc) |
||||||
|
+ return; |
||||||
|
+ |
||||||
|
+ if (!strcmp(source->argv[i], "--")) |
||||||
|
+ continue; |
||||||
|
+ |
||||||
|
+ if (source->argv[i]) { |
||||||
|
+ int need_newline = 0; |
||||||
|
+ int j; |
||||||
|
+ |
||||||
|
+ if (!multi) |
||||||
|
+ printf(" arguments:"); |
||||||
|
+ else |
||||||
|
+ printf(" arguments[%i]:", map_num); |
||||||
|
+ |
||||||
|
+ for (j = i; j < source->argc; j++) { |
||||||
|
+ if (!strcmp(source->argv[j], "--")) |
||||||
|
+ break; |
||||||
|
+ printf(" %s", source->argv[j]); |
||||||
|
+ i++; |
||||||
|
+ need_newline = 1; |
||||||
|
+ } |
||||||
|
+ if (need_newline) |
||||||
|
+ printf("\n"); |
||||||
|
+ } |
||||||
|
+ if (multi) |
||||||
|
+ map_num++; |
||||||
|
+ } |
||||||
|
+ |
||||||
|
+ return; |
||||||
|
+} |
||||||
|
+ |
||||||
|
int master_show_mounts(struct master *master) |
||||||
|
{ |
||||||
|
struct list_head *p, *head; |
||||||
|
@@ -1311,7 +1359,6 @@ int master_show_mounts(struct master *ma |
||||||
|
struct autofs_point *ap; |
||||||
|
time_t now = time(NULL); |
||||||
|
unsigned int count = 0; |
||||||
|
- int i; |
||||||
|
|
||||||
|
this = list_entry(p, struct master_mapent, list); |
||||||
|
p = p->next; |
||||||
|
@@ -1357,20 +1404,10 @@ int master_show_mounts(struct master *ma |
||||||
|
} |
||||||
|
|
||||||
|
if (source->argc >= 1) { |
||||||
|
- i = 0; |
||||||
|
- if (source->argv[0] && *source->argv[0] != '-') { |
||||||
|
- printf(" map: %s\n", source->argv[0]); |
||||||
|
- i = 1; |
||||||
|
- } |
||||||
|
+ print_map_info(source); |
||||||
|
if (count && ap->type == LKP_INDIRECT) |
||||||
|
printf(" duplicate indirect map entry" |
||||||
|
" will be ignored at run time\n"); |
||||||
|
- if (source->argc > 1) { |
||||||
|
- printf(" arguments: "); |
||||||
|
- for (; i < source->argc; i++) |
||||||
|
- printf("%s ", source->argv[i]); |
||||||
|
- printf("\n"); |
||||||
|
- } |
||||||
|
} |
||||||
|
|
||||||
|
printf("\n"); |
@ -0,0 +1,25 @@ |
|||||||
|
autofs-5.0.7 - fix fcntl return check |
||||||
|
|
||||||
|
From: Ian Kent <raven@themaw.net> |
||||||
|
|
||||||
|
When checking for FD_CLOEXEC support the return of the fcntl(2) call to |
||||||
|
get the file descriptor flags is not checked which could result in an |
||||||
|
incorrect result. |
||||||
|
--- |
||||||
|
include/automount.h | 3 ++- |
||||||
|
1 file changed, 2 insertions(+), 1 deletion(-) |
||||||
|
|
||||||
|
diff --git a/include/automount.h b/include/automount.h |
||||||
|
index e72fa0d..6ced842 100644 |
||||||
|
--- a/include/automount.h |
||||||
|
+++ b/include/automount.h |
||||||
|
@@ -547,7 +547,8 @@ static inline void check_cloexec(int fd) |
||||||
|
{ |
||||||
|
if (cloexec_works == 0) { |
||||||
|
int fl = fcntl(fd, F_GETFD); |
||||||
|
- cloexec_works = (fl & FD_CLOEXEC) ? 1 : -1; |
||||||
|
+ if (fl != -1) |
||||||
|
+ cloexec_works = (fl & FD_CLOEXEC) ? 1 : -1; |
||||||
|
} |
||||||
|
if (cloexec_works > 0) |
||||||
|
return; |
@ -0,0 +1,179 @@ |
|||||||
|
autofs-5.0.7 - fix file descriptor leak when reloading the daemon |
||||||
|
|
||||||
|
From: Leonardo Chiquitto <leonardo.lists@gmail.com> |
||||||
|
|
||||||
|
A customer reported that AutoFS may leak file descriptors when some |
||||||
|
maps are modified and the daemon reloaded. I'm able to reproduce the |
||||||
|
problem on 5.0.7 by following these steps: |
||||||
|
|
||||||
|
1. Configure a simple direct mount: |
||||||
|
|
||||||
|
# cat /etc/auto.master |
||||||
|
/- /etc/auto.direct |
||||||
|
|
||||||
|
# cat /etc/auto.direct |
||||||
|
/nfs server:/nfs |
||||||
|
|
||||||
|
2. Start the automounter and do NOT trigger the mount |
||||||
|
|
||||||
|
3. Replace /etc/auto.direct with: |
||||||
|
|
||||||
|
# cat /etc/auto.direct |
||||||
|
/nfs/1 server:/nfs |
||||||
|
/nfs/2 server:/nfs |
||||||
|
|
||||||
|
4. Reload: |
||||||
|
|
||||||
|
# kill -HUP $(pidof automount) |
||||||
|
|
||||||
|
>From now on, every reload will leak a file descriptor: |
||||||
|
|
||||||
|
# ls -la /proc/$(pidof automount)/fd | grep /nfs |
||||||
|
lr-x------ 1 root root 64 Aug 14 22:08 11 -> /nfs |
||||||
|
lr-x------ 1 root root 64 Aug 14 22:08 12 -> /nfs |
||||||
|
lr-x------ 1 root root 64 Aug 14 22:08 13 -> /nfs |
||||||
|
lr-x------ 1 root root 64 Aug 14 22:08 14 -> /nfs |
||||||
|
lr-x------ 1 root root 64 Aug 14 22:08 5 -> /nfs |
||||||
|
|
||||||
|
I've investigated the problem and discovered that the leak happens in |
||||||
|
do_umount_autofs_direct(): |
||||||
|
|
||||||
|
- edit imk |
||||||
|
The same leak is present in umount_autofs_offset() also. |
||||||
|
Updated patch to cover that too. |
||||||
|
- end edit |
||||||
|
|
||||||
|
int do_umount_autofs_direct(struct autofs_point *ap, struct mnt_list |
||||||
|
*mnts, struct mapent *me) |
||||||
|
{ |
||||||
|
(...) |
||||||
|
if (me->ioctlfd != -1) { |
||||||
|
if (tree_is_mounted(mnts, me->key, MNTS_REAL)) { |
||||||
|
error(ap->logopt, |
||||||
|
"attempt to umount busy direct mount %s", |
||||||
|
me->key); |
||||||
|
return 1; |
||||||
|
} |
||||||
|
ioctlfd = me->ioctlfd; |
||||||
|
} else // ioctlfd == -1 |
||||||
|
ops->open(ap->logopt, &ioctlfd, me->dev, me->key); <= we open it here |
||||||
|
|
||||||
|
if (ioctlfd >= 0) { |
||||||
|
unsigned int status = 1; |
||||||
|
|
||||||
|
rv = ops->askumount(ap->logopt, ioctlfd, &status); |
||||||
|
/// at this point, rv == 0 and status == 0 |
||||||
|
if (rv) { |
||||||
|
char *estr = strerror_r(errno, buf, MAX_ERR_BUF); |
||||||
|
error(ap->logopt, "ioctl failed: %s", estr); |
||||||
|
return 1; |
||||||
|
} else if (!status) { |
||||||
|
/// at this point, ap->state == ST_READMAP |
||||||
|
if (ap->state != ST_SHUTDOWN_FORCE) { |
||||||
|
error(ap->logopt, |
||||||
|
"ask umount returned busy for %s", |
||||||
|
me->key); |
||||||
|
return 1; <= we return here, without closing the fd |
||||||
|
} else { |
||||||
|
me->ioctlfd = -1; |
||||||
|
ops->catatonic(ap->logopt, ioctlfd); |
||||||
|
ops->close(ap->logopt, ioctlfd); |
||||||
|
goto force_umount; |
||||||
|
} |
||||||
|
(...) |
||||||
|
--- |
||||||
|
CHANGELOG | 1 + |
||||||
|
daemon/direct.c | 19 ++++++++++++++++--- |
||||||
|
2 files changed, 17 insertions(+), 3 deletions(-) |
||||||
|
|
||||||
|
diff --git a/CHANGELOG b/CHANGELOG |
||||||
|
index 46ef335..a7ed212 100644 |
||||||
|
--- a/CHANGELOG |
||||||
|
+++ b/CHANGELOG |
||||||
|
@@ -30,6 +30,7 @@ |
||||||
|
- workaround missing GNU versionsort extension. |
||||||
|
- dont fail on master map self include. |
||||||
|
- fix wildcard multi map regression. |
||||||
|
+- fix file descriptor leak when reloading the daemon. |
||||||
|
|
||||||
|
25/07/2012 autofs-5.0.7 |
||||||
|
======================= |
||||||
|
diff --git a/daemon/direct.c b/daemon/direct.c |
||||||
|
index 3e09c5d..228a666 100644 |
||||||
|
--- a/daemon/direct.c |
||||||
|
+++ b/daemon/direct.c |
||||||
|
@@ -86,7 +86,8 @@ int do_umount_autofs_direct(struct autofs_point *ap, struct mnt_list *mnts, stru |
||||||
|
{ |
||||||
|
struct ioctl_ops *ops = get_ioctl_ops(); |
||||||
|
char buf[MAX_ERR_BUF]; |
||||||
|
- int ioctlfd, rv, left, retries; |
||||||
|
+ int ioctlfd = -1, rv, left, retries; |
||||||
|
+ int opened = 0; |
||||||
|
|
||||||
|
left = umount_multi(ap, me->key, 0); |
||||||
|
if (left) { |
||||||
|
@@ -103,8 +104,10 @@ int do_umount_autofs_direct(struct autofs_point *ap, struct mnt_list *mnts, stru |
||||||
|
return 1; |
||||||
|
} |
||||||
|
ioctlfd = me->ioctlfd; |
||||||
|
- } else |
||||||
|
+ } else { |
||||||
|
ops->open(ap->logopt, &ioctlfd, me->dev, me->key); |
||||||
|
+ opened = 1; |
||||||
|
+ } |
||||||
|
|
||||||
|
if (ioctlfd >= 0) { |
||||||
|
unsigned int status = 1; |
||||||
|
@@ -113,12 +116,16 @@ int do_umount_autofs_direct(struct autofs_point *ap, struct mnt_list *mnts, stru |
||||||
|
if (rv) { |
||||||
|
char *estr = strerror_r(errno, buf, MAX_ERR_BUF); |
||||||
|
error(ap->logopt, "ioctl failed: %s", estr); |
||||||
|
+ if (opened && ioctlfd != -1) |
||||||
|
+ ops->close(ap->logopt, ioctlfd); |
||||||
|
return 1; |
||||||
|
} else if (!status) { |
||||||
|
if (ap->state != ST_SHUTDOWN_FORCE) { |
||||||
|
error(ap->logopt, |
||||||
|
"ask umount returned busy for %s", |
||||||
|
me->key); |
||||||
|
+ if (opened && ioctlfd != -1) |
||||||
|
+ ops->close(ap->logopt, ioctlfd); |
||||||
|
return 1; |
||||||
|
} else { |
||||||
|
me->ioctlfd = -1; |
||||||
|
@@ -536,7 +543,8 @@ int umount_autofs_offset(struct autofs_point *ap, struct mapent *me) |
||||||
|
{ |
||||||
|
struct ioctl_ops *ops = get_ioctl_ops(); |
||||||
|
char buf[MAX_ERR_BUF]; |
||||||
|
- int ioctlfd, rv = 1, retries; |
||||||
|
+ int ioctlfd = -1, rv = 1, retries; |
||||||
|
+ int opened = 0; |
||||||
|
|
||||||
|
if (me->ioctlfd != -1) { |
||||||
|
if (is_mounted(_PATH_MOUNTED, me->key, MNTS_REAL)) { |
||||||
|
@@ -554,6 +562,7 @@ int umount_autofs_offset(struct autofs_point *ap, struct mapent *me) |
||||||
|
return 0; |
||||||
|
} |
||||||
|
ops->open(ap->logopt, &ioctlfd, me->dev, me->key); |
||||||
|
+ opened = 1; |
||||||
|
} |
||||||
|
|
||||||
|
if (ioctlfd >= 0) { |
||||||
|
@@ -563,6 +572,8 @@ int umount_autofs_offset(struct autofs_point *ap, struct mapent *me) |
||||||
|
if (rv) { |
||||||
|
char *estr = strerror_r(errno, buf, MAX_ERR_BUF); |
||||||
|
logerr("ioctl failed: %s", estr); |
||||||
|
+ if (opened && ioctlfd != -1) |
||||||
|
+ ops->close(ap->logopt, ioctlfd); |
||||||
|
return 1; |
||||||
|
} else if (!status) { |
||||||
|
if (ap->state != ST_SHUTDOWN_FORCE) { |
||||||
|
@@ -570,6 +581,8 @@ int umount_autofs_offset(struct autofs_point *ap, struct mapent *me) |
||||||
|
error(ap->logopt, |
||||||
|
"ask umount returned busy for %s", |
||||||
|
me->key); |
||||||
|
+ if (opened && ioctlfd != -1) |
||||||
|
+ ops->close(ap->logopt, ioctlfd); |
||||||
|
return 1; |
||||||
|
} else { |
||||||
|
me->ioctlfd = -1; |
@ -0,0 +1,37 @@ |
|||||||
|
autofs-5.0.7 - fix fix map entry duplicate offset detection |
||||||
|
|
||||||
|
From: Ian Kent <raven@themaw.net> |
||||||
|
|
||||||
|
Map entry duplicate detection was still broken. |
||||||
|
This hopefully will fix it, at least the Conectathon duplicate offset entry |
||||||
|
tests pass now. |
||||||
|
--- |
||||||
|
CHANGELOG | 1 + |
||||||
|
lib/cache.c | 2 +- |
||||||
|
2 files changed, 2 insertions(+), 1 deletion(-) |
||||||
|
|
||||||
|
diff --git a/CHANGELOG b/CHANGELOG |
||||||
|
index e15aa1f..39d7889 100644 |
||||||
|
--- a/CHANGELOG |
||||||
|
+++ b/CHANGELOG |
||||||
|
@@ -47,6 +47,7 @@ |
||||||
|
- dont probe rdma mounts. |
||||||
|
- fix master map mount options matching. |
||||||
|
- fix master map bogus keywork match. |
||||||
|
+- fix fix map entry duplicate offset detection. |
||||||
|
|
||||||
|
25/07/2012 autofs-5.0.7 |
||||||
|
======================= |
||||||
|
diff --git a/lib/cache.c b/lib/cache.c |
||||||
|
index 1e05a99..ecace4a 100644 |
||||||
|
--- a/lib/cache.c |
||||||
|
+++ b/lib/cache.c |
||||||
|
@@ -659,7 +659,7 @@ int cache_update_offset(struct mapent_cache *mc, const char *mkey, const char *k |
||||||
|
|
||||||
|
me = cache_lookup_distinct(mc, key); |
||||||
|
if (me && me->age == age) { |
||||||
|
- if (me->multi == owner) |
||||||
|
+ if (me == owner || strcmp(me->key, key) == 0) |
||||||
|
return CHE_DUPLICATE; |
||||||
|
} |
||||||
|
|
@ -0,0 +1,283 @@ |
|||||||
|
autofs-5.0.7 - fix fix wildcard multi map regression |
||||||
|
|
||||||
|
From: Ian Kent <raven@themaw.net> |
||||||
|
|
||||||
|
A recent patch to fix a wildcard multi map mount regression has a |
||||||
|
side effect of causing a deadlock at startup when trying to re-connect |
||||||
|
to existing mounts. |
||||||
|
|
||||||
|
The patch required the map entry cache write lock be taken so the cache |
||||||
|
could be updated. But when starting and trying to re-connect to existing |
||||||
|
mounts there's no need to update the cache. |
||||||
|
--- |
||||||
|
CHANGELOG | 1 + |
||||||
|
modules/lookup_file.c | 25 ++++++++++++++++++++----- |
||||||
|
modules/lookup_ldap.c | 23 +++++++++++++++++++---- |
||||||
|
modules/lookup_nisplus.c | 26 +++++++++++++++++++++----- |
||||||
|
modules/lookup_sss.c | 22 ++++++++++++++++++---- |
||||||
|
modules/lookup_yp.c | 23 +++++++++++++++++++---- |
||||||
|
6 files changed, 98 insertions(+), 22 deletions(-) |
||||||
|
|
||||||
|
--- autofs-5.0.7.orig/CHANGELOG |
||||||
|
+++ autofs-5.0.7/CHANGELOG |
||||||
|
@@ -57,6 +57,7 @@ |
||||||
|
- fix a couple of compiler warnings. |
||||||
|
- add after sssd dependency to unit file. |
||||||
|
- fix syncronize handle_mounts() shutdown. |
||||||
|
+- fix fix wildcard multi map regression. |
||||||
|
|
||||||
|
25/07/2012 autofs-5.0.7 |
||||||
|
======================= |
||||||
|
--- autofs-5.0.7.orig/modules/lookup_file.c |
||||||
|
+++ autofs-5.0.7/modules/lookup_file.c |
||||||
|
@@ -1042,7 +1042,7 @@ int lookup_mount(struct autofs_point *ap |
||||||
|
return NSS_STATUS_UNAVAIL; |
||||||
|
} |
||||||
|
|
||||||
|
- cache_writelock(mc); |
||||||
|
+ cache_readlock(mc); |
||||||
|
me = cache_lookup_first(mc); |
||||||
|
if (me && st.st_mtime <= me->age) { |
||||||
|
/* |
||||||
|
@@ -1084,7 +1084,18 @@ int lookup_mount(struct autofs_point *ap |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
- cache_writelock(mc); |
||||||
|
+ /* |
||||||
|
+ * We can't take the writelock for direct mounts. If we're |
||||||
|
+ * starting up or trying to re-connect to an existing direct |
||||||
|
+ * mount we could be iterating through the map entries with |
||||||
|
+ * the readlock held. But we don't need to update the cache |
||||||
|
+ * when we're starting up so just take the readlock in that |
||||||
|
+ * case. |
||||||
|
+ */ |
||||||
|
+ if (ap->flags & MOUNT_FLAG_REMOUNT) |
||||||
|
+ cache_readlock(mc); |
||||||
|
+ else |
||||||
|
+ cache_writelock(mc); |
||||||
|
do_cache_lookup: |
||||||
|
me = cache_lookup(mc, key); |
||||||
|
/* |
||||||
|
@@ -1102,10 +1113,11 @@ do_cache_lookup: |
||||||
|
} |
||||||
|
if (me && me->mapent) { |
||||||
|
/* |
||||||
|
- * Add wildcard match for later validation checks and |
||||||
|
- * negative cache lookups. |
||||||
|
+ * If this is a lookup add wildcard match for later validation |
||||||
|
+ * checks and negative cache lookups. |
||||||
|
*/ |
||||||
|
- if (ap->type == LKP_INDIRECT && *me->key == '*') { |
||||||
|
+ if (!(ap->flags & MOUNT_FLAG_REMOUNT) && |
||||||
|
+ ap->type == LKP_INDIRECT && *me->key == '*') { |
||||||
|
ret = cache_update(mc, source, key, me->mapent, me->age); |
||||||
|
if (!(ret & (CHE_OK | CHE_UPDATED))) |
||||||
|
me = NULL; |
||||||
|
@@ -1130,6 +1142,9 @@ do_cache_lookup: |
||||||
|
ret = ctxt->parse->parse_mount(ap, key, key_len, |
||||||
|
mapent, ctxt->parse->context); |
||||||
|
if (ret) { |
||||||
|
+ /* Don't update negative cache when re-connecting */ |
||||||
|
+ if (ap->flags & MOUNT_FLAG_REMOUNT) |
||||||
|
+ return NSS_STATUS_TRYAGAIN; |
||||||
|
cache_writelock(mc); |
||||||
|
cache_update_negative(mc, source, key, ap->negative_timeout); |
||||||
|
cache_unlock(mc); |
||||||
|
--- autofs-5.0.7.orig/modules/lookup_ldap.c |
||||||
|
+++ autofs-5.0.7/modules/lookup_ldap.c |
||||||
|
@@ -2975,7 +2975,18 @@ int lookup_mount(struct autofs_point *ap |
||||||
|
return status; |
||||||
|
} |
||||||
|
|
||||||
|
- cache_writelock(mc); |
||||||
|
+ /* |
||||||
|
+ * We can't take the writelock for direct mounts. If we're |
||||||
|
+ * starting up or trying to re-connect to an existing direct |
||||||
|
+ * mount we could be iterating through the map entries with |
||||||
|
+ * the readlock held. But we don't need to update the cache |
||||||
|
+ * when we're starting up so just take the readlock in that |
||||||
|
+ * case. |
||||||
|
+ */ |
||||||
|
+ if (ap->flags & MOUNT_FLAG_REMOUNT) |
||||||
|
+ cache_readlock(mc); |
||||||
|
+ else |
||||||
|
+ cache_writelock(mc); |
||||||
|
me = cache_lookup(mc, key); |
||||||
|
/* Stale mapent => check for entry in alternate source or wildcard */ |
||||||
|
if (me && !me->mapent) { |
||||||
|
@@ -2987,10 +2998,11 @@ int lookup_mount(struct autofs_point *ap |
||||||
|
} |
||||||
|
if (me && me->mapent) { |
||||||
|
/* |
||||||
|
- * Add wildcard match for later validation checks and |
||||||
|
- * negative cache lookups. |
||||||
|
+ * If this is a lookup add wildcard match for later validation |
||||||
|
+ * checks and negative cache lookups. |
||||||
|
*/ |
||||||
|
- if (ap->type == LKP_INDIRECT && *me->key == '*') { |
||||||
|
+ if (!(ap->flags & MOUNT_FLAG_REMOUNT) && |
||||||
|
+ ap->type == LKP_INDIRECT && *me->key == '*') { |
||||||
|
ret = cache_update(mc, source, key, me->mapent, me->age); |
||||||
|
if (!(ret & (CHE_OK | CHE_UPDATED))) |
||||||
|
me = NULL; |
||||||
|
@@ -3012,6 +3024,9 @@ int lookup_mount(struct autofs_point *ap |
||||||
|
ret = ctxt->parse->parse_mount(ap, key, key_len, |
||||||
|
mapent, ctxt->parse->context); |
||||||
|
if (ret) { |
||||||
|
+ /* Don't update negative cache when re-connecting */ |
||||||
|
+ if (ap->flags & MOUNT_FLAG_REMOUNT) |
||||||
|
+ return NSS_STATUS_TRYAGAIN; |
||||||
|
cache_writelock(mc); |
||||||
|
cache_update_negative(mc, source, key, ap->negative_timeout); |
||||||
|
cache_unlock(mc); |
||||||
|
--- autofs-5.0.7.orig/modules/lookup_nisplus.c |
||||||
|
+++ autofs-5.0.7/modules/lookup_nisplus.c |
||||||
|
@@ -561,7 +561,18 @@ int lookup_mount(struct autofs_point *ap |
||||||
|
return status; |
||||||
|
} |
||||||
|
|
||||||
|
- cache_writelock(mc); |
||||||
|
+ /* |
||||||
|
+ * We can't take the writelock for direct mounts. If we're |
||||||
|
+ * starting up or trying to re-connect to an existing direct |
||||||
|
+ * mount we could be iterating through the map entries with |
||||||
|
+ * the readlock held. But we don't need to update the cache |
||||||
|
+ * when we're starting up so just take the readlock in that |
||||||
|
+ * case. |
||||||
|
+ */ |
||||||
|
+ if (ap->flags & MOUNT_FLAG_REMOUNT) |
||||||
|
+ cache_readlock(mc); |
||||||
|
+ else |
||||||
|
+ cache_writelock(mc); |
||||||
|
me = cache_lookup(mc, key); |
||||||
|
/* Stale mapent => check for entry in alternate source or wildcard */ |
||||||
|
if (me && !me->mapent) { |
||||||
|
@@ -573,10 +584,11 @@ int lookup_mount(struct autofs_point *ap |
||||||
|
} |
||||||
|
if (me && me->mapent) { |
||||||
|
/* |
||||||
|
- * Add wildcard match for later validation checks and |
||||||
|
- * negative cache lookups. |
||||||
|
+ * If this is a lookup add wildcard match for later validation |
||||||
|
+ * checks and negative cache lookups. |
||||||
|
*/ |
||||||
|
- if (ap->type == LKP_INDIRECT && *me->key == '*') { |
||||||
|
+ if (!(ap->flags & MOUNT_FLAG_REMOUNT) && |
||||||
|
+ ap->type == LKP_INDIRECT && *me->key == '*') { |
||||||
|
ret = cache_update(mc, source, key, me->mapent, me->age); |
||||||
|
if (!(ret & (CHE_OK | CHE_UPDATED))) |
||||||
|
me = NULL; |
||||||
|
@@ -603,6 +615,11 @@ int lookup_mount(struct autofs_point *ap |
||||||
|
time_t now = time(NULL); |
||||||
|
int rv = CHE_OK; |
||||||
|
|
||||||
|
+ free(mapent); |
||||||
|
+ |
||||||
|
+ /* Don't update negative cache when re-connecting */ |
||||||
|
+ if (ap->flags & MOUNT_FLAG_REMOUNT) |
||||||
|
+ return NSS_STATUS_TRYAGAIN; |
||||||
|
cache_writelock(mc); |
||||||
|
me = cache_lookup_distinct(mc, key); |
||||||
|
if (!me) |
||||||
|
@@ -612,7 +629,6 @@ int lookup_mount(struct autofs_point *ap |
||||||
|
me->status = time(NULL) + ap->negative_timeout; |
||||||
|
} |
||||||
|
cache_unlock(mc); |
||||||
|
- free(mapent); |
||||||
|
return NSS_STATUS_TRYAGAIN; |
||||||
|
} |
||||||
|
free(mapent); |
||||||
|
--- autofs-5.0.7.orig/modules/lookup_sss.c |
||||||
|
+++ autofs-5.0.7/modules/lookup_sss.c |
||||||
|
@@ -635,7 +635,17 @@ int lookup_mount(struct autofs_point *ap |
||||||
|
return status; |
||||||
|
} |
||||||
|
|
||||||
|
- cache_readlock(mc); |
||||||
|
+ /* |
||||||
|
+ * We can't take the writelock for direct mounts. If we're |
||||||
|
+ * starting up or trying to re-connect to an existing direct |
||||||
|
+ * mount we could be iterating through the map entries with |
||||||
|
+ * the readlock held. But we don't need to update the cache |
||||||
|
+ * when we're starting up so just take the readlock in that |
||||||
|
+ */ |
||||||
|
+ if (ap->flags & MOUNT_FLAG_REMOUNT) |
||||||
|
+ cache_writelock(mc); |
||||||
|
+ else |
||||||
|
+ cache_readlock(mc); |
||||||
|
me = cache_lookup(mc, key); |
||||||
|
/* Stale mapent => check for entry in alternate source or wildcard */ |
||||||
|
if (me && !me->mapent) { |
||||||
|
@@ -647,10 +657,11 @@ int lookup_mount(struct autofs_point *ap |
||||||
|
} |
||||||
|
if (me && me->mapent) { |
||||||
|
/* |
||||||
|
- * Add wildcard match for later validation checks and |
||||||
|
- * negative cache lookups. |
||||||
|
+ * If this is a lookup add wildcard match for later validation |
||||||
|
+ * checks and negative cache lookups. |
||||||
|
*/ |
||||||
|
- if (ap->type == LKP_INDIRECT && *me->key == '*') { |
||||||
|
+ if (ap->type == LKP_INDIRECT && *me->key == '*' && |
||||||
|
+ !(ap->flags & MOUNT_FLAG_REMOUNT)) { |
||||||
|
ret = cache_update(mc, source, key, me->mapent, me->age); |
||||||
|
if (!(ret & (CHE_OK | CHE_UPDATED))) |
||||||
|
me = NULL; |
||||||
|
@@ -672,6 +683,9 @@ int lookup_mount(struct autofs_point *ap |
||||||
|
ret = ctxt->parse->parse_mount(ap, key, key_len, |
||||||
|
mapent, ctxt->parse->context); |
||||||
|
if (ret) { |
||||||
|
+ /* Don't update negative cache when re-connecting */ |
||||||
|
+ if (ap->flags & MOUNT_FLAG_REMOUNT) |
||||||
|
+ return NSS_STATUS_TRYAGAIN; |
||||||
|
cache_writelock(mc); |
||||||
|
cache_update_negative(mc, source, key, ap->negative_timeout); |
||||||
|
cache_unlock(mc); |
||||||
|
--- autofs-5.0.7.orig/modules/lookup_yp.c |
||||||
|
+++ autofs-5.0.7/modules/lookup_yp.c |
||||||
|
@@ -662,7 +662,18 @@ int lookup_mount(struct autofs_point *ap |
||||||
|
return status; |
||||||
|
} |
||||||
|
|
||||||
|
- cache_writelock(mc); |
||||||
|
+ /* |
||||||
|
+ * We can't take the writelock for direct mounts. If we're |
||||||
|
+ * starting up or trying to re-connect to an existing direct |
||||||
|
+ * mount we could be iterating through the map entries with |
||||||
|
+ * the readlock held. But we don't need to update the cache |
||||||
|
+ * when we're starting up so just take the readlock in that |
||||||
|
+ * case. |
||||||
|
+ */ |
||||||
|
+ if (ap->flags & MOUNT_FLAG_REMOUNT) |
||||||
|
+ cache_readlock(mc); |
||||||
|
+ else |
||||||
|
+ cache_writelock(mc); |
||||||
|
me = cache_lookup(mc, key); |
||||||
|
/* Stale mapent => check for entry in alternate source or wildcard */ |
||||||
|
if (me && !me->mapent) { |
||||||
|
@@ -674,10 +685,11 @@ int lookup_mount(struct autofs_point *ap |
||||||
|
} |
||||||
|
if (me && me->mapent) { |
||||||
|
/* |
||||||
|
- * Add wildcard match for later validation checks and |
||||||
|
- * negative cache lookups. |
||||||
|
+ * If this is a lookup add wildcard match for later validation |
||||||
|
+ * checks and negative cache lookups. |
||||||
|
*/ |
||||||
|
- if (ap->type == LKP_INDIRECT && *me->key == '*') { |
||||||
|
+ if (ap->type == LKP_INDIRECT && *me->key == '*' && |
||||||
|
+ !(ap->flags & MOUNT_FLAG_REMOUNT)) { |
||||||
|
ret = cache_update(mc, source, key, me->mapent, me->age); |
||||||
|
if (!(ret & (CHE_OK | CHE_UPDATED))) |
||||||
|
me = NULL; |
||||||
|
@@ -698,6 +710,9 @@ int lookup_mount(struct autofs_point *ap |
||||||
|
ret = ctxt->parse->parse_mount(ap, key, key_len, |
||||||
|
mapent, ctxt->parse->context); |
||||||
|
if (ret) { |
||||||
|
+ /* Don't update negative cache when re-connecting */ |
||||||
|
+ if (ap->flags & MOUNT_FLAG_REMOUNT) |
||||||
|
+ return NSS_STATUS_TRYAGAIN; |
||||||
|
cache_writelock(mc); |
||||||
|
cache_update_negative(mc, source, key, ap->negative_timeout); |
||||||
|
cache_unlock(mc); |
@ -0,0 +1,94 @@ |
|||||||
|
autofs-5.0.7 - fix get_nfs_info() probe |
||||||
|
|
||||||
|
From: Ian Kent <ikent@redhat.com> |
||||||
|
|
||||||
|
A recent contributed patch series changed the behaviour of server |
||||||
|
probing to use port specification in the same way as mount.nfs(8). |
||||||
|
|
||||||
|
Unfortunately, if NFSv2 only is to be probed and the NFS port |
||||||
|
needs to be obtained, the probe fails unconditionally because |
||||||
|
no rpc client has yet been created. |
||||||
|
--- |
||||||
|
CHANGELOG | 1 + |
||||||
|
modules/replicated.c | 32 ++++++++++++++++++++------------ |
||||||
|
2 files changed, 21 insertions(+), 12 deletions(-) |
||||||
|
|
||||||
|
--- autofs-5.0.7.orig/CHANGELOG |
||||||
|
+++ autofs-5.0.7/CHANGELOG |
||||||
|
@@ -61,6 +61,7 @@ |
||||||
|
- fix dumpmaps multi output. |
||||||
|
- try and cleanup after dumpmaps. |
||||||
|
- teach dumpmaps to output simple key value pairs. |
||||||
|
+- fix get_nfs_info() probe. |
||||||
|
|
||||||
|
25/07/2012 autofs-5.0.7 |
||||||
|
======================= |
||||||
|
--- autofs-5.0.7.orig/modules/replicated.c |
||||||
|
+++ autofs-5.0.7/modules/replicated.c |
||||||
|
@@ -444,6 +444,11 @@ static unsigned int get_nfs_info(unsigne |
||||||
|
host->name, proto, version); |
||||||
|
|
||||||
|
rpc_info->proto = proto; |
||||||
|
+ if (port < 0) |
||||||
|
+ rpc_info->port = NFS_PORT; |
||||||
|
+ else if (port > 0) |
||||||
|
+ rpc_info->port = port; |
||||||
|
+ |
||||||
|
memset(&parms, 0, sizeof(struct pmap)); |
||||||
|
parms.pm_prog = NFS_PROGRAM; |
||||||
|
parms.pm_prot = proto; |
||||||
|
@@ -451,11 +456,7 @@ static unsigned int get_nfs_info(unsigne |
||||||
|
if (!(version & NFS4_REQUESTED)) |
||||||
|
goto v3_ver; |
||||||
|
|
||||||
|
- if (port < 0) |
||||||
|
- rpc_info->port = NFS_PORT; |
||||||
|
- else if (port > 0) |
||||||
|
- rpc_info->port = port; |
||||||
|
- else { |
||||||
|
+ if (!port) { |
||||||
|
status = rpc_portmap_getclient(pm_info, |
||||||
|
host->name, host->addr, host->addr_len, |
||||||
|
proto, RPC_CLOSE_DEFAULT); |
||||||
|
@@ -515,7 +516,7 @@ v3_ver: |
||||||
|
if (!(version & NFS3_REQUESTED)) |
||||||
|
goto v2_ver; |
||||||
|
|
||||||
|
- if (port <= 0 && !(version & NFS4_REQUESTED && port == 0)) { |
||||||
|
+ if (!port && !pm_info->client) { |
||||||
|
status = rpc_portmap_getclient(pm_info, |
||||||
|
host->name, host->addr, host->addr_len, |
||||||
|
proto, RPC_CLOSE_DEFAULT); |
||||||
|
@@ -526,9 +527,7 @@ v3_ver: |
||||||
|
goto done_ver; |
||||||
|
} |
||||||
|
|
||||||
|
- if (port > 0) |
||||||
|
- rpc_info->port = port; |
||||||
|
- else { |
||||||
|
+ if (!port) { |
||||||
|
parms.pm_vers = NFS3_VERSION; |
||||||
|
status = rpc_portmap_getport(pm_info, &parms, &rpc_info->port); |
||||||
|
if (status == -EHOSTUNREACH || status == -ETIMEDOUT) { |
||||||
|
@@ -573,9 +572,18 @@ v2_ver: |
||||||
|
if (!(version & NFS2_REQUESTED)) |
||||||
|
goto done_ver; |
||||||
|
|
||||||
|
- if (port > 0) |
||||||
|
- rpc_info->port = port; |
||||||
|
- else { |
||||||
|
+ if (!port && !pm_info->client) { |
||||||
|
+ status = rpc_portmap_getclient(pm_info, |
||||||
|
+ host->name, host->addr, host->addr_len, |
||||||
|
+ proto, RPC_CLOSE_DEFAULT); |
||||||
|
+ if (status == -EHOSTUNREACH) { |
||||||
|
+ supported = status; |
||||||
|
+ goto done_ver; |
||||||
|
+ } else if (status) |
||||||
|
+ goto done_ver; |
||||||
|
+ } |
||||||
|
+ |
||||||
|
+ if (!port) { |
||||||
|
parms.pm_vers = NFS2_VERSION; |
||||||
|
status = rpc_portmap_getport(pm_info, &parms, &rpc_info->port); |
||||||
|
if (status == -EHOSTUNREACH || status == -ETIMEDOUT) { |
@ -0,0 +1,55 @@ |
|||||||
|
autofs-5.0.7 - fix host_addr null reference in add_new_host() |
||||||
|
|
||||||
|
From: Ian Kent <raven@themaw.net> |
||||||
|
|
||||||
|
The function add_new_host() is always called from a loop that depends |
||||||
|
on host_addr being non-null. |
||||||
|
|
||||||
|
Remove the redundant check. |
||||||
|
--- |
||||||
|
modules/replicated.c | 29 ++++++++++------------------- |
||||||
|
1 file changed, 10 insertions(+), 19 deletions(-) |
||||||
|
|
||||||
|
diff --git a/modules/replicated.c b/modules/replicated.c |
||||||
|
index 0a044b9..e793ca4 100644 |
||||||
|
--- a/modules/replicated.c |
||||||
|
+++ b/modules/replicated.c |
||||||
|
@@ -1030,28 +1030,19 @@ static int add_new_host(struct host **list, |
||||||
|
unsigned int prx; |
||||||
|
int addr_len; |
||||||
|
|
||||||
|
+ prx = get_proximity(host_addr->ai_addr); |
||||||
|
+ |
||||||
|
/* |
||||||
|
- * If we are using random selection we pretend all hosts are at |
||||||
|
- * the same proximity so hosts further away don't get excluded. |
||||||
|
- * We can't use PROXIMITY_LOCAL or we won't perform an RPC ping |
||||||
|
- * to remove hosts that may be down. |
||||||
|
+ * If we want the weight to be the determining factor |
||||||
|
+ * when selecting a host, or we are using random selection, |
||||||
|
+ * then all hosts must have the same proximity. However, |
||||||
|
+ * if this is the local machine it should always be used |
||||||
|
+ * since it is certainly available. |
||||||
|
*/ |
||||||
|
- if (!host_addr) |
||||||
|
+ if (prx != PROXIMITY_LOCAL && |
||||||
|
+ (options & (MOUNT_FLAG_USE_WEIGHT_ONLY | |
||||||
|
+ MOUNT_FLAG_RANDOM_SELECT))) |
||||||
|
prx = PROXIMITY_SUBNET; |
||||||
|
- else { |
||||||
|
- prx = get_proximity(host_addr->ai_addr); |
||||||
|
- /* |
||||||
|
- * If we want the weight to be the determining factor |
||||||
|
- * when selecting a host, or we are using random selection, |
||||||
|
- * then all hosts must have the same proximity. However, |
||||||
|
- * if this is the local machine it should always be used |
||||||
|
- * since it is certainly available. |
||||||
|
- */ |
||||||
|
- if (prx != PROXIMITY_LOCAL && |
||||||
|
- (options & (MOUNT_FLAG_USE_WEIGHT_ONLY | |
||||||
|
- MOUNT_FLAG_RANDOM_SELECT))) |
||||||
|
- prx = PROXIMITY_SUBNET; |
||||||
|
- } |
||||||
|
|
||||||
|
/* |
||||||
|
* If we tried to add an IPv6 address and we don't have IPv6 |
@ -0,0 +1,41 @@ |
|||||||
|
autofs-5.0.7 - fix inconsistent signed usage for __rpc_ping() |
||||||
|
|
||||||
|
From: Ian Kent <raven@themaw.net> |
||||||
|
|
||||||
|
There is some incosistent usage of unsigned int variables with the usage |
||||||
|
of __rpc_ping(). |
||||||
|
--- |
||||||
|
lib/rpc_subs.c | 12 +++++------- |
||||||
|
1 file changed, 5 insertions(+), 7 deletions(-) |
||||||
|
|
||||||
|
diff --git a/lib/rpc_subs.c b/lib/rpc_subs.c |
||||||
|
index 718caf9..f5742e8 100644 |
||||||
|
--- a/lib/rpc_subs.c |
||||||
|
+++ b/lib/rpc_subs.c |
||||||
|
@@ -670,13 +670,11 @@ int rpc_ping_proto(struct conn_info *info) |
||||||
|
return 1; |
||||||
|
} |
||||||
|
|
||||||
|
-static unsigned int __rpc_ping(const char *host, |
||||||
|
- unsigned long version, |
||||||
|
- int proto, |
||||||
|
- long seconds, long micros, |
||||||
|
- unsigned int option) |
||||||
|
+static int __rpc_ping(const char *host, |
||||||
|
+ unsigned long version, int proto, |
||||||
|
+ long seconds, long micros, unsigned int option) |
||||||
|
{ |
||||||
|
- unsigned int status; |
||||||
|
+ int status; |
||||||
|
struct conn_info info; |
||||||
|
struct pmap parms; |
||||||
|
|
||||||
|
@@ -713,7 +711,7 @@ int rpc_ping(const char *host, long seconds, long micros, unsigned int option) |
||||||
|
{ |
||||||
|
unsigned long vers3 = NFS3_VERSION; |
||||||
|
unsigned long vers2 = NFS2_VERSION; |
||||||
|
- unsigned int status; |
||||||
|
+ int status; |
||||||
|
|
||||||
|
status = __rpc_ping(host, vers2, IPPROTO_UDP, seconds, micros, option); |
||||||
|
if (status > 0) |
@ -0,0 +1,23 @@ |
|||||||
|
autofs-5.0.7 - fix inconsistent use of cache lock in handle_packet_missing_direct() |
||||||
|
|
||||||
|
From: Ian Kent <raven@themaw.net> |
||||||
|
|
||||||
|
All references here except this one refer to the same variable so change the odd |
||||||
|
one out for consistency. |
||||||
|
--- |
||||||
|
daemon/direct.c | 2 +- |
||||||
|
1 file changed, 1 insertion(+), 1 deletion(-) |
||||||
|
|
||||||
|
diff --git a/daemon/direct.c b/daemon/direct.c |
||||||
|
index 228a666..399ad0a 100644 |
||||||
|
--- a/daemon/direct.c |
||||||
|
+++ b/daemon/direct.c |
||||||
|
@@ -1392,7 +1392,7 @@ int handle_packet_missing_direct(struct autofs_point *ap, autofs_packet_missing_ |
||||||
|
ops->send_fail(ap->logopt, |
||||||
|
ioctlfd, pkt->wait_queue_token, -ENOENT); |
||||||
|
ops->close(ap->logopt, ioctlfd); |
||||||
|
- cache_unlock(me->mc); |
||||||
|
+ cache_unlock(mc); |
||||||
|
master_source_unlock(ap->entry); |
||||||
|
master_mutex_unlock(); |
||||||
|
pthread_setcancelstate(state, NULL); |
@ -0,0 +1,30 @@ |
|||||||
|
autofs-5.0.7 - fix incorrect check in flag_is_owned() |
||||||
|
|
||||||
|
From: Ian Kent <raven@themaw.net> |
||||||
|
|
||||||
|
The flag file code isn't used any more but this is clearly incorrect |
||||||
|
so fix it in case it gets used sometime in the future. |
||||||
|
--- |
||||||
|
daemon/flag.c | 7 +++---- |
||||||
|
1 file changed, 3 insertions(+), 4 deletions(-) |
||||||
|
|
||||||
|
diff --git a/daemon/flag.c b/daemon/flag.c |
||||||
|
index f8fe163..db9a4bd 100644 |
||||||
|
--- a/daemon/flag.c |
||||||
|
+++ b/daemon/flag.c |
||||||
|
@@ -66,12 +66,11 @@ static int flag_is_owned(int fd) |
||||||
|
|
||||||
|
continue; |
||||||
|
} |
||||||
|
- |
||||||
|
- /* Stale flagfile */ |
||||||
|
- if (!tries) |
||||||
|
- return 0; |
||||||
|
} |
||||||
|
|
||||||
|
+ /* Stale flagfile */ |
||||||
|
+ if (!tries) |
||||||
|
+ return 0; |
||||||
|
|
||||||
|
if (pid) { |
||||||
|
int ret; |
@ -0,0 +1,22 @@ |
|||||||
|
autofs-5.0.7 - fix incorrect var name in test |
||||||
|
|
||||||
|
From: Ian Kent <raven@themaw.net> |
||||||
|
|
||||||
|
Fix incorrect variable name used for test of buffer size for getgrgid_r. |
||||||
|
--- |
||||||
|
lib/mounts.c | 2 +- |
||||||
|
1 file changed, 1 insertion(+), 1 deletion(-) |
||||||
|
|
||||||
|
diff --git a/lib/mounts.c b/lib/mounts.c |
||||||
|
index 550445c..0caa0aa 100644 |
||||||
|
--- a/lib/mounts.c |
||||||
|
+++ b/lib/mounts.c |
||||||
|
@@ -1222,7 +1222,7 @@ void set_tsd_user_vars(unsigned int logopt, uid_t uid, gid_t gid) |
||||||
|
/* Try to get group info */ |
||||||
|
|
||||||
|
grplen = sysconf(_SC_GETGR_R_SIZE_MAX); |
||||||
|
- if (tmplen < 0) { |
||||||
|
+ if (grplen < 0) { |
||||||
|
error(logopt, "failed to get buffer size for getgrgid_r"); |
||||||
|
goto free_tsv_home; |
||||||
|
} |
@ -0,0 +1,22 @@ |
|||||||
|
autofs-5.0.7 - fix incorrect value reference in parse_line() |
||||||
|
|
||||||
|
From: Ian Kent <raven@themaw.net> |
||||||
|
|
||||||
|
This chack should clearly be on the contents of key not the pointer value. |
||||||
|
--- |
||||||
|
lib/defaults.c | 2 +- |
||||||
|
1 file changed, 1 insertion(+), 1 deletion(-) |
||||||
|
|
||||||
|
diff --git a/lib/defaults.c b/lib/defaults.c |
||||||
|
index 1e89509..7c65387 100644 |
||||||
|
--- a/lib/defaults.c |
||||||
|
+++ b/lib/defaults.c |
||||||
|
@@ -167,7 +167,7 @@ static int parse_line(char *line, char **res, char **value) |
||||||
|
while (*key && *key == ' ') |
||||||
|
key++; |
||||||
|
|
||||||
|
- if (!key) |
||||||
|
+ if (!*key) |
||||||
|
return 0; |
||||||
|
|
||||||
|
if (!(val = strchr(key, '='))) |
@ -0,0 +1,39 @@ |
|||||||
|
autofs-5.0.7 - fix init script status return |
||||||
|
|
||||||
|
From: Ian Kent <ikent@redhat.com> |
||||||
|
|
||||||
|
The patch that added the piddir to configure to fix incorrect init |
||||||
|
script status() function returns failed to actually return the value |
||||||
|
to the user. |
||||||
|
--- |
||||||
|
|
||||||
|
CHANGELOG | 1 + |
||||||
|
redhat/autofs.init.in | 2 +- |
||||||
|
2 files changed, 2 insertions(+), 1 deletions(-) |
||||||
|
|
||||||
|
|
||||||
|
diff --git a/CHANGELOG b/CHANGELOG |
||||||
|
index 76c1f73..5bcb1af 100644 |
||||||
|
--- a/CHANGELOG |
||||||
|
+++ b/CHANGELOG |
||||||
|
@@ -19,6 +19,7 @@ |
||||||
|
- Allow nsswitch.conf to not contain "automount:" lines. |
||||||
|
- fix nobind man page description. |
||||||
|
- fix submount offset delete. |
||||||
|
+- fix init script status return. |
||||||
|
|
||||||
|
25/07/2012 autofs-5.0.7 |
||||||
|
======================= |
||||||
|
diff --git a/redhat/autofs.init.in b/redhat/autofs.init.in |
||||||
|
index fe18b3e..9d008ff 100644 |
||||||
|
--- a/redhat/autofs.init.in |
||||||
|
+++ b/redhat/autofs.init.in |
||||||
|
@@ -172,7 +172,7 @@ RETVAL=0 |
||||||
|
case "$1" in |
||||||
|
status) |
||||||
|
status -p @@autofspiddir@@/autofs.pid -l autofs $prog |
||||||
|
- exit 0; |
||||||
|
+ exit $?; |
||||||
|
;; |
||||||
|
usage) |
||||||
|
usage_message |
@ -0,0 +1,55 @@ |
|||||||
|
autofs-5.0.7 - fix interface address null check |
||||||
|
|
||||||
|
From: Doug Nazar <nazard@nazar.ca> |
||||||
|
|
||||||
|
Since commit aa6f7793 [autofs-5.0.7 - fix ipv6 proximity calculation] |
||||||
|
get_proximity() uses getifaddrs however it crashes on interfaces with |
||||||
|
no addresses. |
||||||
|
|
||||||
|
Fix the NULL check to ignore interfaces with no addresses. |
||||||
|
Also skip interfaces which are not currently running. |
||||||
|
--- |
||||||
|
CHANGELOG | 1 + |
||||||
|
modules/replicated.c | 10 ++++++---- |
||||||
|
2 files changed, 7 insertions(+), 4 deletions(-) |
||||||
|
|
||||||
|
diff --git a/CHANGELOG b/CHANGELOG |
||||||
|
index 66c11de..50e83d7 100644 |
||||||
|
--- a/CHANGELOG |
||||||
|
+++ b/CHANGELOG |
||||||
|
@@ -43,6 +43,7 @@ |
||||||
|
- make dump maps check for duplicate indirect mounts. |
||||||
|
- document allowed map sources in auto.master. |
||||||
|
- add enable sloppy mount option to configure. |
||||||
|
+- fix interface address null check. |
||||||
|
|
||||||
|
25/07/2012 autofs-5.0.7 |
||||||
|
======================= |
||||||
|
diff --git a/modules/replicated.c b/modules/replicated.c |
||||||
|
index 26f64b8..6dbdade 100644 |
||||||
|
--- a/modules/replicated.c |
||||||
|
+++ b/modules/replicated.c |
||||||
|
@@ -165,8 +165,9 @@ static unsigned int get_proximity(struct sockaddr *host_addr) |
||||||
|
|
||||||
|
this = ifa; |
||||||
|
while (this) { |
||||||
|
- if (this->ifa_flags & IFF_POINTOPOINT || |
||||||
|
- this->ifa_addr->sa_data == NULL) { |
||||||
|
+ if (!(this->ifa_flags & IFF_UP) || |
||||||
|
+ this->ifa_flags & IFF_POINTOPOINT || |
||||||
|
+ this->ifa_addr == NULL) { |
||||||
|
this = this->ifa_next; |
||||||
|
continue; |
||||||
|
} |
||||||
|
@@ -202,8 +203,9 @@ static unsigned int get_proximity(struct sockaddr *host_addr) |
||||||
|
|
||||||
|
this = ifa; |
||||||
|
while (this) { |
||||||
|
- if (this->ifa_flags & IFF_POINTOPOINT || |
||||||
|
- this->ifa_addr->sa_data == NULL) { |
||||||
|
+ if (!(this->ifa_flags & IFF_UP) || |
||||||
|
+ this->ifa_flags & IFF_POINTOPOINT || |
||||||
|
+ this->ifa_addr == NULL) { |
||||||
|
this = this->ifa_next; |
||||||
|
continue; |
||||||
|
} |
@ -0,0 +1,297 @@ |
|||||||
|
autofs-5.0.7 - fix ipv6 proximity calculation |
||||||
|
|
||||||
|
From: Ian Kent <ikent@redhat.com> |
||||||
|
|
||||||
|
The socket based ioctl used to get interface information only |
||||||
|
return IPv4 information. Change get_proximity() function to use |
||||||
|
getifaddrs(3) instead. |
||||||
|
--- |
||||||
|
|
||||||
|
CHANGELOG | 1 |
||||||
|
modules/replicated.c | 149 ++++++++++++++------------------------------------ |
||||||
|
2 files changed, 42 insertions(+), 108 deletions(-) |
||||||
|
|
||||||
|
|
||||||
|
diff --git a/CHANGELOG b/CHANGELOG |
||||||
|
index dc38580..34c70fa 100644 |
||||||
|
--- a/CHANGELOG |
||||||
|
+++ b/CHANGELOG |
||||||
|
@@ -2,6 +2,7 @@ |
||||||
|
======================= |
||||||
|
- fix nobind sun escaped map entries. |
||||||
|
- fix use cache entry after free in lookup_prune_one_cache(). |
||||||
|
+- fix ipv6 proximity calculation. |
||||||
|
|
||||||
|
25/07/2012 autofs-5.0.7 |
||||||
|
======================= |
||||||
|
diff --git a/modules/replicated.c b/modules/replicated.c |
||||||
|
index 78046c6..bd6003b 100644 |
||||||
|
--- a/modules/replicated.c |
||||||
|
+++ b/modules/replicated.c |
||||||
|
@@ -52,6 +52,7 @@ |
||||||
|
#include <net/if.h> |
||||||
|
#include <netinet/in.h> |
||||||
|
#include <netdb.h> |
||||||
|
+#include <ifaddrs.h> |
||||||
|
|
||||||
|
#include "rpc_subs.h" |
||||||
|
#include "replicated.h" |
||||||
|
@@ -110,58 +111,18 @@ void seed_random(void) |
||||||
|
return; |
||||||
|
} |
||||||
|
|
||||||
|
-static int alloc_ifreq(struct ifconf *ifc, int sock) |
||||||
|
-{ |
||||||
|
- int ret, lastlen = ifc_last_len, len = ifc_buf_len; |
||||||
|
- char err_buf[MAX_ERR_BUF], *buf; |
||||||
|
- |
||||||
|
- while (1) { |
||||||
|
- buf = malloc(len); |
||||||
|
- if (!buf) { |
||||||
|
- char *estr = strerror_r(errno, err_buf, MAX_ERR_BUF); |
||||||
|
- logerr("malloc: %s", estr); |
||||||
|
- return 0; |
||||||
|
- } |
||||||
|
- |
||||||
|
- ifc->ifc_len = len; |
||||||
|
- ifc->ifc_req = (struct ifreq *) buf; |
||||||
|
- |
||||||
|
- ret = ioctl(sock, SIOCGIFCONF, ifc); |
||||||
|
- if (ret == -1) { |
||||||
|
- char *estr = strerror_r(errno, err_buf, MAX_ERR_BUF); |
||||||
|
- logerr("ioctl: %s", estr); |
||||||
|
- free(buf); |
||||||
|
- return 0; |
||||||
|
- } |
||||||
|
- |
||||||
|
- if (ifc->ifc_len <= lastlen) |
||||||
|
- break; |
||||||
|
- |
||||||
|
- lastlen = ifc->ifc_len; |
||||||
|
- len += MAX_IFC_BUF; |
||||||
|
- free(buf); |
||||||
|
- } |
||||||
|
- |
||||||
|
- if (lastlen != ifc_last_len) { |
||||||
|
- ifc_last_len = lastlen; |
||||||
|
- ifc_buf_len = len; |
||||||
|
- } |
||||||
|
- |
||||||
|
- return 1; |
||||||
|
-} |
||||||
|
- |
||||||
|
static unsigned int get_proximity(struct sockaddr *host_addr) |
||||||
|
{ |
||||||
|
+ struct ifaddrs *ifa = NULL; |
||||||
|
+ struct ifaddrs *this; |
||||||
|
struct sockaddr_in *addr, *msk_addr, *if_addr; |
||||||
|
struct sockaddr_in6 *addr6, *msk6_addr, *if6_addr; |
||||||
|
struct in_addr *hst_addr; |
||||||
|
struct in6_addr *hst6_addr; |
||||||
|
int addr_len; |
||||||
|
- char buf[MAX_ERR_BUF], *ptr; |
||||||
|
- struct ifconf ifc; |
||||||
|
- struct ifreq *ifr, nmptr; |
||||||
|
- int sock, ret, i; |
||||||
|
+ char buf[MAX_ERR_BUF]; |
||||||
|
uint32_t mask, ha, ia, *mask6, *ha6, *ia6; |
||||||
|
+ int ret; |
||||||
|
|
||||||
|
addr = NULL; |
||||||
|
addr6 = NULL; |
||||||
|
@@ -170,13 +131,14 @@ static unsigned int get_proximity(struct sockaddr *host_addr) |
||||||
|
mask6 = NULL; |
||||||
|
ha6 = NULL; |
||||||
|
ia6 = NULL; |
||||||
|
+ ha = 0; |
||||||
|
|
||||||
|
switch (host_addr->sa_family) { |
||||||
|
case AF_INET: |
||||||
|
addr = (struct sockaddr_in *) host_addr; |
||||||
|
hst_addr = (struct in_addr *) &addr->sin_addr; |
||||||
|
ha = ntohl((uint32_t) hst_addr->s_addr); |
||||||
|
- addr_len = sizeof(hst_addr); |
||||||
|
+ addr_len = sizeof(*hst_addr); |
||||||
|
break; |
||||||
|
|
||||||
|
case AF_INET6: |
||||||
|
@@ -186,7 +148,7 @@ static unsigned int get_proximity(struct sockaddr *host_addr) |
||||||
|
addr6 = (struct sockaddr_in6 *) host_addr; |
||||||
|
hst6_addr = (struct in6_addr *) &addr6->sin6_addr; |
||||||
|
ha6 = &hst6_addr->s6_addr32[0]; |
||||||
|
- addr_len = sizeof(hst6_addr); |
||||||
|
+ addr_len = sizeof(*hst6_addr); |
||||||
|
break; |
||||||
|
#endif |
||||||
|
|
||||||
|
@@ -194,36 +156,29 @@ static unsigned int get_proximity(struct sockaddr *host_addr) |
||||||
|
return PROXIMITY_ERROR; |
||||||
|
} |
||||||
|
|
||||||
|
- sock = open_sock(AF_INET, SOCK_DGRAM, 0); |
||||||
|
- if (sock < 0) { |
||||||
|
+ ret = getifaddrs(&ifa); |
||||||
|
+ if (ret) { |
||||||
|
char *estr = strerror_r(errno, buf, MAX_ERR_BUF); |
||||||
|
- logerr("socket creation failed: %s", estr); |
||||||
|
+ logerr("getifaddrs: %s", estr); |
||||||
|
return PROXIMITY_ERROR; |
||||||
|
} |
||||||
|
|
||||||
|
- if (!alloc_ifreq(&ifc, sock)) { |
||||||
|
- close(sock); |
||||||
|
- return PROXIMITY_ERROR; |
||||||
|
- } |
||||||
|
- |
||||||
|
- /* For each interface */ |
||||||
|
- |
||||||
|
- /* Is the address a local interface */ |
||||||
|
- i = 0; |
||||||
|
- ptr = (char *) &ifc.ifc_buf[0]; |
||||||
|
- |
||||||
|
- while (ptr < (char *) ifc.ifc_req + ifc.ifc_len) { |
||||||
|
- ifr = (struct ifreq *) ptr; |
||||||
|
+ this = ifa; |
||||||
|
+ while (this) { |
||||||
|
+ if (this->ifa_flags & IFF_POINTOPOINT || |
||||||
|
+ this->ifa_addr->sa_data == NULL) { |
||||||
|
+ this = this->ifa_next; |
||||||
|
+ continue; |
||||||
|
+ } |
||||||
|
|
||||||
|
- switch (ifr->ifr_addr.sa_family) { |
||||||
|
+ switch (this->ifa_addr->sa_family) { |
||||||
|
case AF_INET: |
||||||
|
if (host_addr->sa_family == AF_INET6) |
||||||
|
break; |
||||||
|
- if_addr = (struct sockaddr_in *) &ifr->ifr_addr; |
||||||
|
+ if_addr = (struct sockaddr_in *) this->ifa_addr; |
||||||
|
ret = memcmp(&if_addr->sin_addr, hst_addr, addr_len); |
||||||
|
if (!ret) { |
||||||
|
- close(sock); |
||||||
|
- free(ifc.ifc_req); |
||||||
|
+ freeifaddrs(ifa); |
||||||
|
return PROXIMITY_LOCAL; |
||||||
|
} |
||||||
|
break; |
||||||
|
@@ -234,55 +189,41 @@ static unsigned int get_proximity(struct sockaddr *host_addr) |
||||||
|
#else |
||||||
|
if (host_addr->sa_family == AF_INET) |
||||||
|
break; |
||||||
|
- |
||||||
|
- if6_addr = (struct sockaddr_in6 *) &ifr->ifr_addr; |
||||||
|
+ if6_addr = (struct sockaddr_in6 *) this->ifa_addr; |
||||||
|
ret = memcmp(&if6_addr->sin6_addr, hst6_addr, addr_len); |
||||||
|
if (!ret) { |
||||||
|
- close(sock); |
||||||
|
- free(ifc.ifc_req); |
||||||
|
+ freeifaddrs(ifa); |
||||||
|
return PROXIMITY_LOCAL; |
||||||
|
} |
||||||
|
#endif |
||||||
|
- |
||||||
|
default: |
||||||
|
break; |
||||||
|
} |
||||||
|
- |
||||||
|
- i++; |
||||||
|
- ptr = (char *) &ifc.ifc_req[i]; |
||||||
|
+ this = this->ifa_next; |
||||||
|
} |
||||||
|
|
||||||
|
- i = 0; |
||||||
|
- ptr = (char *) &ifc.ifc_buf[0]; |
||||||
|
- |
||||||
|
- while (ptr < (char *) ifc.ifc_req + ifc.ifc_len) { |
||||||
|
- ifr = (struct ifreq *) ptr; |
||||||
|
- |
||||||
|
- nmptr = *ifr; |
||||||
|
- ret = ioctl(sock, SIOCGIFNETMASK, &nmptr); |
||||||
|
- if (ret == -1) { |
||||||
|
- char *estr = strerror_r(errno, buf, MAX_ERR_BUF); |
||||||
|
- logerr("ioctl: %s", estr); |
||||||
|
- close(sock); |
||||||
|
- free(ifc.ifc_req); |
||||||
|
- return PROXIMITY_ERROR; |
||||||
|
+ this = ifa; |
||||||
|
+ while (this) { |
||||||
|
+ if (this->ifa_flags & IFF_POINTOPOINT || |
||||||
|
+ this->ifa_addr->sa_data == NULL) { |
||||||
|
+ this = this->ifa_next; |
||||||
|
+ continue; |
||||||
|
} |
||||||
|
|
||||||
|
- switch (ifr->ifr_addr.sa_family) { |
||||||
|
+ switch (this->ifa_addr->sa_family) { |
||||||
|
case AF_INET: |
||||||
|
if (host_addr->sa_family == AF_INET6) |
||||||
|
break; |
||||||
|
- if_addr = (struct sockaddr_in *) &ifr->ifr_addr; |
||||||
|
+ if_addr = (struct sockaddr_in *) this->ifa_addr; |
||||||
|
ia = ntohl((uint32_t) if_addr->sin_addr.s_addr); |
||||||
|
|
||||||
|
- /* Is the address within a localiy attached subnet */ |
||||||
|
+ /* Is the address within a localy attached subnet */ |
||||||
|
|
||||||
|
- msk_addr = (struct sockaddr_in *) &nmptr.ifr_netmask; |
||||||
|
+ msk_addr = (struct sockaddr_in *) this->ifa_netmask; |
||||||
|
mask = ntohl((uint32_t) msk_addr->sin_addr.s_addr); |
||||||
|
|
||||||
|
if ((ia & mask) == (ha & mask)) { |
||||||
|
- close(sock); |
||||||
|
- free(ifc.ifc_req); |
||||||
|
+ freeifaddrs(ifa); |
||||||
|
return PROXIMITY_SUBNET; |
||||||
|
} |
||||||
|
|
||||||
|
@@ -304,8 +245,7 @@ static unsigned int get_proximity(struct sockaddr *host_addr) |
||||||
|
break; |
||||||
|
|
||||||
|
if ((ia & mask) == (ha & mask)) { |
||||||
|
- close(sock); |
||||||
|
- free(ifc.ifc_req); |
||||||
|
+ freeifaddrs(ifa); |
||||||
|
return PROXIMITY_NET; |
||||||
|
} |
||||||
|
break; |
||||||
|
@@ -316,35 +256,28 @@ static unsigned int get_proximity(struct sockaddr *host_addr) |
||||||
|
#else |
||||||
|
if (host_addr->sa_family == AF_INET) |
||||||
|
break; |
||||||
|
- |
||||||
|
- if6_addr = (struct sockaddr_in6 *) &ifr->ifr_addr; |
||||||
|
+ if6_addr = (struct sockaddr_in6 *) this->ifa_addr; |
||||||
|
ia6 = &if6_addr->sin6_addr.s6_addr32[0]; |
||||||
|
|
||||||
|
/* Is the address within the network of the interface */ |
||||||
|
|
||||||
|
- msk6_addr = (struct sockaddr_in6 *) &nmptr.ifr_netmask; |
||||||
|
+ msk6_addr = (struct sockaddr_in6 *) this->ifa_netmask; |
||||||
|
mask6 = &msk6_addr->sin6_addr.s6_addr32[0]; |
||||||
|
|
||||||
|
if (ipv6_mask_cmp(ha6, ia6, mask6)) { |
||||||
|
- close(sock); |
||||||
|
- free(ifc.ifc_req); |
||||||
|
+ freeifaddrs(ifa); |
||||||
|
return PROXIMITY_SUBNET; |
||||||
|
} |
||||||
|
|
||||||
|
/* How do we define "local network" in ipv6? */ |
||||||
|
#endif |
||||||
|
- break; |
||||||
|
- |
||||||
|
default: |
||||||
|
break; |
||||||
|
} |
||||||
|
- |
||||||
|
- i++; |
||||||
|
- ptr = (char *) &ifc.ifc_req[i]; |
||||||
|
+ this = this->ifa_next; |
||||||
|
} |
||||||
|
|
||||||
|
- close(sock); |
||||||
|
- free(ifc.ifc_req); |
||||||
|
+ freeifaddrs(ifa); |
||||||
|
|
||||||
|
return PROXIMITY_OTHER; |
||||||
|
} |
@ -0,0 +1,21 @@ |
|||||||
|
autofs-5.0.7 - fix leaked ldap percent hack allocation in lookup_one() |
||||||
|
|
||||||
|
From: Ian Kent <raven@themaw.net> |
||||||
|
|
||||||
|
Fix a resource leak when calling the percent hack transforms in lookup_one(). |
||||||
|
--- |
||||||
|
modules/lookup_ldap.c | 1 + |
||||||
|
1 file changed, 1 insertion(+) |
||||||
|
|
||||||
|
diff --git a/modules/lookup_ldap.c b/modules/lookup_ldap.c |
||||||
|
index 26481a8..35ea6ea 100644 |
||||||
|
--- a/modules/lookup_ldap.c |
||||||
|
+++ b/modules/lookup_ldap.c |
||||||
|
@@ -2525,6 +2525,7 @@ static int lookup_one(struct autofs_point *ap, |
||||||
|
if (enc_len1 != 0) { |
||||||
|
enc_len2 = encode_percent_hack(qKey, &enc_key2, 1); |
||||||
|
if (enc_len2 < 0) { |
||||||
|
+ free(enc_key1); |
||||||
|
crit(ap->logopt, |
||||||
|
"could not use percent hack encode key %s", |
||||||
|
qKey); |
@ -0,0 +1,66 @@ |
|||||||
|
autofs-5.0.7 - fix libtirpc build option |
||||||
|
|
||||||
|
From: Ian Kent <raven@themaw.net> |
||||||
|
|
||||||
|
|
||||||
|
--- |
||||||
|
CHANGELOG | 1 + |
||||||
|
autofs.spec | 17 ++++++++++++++++- |
||||||
|
2 files changed, 17 insertions(+), 1 deletion(-) |
||||||
|
|
||||||
|
diff --git a/CHANGELOG b/CHANGELOG |
||||||
|
index e848bcd..b6b2679 100644 |
||||||
|
--- a/CHANGELOG |
||||||
|
+++ b/CHANGELOG |
||||||
|
@@ -34,6 +34,7 @@ |
||||||
|
- depricate nosymlink pseudo option. |
||||||
|
- add symlink pseudo option. |
||||||
|
- fix requires in spec file. |
||||||
|
+- fix libtirpc build option to require libtirpc-devel if needed. |
||||||
|
|
||||||
|
25/07/2012 autofs-5.0.7 |
||||||
|
======================= |
||||||
|
diff --git a/autofs.spec b/autofs.spec |
||||||
|
index 703f7a9..f77acc1 100644 |
||||||
|
--- a/autofs.spec |
||||||
|
+++ b/autofs.spec |
||||||
|
@@ -12,6 +12,10 @@ |
||||||
|
# disable them. |
||||||
|
%define with_systemd %{?_without_systemd: 0} %{?!_without_systemd: 1} |
||||||
|
|
||||||
|
+# Use --without libtirpc in your rpmbuild command or force values to 0 to |
||||||
|
+# disable them. |
||||||
|
+%define with_libtirpc %{?_without_libtirpc: 0} %{?!_without_libtirpc: 1} |
||||||
|
+ |
||||||
|
Summary: A tool from automatically mounting and umounting filesystems. |
||||||
|
Name: autofs |
||||||
|
%define version 5.0.7 |
||||||
|
@@ -25,6 +29,9 @@ Buildroot: %{_tmppath}/%{name}-tmp |
||||||
|
%if %{with_systemd} |
||||||
|
BuildRequires: systemd-units |
||||||
|
%endif |
||||||
|
+%if %{with_libtirpc} |
||||||
|
+BuildRequires: libtirpc-devel |
||||||
|
+%endif |
||||||
|
BuildRequires: autoconf, hesiod-devel, openldap-devel, bison, flex, cyrus-sasl-devel |
||||||
|
Requires: chkconfig |
||||||
|
Requires: /bin/bash mktemp sed textutils sh-utils grep /bin/ps |
||||||
|
@@ -72,9 +79,17 @@ echo %{version}-%{release} > .version |
||||||
|
%define _unitdir %{?_unitdir:/lib/systemd/system} |
||||||
|
%define systemd_configure_arg --with-systemd |
||||||
|
%endif |
||||||
|
+%if %{with_libtirpc} |
||||||
|
+ %define libtirpc_configure_arg --with-libtirpc |
||||||
|
+%endif |
||||||
|
|
||||||
|
%build |
||||||
|
-CFLAGS="$RPM_OPT_FLAGS -Wall" ./configure --libdir=%{_libdir} --disable-mount-locking --enable-ignore-busy --with-libtirpc %{?systemd_configure_arg:} |
||||||
|
+CFLAGS="$RPM_OPT_FLAGS -Wall" \ |
||||||
|
+./configure --libdir=%{_libdir} \ |
||||||
|
+ --disable-mount-locking \ |
||||||
|
+ --enable-ignore-busy \ |
||||||
|
+ %{?systemd_configure_arg:} \ |
||||||
|
+ %{?libtirpc_configure_arg:} |
||||||
|
CFLAGS="$RPM_OPT_FLAGS -Wall" make initdir=/etc/rc.d/init.d DONTSTRIP=1 |
||||||
|
|
||||||
|
%install |
@ -0,0 +1,37 @@ |
|||||||
|
autofs-5.0.7 - fix map entry duplicate offset detection |
||||||
|
|
||||||
|
From: Ian Kent <raven@themaw.net> |
||||||
|
|
||||||
|
Recent changes broke the detection of duplicate offsets in map entries. |
||||||
|
--- |
||||||
|
|
||||||
|
CHANGELOG | 1 + |
||||||
|
lib/cache.c | 2 +- |
||||||
|
2 files changed, 2 insertions(+), 1 deletions(-) |
||||||
|
|
||||||
|
|
||||||
|
diff --git a/CHANGELOG b/CHANGELOG |
||||||
|
index 8f6bb3a..bd0dd82 100644 |
||||||
|
--- a/CHANGELOG |
||||||
|
+++ b/CHANGELOG |
||||||
|
@@ -15,6 +15,7 @@ |
||||||
|
- fix recursive mount deadlock. |
||||||
|
- increase file map read buffer size. |
||||||
|
- handle new location of systemd. |
||||||
|
+- fix map entry duplicate offset detection. |
||||||
|
|
||||||
|
25/07/2012 autofs-5.0.7 |
||||||
|
======================= |
||||||
|
diff --git a/lib/cache.c b/lib/cache.c |
||||||
|
index 9179ad5..1e05a99 100644 |
||||||
|
--- a/lib/cache.c |
||||||
|
+++ b/lib/cache.c |
||||||
|
@@ -659,7 +659,7 @@ int cache_update_offset(struct mapent_cache *mc, const char *mkey, const char *k |
||||||
|
|
||||||
|
me = cache_lookup_distinct(mc, key); |
||||||
|
if (me && me->age == age) { |
||||||
|
- if (me->multi != owner) |
||||||
|
+ if (me->multi == owner) |
||||||
|
return CHE_DUPLICATE; |
||||||
|
} |
||||||
|
|
@ -0,0 +1,62 @@ |
|||||||
|
autofs-5.0.7 - fix master map bogus keywork match |
||||||
|
|
||||||
|
From: Ian Kent <raven@themaw.net> |
||||||
|
|
||||||
|
If we have a map name in the master map that ends with a keyword |
||||||
|
of one of the map types or "multi" we mistakenly match the trailing |
||||||
|
white space and include that in the map name. This has to be wrong |
||||||
|
since we can't handle quoting in the master map and embedded white |
||||||
|
space must be escaped. It would be good if we handled quoted strings |
||||||
|
but that has proven a bit of a nightmare so far for the current |
||||||
|
tokenizer. |
||||||
|
--- |
||||||
|
CHANGELOG | 1 + |
||||||
|
lib/master_tok.l | 16 ++++++++++++++++ |
||||||
|
2 files changed, 17 insertions(+) |
||||||
|
|
||||||
|
diff --git a/CHANGELOG b/CHANGELOG |
||||||
|
index 00eaff2..e15aa1f 100644 |
||||||
|
--- a/CHANGELOG |
||||||
|
+++ b/CHANGELOG |
||||||
|
@@ -46,6 +46,7 @@ |
||||||
|
- fix interface address null check. |
||||||
|
- dont probe rdma mounts. |
||||||
|
- fix master map mount options matching. |
||||||
|
+- fix master map bogus keywork match. |
||||||
|
|
||||||
|
25/07/2012 autofs-5.0.7 |
||||||
|
======================= |
||||||
|
diff --git a/lib/master_tok.l b/lib/master_tok.l |
||||||
|
index 8d1f1a2..a55cc76 100644 |
||||||
|
--- a/lib/master_tok.l |
||||||
|
+++ b/lib/master_tok.l |
||||||
|
@@ -202,6 +202,14 @@ OPTNTOUT (-n{OPTWS}|-n{OPTWS}={OPTWS}|--negative-timeout{OPTWS}|--negative-timeo |
||||||
|
{MULTI} { |
||||||
|
tlen = master_leng - 1; |
||||||
|
if (bptr != buff && isblank(master_text[tlen])) { |
||||||
|
+ /* |
||||||
|
+ * We can't handle unescaped white space in map names |
||||||
|
+ * so just eat the white space. We always have the |
||||||
|
+ * "multi" at the beginning of the string so the while |
||||||
|
+ * will not fall off the end. |
||||||
|
+ */ |
||||||
|
+ while (isblank(master_text[tlen - 1])) |
||||||
|
+ tlen--; |
||||||
|
strncat(buff, master_text, tlen); |
||||||
|
bptr += tlen; |
||||||
|
yyless(tlen); |
||||||
|
@@ -216,6 +224,14 @@ OPTNTOUT (-n{OPTWS}|-n{OPTWS}={OPTWS}|--negative-timeout{OPTWS}|--negative-timeo |
||||||
|
{MTYPE}/{DNATTRSTR}= { |
||||||
|
tlen = master_leng - 1; |
||||||
|
if (bptr != buff && isblank(master_text[tlen])) { |
||||||
|
+ /* |
||||||
|
+ * We can't handle unescaped white space in map names |
||||||
|
+ * so just eat the white space. We always have the |
||||||
|
+ * maptype keyword at the beginning of the string so |
||||||
|
+ * the while will not fall off the end. |
||||||
|
+ */ |
||||||
|
+ while (isblank(master_text[tlen - 1])) |
||||||
|
+ tlen--; |
||||||
|
strncat(buff, master_text, tlen); |
||||||
|
bptr += tlen; |
||||||
|
yyless(tlen); |
@ -0,0 +1,43 @@ |
|||||||
|
autofs-5.0.7 - fix master map mount options matching |
||||||
|
|
||||||
|
From: Ian Kent <raven@themaw.net> |
||||||
|
|
||||||
|
The master map options pattern matching is fairly primitive since it |
||||||
|
doesn't need to be very sophisticated. The current mount option pattern |
||||||
|
matching can't match mount options with quotes or embedded colons and so |
||||||
|
it can't pass these options through as a global options string. |
||||||
|
|
||||||
|
But it must be able to match a fairly large class of strings, including |
||||||
|
the above case, so they can be passed through as global options. Of |
||||||
|
course it can't try and validate them since it can't know what mount type |
||||||
|
they may be used with. |
||||||
|
--- |
||||||
|
CHANGELOG | 1 + |
||||||
|
lib/master_tok.l | 2 +- |
||||||
|
2 files changed, 2 insertions(+), 1 deletion(-) |
||||||
|
|
||||||
|
diff --git a/CHANGELOG b/CHANGELOG |
||||||
|
index 1156cc9..00eaff2 100644 |
||||||
|
--- a/CHANGELOG |
||||||
|
+++ b/CHANGELOG |
||||||
|
@@ -45,6 +45,7 @@ |
||||||
|
- add enable sloppy mount option to configure. |
||||||
|
- fix interface address null check. |
||||||
|
- dont probe rdma mounts. |
||||||
|
+- fix master map mount options matching. |
||||||
|
|
||||||
|
25/07/2012 autofs-5.0.7 |
||||||
|
======================= |
||||||
|
diff --git a/lib/master_tok.l b/lib/master_tok.l |
||||||
|
index f9b4e55..8d1f1a2 100644 |
||||||
|
--- a/lib/master_tok.l |
||||||
|
+++ b/lib/master_tok.l |
||||||
|
@@ -91,7 +91,7 @@ OPTWS [[:blank:]]* |
||||||
|
NL \r?\n |
||||||
|
CONT \\\n{OPTWS} |
||||||
|
|
||||||
|
-OPTIONSTR ([\-]?([[:alpha:]_]([[:alnum:]_\-])*(=([[:alnum:]_\-])+)*)+) |
||||||
|
+OPTIONSTR ([\-]?([[:alpha:]_]([[:alnum:]_\-])*(=(\"?([[:alnum:]_\-\:])+\"?))?)+) |
||||||
|
MACROSTR (-D{OPTWS}([[:alpha:]_]([[:alnum:]_\-\.])*)=([[:alnum:]_\-\.])+) |
||||||
|
SLASHIFYSTR (--(no-)?slashify-colons) |
||||||
|
NUMBER [0-9]+ |
@ -0,0 +1,30 @@ |
|||||||
|
autofs-5.0.7 - fix memory leak in get_dc_list() |
||||||
|
|
||||||
|
From: Ian Kent <raven@themaw.net> |
||||||
|
|
||||||
|
In get_dc_list() if an invalid port is found the allocated list storage |
||||||
|
isn't freed on the error exit. |
||||||
|
--- |
||||||
|
modules/dclist.c | 2 ++ |
||||||
|
1 file changed, 2 insertions(+) |
||||||
|
|
||||||
|
diff --git a/modules/dclist.c b/modules/dclist.c |
||||||
|
index d16b913..af21ce0 100644 |
||||||
|
--- a/modules/dclist.c |
||||||
|
+++ b/modules/dclist.c |
||||||
|
@@ -536,6 +536,7 @@ struct dclist *get_dc_list(unsigned int logopt, const char *uri) |
||||||
|
else |
||||||
|
strcat(tmp, " "); |
||||||
|
|
||||||
|
+ list = NULL; |
||||||
|
for (i = 0; i < numdcs; i++) { |
||||||
|
if (i > 0) |
||||||
|
strcat(tmp, " "); |
||||||
|
@@ -549,6 +550,7 @@ struct dclist *get_dc_list(unsigned int logopt, const char *uri) |
||||||
|
error(logopt, |
||||||
|
"invalid port: %u", dcs[i].port); |
||||||
|
free_srv_rrs(dcs, numdcs); |
||||||
|
+ free(tmp); |
||||||
|
goto out_error; |
||||||
|
} |
||||||
|
strcat(tmp, port); |
@ -0,0 +1,46 @@ |
|||||||
|
autofs-5.0.7 - fix nobind man page description |
||||||
|
|
||||||
|
From: Ian Kent <raven@themaw.net> |
||||||
|
|
||||||
|
Update auto.master(5) to better describe the behavior of the "nobind" |
||||||
|
option when used with direct mounts maps. |
||||||
|
--- |
||||||
|
|
||||||
|
CHANGELOG | 1 + |
||||||
|
man/auto.master.5.in | 10 +++++++--- |
||||||
|
2 files changed, 8 insertions(+), 3 deletions(-) |
||||||
|
|
||||||
|
|
||||||
|
diff --git a/CHANGELOG b/CHANGELOG |
||||||
|
index 16ac2a0..7eb7235 100644 |
||||||
|
--- a/CHANGELOG |
||||||
|
+++ b/CHANGELOG |
||||||
|
@@ -17,6 +17,7 @@ |
||||||
|
- handle new location of systemd. |
||||||
|
- fix map entry duplicate offset detection. |
||||||
|
- Allow nsswitch.conf to not contain "automount:" lines. |
||||||
|
+- fix nobind man page description. |
||||||
|
|
||||||
|
25/07/2012 autofs-5.0.7 |
||||||
|
======================= |
||||||
|
diff --git a/man/auto.master.5.in b/man/auto.master.5.in |
||||||
|
index 21d7544..8007542 100644 |
||||||
|
--- a/man/auto.master.5.in |
||||||
|
+++ b/man/auto.master.5.in |
||||||
|
@@ -151,9 +151,13 @@ can't be mounted. |
||||||
|
This is an autofs specific option that is a pseudo mount option and |
||||||
|
so is given without a leading dash. It may be used either in the master |
||||||
|
map entry (so it effects all the map entries) or with individual map |
||||||
|
-entries to prevent bind mounting of local NFS filesystems. Bind mounting |
||||||
|
-of NFS file systems can also be prevented for specific map entrys by |
||||||
|
-adding the "port=" mount option to the entries. |
||||||
|
+entries to prevent bind mounting of local NFS filesystems. For direct |
||||||
|
+mount maps the option is only effective if specified on the first direct |
||||||
|
+map entry and is applied to all direct mount maps in the master map. It |
||||||
|
+is ignored if given on subsequent direct map entries. It may be used |
||||||
|
+on individual map entries of both types. Bind mounting of NFS file |
||||||
|
+systems can also be prevented for specific map entrys by adding the |
||||||
|
+"port=" mount option to the entries. |
||||||
|
.TP |
||||||
|
.I "\-r, \-\-random-multimount-selection" |
||||||
|
Enables the use of ramdom selection when choosing a host from a |
@ -0,0 +1,47 @@ |
|||||||
|
autofs-5.0.7 - fix nobind sun escaped map entries |
||||||
|
|
||||||
|
From: Ian Kent <ikent@redhat.com> |
||||||
|
|
||||||
|
If a map contains a Sun colon escape to indicate the mount is a local |
||||||
|
file system and the "nobind" option is present there is no hostname in |
||||||
|
the mount location and the mount fails. |
||||||
|
--- |
||||||
|
|
||||||
|
CHANGELOG | 4 ++++ |
||||||
|
modules/mount_nfs.c | 5 +++-- |
||||||
|
2 files changed, 7 insertions(+), 2 deletions(-) |
||||||
|
|
||||||
|
|
||||||
|
diff --git a/CHANGELOG b/CHANGELOG |
||||||
|
index 67fdcec..faf4c80 100644 |
||||||
|
--- a/CHANGELOG |
||||||
|
+++ b/CHANGELOG |
||||||
|
@@ -1,3 +1,7 @@ |
||||||
|
+??/??/2012 autofs-5.0.8 |
||||||
|
+======================= |
||||||
|
+- fix nobind sun escaped map entries. |
||||||
|
+ |
||||||
|
25/07/2012 autofs-5.0.7 |
||||||
|
======================= |
||||||
|
- fix ipv6 name for lookup fix. |
||||||
|
diff --git a/modules/mount_nfs.c b/modules/mount_nfs.c |
||||||
|
index 9b8e5f1..bbbb1de 100644 |
||||||
|
--- a/modules/mount_nfs.c |
||||||
|
+++ b/modules/mount_nfs.c |
||||||
|
@@ -263,13 +263,14 @@ int mount_mount(struct autofs_point *ap, const char *root, const char *name, int |
||||||
|
} else |
||||||
|
strcpy(loc, n_addr); |
||||||
|
} else { |
||||||
|
- loc = malloc(strlen(this->name) + strlen(this->path) + 2); |
||||||
|
+ char *host = this->name ? this->name : "localhost"; |
||||||
|
+ loc = malloc(strlen(host) + strlen(this->path) + 2); |
||||||
|
if (!loc) { |
||||||
|
char *estr = strerror_r(errno, buf, MAX_ERR_BUF); |
||||||
|
error(ap->logopt, "malloc: %s", estr); |
||||||
|
goto forced_fail; |
||||||
|
} |
||||||
|
- strcpy(loc, this->name); |
||||||
|
+ strcpy(loc, host); |
||||||
|
} |
||||||
|
strcat(loc, ":"); |
||||||
|
strcat(loc, this->path); |
@ -0,0 +1,81 @@ |
|||||||
|
autofs-5.0.7 - fix null map entry order handling |
||||||
|
|
||||||
|
From: Ian Kent <ikent@redhat.com> |
||||||
|
|
||||||
|
If a null map entry appears after a corresponding indirect map entry |
||||||
|
autofs doesn't handle it properly. |
||||||
|
|
||||||
|
Since it appears after the map entry it should'nt affect it but autofs |
||||||
|
doesn't account for this case and assumes the map entry is already |
||||||
|
mounted and tries to shut it down causing attempted access to facilities |
||||||
|
that don't exist. |
||||||
|
--- |
||||||
|
|
||||||
|
CHANGELOG | 1 + |
||||||
|
lib/master.c | 32 +++++++++++++++++++++++++++++--- |
||||||
|
2 files changed, 30 insertions(+), 3 deletions(-) |
||||||
|
|
||||||
|
|
||||||
|
diff --git a/CHANGELOG b/CHANGELOG |
||||||
|
index 7b8d185..79cf673 100644 |
||||||
|
--- a/CHANGELOG |
||||||
|
+++ b/CHANGELOG |
||||||
|
@@ -7,6 +7,7 @@ |
||||||
|
- fix typo in automount(8). |
||||||
|
- dont wait forever to restart. |
||||||
|
- add timeout option description to man page. |
||||||
|
+- fix null map entry order handling. |
||||||
|
|
||||||
|
25/07/2012 autofs-5.0.7 |
||||||
|
======================= |
||||||
|
diff --git a/lib/master.c b/lib/master.c |
||||||
|
index 904b13d..a0e62f2 100644 |
||||||
|
--- a/lib/master.c |
||||||
|
+++ b/lib/master.c |
||||||
|
@@ -1179,9 +1179,35 @@ int master_mount_mounts(struct master *master, time_t age, int readall) |
||||||
|
|
||||||
|
cache_readlock(nc); |
||||||
|
ne = cache_lookup_distinct(nc, this->path); |
||||||
|
- if (ne && this->age > ne->age) { |
||||||
|
+ /* |
||||||
|
+ * If this path matched a nulled entry the master map entry |
||||||
|
+ * must be an indirect mount so the master map entry line |
||||||
|
+ * number may be obtained from this->maps. |
||||||
|
+ */ |
||||||
|
+ if (ne) { |
||||||
|
+ int lineno = ne->age; |
||||||
|
cache_unlock(nc); |
||||||
|
- st_add_task(ap, ST_SHUTDOWN_PENDING); |
||||||
|
+ |
||||||
|
+ /* null entry appears after map entry */ |
||||||
|
+ if (this->maps->master_line < lineno) { |
||||||
|
+ warn(ap->logopt, |
||||||
|
+ "ignoring null entry that appears after " |
||||||
|
+ "existing entry for %s", this->path); |
||||||
|
+ goto cont; |
||||||
|
+ } |
||||||
|
+ if (ap->state != ST_INIT) { |
||||||
|
+ st_add_task(ap, ST_SHUTDOWN_PENDING); |
||||||
|
+ continue; |
||||||
|
+ } |
||||||
|
+ /* |
||||||
|
+ * The map entry hasn't been started yet and we've |
||||||
|
+ * seen a preceeding null map entry for it so just |
||||||
|
+ * delete it from the master map entry list so it |
||||||
|
+ * doesn't get in the road. |
||||||
|
+ */ |
||||||
|
+ list_del_init(&this->list); |
||||||
|
+ master_free_mapent_sources(ap->entry, 1); |
||||||
|
+ master_free_mapent(ap->entry); |
||||||
|
continue; |
||||||
|
} |
||||||
|
nested = cache_partial_match(nc, this->path); |
||||||
|
@@ -1194,7 +1220,7 @@ int master_mount_mounts(struct master *master, time_t age, int readall) |
||||||
|
cache_delete(nc, nested->key); |
||||||
|
} |
||||||
|
cache_unlock(nc); |
||||||
|
- |
||||||
|
+cont: |
||||||
|
st_mutex_lock(); |
||||||
|
|
||||||
|
state_pipe = this->ap->state_pipe[1]; |
@ -0,0 +1,51 @@ |
|||||||
|
autofs-5.0.7 - fix parse buffer initialization |
||||||
|
|
||||||
|
From: Ian Kent <ikent@redhat.com> |
||||||
|
|
||||||
|
When parsing a master map entry, if the mount point path is longer than |
||||||
|
the following map string the lexical analyzer buffer may not have a null |
||||||
|
terminator where it is expected. If the map name string also contains a |
||||||
|
string that is the same as a map type at the end the map name the map |
||||||
|
name is not constructed correctly because of this lack of a string |
||||||
|
terminator in the buffer. |
||||||
|
--- |
||||||
|
|
||||||
|
CHANGELOG | 1 + |
||||||
|
lib/master_tok.l | 4 +++- |
||||||
|
2 files changed, 4 insertions(+), 1 deletions(-) |
||||||
|
|
||||||
|
|
||||||
|
diff --git a/CHANGELOG b/CHANGELOG |
||||||
|
index 34c70fa..276d6ba 100644 |
||||||
|
--- a/CHANGELOG |
||||||
|
+++ b/CHANGELOG |
||||||
|
@@ -3,6 +3,7 @@ |
||||||
|
- fix nobind sun escaped map entries. |
||||||
|
- fix use cache entry after free in lookup_prune_one_cache(). |
||||||
|
- fix ipv6 proximity calculation. |
||||||
|
+- fix parse buffer initialization. |
||||||
|
|
||||||
|
25/07/2012 autofs-5.0.7 |
||||||
|
======================= |
||||||
|
diff --git a/lib/master_tok.l b/lib/master_tok.l |
||||||
|
index 0d6edb7..30abb15 100644 |
||||||
|
--- a/lib/master_tok.l |
||||||
|
+++ b/lib/master_tok.l |
||||||
|
@@ -74,7 +74,8 @@ int my_yyinput(char *, int); |
||||||
|
#define unput(c) (*(char *) --line = c) |
||||||
|
#endif |
||||||
|
|
||||||
|
-char buff[1024]; |
||||||
|
+#define BUFF_LEN 1024 |
||||||
|
+char buff[BUFF_LEN]; |
||||||
|
char *bptr; |
||||||
|
char *optr = buff; |
||||||
|
unsigned int tlen; |
||||||
|
@@ -174,6 +175,7 @@ OPTNTOUT (-n{OPTWS}|-n{OPTWS}={OPTWS}|--negative-timeout{OPTWS}|--negative-timeo |
||||||
|
*bptr = '\0'; |
||||||
|
strcpy(master_lval.strtype, buff); |
||||||
|
bptr = buff; |
||||||
|
+ memset(buff, 0, BUFF_LEN); |
||||||
|
return(PATH); |
||||||
|
} |
||||||
|
|
@ -0,0 +1,285 @@ |
|||||||
|
autofs-5.0.7 - fix portmap lookup |
||||||
|
|
||||||
|
From: Ian Kent <ikent@redhat.com> |
||||||
|
|
||||||
|
The autofs RPC library has fallen behind some. |
||||||
|
|
||||||
|
When using IPv6 (rpbbind) version 3 or 4 is available whereas with IPv4 |
||||||
|
(portmap) verions 2 and 3 are available. |
||||||
|
|
||||||
|
autofs uses the version defined by PMAPVERS in the portmap include files |
||||||
|
whereas it should be using the RPCBVERS defines when using libtirpc. |
||||||
|
|
||||||
|
In addition /etc/rpc should be used for program number lookup and |
||||||
|
/etc/services should be used to lookup rpcbind/protmap port number. |
||||||
|
|
||||||
|
This incompatibility only shows up when using IPv6 only. |
||||||
|
--- |
||||||
|
CHANGELOG | 1 |
||||||
|
aclocal.m4 | 2 + |
||||||
|
configure | 80 +++++++++++++++++++++++++++++++++++++++++++++ |
||||||
|
include/config.h.in | 6 +++ |
||||||
|
lib/rpc_subs.c | 92 ++++++++++++++++++++++++++++++++++++++++++++++++---- |
||||||
|
5 files changed, 175 insertions(+), 6 deletions(-) |
||||||
|
|
||||||
|
--- autofs-5.0.7.orig/CHANGELOG |
||||||
|
+++ autofs-5.0.7/CHANGELOG |
||||||
|
@@ -62,6 +62,7 @@ |
||||||
|
- try and cleanup after dumpmaps. |
||||||
|
- teach dumpmaps to output simple key value pairs. |
||||||
|
- fix get_nfs_info() probe. |
||||||
|
+- fix portmap lookup. |
||||||
|
|
||||||
|
25/07/2012 autofs-5.0.7 |
||||||
|
======================= |
||||||
|
--- autofs-5.0.7.orig/aclocal.m4 |
||||||
|
+++ autofs-5.0.7/aclocal.m4 |
||||||
|
@@ -421,6 +421,8 @@ if test "$af_have_libtirpc" = "yes"; the |
||||||
|
TIRPCLIB="-ltirpc" |
||||||
|
fi |
||||||
|
|
||||||
|
+AC_CHECK_FUNCS([getrpcbyname getservbyname]) |
||||||
|
+ |
||||||
|
# restore flags |
||||||
|
CFLAGS="$af_check_libtirpc_save_cflags" |
||||||
|
LDFLAGS="$af_check_libtirpc_save_ldflags" |
||||||
|
--- autofs-5.0.7.orig/configure |
||||||
|
+++ autofs-5.0.7/configure |
||||||
|
@@ -1559,6 +1559,73 @@ fi |
||||||
|
|
||||||
|
} # ac_fn_c_try_link |
||||||
|
|
||||||
|
+# ac_fn_c_check_func LINENO FUNC VAR |
||||||
|
+# ---------------------------------- |
||||||
|
+# Tests whether FUNC exists, setting the cache variable VAR accordingly |
||||||
|
+ac_fn_c_check_func () |
||||||
|
+{ |
||||||
|
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack |
||||||
|
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 |
||||||
|
+$as_echo_n "checking for $2... " >&6; } |
||||||
|
+if eval \${$3+:} false; then : |
||||||
|
+ $as_echo_n "(cached) " >&6 |
||||||
|
+else |
||||||
|
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext |
||||||
|
+/* end confdefs.h. */ |
||||||
|
+/* Define $2 to an innocuous variant, in case <limits.h> declares $2. |
||||||
|
+ For example, HP-UX 11i <limits.h> declares gettimeofday. */ |
||||||
|
+#define $2 innocuous_$2 |
||||||
|
+ |
||||||
|
+/* System header to define __stub macros and hopefully few prototypes, |
||||||
|
+ which can conflict with char $2 (); below. |
||||||
|
+ Prefer <limits.h> to <assert.h> if __STDC__ is defined, since |
||||||
|
+ <limits.h> exists even on freestanding compilers. */ |
||||||
|
+ |
||||||
|
+#ifdef __STDC__ |
||||||
|
+# include <limits.h> |
||||||
|
+#else |
||||||
|
+# include <assert.h> |
||||||
|
+#endif |
||||||
|
+ |
||||||
|
+#undef $2 |
||||||
|
+ |
||||||
|
+/* Override any GCC internal prototype to avoid an error. |
||||||
|
+ Use char because int might match the return type of a GCC |
||||||
|
+ builtin and then its argument prototype would still apply. */ |
||||||
|
+#ifdef __cplusplus |
||||||
|
+extern "C" |
||||||
|
+#endif |
||||||
|
+char $2 (); |
||||||
|
+/* The GNU C library defines this for functions which it implements |
||||||
|
+ to always fail with ENOSYS. Some functions are actually named |
||||||
|
+ something starting with __ and the normal name is an alias. */ |
||||||
|
+#if defined __stub_$2 || defined __stub___$2 |
||||||
|
+choke me |
||||||
|
+#endif |
||||||
|
+ |
||||||
|
+int |
||||||
|
+main () |
||||||
|
+{ |
||||||
|
+return $2 (); |
||||||
|
+ ; |
||||||
|
+ return 0; |
||||||
|
+} |
||||||
|
+_ACEOF |
||||||
|
+if ac_fn_c_try_link "$LINENO"; then : |
||||||
|
+ eval "$3=yes" |
||||||
|
+else |
||||||
|
+ eval "$3=no" |
||||||
|
+fi |
||||||
|
+rm -f core conftest.err conftest.$ac_objext \ |
||||||
|
+ conftest$ac_exeext conftest.$ac_ext |
||||||
|
+fi |
||||||
|
+eval ac_res=\$$3 |
||||||
|
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 |
||||||
|
+$as_echo "$ac_res" >&6; } |
||||||
|
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno |
||||||
|
+ |
||||||
|
+} # ac_fn_c_check_func |
||||||
|
+ |
||||||
|
# ac_fn_c_try_cpp LINENO |
||||||
|
# ---------------------- |
||||||
|
# Try to preprocess conftest.$ac_ext, and return whether this succeeded. |
||||||
|
@@ -3161,6 +3228,19 @@ $as_echo "#define TIRPC_WORKAROUND 1" >> |
||||||
|
TIRPCLIB="-ltirpc" |
||||||
|
fi |
||||||
|
|
||||||
|
+for ac_func in getrpcbyname getservbyname |
||||||
|
+do : |
||||||
|
+ as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` |
||||||
|
+ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" |
||||||
|
+if eval test \"x\$"$as_ac_var"\" = x"yes"; then : |
||||||
|
+ cat >>confdefs.h <<_ACEOF |
||||||
|
+#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 |
||||||
|
+_ACEOF |
||||||
|
+ |
||||||
|
+fi |
||||||
|
+done |
||||||
|
+ |
||||||
|
+ |
||||||
|
# restore flags |
||||||
|
CFLAGS="$af_check_libtirpc_save_cflags" |
||||||
|
LDFLAGS="$af_check_libtirpc_save_ldflags" |
||||||
|
--- autofs-5.0.7.orig/include/config.h.in |
||||||
|
+++ autofs-5.0.7/include/config.h.in |
||||||
|
@@ -21,6 +21,12 @@ |
||||||
|
/* define if you have E4FSCK */ |
||||||
|
#undef HAVE_E4FSCK |
||||||
|
|
||||||
|
+/* Define to 1 if you have the `getrpcbyname' function. */ |
||||||
|
+#undef HAVE_GETRPCBYNAME |
||||||
|
+ |
||||||
|
+/* Define to 1 if you have the `getservbyname' function. */ |
||||||
|
+#undef HAVE_GETSERVBYNAME |
||||||
|
+ |
||||||
|
/* Define to 1 if you have the <inttypes.h> header file. */ |
||||||
|
#undef HAVE_INTTYPES_H |
||||||
|
|
||||||
|
--- autofs-5.0.7.orig/lib/rpc_subs.c |
||||||
|
+++ autofs-5.0.7/lib/rpc_subs.c |
||||||
|
@@ -43,6 +43,14 @@ |
||||||
|
} while (0) |
||||||
|
#endif |
||||||
|
|
||||||
|
+#ifdef WITH_LIBTIRPC |
||||||
|
+const rpcprog_t rpcb_prog = RPCBPROG; |
||||||
|
+const rpcvers_t rpcb_version = RPCBVERS; |
||||||
|
+#else |
||||||
|
+const rpcprog_t rpcb_prog = PMAPPROG; |
||||||
|
+const rpcvers_t rpcb_version = PMAPVERS; |
||||||
|
+#endif |
||||||
|
+ |
||||||
|
#include "mount.h" |
||||||
|
#include "rpc_subs.h" |
||||||
|
#include "automount.h" |
||||||
|
@@ -259,6 +267,9 @@ static int rpc_do_create_client(struct s |
||||||
|
laddr = (struct sockaddr *) &in4_laddr; |
||||||
|
in4_raddr->sin_port = htons(info->port); |
||||||
|
slen = sizeof(struct sockaddr_in); |
||||||
|
+ /* Use rpcbind v2 for AF_INET */ |
||||||
|
+ if (info->program == rpcb_prog) |
||||||
|
+ info->version = PMAPVERS; |
||||||
|
} else if (addr->sa_family == AF_INET6) { |
||||||
|
struct sockaddr_in6 *in6_raddr = (struct sockaddr_in6 *) addr; |
||||||
|
in6_laddr.sin6_family = AF_INET6; |
||||||
|
@@ -315,6 +326,63 @@ static int rpc_do_create_client(struct s |
||||||
|
} |
||||||
|
#endif |
||||||
|
|
||||||
|
+#if defined(HAVE_GETRPCBYNAME) || defined(HAVE_GETSERVBYNAME) |
||||||
|
+static pthread_mutex_t rpcb_mutex = PTHREAD_MUTEX_INITIALIZER; |
||||||
|
+#endif |
||||||
|
+ |
||||||
|
+static rpcprog_t rpc_getrpcbyname(const rpcprog_t program) |
||||||
|
+{ |
||||||
|
+#ifdef HAVE_GETRPCBYNAME |
||||||
|
+ static const char *rpcb_pgmtbl[] = { |
||||||
|
+ "rpcbind", "portmap", "portmapper", "sunrpc", NULL, |
||||||
|
+ }; |
||||||
|
+ struct rpcent *entry; |
||||||
|
+ rpcprog_t prog_number; |
||||||
|
+ unsigned int i; |
||||||
|
+ |
||||||
|
+ pthread_mutex_lock(&rpcb_mutex); |
||||||
|
+ for (i = 0; rpcb_pgmtbl[i] != NULL; i++) { |
||||||
|
+ entry = getrpcbyname(rpcb_pgmtbl[i]); |
||||||
|
+ if (entry) { |
||||||
|
+ prog_number = entry->r_number; |
||||||
|
+ pthread_mutex_unlock(&rpcb_mutex); |
||||||
|
+ return prog_number; |
||||||
|
+ } |
||||||
|
+ } |
||||||
|
+ pthread_mutex_unlock(&rpcb_mutex); |
||||||
|
+#endif |
||||||
|
+ return program; |
||||||
|
+} |
||||||
|
+ |
||||||
|
+static unsigned short rpc_getrpcbport(const int proto) |
||||||
|
+{ |
||||||
|
+#ifdef HAVE_GETSERVBYNAME |
||||||
|
+ static const char *rpcb_netnametbl[] = { |
||||||
|
+ "rpcbind", "portmapper", "sunrpc", NULL, |
||||||
|
+ }; |
||||||
|
+ struct servent *entry; |
||||||
|
+ struct protoent *p_ent; |
||||||
|
+ unsigned short port; |
||||||
|
+ unsigned int i; |
||||||
|
+ |
||||||
|
+ pthread_mutex_lock(&rpcb_mutex); |
||||||
|
+ p_ent = getprotobynumber(proto); |
||||||
|
+ if (!p_ent) |
||||||
|
+ goto done; |
||||||
|
+ for (i = 0; rpcb_netnametbl[i] != NULL; i++) { |
||||||
|
+ entry = getservbyname(rpcb_netnametbl[i], p_ent->p_name); |
||||||
|
+ if (entry) { |
||||||
|
+ port = entry->s_port; |
||||||
|
+ pthread_mutex_unlock(&rpcb_mutex); |
||||||
|
+ return port; |
||||||
|
+ } |
||||||
|
+ } |
||||||
|
+done: |
||||||
|
+ pthread_mutex_unlock(&rpcb_mutex); |
||||||
|
+#endif |
||||||
|
+ return (unsigned short) PMAPPORT; |
||||||
|
+} |
||||||
|
+ |
||||||
|
/* |
||||||
|
* Create an RPC client |
||||||
|
*/ |
||||||
|
@@ -510,9 +578,15 @@ int rpc_portmap_getclient(struct conn_in |
||||||
|
info->host = host; |
||||||
|
info->addr = addr; |
||||||
|
info->addr_len = addr_len; |
||||||
|
- info->program = PMAPPROG; |
||||||
|
- info->port = PMAPPORT; |
||||||
|
- info->version = PMAPVERS; |
||||||
|
+ info->program = rpc_getrpcbyname(rpcb_prog); |
||||||
|
+ info->port = ntohs(rpc_getrpcbport(proto)); |
||||||
|
+ /* |
||||||
|
+ * When using libtirpc we might need to change the rpcbind version |
||||||
|
+ * to qurey AF_INET addresses. Since we might not have an address |
||||||
|
+ * yet set AF_INET rpcbind version in rpc_do_create_client() when |
||||||
|
+ * we always have an address. |
||||||
|
+ */ |
||||||
|
+ info->version = rpcb_version; |
||||||
|
info->proto = proto; |
||||||
|
info->send_sz = RPCSMALLMSGSIZE; |
||||||
|
info->recv_sz = RPCSMALLMSGSIZE; |
||||||
|
@@ -555,9 +629,15 @@ int rpc_portmap_getport(struct conn_info |
||||||
|
pmap_info.host = info->host; |
||||||
|
pmap_info.addr = info->addr; |
||||||
|
pmap_info.addr_len = info->addr_len; |
||||||
|
- pmap_info.port = PMAPPORT; |
||||||
|
- pmap_info.program = PMAPPROG; |
||||||
|
- pmap_info.version = PMAPVERS; |
||||||
|
+ pmap_info.port = ntohs(rpc_getrpcbport(info->proto)); |
||||||
|
+ pmap_info.program = rpc_getrpcbyname(rpcb_prog); |
||||||
|
+ /* |
||||||
|
+ * When using libtirpc we might need to change the rpcbind |
||||||
|
+ * version to qurey AF_INET addresses. Since we might not |
||||||
|
+ * have an address yet set AF_INET rpcbind version in |
||||||
|
+ * rpc_do_create_client() when we always have an address. |
||||||
|
+ */ |
||||||
|
+ pmap_info.version = rpcb_version; |
||||||
|
pmap_info.proto = info->proto; |
||||||
|
pmap_info.send_sz = RPCSMALLMSGSIZE; |
||||||
|
pmap_info.recv_sz = RPCSMALLMSGSIZE; |
@ -0,0 +1,21 @@ |
|||||||
|
autofs-5.0.7 - fix possible use after free in lookup_dir.c:lookup_init() |
||||||
|
|
||||||
|
From: Ian Kent <raven@themaw.net> |
||||||
|
|
||||||
|
Add a missing error return in lookup_dir.c:lookup_init(). |
||||||
|
--- |
||||||
|
modules/lookup_dir.c | 1 + |
||||||
|
1 file changed, 1 insertion(+) |
||||||
|
|
||||||
|
diff --git a/modules/lookup_dir.c b/modules/lookup_dir.c |
||||||
|
index 07471b7..cbeda1f 100644 |
||||||
|
--- a/modules/lookup_dir.c |
||||||
|
+++ b/modules/lookup_dir.c |
||||||
|
@@ -98,6 +98,7 @@ int lookup_init(const char *mapfmt, int argc, const char *const *argv, void **co |
||||||
|
free(ctxt); |
||||||
|
warn(LOGOPT_NONE, MODPREFIX |
||||||
|
"dir map %s, is not a directory", argv[0]); |
||||||
|
+ return 1; |
||||||
|
} |
||||||
|
|
||||||
|
*context = ctxt; |
@ -0,0 +1,157 @@ |
|||||||
|
autofs-5.0.7 - fix potential null dereference in lookup_mount() |
||||||
|
|
||||||
|
From: Ian Kent <raven@themaw.net> |
||||||
|
|
||||||
|
Updating a negative cache entry should always find an entry but the entry |
||||||
|
lookup return isn't checked and probably should be. |
||||||
|
|
||||||
|
Since this code is duplicated in several modules add it as a function to |
||||||
|
the cache handling code. |
||||||
|
--- |
||||||
|
include/automount.h | 1 + |
||||||
|
lib/cache.c | 20 ++++++++++++++++++++ |
||||||
|
modules/lookup_file.c | 11 +---------- |
||||||
|
modules/lookup_ldap.c | 12 +----------- |
||||||
|
modules/lookup_sss.c | 12 +----------- |
||||||
|
modules/lookup_yp.c | 12 ++---------- |
||||||
|
6 files changed, 26 insertions(+), 42 deletions(-) |
||||||
|
|
||||||
|
diff --git a/include/automount.h b/include/automount.h |
||||||
|
index 6ced842..71787a5 100644 |
||||||
|
--- a/include/automount.h |
||||||
|
+++ b/include/automount.h |
||||||
|
@@ -189,6 +189,7 @@ struct mapent *cache_lookup_offset(const char *prefix, const char *offset, int s |
||||||
|
struct mapent *cache_partial_match(struct mapent_cache *mc, const char *prefix); |
||||||
|
int cache_add(struct mapent_cache *mc, struct map_source *ms, const char *key, const char *mapent, time_t age); |
||||||
|
int cache_update_offset(struct mapent_cache *mc, const char *mkey, const char *key, const char *mapent, time_t age); |
||||||
|
+void cache_update_negative(struct mapent_cache *mc, struct map_source *ms, const char *key, time_t timeout); |
||||||
|
int cache_set_parents(struct mapent *mm); |
||||||
|
int cache_update(struct mapent_cache *mc, struct map_source *ms, const char *key, const char *mapent, time_t age); |
||||||
|
int cache_delete(struct mapent_cache *mc, const char *key); |
||||||
|
diff --git a/lib/cache.c b/lib/cache.c |
||||||
|
index ecace4a..be4917b 100644 |
||||||
|
--- a/lib/cache.c |
||||||
|
+++ b/lib/cache.c |
||||||
|
@@ -680,6 +680,26 @@ done: |
||||||
|
return ret; |
||||||
|
} |
||||||
|
|
||||||
|
+void cache_update_negative(struct mapent_cache *mc, |
||||||
|
+ struct map_source *ms, const char *key, |
||||||
|
+ time_t timeout) |
||||||
|
+{ |
||||||
|
+ time_t now = time(NULL); |
||||||
|
+ struct mapent *me; |
||||||
|
+ int rv = CHE_OK; |
||||||
|
+ |
||||||
|
+ me = cache_lookup_distinct(mc, key); |
||||||
|
+ if (!me) |
||||||
|
+ rv = cache_update(mc, ms, key, NULL, now); |
||||||
|
+ if (rv != CHE_FAIL) { |
||||||
|
+ me = cache_lookup_distinct(mc, key); |
||||||
|
+ if (me) |
||||||
|
+ me->status = now + timeout; |
||||||
|
+ } |
||||||
|
+ return; |
||||||
|
+} |
||||||
|
+ |
||||||
|
+ |
||||||
|
static struct mapent *get_parent(const char *key, struct list_head *head, struct list_head **pos) |
||||||
|
{ |
||||||
|
struct list_head *next; |
||||||
|
diff --git a/modules/lookup_file.c b/modules/lookup_file.c |
||||||
|
index 2836996..4b4ee89 100644 |
||||||
|
--- a/modules/lookup_file.c |
||||||
|
+++ b/modules/lookup_file.c |
||||||
|
@@ -1130,17 +1130,8 @@ do_cache_lookup: |
||||||
|
ret = ctxt->parse->parse_mount(ap, key, key_len, |
||||||
|
mapent, ctxt->parse->context); |
||||||
|
if (ret) { |
||||||
|
- time_t now = time(NULL); |
||||||
|
- int rv = CHE_OK; |
||||||
|
- |
||||||
|
cache_writelock(mc); |
||||||
|
- me = cache_lookup_distinct(mc, key); |
||||||
|
- if (!me) |
||||||
|
- rv = cache_update(mc, source, key, NULL, now); |
||||||
|
- if (rv != CHE_FAIL) { |
||||||
|
- me = cache_lookup_distinct(mc, key); |
||||||
|
- me->status = now + ap->negative_timeout; |
||||||
|
- } |
||||||
|
+ cache_update_negative(mc, source, key, ap->negative_timeout); |
||||||
|
cache_unlock(mc); |
||||||
|
return NSS_STATUS_TRYAGAIN; |
||||||
|
} |
||||||
|
diff --git a/modules/lookup_ldap.c b/modules/lookup_ldap.c |
||||||
|
index a59de92..26481a8 100644 |
||||||
|
--- a/modules/lookup_ldap.c |
||||||
|
+++ b/modules/lookup_ldap.c |
||||||
|
@@ -3011,18 +3011,8 @@ int lookup_mount(struct autofs_point *ap, const char *name, int name_len, void * |
||||||
|
ret = ctxt->parse->parse_mount(ap, key, key_len, |
||||||
|
mapent, ctxt->parse->context); |
||||||
|
if (ret) { |
||||||
|
- time_t now = time(NULL); |
||||||
|
- int rv = CHE_OK; |
||||||
|
- |
||||||
|
- /* Record the the mount fail in the cache */ |
||||||
|
cache_writelock(mc); |
||||||
|
- me = cache_lookup_distinct(mc, key); |
||||||
|
- if (!me) |
||||||
|
- rv = cache_update(mc, source, key, NULL, now); |
||||||
|
- if (rv != CHE_FAIL) { |
||||||
|
- me = cache_lookup_distinct(mc, key); |
||||||
|
- me->status = now + ap->negative_timeout; |
||||||
|
- } |
||||||
|
+ cache_update_negative(mc, source, key, ap->negative_timeout); |
||||||
|
cache_unlock(mc); |
||||||
|
return NSS_STATUS_TRYAGAIN; |
||||||
|
} |
||||||
|
diff --git a/modules/lookup_sss.c b/modules/lookup_sss.c |
||||||
|
index 5c2ed0a..1fe740b 100644 |
||||||
|
--- a/modules/lookup_sss.c |
||||||
|
+++ b/modules/lookup_sss.c |
||||||
|
@@ -672,18 +672,8 @@ int lookup_mount(struct autofs_point *ap, const char *name, int name_len, void * |
||||||
|
ret = ctxt->parse->parse_mount(ap, key, key_len, |
||||||
|
mapent, ctxt->parse->context); |
||||||
|
if (ret) { |
||||||
|
- time_t now = time(NULL); |
||||||
|
- int rv = CHE_OK; |
||||||
|
- |
||||||
|
- /* Record the the mount fail in the cache */ |
||||||
|
cache_writelock(mc); |
||||||
|
- me = cache_lookup_distinct(mc, key); |
||||||
|
- if (!me) |
||||||
|
- rv = cache_update(mc, source, key, NULL, now); |
||||||
|
- if (rv != CHE_FAIL) { |
||||||
|
- me = cache_lookup_distinct(mc, key); |
||||||
|
- me->status = now + ap->negative_timeout; |
||||||
|
- } |
||||||
|
+ cache_update_negative(mc, source, key, ap->negative_timeout); |
||||||
|
cache_unlock(mc); |
||||||
|
return NSS_STATUS_TRYAGAIN; |
||||||
|
} |
||||||
|
diff --git a/modules/lookup_yp.c b/modules/lookup_yp.c |
||||||
|
index a716e1f..e99e3c0 100644 |
||||||
|
--- a/modules/lookup_yp.c |
||||||
|
+++ b/modules/lookup_yp.c |
||||||
|
@@ -698,18 +698,10 @@ int lookup_mount(struct autofs_point *ap, const char *name, int name_len, void * |
||||||
|
ret = ctxt->parse->parse_mount(ap, key, key_len, |
||||||
|
mapent, ctxt->parse->context); |
||||||
|
if (ret) { |
||||||
|
- time_t now = time(NULL); |
||||||
|
- int rv = CHE_OK; |
||||||
|
- |
||||||
|
cache_writelock(mc); |
||||||
|
- me = cache_lookup_distinct(mc, key); |
||||||
|
- if (!me) |
||||||
|
- rv = cache_update(mc, source, key, NULL, now); |
||||||
|
- if (rv != CHE_FAIL) { |
||||||
|
- me = cache_lookup_distinct(mc, key); |
||||||
|
- me->status = now + ap->negative_timeout; |
||||||
|
- } |
||||||
|
+ cache_update_negative(mc, source, key, ap->negative_timeout); |
||||||
|
cache_unlock(mc); |
||||||
|
+ return NSS_STATUS_TRYAGAIN; |
||||||
|
} |
||||||
|
} |
||||||
|
|
@ -0,0 +1,36 @@ |
|||||||
|
autofs-5.0.7 - fix probe each nfs version in turn for singleton mounts |
||||||
|
|
||||||
|
From: Ian Kent <raven@themaw.net> |
||||||
|
|
||||||
|
If there aren't any hosts in the list returned from parse_location() make sure |
||||||
|
the probe checks are skipped. |
||||||
|
--- |
||||||
|
CHANGELOG | 1 + |
||||||
|
modules/mount_nfs.c | 2 +- |
||||||
|
2 files changed, 2 insertions(+), 1 deletion(-) |
||||||
|
|
||||||
|
diff --git a/CHANGELOG b/CHANGELOG |
||||||
|
index 25179b1..0242c11 100644 |
||||||
|
--- a/CHANGELOG |
||||||
|
+++ b/CHANGELOG |
||||||
|
@@ -50,6 +50,7 @@ |
||||||
|
- fix fix map entry duplicate offset detection. |
||||||
|
- probe each nfs version in turn for singleton mounts. |
||||||
|
- add changlog entry for coverity fixes. |
||||||
|
+- fix probe each nfs version in turn for singleton mounts. |
||||||
|
|
||||||
|
25/07/2012 autofs-5.0.7 |
||||||
|
======================= |
||||||
|
diff --git a/modules/mount_nfs.c b/modules/mount_nfs.c |
||||||
|
index 81ba3ca..9de8a73 100644 |
||||||
|
--- a/modules/mount_nfs.c |
||||||
|
+++ b/modules/mount_nfs.c |
||||||
|
@@ -190,7 +190,7 @@ int mount_mount(struct autofs_point *ap, const char *root, const char *name, int |
||||||
|
* to NFSv3 (if it can). If the NFSv4 probe fails then probe as |
||||||
|
* normal. |
||||||
|
*/ |
||||||
|
- if (!hosts->next && |
||||||
|
+ if ((hosts && !hosts->next) && |
||||||
|
mount_default_proto == 4 && |
||||||
|
vers & NFS_VERS_MASK != 0 && |
||||||
|
vers & NFS4_VERS_MASK != 0) { |
@ -0,0 +1,37 @@ |
|||||||
|
autofs-5.0.7 - fix requires in spec file |
||||||
|
|
||||||
|
From: Ian Kent <raven@themaw.net> |
||||||
|
|
||||||
|
Fix the use of depricated reqires in tar spec file. |
||||||
|
--- |
||||||
|
CHANGELOG | 1 + |
||||||
|
autofs.spec | 4 ++-- |
||||||
|
2 files changed, 3 insertions(+), 2 deletions(-) |
||||||
|
|
||||||
|
diff --git a/CHANGELOG b/CHANGELOG |
||||||
|
index 247d334..e848bcd 100644 |
||||||
|
--- a/CHANGELOG |
||||||
|
+++ b/CHANGELOG |
||||||
|
@@ -33,6 +33,7 @@ |
||||||
|
- fix file descriptor leak when reloading the daemon. |
||||||
|
- depricate nosymlink pseudo option. |
||||||
|
- add symlink pseudo option. |
||||||
|
+- fix requires in spec file. |
||||||
|
|
||||||
|
25/07/2012 autofs-5.0.7 |
||||||
|
======================= |
||||||
|
diff --git a/autofs.spec b/autofs.spec |
||||||
|
index b8a3b7a..703f7a9 100644 |
||||||
|
--- a/autofs.spec |
||||||
|
+++ b/autofs.spec |
||||||
|
@@ -25,8 +25,8 @@ Buildroot: %{_tmppath}/%{name}-tmp |
||||||
|
%if %{with_systemd} |
||||||
|
BuildRequires: systemd-units |
||||||
|
%endif |
||||||
|
-BuildPrereq: autoconf, hesiod-devel, openldap-devel, bison, flex, cyrus-sasl-devel |
||||||
|
-Prereq: chkconfig |
||||||
|
+BuildRequires: autoconf, hesiod-devel, openldap-devel, bison, flex, cyrus-sasl-devel |
||||||
|
+Requires: chkconfig |
||||||
|
Requires: /bin/bash mktemp sed textutils sh-utils grep /bin/ps |
||||||
|
%if %{with_systemd} |
||||||
|
Requires(post): systemd-sysv |
@ -0,0 +1,128 @@ |
|||||||
|
autofs-5.0.7 - fix several off by one errors |
||||||
|
|
||||||
|
From: Ian Kent <raven@themaw.net> |
||||||
|
|
||||||
|
Fix several off-by-one array reference errors and a couple of short allocation |
||||||
|
errors. |
||||||
|
--- |
||||||
|
daemon/spawn.c | 10 +++++----- |
||||||
|
lib/defaults.c | 2 +- |
||||||
|
modules/lookup_ldap.c | 8 ++++---- |
||||||
|
modules/parse_hesiod.c | 2 +- |
||||||
|
modules/parse_sun.c | 2 +- |
||||||
|
5 files changed, 12 insertions(+), 12 deletions(-) |
||||||
|
|
||||||
|
diff --git a/daemon/spawn.c b/daemon/spawn.c |
||||||
|
index 3b4a009..9b8d5a2 100644 |
||||||
|
--- a/daemon/spawn.c |
||||||
|
+++ b/daemon/spawn.c |
||||||
|
@@ -320,7 +320,7 @@ int spawn_mount(unsigned logopt, ...) |
||||||
|
unsigned int retries = MTAB_LOCK_RETRIES; |
||||||
|
int update_mtab = 1, ret, printed = 0; |
||||||
|
unsigned int wait = defaults_get_mount_wait(); |
||||||
|
- char buf[PATH_MAX]; |
||||||
|
+ char buf[PATH_MAX + 1]; |
||||||
|
|
||||||
|
/* If we use mount locking we can't validate the location */ |
||||||
|
#ifdef ENABLE_MOUNT_LOCKING |
||||||
|
@@ -346,7 +346,7 @@ int spawn_mount(unsigned logopt, ...) |
||||||
|
} |
||||||
|
|
||||||
|
/* Alloc 1 extra slot in case we need to use the "-f" option */ |
||||||
|
- if (!(argv = alloca(sizeof(char *) * argc + 2))) |
||||||
|
+ if (!(argv = alloca(sizeof(char *) * (argc + 2)))) |
||||||
|
return -1; |
||||||
|
|
||||||
|
argv[0] = arg0; |
||||||
|
@@ -448,7 +448,7 @@ int spawn_bind_mount(unsigned logopt, ...) |
||||||
|
unsigned int options; |
||||||
|
unsigned int retries = MTAB_LOCK_RETRIES; |
||||||
|
int update_mtab = 1, ret, printed = 0; |
||||||
|
- char buf[PATH_MAX]; |
||||||
|
+ char buf[PATH_MAX + 1]; |
||||||
|
|
||||||
|
/* If we use mount locking we can't validate the location */ |
||||||
|
#ifdef ENABLE_MOUNT_LOCKING |
||||||
|
@@ -477,7 +477,7 @@ int spawn_bind_mount(unsigned logopt, ...) |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
- if (!(argv = alloca(sizeof(char *) * argc + 2))) |
||||||
|
+ if (!(argv = alloca(sizeof(char *) * (argc + 2)))) |
||||||
|
return -1; |
||||||
|
|
||||||
|
argv[0] = arg0; |
||||||
|
@@ -556,7 +556,7 @@ int spawn_umount(unsigned logopt, ...) |
||||||
|
unsigned int retries = MTAB_LOCK_RETRIES; |
||||||
|
int update_mtab = 1, ret, printed = 0; |
||||||
|
unsigned int wait = defaults_get_umount_wait(); |
||||||
|
- char buf[PATH_MAX]; |
||||||
|
+ char buf[PATH_MAX + 1]; |
||||||
|
|
||||||
|
#ifdef ENABLE_MOUNT_LOCKING |
||||||
|
options = SPAWN_OPT_LOCK; |
||||||
|
diff --git a/lib/defaults.c b/lib/defaults.c |
||||||
|
index ae1162f..1e89509 100644 |
||||||
|
--- a/lib/defaults.c |
||||||
|
+++ b/lib/defaults.c |
||||||
|
@@ -227,7 +227,7 @@ void defaults_free_uris(struct list_head *list) |
||||||
|
static unsigned int add_uris(char *value, struct list_head *list) |
||||||
|
{ |
||||||
|
char *str, *tok, *ptr = NULL; |
||||||
|
- size_t len = strlen(value); |
||||||
|
+ size_t len = strlen(value) + 1; |
||||||
|
|
||||||
|
str = alloca(len); |
||||||
|
if (!str) |
||||||
|
diff --git a/modules/lookup_ldap.c b/modules/lookup_ldap.c |
||||||
|
index 83e3215..17cbe9a 100644 |
||||||
|
--- a/modules/lookup_ldap.c |
||||||
|
+++ b/modules/lookup_ldap.c |
||||||
|
@@ -2234,8 +2234,8 @@ static int do_get_entries(struct ldap_search_params *sp, struct map_source *sour |
||||||
|
mapent = new_me; |
||||||
|
strcat(mapent, " "); |
||||||
|
strncat(mapent, v_val, v_len); |
||||||
|
- mapent[new_size] = '\0'; |
||||||
|
- mapent_len = new_size; |
||||||
|
+ mapent[new_size - 1] = '\0'; |
||||||
|
+ mapent_len = new_size - 1; |
||||||
|
} else { |
||||||
|
char *estr; |
||||||
|
estr = strerror_r(errno, buf, sizeof(buf)); |
||||||
|
@@ -2723,8 +2723,8 @@ static int lookup_one(struct autofs_point *ap, |
||||||
|
mapent = new_me; |
||||||
|
strcat(mapent, " "); |
||||||
|
strncat(mapent, v_val, v_len); |
||||||
|
- mapent[new_size] = '\0'; |
||||||
|
- mapent_len = new_size; |
||||||
|
+ mapent[new_size - 1] = '\0'; |
||||||
|
+ mapent_len = new_size - 1; |
||||||
|
} else { |
||||||
|
char *estr; |
||||||
|
estr = strerror_r(errno, buf, sizeof(buf)); |
||||||
|
diff --git a/modules/parse_hesiod.c b/modules/parse_hesiod.c |
||||||
|
index 7a6a57d..237fd50 100644 |
||||||
|
--- a/modules/parse_hesiod.c |
||||||
|
+++ b/modules/parse_hesiod.c |
||||||
|
@@ -117,7 +117,7 @@ static int parse_nfs(struct autofs_point *ap, |
||||||
|
p++; |
||||||
|
|
||||||
|
/* Isolate the remote mountpoint for this NFS fs. */ |
||||||
|
- for (i = 0; (!isspace(p[i]) && i < (int) sizeof(mount)); i++) { |
||||||
|
+ for (i = 0; (!isspace(p[i]) && i < ((int) sizeof(mount) - 1)); i++) { |
||||||
|
if (!p[i]) { |
||||||
|
error(ap->logopt, MODPREFIX |
||||||
|
"unexpeced end of input looking for NFS " |
||||||
|
diff --git a/modules/parse_sun.c b/modules/parse_sun.c |
||||||
|
index ae1caf7..c1fc528 100644 |
||||||
|
--- a/modules/parse_sun.c |
||||||
|
+++ b/modules/parse_sun.c |
||||||
|
@@ -1135,7 +1135,7 @@ static int mount_subtree(struct autofs_point *ap, struct mapent *me, |
||||||
|
} |
||||||
|
ro_len = strlen(ro_loc); |
||||||
|
|
||||||
|
- tmp = alloca(mnt_root_len + 1); |
||||||
|
+ tmp = alloca(mnt_root_len + 2); |
||||||
|
strcpy(tmp, mnt_root); |
||||||
|
tmp[mnt_root_len] = '/'; |
||||||
|
tmp[mnt_root_len + 1] = '\0'; |
@ -0,0 +1,45 @@ |
|||||||
|
autofs-5.0.7 - fix some automount(8) typos |
||||||
|
|
||||||
|
From: Ian Kent <raven@themaw.net> |
||||||
|
|
||||||
|
Fix a couple of spelling errors in the automount(8) man page |
||||||
|
that have been around for a long time. |
||||||
|
--- |
||||||
|
CHANGELOG | 1 + |
||||||
|
man/automount.8 | 4 ++-- |
||||||
|
2 files changed, 3 insertions(+), 2 deletions(-) |
||||||
|
|
||||||
|
diff --git a/CHANGELOG b/CHANGELOG |
||||||
|
index d8e4049..488ad1e 100644 |
||||||
|
--- a/CHANGELOG |
||||||
|
+++ b/CHANGELOG |
||||||
|
@@ -37,6 +37,7 @@ |
||||||
|
- fix libtirpc build option to require libtirpc-devel if needed. |
||||||
|
- fix systemd unidir in spec file. |
||||||
|
- document browse option in man page. |
||||||
|
+- fix some automount(8) typos. |
||||||
|
|
||||||
|
25/07/2012 autofs-5.0.7 |
||||||
|
======================= |
||||||
|
diff --git a/man/automount.8 b/man/automount.8 |
||||||
|
index dddebce..7cc32c5 100644 |
||||||
|
--- a/man/automount.8 |
||||||
|
+++ b/man/automount.8 |
||||||
|
@@ -43,7 +43,7 @@ autofs managed mounts. |
||||||
|
.TP |
||||||
|
.I "\-d, \-\-debug" |
||||||
|
Enables logging of general status and progress messages as well as |
||||||
|
-debuging messages for all autofs managed mounts. |
||||||
|
+debugging messages for all autofs managed mounts. |
||||||
|
.TP |
||||||
|
.I "\-Dvariable=value" |
||||||
|
Define a global macro substitution variable. Global definitions |
||||||
|
@@ -133,7 +133,7 @@ unused. If the force umount at exit option is used the filesystems |
||||||
|
will be umounted but the mount will not be released by the kernel |
||||||
|
until they are no longer in use by the processes that held them busy. |
||||||
|
If automount managed filesystems are found mounted when autofs is |
||||||
|
-started they will be recoverd unless they are no longer present in |
||||||
|
+started they will be recovered unless they are no longer present in |
||||||
|
the map in which case they need to umounted manually. |
||||||
|
.P |
||||||
|
If the option to disable the check to see if the daemon is already |
@ -0,0 +1,23 @@ |
|||||||
|
autofs-5.0.7 - fix spawn_umount() return check in mount_bind.c:lookup_init() |
||||||
|
|
||||||
|
From: Ian Kent <raven@themaw.net> |
||||||
|
|
||||||
|
Check return of spawn_umount() and report it if it fails. |
||||||
|
--- |
||||||
|
modules/mount_bind.c | 3 ++- |
||||||
|
1 file changed, 2 insertions(+), 1 deletion(-) |
||||||
|
|
||||||
|
diff --git a/modules/mount_bind.c b/modules/mount_bind.c |
||||||
|
index 4975294..d6c6fe7 100644 |
||||||
|
--- a/modules/mount_bind.c |
||||||
|
+++ b/modules/mount_bind.c |
||||||
|
@@ -57,7 +57,8 @@ int mount_init(void **context) |
||||||
|
bind_works = 1; |
||||||
|
} |
||||||
|
|
||||||
|
- spawn_umount(LOGOPT_NONE, "-n", t2_dir, NULL); |
||||||
|
+ if (spawn_umount(LOGOPT_NONE, "-n", t2_dir, NULL) != 0) |
||||||
|
+ debug(LOGOPT_ANY, MODPREFIX "umount failed for %s", t2_dir); |
||||||
|
|
||||||
|
out: |
||||||
|
rmdir(t1_dir); |
@ -0,0 +1,45 @@ |
|||||||
|
autofs-5.0.7 - fix submount offset delete |
||||||
|
|
||||||
|
From: Ian Kent <ikent@redhat.com> |
||||||
|
|
||||||
|
As part of the implementation to allow for limited update of |
||||||
|
the internal hosts map by using a HUP signal some code that |
||||||
|
deleted any offset entries from the cache on lookup was removed |
||||||
|
as it appeared to not be needed. |
||||||
|
|
||||||
|
There is however a case where it is needed to avoid a duplicate |
||||||
|
cache entry failure on lookup. |
||||||
|
--- |
||||||
|
|
||||||
|
CHANGELOG | 1 + |
||||||
|
daemon/automount.c | 4 ++-- |
||||||
|
2 files changed, 3 insertions(+), 2 deletions(-) |
||||||
|
|
||||||
|
|
||||||
|
diff --git a/CHANGELOG b/CHANGELOG |
||||||
|
index 7eb7235..76c1f73 100644 |
||||||
|
--- a/CHANGELOG |
||||||
|
+++ b/CHANGELOG |
||||||
|
@@ -18,6 +18,7 @@ |
||||||
|
- fix map entry duplicate offset detection. |
||||||
|
- Allow nsswitch.conf to not contain "automount:" lines. |
||||||
|
- fix nobind man page description. |
||||||
|
+- fix submount offset delete. |
||||||
|
|
||||||
|
25/07/2012 autofs-5.0.7 |
||||||
|
======================= |
||||||
|
diff --git a/daemon/automount.c b/daemon/automount.c |
||||||
|
index e56f9e1..4a3eb3d 100644 |
||||||
|
--- a/daemon/automount.c |
||||||
|
+++ b/daemon/automount.c |
||||||
|
@@ -544,8 +544,8 @@ int umount_multi(struct autofs_point *ap, const char *path, int incl) |
||||||
|
* If we are a submount we need to umount any offsets our |
||||||
|
* parent may have mounted over top of us. |
||||||
|
*/ |
||||||
|
- /*if (ap->submount) |
||||||
|
- left += umount_subtree_mounts(ap->parent, path, is_autofs_fs);*/ |
||||||
|
+ if (ap->submount) |
||||||
|
+ left += umount_subtree_mounts(ap->parent, path, is_autofs_fs); |
||||||
|
|
||||||
|
left += umount_subtree_mounts(ap, path, is_autofs_fs); |
||||||
|
|
@ -0,0 +1,70 @@ |
|||||||
|
autofs-5.0.7 - fix submount tree not all expiring |
||||||
|
|
||||||
|
From: Ian Kent <ikent@redhat.com> |
||||||
|
|
||||||
|
Due to the change in the expire-specific-submount-only patch, sub-mounts |
||||||
|
within an indirect mount that follow a submount (in the check order) won't |
||||||
|
be expired if that submount is busy. |
||||||
|
--- |
||||||
|
CHANGELOG | 1 + |
||||||
|
lib/master.c | 24 +++++++++++++++--------- |
||||||
|
2 files changed, 16 insertions(+), 9 deletions(-) |
||||||
|
|
||||||
|
diff --git a/CHANGELOG b/CHANGELOG |
||||||
|
index f1ec1e5..4106e7f 100644 |
||||||
|
--- a/CHANGELOG |
||||||
|
+++ b/CHANGELOG |
||||||
|
@@ -39,6 +39,7 @@ |
||||||
|
- document browse option in man page. |
||||||
|
- fix some automount(8) typos. |
||||||
|
- syncronize handle_mounts() shutdown. |
||||||
|
+- fix submount tree not all expiring. |
||||||
|
|
||||||
|
25/07/2012 autofs-5.0.7 |
||||||
|
======================= |
||||||
|
diff --git a/lib/master.c b/lib/master.c |
||||||
|
index a0e62f2..64dbcb1 100644 |
||||||
|
--- a/lib/master.c |
||||||
|
+++ b/lib/master.c |
||||||
|
@@ -905,15 +905,24 @@ int master_notify_submount(struct autofs_point *ap, const char *path, enum state |
||||||
|
this = list_entry(p, struct autofs_point, mounts); |
||||||
|
p = p->prev; |
||||||
|
|
||||||
|
- if (!master_submount_list_empty(this)) { |
||||||
|
- mounts_mutex_unlock(ap); |
||||||
|
- return master_notify_submount(this, path, state); |
||||||
|
- } |
||||||
|
- |
||||||
|
/* path not the same */ |
||||||
|
if (strcmp(this->path, path)) |
||||||
|
continue; |
||||||
|
|
||||||
|
+ if (!master_submount_list_empty(this)) { |
||||||
|
+ char *this_path = strdup(this->path); |
||||||
|
+ if (this_path) { |
||||||
|
+ mounts_mutex_unlock(ap); |
||||||
|
+ master_notify_submount(this, path, state); |
||||||
|
+ mounts_mutex_lock(ap); |
||||||
|
+ if (!__master_find_submount(ap, this_path)) { |
||||||
|
+ free(this_path); |
||||||
|
+ continue; |
||||||
|
+ } |
||||||
|
+ free(this_path); |
||||||
|
+ } |
||||||
|
+ } |
||||||
|
+ |
||||||
|
/* Now we have found the submount we want to expire */ |
||||||
|
|
||||||
|
st_mutex_lock(); |
||||||
|
@@ -959,10 +968,7 @@ int master_notify_submount(struct autofs_point *ap, const char *path, enum state |
||||||
|
st_mutex_lock(); |
||||||
|
} |
||||||
|
st_mutex_unlock(); |
||||||
|
- mounts_mutex_unlock(ap); |
||||||
|
- |
||||||
|
- return ret; |
||||||
|
- |
||||||
|
+ break; |
||||||
|
} |
||||||
|
|
||||||
|
mounts_mutex_unlock(ap); |
@ -0,0 +1,36 @@ |
|||||||
|
autofs-5.0.7 - fix syncronize handle_mounts() shutdown |
||||||
|
|
||||||
|
From: Ian Kent <raven@themaw.net> |
||||||
|
|
||||||
|
A recent change to fix a problem where automount would exit when re-reading |
||||||
|
the master map if more than on entry had been removed causes automount to |
||||||
|
ignore HUP signals if the mount list is empty. |
||||||
|
|
||||||
|
Removing that check and testing shows that the remainder of the change still |
||||||
|
fixes the original problem. |
||||||
|
--- |
||||||
|
CHANGELOG | 1 + |
||||||
|
daemon/automount.c | 2 +- |
||||||
|
2 files changed, 2 insertions(+), 1 deletion(-) |
||||||
|
|
||||||
|
--- autofs-5.0.7.orig/CHANGELOG |
||||||
|
+++ autofs-5.0.7/CHANGELOG |
||||||
|
@@ -56,6 +56,7 @@ |
||||||
|
- don't override LDFLAGS in make rules. |
||||||
|
- fix a couple of compiler warnings. |
||||||
|
- add after sssd dependency to unit file. |
||||||
|
+- fix syncronize handle_mounts() shutdown. |
||||||
|
|
||||||
|
25/07/2012 autofs-5.0.7 |
||||||
|
======================= |
||||||
|
--- autofs-5.0.7.orig/daemon/automount.c |
||||||
|
+++ autofs-5.0.7/daemon/automount.c |
||||||
|
@@ -1286,7 +1286,7 @@ static int do_hup_signal(struct master * |
||||||
|
|
||||||
|
master_mutex_lock(); |
||||||
|
/* Already doing a map read or shutdown or no mounts */ |
||||||
|
- if (master->reading || list_empty(&master->mounts)) { |
||||||
|
+ if (master->reading) { |
||||||
|
status = pthread_mutex_unlock(&mrc.mutex); |
||||||
|
if (status) |
||||||
|
fatal(status); |
@ -0,0 +1,72 @@ |
|||||||
|
autofs-5.0.7 - fix systemd unidir in spec file |
||||||
|
|
||||||
|
From: Ian Kent <raven@themaw.net> |
||||||
|
|
||||||
|
|
||||||
|
--- |
||||||
|
CHANGELOG | 1 + |
||||||
|
autofs.spec | 16 ++++++++-------- |
||||||
|
2 files changed, 9 insertions(+), 8 deletions(-) |
||||||
|
|
||||||
|
diff --git a/CHANGELOG b/CHANGELOG |
||||||
|
index b6b2679..ecdea0b 100644 |
||||||
|
--- a/CHANGELOG |
||||||
|
+++ b/CHANGELOG |
||||||
|
@@ -35,6 +35,7 @@ |
||||||
|
- add symlink pseudo option. |
||||||
|
- fix requires in spec file. |
||||||
|
- fix libtirpc build option to require libtirpc-devel if needed. |
||||||
|
+- fix systemd unidir in spec file. |
||||||
|
|
||||||
|
25/07/2012 autofs-5.0.7 |
||||||
|
======================= |
||||||
|
diff --git a/autofs.spec b/autofs.spec |
||||||
|
index f77acc1..a768e44 100644 |
||||||
|
--- a/autofs.spec |
||||||
|
+++ b/autofs.spec |
||||||
|
@@ -76,7 +76,7 @@ inkludera n |
||||||
|
%setup -q |
||||||
|
echo %{version}-%{release} > .version |
||||||
|
%if %{with_systemd} |
||||||
|
- %define _unitdir %{?_unitdir:/lib/systemd/system} |
||||||
|
+ %define unitdir %{?_unitdir:/lib/systemd/system} |
||||||
|
%define systemd_configure_arg --with-systemd |
||||||
|
%endif |
||||||
|
%if %{with_libtirpc} |
||||||
|
@@ -95,7 +95,7 @@ CFLAGS="$RPM_OPT_FLAGS -Wall" make initdir=/etc/rc.d/init.d DONTSTRIP=1 |
||||||
|
%install |
||||||
|
rm -rf $RPM_BUILD_ROOT |
||||||
|
%if %{with_systemd} |
||||||
|
-install -d -m 755 $RPM_BUILD_ROOT%{_unitdir} |
||||||
|
+install -d -m 755 $RPM_BUILD_ROOT%{unitdir} |
||||||
|
%else |
||||||
|
mkdir -p -m755 $RPM_BUILD_ROOT/etc/rc.d/init.d |
||||||
|
%endif |
||||||
|
@@ -109,9 +109,13 @@ make install mandir=%{_mandir} initdir=/etc/rc.d/init.d INSTALLROOT=$RPM_BUILD_R |
||||||
|
echo make -C redhat |
||||||
|
make -C redhat |
||||||
|
%if %{with_systemd} |
||||||
|
-install -m 644 redhat/autofs.service $RPM_BUILD_ROOT%{_unitdir}/autofs.service |
||||||
|
+# Configure can get this wrong when the unit files appear under /lib and /usr/lib |
||||||
|
+find $RPM_BUILD_ROOT -type f -name autofs.service -exec rm -f {} \; |
||||||
|
+install -m 644 redhat/autofs.service $RPM_BUILD_ROOT%{unitdir}/autofs.service |
||||||
|
+%define init_file_name %{unitdir}/autofs.service |
||||||
|
%else |
||||||
|
install -m 755 redhat/autofs.init $RPM_BUILD_ROOT/etc/rc.d/init.d/autofs |
||||||
|
+%define init_file_name /etc/rc.d/init.d/autofs |
||||||
|
%endif |
||||||
|
install -m 644 redhat/autofs.sysconfig $RPM_BUILD_ROOT/etc/sysconfig/autofs |
||||||
|
|
||||||
|
@@ -170,11 +174,7 @@ fi |
||||||
|
%files |
||||||
|
%defattr(-,root,root) |
||||||
|
%doc CREDITS CHANGELOG INSTALL COPY* README* samples/ldap* samples/autofs.schema samples/autofs_ldap_auth.conf |
||||||
|
-%if %{with_systemd} |
||||||
|
-%{_unitdir}/autofs.service |
||||||
|
-%else |
||||||
|
-%config /etc/rc.d/init.d/autofs |
||||||
|
-%endif |
||||||
|
+%config %{init_file_name} |
||||||
|
%config(noreplace) /etc/auto.master |
||||||
|
%config(noreplace,missingok) /etc/auto.misc |
||||||
|
%config(noreplace,missingok) /etc/auto.net |
@ -0,0 +1,33 @@ |
|||||||
|
autofs-5.0.7 - fix typo in automount(8) |
||||||
|
|
||||||
|
From: Ian Kent <ikent@redhat.com> |
||||||
|
|
||||||
|
|
||||||
|
--- |
||||||
|
|
||||||
|
CHANGELOG | 1 + |
||||||
|
man/automount.8 | 2 +- |
||||||
|
2 files changed, 2 insertions(+), 1 deletions(-) |
||||||
|
|
||||||
|
|
||||||
|
--- autofs-5.0.7.orig/CHANGELOG |
||||||
|
+++ autofs-5.0.7/CHANGELOG |
||||||
|
@@ -4,6 +4,7 @@ |
||||||
|
- fix use cache entry after free in lookup_prune_one_cache(). |
||||||
|
- fix ipv6 proximity calculation. |
||||||
|
- fix parse buffer initialization. |
||||||
|
+- fix typo in automount(8). |
||||||
|
|
||||||
|
25/07/2012 autofs-5.0.7 |
||||||
|
======================= |
||||||
|
--- autofs-5.0.7.orig/man/automount.8 |
||||||
|
+++ autofs-5.0.7/man/automount.8 |
||||||
|
@@ -51,7 +51,7 @@ are over-ridden macro definitions of the |
||||||
|
mount entries. |
||||||
|
.TP |
||||||
|
.I "\-f, \-\-foreground" |
||||||
|
-Run the daemon in the forground and log to stderr instead of syslog." |
||||||
|
+Run the daemon in the foreground and log to stderr instead of syslog." |
||||||
|
.TP |
||||||
|
.I "\-r, \-\-random-multimount-selection" |
||||||
|
Enables the use of ramdom selection when choosing a host from a |
@ -0,0 +1,49 @@ |
|||||||
|
autofs-5.0.7 - fix use cache entry after free mistake |
||||||
|
|
||||||
|
From: Ian Kent <ikent@redhat.com> |
||||||
|
|
||||||
|
Fix an obvious use after free mistake in lookup_prune_one_cache(). |
||||||
|
--- |
||||||
|
|
||||||
|
CHANGELOG | 1 + |
||||||
|
daemon/lookup.c | 7 +++++-- |
||||||
|
2 files changed, 6 insertions(+), 2 deletions(-) |
||||||
|
|
||||||
|
|
||||||
|
diff --git a/CHANGELOG b/CHANGELOG |
||||||
|
index faf4c80..dc38580 100644 |
||||||
|
--- a/CHANGELOG |
||||||
|
+++ b/CHANGELOG |
||||||
|
@@ -1,6 +1,7 @@ |
||||||
|
??/??/2012 autofs-5.0.8 |
||||||
|
======================= |
||||||
|
- fix nobind sun escaped map entries. |
||||||
|
+- fix use cache entry after free in lookup_prune_one_cache(). |
||||||
|
|
||||||
|
25/07/2012 autofs-5.0.7 |
||||||
|
======================= |
||||||
|
diff --git a/daemon/lookup.c b/daemon/lookup.c |
||||||
|
index 7909536..e3d9536 100644 |
||||||
|
--- a/daemon/lookup.c |
||||||
|
+++ b/daemon/lookup.c |
||||||
|
@@ -1103,15 +1103,18 @@ void lookup_prune_one_cache(struct autofs_point *ap, struct mapent_cache *mc, ti |
||||||
|
if (valid) |
||||||
|
cache_delete(mc, key); |
||||||
|
else if (!is_mounted(_PROC_MOUNTS, path, MNTS_AUTOFS)) { |
||||||
|
+ dev_t devid = ap->dev; |
||||||
|
status = CHE_FAIL; |
||||||
|
+ if (ap->type == LKP_DIRECT) |
||||||
|
+ devid = this->dev; |
||||||
|
if (this->ioctlfd == -1) |
||||||
|
status = cache_delete(mc, key); |
||||||
|
if (status != CHE_FAIL) { |
||||||
|
if (ap->type == LKP_INDIRECT) { |
||||||
|
if (ap->flags & MOUNT_FLAG_GHOST) |
||||||
|
- rmdir_path(ap, path, ap->dev); |
||||||
|
+ rmdir_path(ap, path, devid); |
||||||
|
} else |
||||||
|
- rmdir_path(ap, path, this->dev); |
||||||
|
+ rmdir_path(ap, path, devid); |
||||||
|
} |
||||||
|
} |
||||||
|
cache_unlock(mc); |
@ -0,0 +1,54 @@ |
|||||||
|
autofs-5.0.7 - fix use get_proximity() without libtirpc |
||||||
|
|
||||||
|
From: Ian Kent <raven@themaw.net> |
||||||
|
|
||||||
|
If autofs is not using libtirpc and there are any configured IPv6 |
||||||
|
interfaces then get_proximity() will fail with PROXIMITY_UNSUPPORTED. |
||||||
|
|
||||||
|
In this case when checking interfaces the IPv6 interfaces need to be |
||||||
|
ignored. |
||||||
|
--- |
||||||
|
|
||||||
|
CHANGELOG | 1 + |
||||||
|
modules/replicated.c | 8 ++------ |
||||||
|
2 files changed, 3 insertions(+), 6 deletions(-) |
||||||
|
|
||||||
|
|
||||||
|
diff --git a/CHANGELOG b/CHANGELOG |
||||||
|
index 5bcb1af..460bd27 100644 |
||||||
|
--- a/CHANGELOG |
||||||
|
+++ b/CHANGELOG |
||||||
|
@@ -20,6 +20,7 @@ |
||||||
|
- fix nobind man page description. |
||||||
|
- fix submount offset delete. |
||||||
|
- fix init script status return. |
||||||
|
+- fix use get_proximity() without libtirpc. |
||||||
|
|
||||||
|
25/07/2012 autofs-5.0.7 |
||||||
|
======================= |
||||||
|
diff --git a/modules/replicated.c b/modules/replicated.c |
||||||
|
index bd6003b..6b96320 100644 |
||||||
|
--- a/modules/replicated.c |
||||||
|
+++ b/modules/replicated.c |
||||||
|
@@ -184,9 +184,7 @@ static unsigned int get_proximity(struct sockaddr *host_addr) |
||||||
|
break; |
||||||
|
|
||||||
|
case AF_INET6: |
||||||
|
-#ifndef WITH_LIBTIRPC |
||||||
|
- return PROXIMITY_UNSUPPORTED; |
||||||
|
-#else |
||||||
|
+#ifdef WITH_LIBTIRPC |
||||||
|
if (host_addr->sa_family == AF_INET) |
||||||
|
break; |
||||||
|
if6_addr = (struct sockaddr_in6 *) this->ifa_addr; |
||||||
|
@@ -251,9 +249,7 @@ static unsigned int get_proximity(struct sockaddr *host_addr) |
||||||
|
break; |
||||||
|
|
||||||
|
case AF_INET6: |
||||||
|
-#ifndef WITH_LIBTIRPC |
||||||
|
- return PROXIMITY_UNSUPPORTED; |
||||||
|
-#else |
||||||
|
+#ifdef WITH_LIBTIRPC |
||||||
|
if (host_addr->sa_family == AF_INET) |
||||||
|
break; |
||||||
|
if6_addr = (struct sockaddr_in6 *) this->ifa_addr; |
@ -0,0 +1,225 @@ |
|||||||
|
autofs-5.0.7 - fix wildcard multi map regression |
||||||
|
|
||||||
|
From: Ian Kent <raven@themaw.net> |
||||||
|
|
||||||
|
A recent patch that removed code to add the current map entry when |
||||||
|
being parsed if it didn't already exist cause wildcard indirect |
||||||
|
multi-mount map entries to fail to mount. |
||||||
|
|
||||||
|
Indirect multi-mount map entries need the entry matched by a wildcard |
||||||
|
lookup to be added to the map entry cache because subsequent operations |
||||||
|
expect a distinct map entry to be present or they will fail. This is |
||||||
|
what the code that was removed did but it did so in the wrong place |
||||||
|
which caused a deadlock situation. |
||||||
|
--- |
||||||
|
CHANGELOG | 1 + |
||||||
|
modules/lookup_file.c | 23 ++++++++++++++++------- |
||||||
|
modules/lookup_ldap.c | 19 +++++++++++++++---- |
||||||
|
modules/lookup_nisplus.c | 21 ++++++++++++++++----- |
||||||
|
modules/lookup_sss.c | 17 ++++++++++++++--- |
||||||
|
modules/lookup_yp.c | 21 ++++++++++++++++----- |
||||||
|
6 files changed, 78 insertions(+), 24 deletions(-) |
||||||
|
|
||||||
|
diff --git a/CHANGELOG b/CHANGELOG |
||||||
|
index 97d6f48..46ef335 100644 |
||||||
|
--- a/CHANGELOG |
||||||
|
+++ b/CHANGELOG |
||||||
|
@@ -29,6 +29,7 @@ |
||||||
|
- modules/replicated.c: use sin6_addr.s6_addr32. |
||||||
|
- workaround missing GNU versionsort extension. |
||||||
|
- dont fail on master map self include. |
||||||
|
+- fix wildcard multi map regression. |
||||||
|
|
||||||
|
25/07/2012 autofs-5.0.7 |
||||||
|
======================= |
||||||
|
diff --git a/modules/lookup_file.c b/modules/lookup_file.c |
||||||
|
index f37bed9..65e5ee6 100644 |
||||||
|
--- a/modules/lookup_file.c |
||||||
|
+++ b/modules/lookup_file.c |
||||||
|
@@ -1040,7 +1040,7 @@ int lookup_mount(struct autofs_point *ap, const char *name, int name_len, void * |
||||||
|
return NSS_STATUS_UNAVAIL; |
||||||
|
} |
||||||
|
|
||||||
|
- cache_readlock(mc); |
||||||
|
+ cache_writelock(mc); |
||||||
|
me = cache_lookup_first(mc); |
||||||
|
if (me && st.st_mtime <= me->age) { |
||||||
|
/* |
||||||
|
@@ -1082,7 +1082,7 @@ int lookup_mount(struct autofs_point *ap, const char *name, int name_len, void * |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
- cache_readlock(mc); |
||||||
|
+ cache_writelock(mc); |
||||||
|
do_cache_lookup: |
||||||
|
me = cache_lookup(mc, key); |
||||||
|
/* |
||||||
|
@@ -1098,11 +1098,20 @@ do_cache_lookup: |
||||||
|
if (!me) |
||||||
|
me = cache_lookup_distinct(mc, "*"); |
||||||
|
} |
||||||
|
- if (me && me->mapent && (me->source == source || *me->key == '/')) { |
||||||
|
- pthread_cleanup_push(cache_lock_cleanup, mc); |
||||||
|
- strcpy(mapent_buf, me->mapent); |
||||||
|
- mapent = mapent_buf; |
||||||
|
- pthread_cleanup_pop(0); |
||||||
|
+ if (me && me->mapent) { |
||||||
|
+ /* |
||||||
|
+ * Add wildcard match for later validation checks and |
||||||
|
+ * negative cache lookups. |
||||||
|
+ */ |
||||||
|
+ if (ap->type == LKP_INDIRECT && *me->key == '*') { |
||||||
|
+ ret = cache_update(mc, source, key, me->mapent, me->age); |
||||||
|
+ if (!(ret & (CHE_OK | CHE_UPDATED))) |
||||||
|
+ me = NULL; |
||||||
|
+ } |
||||||
|
+ if (me && (me->source == source || *me->key == '/')) { |
||||||
|
+ strcpy(mapent_buf, me->mapent); |
||||||
|
+ mapent = mapent_buf; |
||||||
|
+ } |
||||||
|
} |
||||||
|
cache_unlock(mc); |
||||||
|
|
||||||
|
diff --git a/modules/lookup_ldap.c b/modules/lookup_ldap.c |
||||||
|
index 431e50d..83e3215 100644 |
||||||
|
--- a/modules/lookup_ldap.c |
||||||
|
+++ b/modules/lookup_ldap.c |
||||||
|
@@ -2969,7 +2969,7 @@ int lookup_mount(struct autofs_point *ap, const char *name, int name_len, void * |
||||||
|
return status; |
||||||
|
} |
||||||
|
|
||||||
|
- cache_readlock(mc); |
||||||
|
+ cache_writelock(mc); |
||||||
|
me = cache_lookup(mc, key); |
||||||
|
/* Stale mapent => check for entry in alternate source or wildcard */ |
||||||
|
if (me && !me->mapent) { |
||||||
|
@@ -2979,9 +2979,20 @@ int lookup_mount(struct autofs_point *ap, const char *name, int name_len, void * |
||||||
|
if (!me) |
||||||
|
me = cache_lookup_distinct(mc, "*"); |
||||||
|
} |
||||||
|
- if (me && me->mapent && (me->source == source || *me->key == '/')) { |
||||||
|
- strcpy(mapent_buf, me->mapent); |
||||||
|
- mapent = mapent_buf; |
||||||
|
+ if (me && me->mapent) { |
||||||
|
+ /* |
||||||
|
+ * Add wildcard match for later validation checks and |
||||||
|
+ * negative cache lookups. |
||||||
|
+ */ |
||||||
|
+ if (ap->type == LKP_INDIRECT && *me->key == '*') { |
||||||
|
+ ret = cache_update(mc, source, key, me->mapent, me->age); |
||||||
|
+ if (!(ret & (CHE_OK | CHE_UPDATED))) |
||||||
|
+ me = NULL; |
||||||
|
+ } |
||||||
|
+ if (me && (me->source == source || *me->key == '/')) { |
||||||
|
+ strcpy(mapent_buf, me->mapent); |
||||||
|
+ mapent = mapent_buf; |
||||||
|
+ } |
||||||
|
} |
||||||
|
cache_unlock(mc); |
||||||
|
|
||||||
|
diff --git a/modules/lookup_nisplus.c b/modules/lookup_nisplus.c |
||||||
|
index 9fced96..8237a1e 100644 |
||||||
|
--- a/modules/lookup_nisplus.c |
||||||
|
+++ b/modules/lookup_nisplus.c |
||||||
|
@@ -561,7 +561,7 @@ int lookup_mount(struct autofs_point *ap, const char *name, int name_len, void * |
||||||
|
return status; |
||||||
|
} |
||||||
|
|
||||||
|
- cache_readlock(mc); |
||||||
|
+ cache_writelock(mc); |
||||||
|
me = cache_lookup(mc, key); |
||||||
|
/* Stale mapent => check for entry in alternate source or wildcard */ |
||||||
|
if (me && !me->mapent) { |
||||||
|
@@ -571,10 +571,21 @@ int lookup_mount(struct autofs_point *ap, const char *name, int name_len, void * |
||||||
|
if (!me) |
||||||
|
me = cache_lookup_distinct(mc, "*"); |
||||||
|
} |
||||||
|
- if (me && me->mapent && (me->source == source || *me->key == '/')) { |
||||||
|
- mapent_len = strlen(me->mapent); |
||||||
|
- mapent = malloc(mapent_len + 1); |
||||||
|
- strcpy(mapent, me->mapent); |
||||||
|
+ if (me && me->mapent) { |
||||||
|
+ /* |
||||||
|
+ * Add wildcard match for later validation checks and |
||||||
|
+ * negative cache lookups. |
||||||
|
+ */ |
||||||
|
+ if (ap->type == LKP_INDIRECT && *me->key == '*') { |
||||||
|
+ ret = cache_update(mc, source, key, me->mapent, me->age); |
||||||
|
+ if (!(ret & (CHE_OK | CHE_UPDATED))) |
||||||
|
+ me = NULL; |
||||||
|
+ } |
||||||
|
+ if (me && (me->source == source || *me->key == '/')) { |
||||||
|
+ mapent_len = strlen(me->mapent); |
||||||
|
+ mapent = malloc(mapent_len + 1); |
||||||
|
+ strcpy(mapent, me->mapent); |
||||||
|
+ } |
||||||
|
} |
||||||
|
cache_unlock(mc); |
||||||
|
|
||||||
|
diff --git a/modules/lookup_sss.c b/modules/lookup_sss.c |
||||||
|
index e0b84cc..5c2ed0a 100644 |
||||||
|
--- a/modules/lookup_sss.c |
||||||
|
+++ b/modules/lookup_sss.c |
||||||
|
@@ -645,9 +645,20 @@ int lookup_mount(struct autofs_point *ap, const char *name, int name_len, void * |
||||||
|
if (!me) |
||||||
|
me = cache_lookup_distinct(mc, "*"); |
||||||
|
} |
||||||
|
- if (me && me->mapent && (me->source == source || *me->key == '/')) { |
||||||
|
- strcpy(mapent_buf, me->mapent); |
||||||
|
- mapent = mapent_buf; |
||||||
|
+ if (me && me->mapent) { |
||||||
|
+ /* |
||||||
|
+ * Add wildcard match for later validation checks and |
||||||
|
+ * negative cache lookups. |
||||||
|
+ */ |
||||||
|
+ if (ap->type == LKP_INDIRECT && *me->key == '*') { |
||||||
|
+ ret = cache_update(mc, source, key, me->mapent, me->age); |
||||||
|
+ if (!(ret & (CHE_OK | CHE_UPDATED))) |
||||||
|
+ me = NULL; |
||||||
|
+ } |
||||||
|
+ if (me && (me->source == source || *me->key == '/')) { |
||||||
|
+ strcpy(mapent_buf, me->mapent); |
||||||
|
+ mapent = mapent_buf; |
||||||
|
+ } |
||||||
|
} |
||||||
|
cache_unlock(mc); |
||||||
|
|
||||||
|
diff --git a/modules/lookup_yp.c b/modules/lookup_yp.c |
||||||
|
index 720df2e..a716e1f 100644 |
||||||
|
--- a/modules/lookup_yp.c |
||||||
|
+++ b/modules/lookup_yp.c |
||||||
|
@@ -662,7 +662,7 @@ int lookup_mount(struct autofs_point *ap, const char *name, int name_len, void * |
||||||
|
return status; |
||||||
|
} |
||||||
|
|
||||||
|
- cache_readlock(mc); |
||||||
|
+ cache_writelock(mc); |
||||||
|
me = cache_lookup(mc, key); |
||||||
|
/* Stale mapent => check for entry in alternate source or wildcard */ |
||||||
|
if (me && !me->mapent) { |
||||||
|
@@ -672,10 +672,21 @@ int lookup_mount(struct autofs_point *ap, const char *name, int name_len, void * |
||||||
|
if (!me) |
||||||
|
me = cache_lookup_distinct(mc, "*"); |
||||||
|
} |
||||||
|
- if (me && me->mapent && (me->source == source || *me->key == '/')) { |
||||||
|
- mapent_len = strlen(me->mapent); |
||||||
|
- mapent = alloca(mapent_len + 1); |
||||||
|
- strcpy(mapent, me->mapent); |
||||||
|
+ if (me && me->mapent) { |
||||||
|
+ /* |
||||||
|
+ * Add wildcard match for later validation checks and |
||||||
|
+ * negative cache lookups. |
||||||
|
+ */ |
||||||
|
+ if (ap->type == LKP_INDIRECT && *me->key == '*') { |
||||||
|
+ ret = cache_update(mc, source, key, me->mapent, me->age); |
||||||
|
+ if (!(ret & (CHE_OK | CHE_UPDATED))) |
||||||
|
+ me = NULL; |
||||||
|
+ } |
||||||
|
+ if (me && (me->source == source || *me->key == '/')) { |
||||||
|
+ mapent_len = strlen(me->mapent); |
||||||
|
+ mapent = alloca(mapent_len + 1); |
||||||
|
+ strcpy(mapent, me->mapent); |
||||||
|
+ } |
||||||
|
} |
||||||
|
cache_unlock(mc); |
||||||
|
|
@ -0,0 +1,57 @@ |
|||||||
|
autofs-5.0.7 - Handle new location of systemd |
||||||
|
|
||||||
|
From: Frederic Crozat <fcrozat@suse.com> |
||||||
|
|
||||||
|
Some distributions are moving systemd unit files from /lib to |
||||||
|
/usr/lib, so we need to test both directories. |
||||||
|
|
||||||
|
edit: imk |
||||||
|
It occurs to me I've forgotten to check for the 64 bit variants |
||||||
|
of the directories, so add them as well. |
||||||
|
end edit: imk |
||||||
|
--- |
||||||
|
|
||||||
|
CHANGELOG | 1 + |
||||||
|
aclocal.m4 | 2 +- |
||||||
|
configure | 2 +- |
||||||
|
3 files changed, 3 insertions(+), 2 deletions(-) |
||||||
|
|
||||||
|
|
||||||
|
diff --git a/CHANGELOG b/CHANGELOG |
||||||
|
index 3bdf8a4..8f6bb3a 100644 |
||||||
|
--- a/CHANGELOG |
||||||
|
+++ b/CHANGELOG |
||||||
|
@@ -14,6 +14,7 @@ |
||||||
|
- allow non root user to check status. |
||||||
|
- fix recursive mount deadlock. |
||||||
|
- increase file map read buffer size. |
||||||
|
+- handle new location of systemd. |
||||||
|
|
||||||
|
25/07/2012 autofs-5.0.7 |
||||||
|
======================= |
||||||
|
diff --git a/aclocal.m4 b/aclocal.m4 |
||||||
|
index 1798c8b..47bca0c 100644 |
||||||
|
--- a/aclocal.m4 |
||||||
|
+++ b/aclocal.m4 |
||||||
|
@@ -234,7 +234,7 @@ AC_DEFUN([AF_WITH_SYSTEMD], |
||||||
|
[if test "$withval" = yes; then |
||||||
|
if test -z "$systemddir"; then |
||||||
|
AC_MSG_CHECKING([location of the systemd unit files directory]) |
||||||
|
- for systemd_d in /lib/systemd/system; do |
||||||
|
+ for systemd_d in /usr/lib/systemd/system /usr/lib64/systemd/system /lib/systemd/system /lib64/systemd/system; do |
||||||
|
if test -z "$systemddir"; then |
||||||
|
if test -d "$systemd_d"; then |
||||||
|
systemddir="$systemd_d" |
||||||
|
diff --git a/configure b/configure |
||||||
|
index ba3bba6..3722a46 100755 |
||||||
|
--- a/configure |
||||||
|
+++ b/configure |
||||||
|
@@ -2157,7 +2157,7 @@ if test "${with_systemd+set}" = set; then : |
||||||
|
if test -z "$systemddir"; then |
||||||
|
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking location of the systemd unit files directory" >&5 |
||||||
|
$as_echo_n "checking location of the systemd unit files directory... " >&6; } |
||||||
|
- for systemd_d in /lib/systemd/system; do |
||||||
|
+ for systemd_d in /usr/lib/systemd/system /usr/lib64/systemd/system /lib/systemd/system /lib64/systemd/system; do |
||||||
|
if test -z "$systemddir"; then |
||||||
|
if test -d "$systemd_d"; then |
||||||
|
systemddir="$systemd_d" |
@ -0,0 +1,84 @@ |
|||||||
|
autofs-5.0.7 - improve timeout option description |
||||||
|
|
||||||
|
From: Ian Kent <raven@themaw.net> |
||||||
|
|
||||||
|
The description of the configuration option is a little misleading. |
||||||
|
So add some explaination about the internal default and the reason |
||||||
|
the default installed configuration overrides it. |
||||||
|
--- |
||||||
|
CHANGELOG | 1 + |
||||||
|
man/auto.master.5.in | 5 ++++- |
||||||
|
man/automount.8 | 5 ++++- |
||||||
|
redhat/autofs.sysconfig.in | 5 ++++- |
||||||
|
samples/autofs.conf.default.in | 5 ++++- |
||||||
|
5 files changed, 17 insertions(+), 4 deletions(-) |
||||||
|
|
||||||
|
--- autofs-5.0.7.orig/CHANGELOG |
||||||
|
+++ autofs-5.0.7/CHANGELOG |
||||||
|
@@ -65,6 +65,7 @@ |
||||||
|
- fix portmap lookup. |
||||||
|
- only probe specific nfs version if requested. |
||||||
|
- fix ipv6 libtirpc getport. |
||||||
|
+- improve timeout option description. |
||||||
|
|
||||||
|
25/07/2012 autofs-5.0.7 |
||||||
|
======================= |
||||||
|
--- autofs-5.0.7.orig/man/auto.master.5.in |
||||||
|
+++ autofs-5.0.7/man/auto.master.5.in |
||||||
|
@@ -212,7 +212,10 @@ configuration file |
||||||
|
They are: |
||||||
|
.TP |
||||||
|
.B TIMEOUT |
||||||
|
-sets the default mount timeout (program default 600). |
||||||
|
+Sets the default mount timeout in seconds. The internal program |
||||||
|
+default is 10 minutes, but the default installed configuration |
||||||
|
+overrides this and sets the timeout to 5 minutes to be consistent |
||||||
|
+with earlier autofs releases. |
||||||
|
.TP |
||||||
|
.B NEGATIVE_TIMEOUT |
||||||
|
Set the default timeout for caching failed key lookups (program default |
||||||
|
--- autofs-5.0.7.orig/man/automount.8 |
||||||
|
+++ autofs-5.0.7/man/automount.8 |
||||||
|
@@ -29,10 +29,13 @@ Print brief help on program usage. |
||||||
|
.I "\-p, \-\-pid-file" |
||||||
|
Write the pid of the daemon to the specified file. |
||||||
|
.TP |
||||||
|
-.I "\-t, \-\-timeout" |
||||||
|
+.I "\-t <seconds>, \-\-timeout <seconds>" |
||||||
|
Set the global minimum timeout, in seconds, until directories |
||||||
|
are unmounted. The default is 10 minutes. Setting the timeout |
||||||
|
to zero disables umounts completely. |
||||||
|
+The internal program default is 10 minutes, but the default |
||||||
|
+installed configuration overrides this and sets the timeout |
||||||
|
+to 5 minutes to be consistent with earlier autofs releases. |
||||||
|
.TP |
||||||
|
.I "\-n <seconds>, \-\-negative\-timeout <seconds>" |
||||||
|
Set the default timeout for caching failed key lookups. The default is 60 seconds. |
||||||
|
--- autofs-5.0.7.orig/redhat/autofs.sysconfig.in |
||||||
|
+++ autofs-5.0.7/redhat/autofs.sysconfig.in |
||||||
|
@@ -5,7 +5,10 @@ |
||||||
|
# |
||||||
|
#MASTER_MAP_NAME="auto.master" |
||||||
|
# |
||||||
|
-# TIMEOUT - set the default mount timeout (default 600). |
||||||
|
+# TIMEOUT - set the default mount timeout in secons. The internal |
||||||
|
+# program default is 10 minutes, but the default installed |
||||||
|
+# configuration overrides this and sets the timeout to 5 |
||||||
|
+# minutes to be consistent with earlier autofs releases. |
||||||
|
# |
||||||
|
TIMEOUT=300 |
||||||
|
# |
||||||
|
--- autofs-5.0.7.orig/samples/autofs.conf.default.in |
||||||
|
+++ autofs-5.0.7/samples/autofs.conf.default.in |
||||||
|
@@ -5,7 +5,10 @@ |
||||||
|
# |
||||||
|
#MASTER_MAP_NAME="auto.master" |
||||||
|
# |
||||||
|
-# TIMEOUT - set the default mount timeout (default 600). |
||||||
|
+# TIMEOUT - set the default mount timeout in secons. The internal |
||||||
|
+# program default is 10 minutes, but the default installed |
||||||
|
+# configuration overrides this and sets the timeout to 5 |
||||||
|
+# minutes to be consistent with earlier autofs releases. |
||||||
|
# |
||||||
|
TIMEOUT=300 |
||||||
|
# |
@ -0,0 +1,25 @@ |
|||||||
|
autofs-5.0.7 - include usage in usage message |
||||||
|
|
||||||
|
From: Ian Kent <ikent@redhat.com> |
||||||
|
|
||||||
|
Since usage is a case entry we should also nclude it in the usage |
||||||
|
message. |
||||||
|
--- |
||||||
|
|
||||||
|
redhat/autofs.init.in | 2 +- |
||||||
|
1 files changed, 1 insertions(+), 1 deletions(-) |
||||||
|
|
||||||
|
|
||||||
|
diff --git a/redhat/autofs.init.in b/redhat/autofs.init.in |
||||||
|
index 8e355da..ec6d5d6 100644 |
||||||
|
--- a/redhat/autofs.init.in |
||||||
|
+++ b/redhat/autofs.init.in |
||||||
|
@@ -155,7 +155,7 @@ function reload() { |
||||||
|
} |
||||||
|
|
||||||
|
function usage_message() { |
||||||
|
- echo $"Usage: $0 {start|forcestart|stop|status|restart|force-reload|forcerestart|reload|condrestart|try-restart}" |
||||||
|
+ echo $"Usage: $0 {start|forcestart|stop|status|restart|force-reload|forcerestart|reload|condrestart|try-restart|usage}" |
||||||
|
} |
||||||
|
|
||||||
|
RETVAL=0 |
@ -0,0 +1,448 @@ |
|||||||
|
autofs-5.0.7 - lib/defaults.c: use WITH_LDAP conditional around LDAP types |
||||||
|
|
||||||
|
From: Chris Packham <chris.packham@alliedtelesis.co.nz> |
||||||
|
|
||||||
|
Wrap the inclusion of lookup_ldap.h and functions that use ldap_uri or |
||||||
|
ldap_schema with the WITH_LDAP conditional. WITH_LDAP is set by the |
||||||
|
configure step when LDAP support is not desired. This also allows |
||||||
|
compilation on a system that doesn't have any LDAP libraries. |
||||||
|
--- |
||||||
|
|
||||||
|
CHANGELOG | 1 |
||||||
|
include/defaults.h | 14 +- |
||||||
|
include/lookup_ldap.h | 1 |
||||||
|
lib/defaults.c | 325 +++++++++++++++++++++++++------------------------ |
||||||
|
modules/lookup_ldap.c | 1 |
||||||
|
5 files changed, 175 insertions(+), 167 deletions(-) |
||||||
|
|
||||||
|
|
||||||
|
diff --git a/CHANGELOG b/CHANGELOG |
||||||
|
index ba1d65b..1130db6 100644 |
||||||
|
--- a/CHANGELOG |
||||||
|
+++ b/CHANGELOG |
||||||
|
@@ -24,6 +24,7 @@ |
||||||
|
- don't use dirent d_type to filter out files in scandir() |
||||||
|
- don't schedule new alarms after readmap. |
||||||
|
- use numeric protocol ids instead of protoent structs. |
||||||
|
+- lib/defaults.c: use WITH_LDAP conditional around LDAP types. |
||||||
|
|
||||||
|
25/07/2012 autofs-5.0.7 |
||||||
|
======================= |
||||||
|
diff --git a/include/defaults.h b/include/defaults.h |
||||||
|
index cda2174..871e14b 100644 |
||||||
|
--- a/include/defaults.h |
||||||
|
+++ b/include/defaults.h |
||||||
|
@@ -44,8 +44,16 @@ |
||||||
|
|
||||||
|
#define DEFAULT_MAP_HASH_TABLE_SIZE 1024 |
||||||
|
|
||||||
|
+#ifdef WITH_LDAP |
||||||
|
struct ldap_schema; |
||||||
|
struct ldap_searchdn; |
||||||
|
+void defaults_free_uris(struct list_head *); |
||||||
|
+struct list_head *defaults_get_uris(void); |
||||||
|
+struct ldap_schema *defaults_get_default_schema(void); |
||||||
|
+void defaults_free_searchdns(struct ldap_searchdn *); |
||||||
|
+struct ldap_searchdn *defaults_get_searchdns(void); |
||||||
|
+struct ldap_schema *defaults_get_schema(void); |
||||||
|
+#endif |
||||||
|
|
||||||
|
unsigned int defaults_read_config(unsigned int); |
||||||
|
const char *defaults_get_master_map(void); |
||||||
|
@@ -57,12 +65,6 @@ unsigned int defaults_get_logging(void); |
||||||
|
const char *defaults_get_ldap_server(void); |
||||||
|
unsigned int defaults_get_ldap_timeout(void); |
||||||
|
unsigned int defaults_get_ldap_network_timeout(void); |
||||||
|
-struct list_head *defaults_get_uris(void); |
||||||
|
-void defaults_free_uris(struct list_head *); |
||||||
|
-struct ldap_schema *defaults_get_default_schema(void); |
||||||
|
-struct ldap_schema *defaults_get_schema(void); |
||||||
|
-struct ldap_searchdn *defaults_get_searchdns(void); |
||||||
|
-void defaults_free_searchdns(struct ldap_searchdn *); |
||||||
|
unsigned int defaults_get_mount_nfs_default_proto(void); |
||||||
|
unsigned int defaults_get_append_options(void); |
||||||
|
unsigned int defaults_get_mount_wait(void); |
||||||
|
diff --git a/include/lookup_ldap.h b/include/lookup_ldap.h |
||||||
|
index e441a61..9a4ce73 100644 |
||||||
|
--- a/include/lookup_ldap.h |
||||||
|
+++ b/include/lookup_ldap.h |
||||||
|
@@ -8,7 +8,6 @@ |
||||||
|
#include <openssl/evp.h> |
||||||
|
#include <openssl/err.h> |
||||||
|
#include <sasl/sasl.h> |
||||||
|
-#include <libxml/tree.h> |
||||||
|
#include <krb5.h> |
||||||
|
#endif |
||||||
|
|
||||||
|
diff --git a/lib/defaults.c b/lib/defaults.c |
||||||
|
index 5ce71b7..ae1162f 100644 |
||||||
|
--- a/lib/defaults.c |
||||||
|
+++ b/lib/defaults.c |
||||||
|
@@ -17,9 +17,12 @@ |
||||||
|
#include <ctype.h> |
||||||
|
#include <string.h> |
||||||
|
|
||||||
|
+#include "config.h" |
||||||
|
#include "list.h" |
||||||
|
#include "defaults.h" |
||||||
|
+#ifdef WITH_LDAP |
||||||
|
#include "lookup_ldap.h" |
||||||
|
+#endif |
||||||
|
#include "log.h" |
||||||
|
#include "automount.h" |
||||||
|
|
||||||
|
@@ -197,6 +200,7 @@ static int parse_line(char *line, char **res, char **value) |
||||||
|
return 1; |
||||||
|
} |
||||||
|
|
||||||
|
+#ifdef WITH_LDAP |
||||||
|
void defaults_free_uris(struct list_head *list) |
||||||
|
{ |
||||||
|
struct list_head *next; |
||||||
|
@@ -290,166 +294,6 @@ struct list_head *defaults_get_uris(void) |
||||||
|
return list; |
||||||
|
} |
||||||
|
|
||||||
|
-/* |
||||||
|
- * Read config env variables and check they have been set. |
||||||
|
- * |
||||||
|
- * This simple minded routine assumes the config file |
||||||
|
- * is valid bourne shell script without spaces around "=" |
||||||
|
- * and that it has valid values. |
||||||
|
- */ |
||||||
|
-unsigned int defaults_read_config(unsigned int to_syslog) |
||||||
|
-{ |
||||||
|
- FILE *f; |
||||||
|
- char buf[MAX_LINE_LEN]; |
||||||
|
- char *res; |
||||||
|
- |
||||||
|
- f = open_fopen_r(DEFAULTS_CONFIG_FILE); |
||||||
|
- if (!f) |
||||||
|
- return 0; |
||||||
|
- |
||||||
|
- while ((res = fgets(buf, MAX_LINE_LEN, f))) { |
||||||
|
- char *key, *value; |
||||||
|
- |
||||||
|
- if (!parse_line(res, &key, &value)) |
||||||
|
- continue; |
||||||
|
- |
||||||
|
- if (check_set_config_value(key, ENV_NAME_MASTER_MAP, value, to_syslog) || |
||||||
|
- check_set_config_value(key, ENV_NAME_TIMEOUT, value, to_syslog) || |
||||||
|
- check_set_config_value(key, ENV_NAME_NEGATIVE_TIMEOUT, value, to_syslog) || |
||||||
|
- check_set_config_value(key, ENV_NAME_BROWSE_MODE, value, to_syslog) || |
||||||
|
- check_set_config_value(key, ENV_NAME_LOGGING, value, to_syslog) || |
||||||
|
- check_set_config_value(key, ENV_LDAP_TIMEOUT, value, to_syslog) || |
||||||
|
- check_set_config_value(key, ENV_LDAP_NETWORK_TIMEOUT, value, to_syslog) || |
||||||
|
- check_set_config_value(key, ENV_NAME_MAP_OBJ_CLASS, value, to_syslog) || |
||||||
|
- check_set_config_value(key, ENV_NAME_ENTRY_OBJ_CLASS, value, to_syslog) || |
||||||
|
- check_set_config_value(key, ENV_NAME_MAP_ATTR, value, to_syslog) || |
||||||
|
- check_set_config_value(key, ENV_NAME_ENTRY_ATTR, value, to_syslog) || |
||||||
|
- check_set_config_value(key, ENV_NAME_VALUE_ATTR, value, to_syslog) || |
||||||
|
- check_set_config_value(key, ENV_APPEND_OPTIONS, value, to_syslog) || |
||||||
|
- check_set_config_value(key, ENV_MOUNT_WAIT, value, to_syslog) || |
||||||
|
- check_set_config_value(key, ENV_UMOUNT_WAIT, value, to_syslog) || |
||||||
|
- check_set_config_value(key, ENV_AUTH_CONF_FILE, value, to_syslog) || |
||||||
|
- check_set_config_value(key, ENV_MAP_HASH_TABLE_SIZE, value, to_syslog) || |
||||||
|
- check_set_config_value(key, ENV_MOUNT_NFS_DEFAULT_PROTOCOL, value, to_syslog)) |
||||||
|
- ; |
||||||
|
- } |
||||||
|
- |
||||||
|
- if (!feof(f) || ferror(f)) { |
||||||
|
- if (!to_syslog) { |
||||||
|
- fprintf(stderr, |
||||||
|
- "fgets returned error %d while reading %s\n", |
||||||
|
- ferror(f), DEFAULTS_CONFIG_FILE); |
||||||
|
- } else { |
||||||
|
- logmsg("fgets returned error %d while reading %s", |
||||||
|
- ferror(f), DEFAULTS_CONFIG_FILE); |
||||||
|
- } |
||||||
|
- fclose(f); |
||||||
|
- return 0; |
||||||
|
- } |
||||||
|
- |
||||||
|
- fclose(f); |
||||||
|
- return 1; |
||||||
|
-} |
||||||
|
- |
||||||
|
-const char *defaults_get_master_map(void) |
||||||
|
-{ |
||||||
|
- char *master; |
||||||
|
- |
||||||
|
- master = get_env_string(ENV_NAME_MASTER_MAP); |
||||||
|
- if (!master) |
||||||
|
- return strdup(default_master_map_name); |
||||||
|
- |
||||||
|
- return (const char *) master; |
||||||
|
-} |
||||||
|
- |
||||||
|
-int defaults_master_set(void) |
||||||
|
-{ |
||||||
|
- char *val = getenv(ENV_NAME_MASTER_MAP); |
||||||
|
- if (!val) |
||||||
|
- return 0; |
||||||
|
- |
||||||
|
- return 1; |
||||||
|
-} |
||||||
|
- |
||||||
|
-unsigned int defaults_get_timeout(void) |
||||||
|
-{ |
||||||
|
- long timeout; |
||||||
|
- |
||||||
|
- timeout = get_env_number(ENV_NAME_TIMEOUT); |
||||||
|
- if (timeout < 0) |
||||||
|
- timeout = DEFAULT_TIMEOUT; |
||||||
|
- |
||||||
|
- return (unsigned int) timeout; |
||||||
|
-} |
||||||
|
- |
||||||
|
-unsigned int defaults_get_negative_timeout(void) |
||||||
|
-{ |
||||||
|
- long n_timeout; |
||||||
|
- |
||||||
|
- n_timeout = get_env_number(ENV_NAME_NEGATIVE_TIMEOUT); |
||||||
|
- if (n_timeout <= 0) |
||||||
|
- n_timeout = DEFAULT_NEGATIVE_TIMEOUT; |
||||||
|
- |
||||||
|
- return (unsigned int) n_timeout; |
||||||
|
-} |
||||||
|
- |
||||||
|
-unsigned int defaults_get_browse_mode(void) |
||||||
|
-{ |
||||||
|
- int res; |
||||||
|
- |
||||||
|
- res = get_env_yesno(ENV_NAME_BROWSE_MODE); |
||||||
|
- if (res < 0) |
||||||
|
- res = DEFAULT_BROWSE_MODE; |
||||||
|
- |
||||||
|
- return res; |
||||||
|
-} |
||||||
|
- |
||||||
|
-unsigned int defaults_get_logging(void) |
||||||
|
-{ |
||||||
|
- char *res; |
||||||
|
- unsigned int logging = DEFAULT_LOGGING; |
||||||
|
- |
||||||
|
- res = get_env_string(ENV_NAME_LOGGING); |
||||||
|
- if (!res) |
||||||
|
- return logging; |
||||||
|
- |
||||||
|
- if (!strcasecmp(res, "none")) |
||||||
|
- logging = DEFAULT_LOGGING; |
||||||
|
- else { |
||||||
|
- if (!strcasecmp(res, "verbose")) |
||||||
|
- logging |= LOGOPT_VERBOSE; |
||||||
|
- |
||||||
|
- if (!strcasecmp(res, "debug")) |
||||||
|
- logging |= LOGOPT_DEBUG; |
||||||
|
- } |
||||||
|
- |
||||||
|
- free(res); |
||||||
|
- |
||||||
|
- return logging; |
||||||
|
-} |
||||||
|
- |
||||||
|
-unsigned int defaults_get_ldap_timeout(void) |
||||||
|
-{ |
||||||
|
- int res; |
||||||
|
- |
||||||
|
- res = get_env_number(ENV_LDAP_TIMEOUT); |
||||||
|
- if (res < 0) |
||||||
|
- res = DEFAULT_LDAP_TIMEOUT; |
||||||
|
- |
||||||
|
- return res; |
||||||
|
-} |
||||||
|
- |
||||||
|
-unsigned int defaults_get_ldap_network_timeout(void) |
||||||
|
-{ |
||||||
|
- int res; |
||||||
|
- |
||||||
|
- res = get_env_number(ENV_LDAP_NETWORK_TIMEOUT); |
||||||
|
- if (res < 0) |
||||||
|
- res = DEFAULT_LDAP_NETWORK_TIMEOUT; |
||||||
|
- |
||||||
|
- return res; |
||||||
|
-} |
||||||
|
- |
||||||
|
struct ldap_schema *defaults_get_default_schema(void) |
||||||
|
{ |
||||||
|
struct ldap_schema *schema; |
||||||
|
@@ -645,6 +489,167 @@ struct ldap_schema *defaults_get_schema(void) |
||||||
|
|
||||||
|
return schema; |
||||||
|
} |
||||||
|
+#endif |
||||||
|
+ |
||||||
|
+/* |
||||||
|
+ * Read config env variables and check they have been set. |
||||||
|
+ * |
||||||
|
+ * This simple minded routine assumes the config file |
||||||
|
+ * is valid bourne shell script without spaces around "=" |
||||||
|
+ * and that it has valid values. |
||||||
|
+ */ |
||||||
|
+unsigned int defaults_read_config(unsigned int to_syslog) |
||||||
|
+{ |
||||||
|
+ FILE *f; |
||||||
|
+ char buf[MAX_LINE_LEN]; |
||||||
|
+ char *res; |
||||||
|
+ |
||||||
|
+ f = open_fopen_r(DEFAULTS_CONFIG_FILE); |
||||||
|
+ if (!f) |
||||||
|
+ return 0; |
||||||
|
+ |
||||||
|
+ while ((res = fgets(buf, MAX_LINE_LEN, f))) { |
||||||
|
+ char *key, *value; |
||||||
|
+ |
||||||
|
+ if (!parse_line(res, &key, &value)) |
||||||
|
+ continue; |
||||||
|
+ |
||||||
|
+ if (check_set_config_value(key, ENV_NAME_MASTER_MAP, value, to_syslog) || |
||||||
|
+ check_set_config_value(key, ENV_NAME_TIMEOUT, value, to_syslog) || |
||||||
|
+ check_set_config_value(key, ENV_NAME_NEGATIVE_TIMEOUT, value, to_syslog) || |
||||||
|
+ check_set_config_value(key, ENV_NAME_BROWSE_MODE, value, to_syslog) || |
||||||
|
+ check_set_config_value(key, ENV_NAME_LOGGING, value, to_syslog) || |
||||||
|
+ check_set_config_value(key, ENV_LDAP_TIMEOUT, value, to_syslog) || |
||||||
|
+ check_set_config_value(key, ENV_LDAP_NETWORK_TIMEOUT, value, to_syslog) || |
||||||
|
+ check_set_config_value(key, ENV_NAME_MAP_OBJ_CLASS, value, to_syslog) || |
||||||
|
+ check_set_config_value(key, ENV_NAME_ENTRY_OBJ_CLASS, value, to_syslog) || |
||||||
|
+ check_set_config_value(key, ENV_NAME_MAP_ATTR, value, to_syslog) || |
||||||
|
+ check_set_config_value(key, ENV_NAME_ENTRY_ATTR, value, to_syslog) || |
||||||
|
+ check_set_config_value(key, ENV_NAME_VALUE_ATTR, value, to_syslog) || |
||||||
|
+ check_set_config_value(key, ENV_APPEND_OPTIONS, value, to_syslog) || |
||||||
|
+ check_set_config_value(key, ENV_MOUNT_WAIT, value, to_syslog) || |
||||||
|
+ check_set_config_value(key, ENV_UMOUNT_WAIT, value, to_syslog) || |
||||||
|
+ check_set_config_value(key, ENV_AUTH_CONF_FILE, value, to_syslog) || |
||||||
|
+ check_set_config_value(key, ENV_MAP_HASH_TABLE_SIZE, value, to_syslog) || |
||||||
|
+ check_set_config_value(key, ENV_MOUNT_NFS_DEFAULT_PROTOCOL, value, to_syslog)) |
||||||
|
+ ; |
||||||
|
+ } |
||||||
|
+ |
||||||
|
+ if (!feof(f) || ferror(f)) { |
||||||
|
+ if (!to_syslog) { |
||||||
|
+ fprintf(stderr, |
||||||
|
+ "fgets returned error %d while reading %s\n", |
||||||
|
+ ferror(f), DEFAULTS_CONFIG_FILE); |
||||||
|
+ } else { |
||||||
|
+ logmsg("fgets returned error %d while reading %s", |
||||||
|
+ ferror(f), DEFAULTS_CONFIG_FILE); |
||||||
|
+ } |
||||||
|
+ fclose(f); |
||||||
|
+ return 0; |
||||||
|
+ } |
||||||
|
+ |
||||||
|
+ fclose(f); |
||||||
|
+ return 1; |
||||||
|
+} |
||||||
|
+ |
||||||
|
+const char *defaults_get_master_map(void) |
||||||
|
+{ |
||||||
|
+ char *master; |
||||||
|
+ |
||||||
|
+ master = get_env_string(ENV_NAME_MASTER_MAP); |
||||||
|
+ if (!master) |
||||||
|
+ return strdup(default_master_map_name); |
||||||
|
+ |
||||||
|
+ return (const char *) master; |
||||||
|
+} |
||||||
|
+ |
||||||
|
+int defaults_master_set(void) |
||||||
|
+{ |
||||||
|
+ char *val = getenv(ENV_NAME_MASTER_MAP); |
||||||
|
+ if (!val) |
||||||
|
+ return 0; |
||||||
|
+ |
||||||
|
+ return 1; |
||||||
|
+} |
||||||
|
+ |
||||||
|
+unsigned int defaults_get_timeout(void) |
||||||
|
+{ |
||||||
|
+ long timeout; |
||||||
|
+ |
||||||
|
+ timeout = get_env_number(ENV_NAME_TIMEOUT); |
||||||
|
+ if (timeout < 0) |
||||||
|
+ timeout = DEFAULT_TIMEOUT; |
||||||
|
+ |
||||||
|
+ return (unsigned int) timeout; |
||||||
|
+} |
||||||
|
+ |
||||||
|
+unsigned int defaults_get_negative_timeout(void) |
||||||
|
+{ |
||||||
|
+ long n_timeout; |
||||||
|
+ |
||||||
|
+ n_timeout = get_env_number(ENV_NAME_NEGATIVE_TIMEOUT); |
||||||
|
+ if (n_timeout <= 0) |
||||||
|
+ n_timeout = DEFAULT_NEGATIVE_TIMEOUT; |
||||||
|
+ |
||||||
|
+ return (unsigned int) n_timeout; |
||||||
|
+} |
||||||
|
+ |
||||||
|
+unsigned int defaults_get_browse_mode(void) |
||||||
|
+{ |
||||||
|
+ int res; |
||||||
|
+ |
||||||
|
+ res = get_env_yesno(ENV_NAME_BROWSE_MODE); |
||||||
|
+ if (res < 0) |
||||||
|
+ res = DEFAULT_BROWSE_MODE; |
||||||
|
+ |
||||||
|
+ return res; |
||||||
|
+} |
||||||
|
+ |
||||||
|
+unsigned int defaults_get_logging(void) |
||||||
|
+{ |
||||||
|
+ char *res; |
||||||
|
+ unsigned int logging = DEFAULT_LOGGING; |
||||||
|
+ |
||||||
|
+ res = get_env_string(ENV_NAME_LOGGING); |
||||||
|
+ if (!res) |
||||||
|
+ return logging; |
||||||
|
+ |
||||||
|
+ if (!strcasecmp(res, "none")) |
||||||
|
+ logging = DEFAULT_LOGGING; |
||||||
|
+ else { |
||||||
|
+ if (!strcasecmp(res, "verbose")) |
||||||
|
+ logging |= LOGOPT_VERBOSE; |
||||||
|
+ |
||||||
|
+ if (!strcasecmp(res, "debug")) |
||||||
|
+ logging |= LOGOPT_DEBUG; |
||||||
|
+ } |
||||||
|
+ |
||||||
|
+ free(res); |
||||||
|
+ |
||||||
|
+ return logging; |
||||||
|
+} |
||||||
|
+ |
||||||
|
+unsigned int defaults_get_ldap_timeout(void) |
||||||
|
+{ |
||||||
|
+ int res; |
||||||
|
+ |
||||||
|
+ res = get_env_number(ENV_LDAP_TIMEOUT); |
||||||
|
+ if (res < 0) |
||||||
|
+ res = DEFAULT_LDAP_TIMEOUT; |
||||||
|
+ |
||||||
|
+ return res; |
||||||
|
+} |
||||||
|
+ |
||||||
|
+unsigned int defaults_get_ldap_network_timeout(void) |
||||||
|
+{ |
||||||
|
+ int res; |
||||||
|
+ |
||||||
|
+ res = get_env_number(ENV_LDAP_NETWORK_TIMEOUT); |
||||||
|
+ if (res < 0) |
||||||
|
+ res = DEFAULT_LDAP_NETWORK_TIMEOUT; |
||||||
|
+ |
||||||
|
+ return res; |
||||||
|
+} |
||||||
|
|
||||||
|
unsigned int defaults_get_mount_nfs_default_proto(void) |
||||||
|
{ |
||||||
|
diff --git a/modules/lookup_ldap.c b/modules/lookup_ldap.c |
||||||
|
index 3bc4dc5..431e50d 100644 |
||||||
|
--- a/modules/lookup_ldap.c |
||||||
|
+++ b/modules/lookup_ldap.c |
||||||
|
@@ -28,6 +28,7 @@ |
||||||
|
#include <arpa/nameser.h> |
||||||
|
#include <resolv.h> |
||||||
|
#include <lber.h> |
||||||
|
+#include <libxml/tree.h> |
||||||
|
|
||||||
|
#define MODULE_LOOKUP |
||||||
|
#include "automount.h" |
@ -0,0 +1,57 @@ |
|||||||
|
autofs-5.0.7 - make description of default MOUNT_WAIT setting clear |
||||||
|
|
||||||
|
From: Ian Kent <ikent@redhat.com> |
||||||
|
|
||||||
|
|
||||||
|
--- |
||||||
|
|
||||||
|
CHANGELOG | 1 + |
||||||
|
redhat/autofs.sysconfig.in | 5 +++-- |
||||||
|
samples/autofs.conf.default.in | 5 +++-- |
||||||
|
3 files changed, 7 insertions(+), 4 deletions(-) |
||||||
|
|
||||||
|
|
||||||
|
diff --git a/CHANGELOG b/CHANGELOG |
||||||
|
index 79cf673..961e340 100644 |
||||||
|
--- a/CHANGELOG |
||||||
|
+++ b/CHANGELOG |
||||||
|
@@ -8,6 +8,7 @@ |
||||||
|
- dont wait forever to restart. |
||||||
|
- add timeout option description to man page. |
||||||
|
- fix null map entry order handling. |
||||||
|
+- make description of default MOUNT_WAIT setting clear. |
||||||
|
|
||||||
|
25/07/2012 autofs-5.0.7 |
||||||
|
======================= |
||||||
|
diff --git a/redhat/autofs.sysconfig.in b/redhat/autofs.sysconfig.in |
||||||
|
index 36b924d..a8992c4 100644 |
||||||
|
--- a/redhat/autofs.sysconfig.in |
||||||
|
+++ b/redhat/autofs.sysconfig.in |
||||||
|
@@ -18,8 +18,9 @@ TIMEOUT=300 |
||||||
|
# Setting this timeout can cause problems when |
||||||
|
# mount would otherwise wait for a server that |
||||||
|
# is temporarily unavailable, such as when it's |
||||||
|
-# restarting. The defailt of waiting for mount(8) |
||||||
|
-# usually results in a wait of around 3 minutes. |
||||||
|
+# restarting. The default setting (-1) of waiting |
||||||
|
+# for mount(8) usually results in a wait of around |
||||||
|
+# 3 minutes. |
||||||
|
# |
||||||
|
#MOUNT_WAIT=-1 |
||||||
|
# |
||||||
|
diff --git a/samples/autofs.conf.default.in b/samples/autofs.conf.default.in |
||||||
|
index ac2f63b..1da89cf 100644 |
||||||
|
--- a/samples/autofs.conf.default.in |
||||||
|
+++ b/samples/autofs.conf.default.in |
||||||
|
@@ -18,8 +18,9 @@ TIMEOUT=300 |
||||||
|
# Setting this timeout can cause problems when |
||||||
|
# mount would otherwise wait for a server that |
||||||
|
# is temporarily unavailable, such as when it's |
||||||
|
-# restarting. The defailt of waiting for mount(8) |
||||||
|
-# usually results in a wait of around 3 minutes. |
||||||
|
+# restarting. The default setting (-1) of waiting |
||||||
|
+# for mount(8) usually results in a wait of around |
||||||
|
+# 3 minutes. |
||||||
|
# |
||||||
|
#MOUNT_WAIT=-1 |
||||||
|
# |
@ -0,0 +1,64 @@ |
|||||||
|
autofs-5.0.7 - make dump maps check for duplicate indirect mounts |
||||||
|
|
||||||
|
From: Ian Kent <raven@themaw.net> |
||||||
|
|
||||||
|
The dumpmaps function was intended for users to find out how the configured |
||||||
|
mounts would be seen by automount. It does a limited amount of checking and |
||||||
|
in particular doesn't report that duplicate indirect map sources will be |
||||||
|
ignored at runtime. |
||||||
|
--- |
||||||
|
CHANGELOG | 1 + |
||||||
|
lib/master.c | 7 +++++++ |
||||||
|
2 files changed, 8 insertions(+) |
||||||
|
|
||||||
|
diff --git a/CHANGELOG b/CHANGELOG |
||||||
|
index 4106e7f..4576d47 100644 |
||||||
|
--- a/CHANGELOG |
||||||
|
+++ b/CHANGELOG |
||||||
|
@@ -40,6 +40,7 @@ |
||||||
|
- fix some automount(8) typos. |
||||||
|
- syncronize handle_mounts() shutdown. |
||||||
|
- fix submount tree not all expiring. |
||||||
|
+- make dump maps check for duplicate indirect mounts. |
||||||
|
|
||||||
|
25/07/2012 autofs-5.0.7 |
||||||
|
======================= |
||||||
|
diff --git a/lib/master.c b/lib/master.c |
||||||
|
index 64dbcb1..eca3523 100644 |
||||||
|
--- a/lib/master.c |
||||||
|
+++ b/lib/master.c |
||||||
|
@@ -1310,6 +1310,7 @@ int master_show_mounts(struct master *master) |
||||||
|
struct master_mapent *this; |
||||||
|
struct autofs_point *ap; |
||||||
|
time_t now = time(NULL); |
||||||
|
+ unsigned int count = 0; |
||||||
|
int i; |
||||||
|
|
||||||
|
this = list_entry(p, struct master_mapent, list); |
||||||
|
@@ -1318,6 +1319,7 @@ int master_show_mounts(struct master *master) |
||||||
|
ap = this->ap; |
||||||
|
|
||||||
|
printf("\nMount point: %s\n", ap->path); |
||||||
|
+ |
||||||
|
printf("\nsource(s):\n"); |
||||||
|
|
||||||
|
/* |
||||||
|
@@ -1360,6 +1362,9 @@ int master_show_mounts(struct master *master) |
||||||
|
printf(" map: %s\n", source->argv[0]); |
||||||
|
i = 1; |
||||||
|
} |
||||||
|
+ if (count && ap->type == LKP_INDIRECT) |
||||||
|
+ printf(" duplicate indirect map entry" |
||||||
|
+ " will be ignored at run time\n"); |
||||||
|
if (source->argc > 1) { |
||||||
|
printf(" arguments: "); |
||||||
|
for (; i < source->argc; i++) |
||||||
|
@@ -1379,6 +1384,8 @@ int master_show_mounts(struct master *master) |
||||||
|
} while ((me = cache_lookup_next(source->mc, me))); |
||||||
|
} |
||||||
|
|
||||||
|
+ count++; |
||||||
|
+ |
||||||
|
source = source->next; |
||||||
|
} |
||||||
|
|
@ -0,0 +1,156 @@ |
|||||||
|
autofs-5.0.7 - make yellow pages support optional |
||||||
|
|
||||||
|
From: Chris Packham <chris.packham@alliedtelesis.co.nz> |
||||||
|
|
||||||
|
If rpcsvc/ypclnt.h is not available don't compile in Yellow Pages |
||||||
|
support. |
||||||
|
--- |
||||||
|
|
||||||
|
CHANGELOG | 1 + |
||||||
|
Makefile.conf.in | 3 +++ |
||||||
|
configure | 16 ++++++++++++++++ |
||||||
|
configure.in | 9 +++++++++ |
||||||
|
include/config.h.in | 3 +++ |
||||||
|
lib/rpc_subs.c | 1 - |
||||||
|
modules/Makefile | 9 +++++++-- |
||||||
|
7 files changed, 39 insertions(+), 3 deletions(-) |
||||||
|
|
||||||
|
|
||||||
|
diff --git a/CHANGELOG b/CHANGELOG |
||||||
|
index 1130db6..ed17163 100644 |
||||||
|
--- a/CHANGELOG |
||||||
|
+++ b/CHANGELOG |
||||||
|
@@ -25,6 +25,7 @@ |
||||||
|
- don't schedule new alarms after readmap. |
||||||
|
- use numeric protocol ids instead of protoent structs. |
||||||
|
- lib/defaults.c: use WITH_LDAP conditional around LDAP types. |
||||||
|
+- make yellow pages support optional. |
||||||
|
|
||||||
|
25/07/2012 autofs-5.0.7 |
||||||
|
======================= |
||||||
|
diff --git a/Makefile.conf.in b/Makefile.conf.in |
||||||
|
index 802318b..3766d45 100644 |
||||||
|
--- a/Makefile.conf.in |
||||||
|
+++ b/Makefile.conf.in |
||||||
|
@@ -43,6 +43,9 @@ NISPLUS = @HAVE_NISPLUS@ |
||||||
|
# SMBFS support: yes (1) no (0) |
||||||
|
SMBFS = @HAVE_SMBMOUNT@ |
||||||
|
|
||||||
|
+# YellowPages support: yes (1) no (0) |
||||||
|
+YPCLNT = @HAVE_YPCLNT@ |
||||||
|
+ |
||||||
|
# Support for calling e2fsck when mounting ext2 filesystems |
||||||
|
EXT2FS = @HAVE_E2FSCK@ |
||||||
|
|
||||||
|
diff --git a/configure b/configure |
||||||
|
index 3722a46..cf6428c 100755 |
||||||
|
--- a/configure |
||||||
|
+++ b/configure |
||||||
|
@@ -614,6 +614,7 @@ XML_FLAGS |
||||||
|
LIBLDAP |
||||||
|
HAVE_LDAP |
||||||
|
LDAP_FLAGS |
||||||
|
+HAVE_YPCLNT |
||||||
|
HAVE_NISPLUS |
||||||
|
EGREP |
||||||
|
GREP |
||||||
|
@@ -4575,6 +4576,21 @@ fi |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
+# YellowPages support? |
||||||
|
+HAVE_YPCLNT=0 |
||||||
|
+ac_fn_c_check_header_mongrel "$LINENO" "rpcsvc/ypclnt.h" "ac_cv_header_rpcsvc_ypclnt_h" "$ac_includes_default" |
||||||
|
+if test "x$ac_cv_header_rpcsvc_ypclnt_h" = xyes; then : |
||||||
|
+ HAVE_YPCLNT=1 |
||||||
|
+fi |
||||||
|
+ |
||||||
|
+ |
||||||
|
+ |
||||||
|
+if test "$HAVE_YPCLNT" = "1"; then |
||||||
|
+ |
||||||
|
+$as_echo "#define HAVE_YPCLNT 1" >>confdefs.h |
||||||
|
+ |
||||||
|
+fi |
||||||
|
+ |
||||||
|
# |
||||||
|
# OpenLDAP support? Expect that this may have a special directory... |
||||||
|
# |
||||||
|
diff --git a/configure.in b/configure.in |
||||||
|
index 90bda62..363c376 100644 |
||||||
|
--- a/configure.in |
||||||
|
+++ b/configure.in |
||||||
|
@@ -213,6 +213,15 @@ HAVE_NISPLUS=0 |
||||||
|
AC_CHECK_HEADER(rpcsvc/nis.h, HAVE_NISPLUS=1) |
||||||
|
AC_SUBST(HAVE_NISPLUS) |
||||||
|
|
||||||
|
+# YellowPages support? |
||||||
|
+HAVE_YPCLNT=0 |
||||||
|
+AC_CHECK_HEADER([rpcsvc/ypclnt.h], HAVE_YPCLNT=1) |
||||||
|
+AC_SUBST(HAVE_YPCLNT) |
||||||
|
+if test "$HAVE_YPCLNT" = "1"; then |
||||||
|
+ AC_DEFINE(HAVE_YPCLNT, 1, |
||||||
|
+ [Define if using YellowPages]) |
||||||
|
+fi |
||||||
|
+ |
||||||
|
# |
||||||
|
# OpenLDAP support? Expect that this may have a special directory... |
||||||
|
# |
||||||
|
diff --git a/include/config.h.in b/include/config.h.in |
||||||
|
index 9bdf98a..7f1c5b5 100644 |
||||||
|
--- a/include/config.h.in |
||||||
|
+++ b/include/config.h.in |
||||||
|
@@ -72,6 +72,9 @@ |
||||||
|
/* Define to 1 if you have the <unistd.h> header file. */ |
||||||
|
#undef HAVE_UNISTD_H |
||||||
|
|
||||||
|
+/* Define if using YellowPages */ |
||||||
|
+#undef HAVE_YPCLNT |
||||||
|
+ |
||||||
|
/* Use libxml2 tsd usage workaround */ |
||||||
|
#undef LIBXML2_WORKAROUND |
||||||
|
|
||||||
|
diff --git a/lib/rpc_subs.c b/lib/rpc_subs.c |
||||||
|
index ad1d557..718caf9 100644 |
||||||
|
--- a/lib/rpc_subs.c |
||||||
|
+++ b/lib/rpc_subs.c |
||||||
|
@@ -27,7 +27,6 @@ |
||||||
|
#include <net/if.h> |
||||||
|
#include <netinet/in.h> |
||||||
|
#include <arpa/inet.h> |
||||||
|
-#include <rpcsvc/ypclnt.h> |
||||||
|
#include <errno.h> |
||||||
|
#include <sys/ioctl.h> |
||||||
|
#include <ctype.h> |
||||||
|
diff --git a/modules/Makefile b/modules/Makefile |
||||||
|
index 939da7c..c5deb24 100644 |
||||||
|
--- a/modules/Makefile |
||||||
|
+++ b/modules/Makefile |
||||||
|
@@ -5,13 +5,13 @@ |
||||||
|
-include ../Makefile.conf |
||||||
|
include ../Makefile.rules |
||||||
|
|
||||||
|
-SRCS := lookup_yp.c lookup_file.c lookup_program.c lookup_userhome.c \ |
||||||
|
+SRCS := lookup_file.c lookup_program.c lookup_userhome.c \ |
||||||
|
lookup_multi.c lookup_hosts.c lookup_dir.c \ |
||||||
|
parse_sun.c \ |
||||||
|
mount_generic.c mount_nfs.c mount_afs.c mount_autofs.c \ |
||||||
|
mount_changer.c mount_bind.c |
||||||
|
|
||||||
|
-MODS := lookup_yp.so lookup_file.so lookup_program.so lookup_userhome.so \ |
||||||
|
+MODS := lookup_file.so lookup_program.so lookup_userhome.so \ |
||||||
|
lookup_multi.so lookup_hosts.so lookup_dir.so \ |
||||||
|
parse_sun.so \ |
||||||
|
mount_generic.so mount_nfs.so mount_afs.so mount_autofs.so \ |
||||||
|
@@ -37,6 +37,11 @@ ifeq ($(NISPLUS), 1) |
||||||
|
MODS += lookup_nisplus.so |
||||||
|
endif |
||||||
|
|
||||||
|
+ifeq ($(YPCLNT), 1) |
||||||
|
+ SRCS += lookup_yp.c |
||||||
|
+ MODS += lookup_yp.so |
||||||
|
+endif |
||||||
|
+ |
||||||
|
ifeq ($(LDAP), 1) |
||||||
|
SRCS += lookup_ldap.c |
||||||
|
MODS += lookup_ldap.so |
@ -0,0 +1,73 @@ |
|||||||
|
autofs-5.0.7 - misc man page fixes |
||||||
|
|
||||||
|
From: Ian Kent <raven@themaw.net> |
||||||
|
|
||||||
|
- add missing long option for for macro define in automount(8). |
||||||
|
- fix a couple of grammar mistakes in autofs(8). |
||||||
|
- add missing force option to help. |
||||||
|
--- |
||||||
|
CHANGELOG | 1 + |
||||||
|
daemon/automount.c | 1 + |
||||||
|
man/autofs.8.in | 4 ++-- |
||||||
|
man/automount.8 | 2 +- |
||||||
|
4 files changed, 5 insertions(+), 3 deletions(-) |
||||||
|
|
||||||
|
diff --git a/CHANGELOG b/CHANGELOG |
||||||
|
index 0242c11..503a21e 100644 |
||||||
|
--- a/CHANGELOG |
||||||
|
+++ b/CHANGELOG |
||||||
|
@@ -51,6 +51,7 @@ |
||||||
|
- probe each nfs version in turn for singleton mounts. |
||||||
|
- add changlog entry for coverity fixes. |
||||||
|
- fix probe each nfs version in turn for singleton mounts. |
||||||
|
+- misc man page fixes. |
||||||
|
|
||||||
|
25/07/2012 autofs-5.0.7 |
||||||
|
======================= |
||||||
|
diff --git a/daemon/automount.c b/daemon/automount.c |
||||||
|
index 3f9337f..019637f 100644 |
||||||
|
--- a/daemon/automount.c |
||||||
|
+++ b/daemon/automount.c |
||||||
|
@@ -1734,6 +1734,7 @@ static void usage(void) |
||||||
|
" set daemon log verbosity\n" |
||||||
|
" -C --dont-check-daemon\n" |
||||||
|
" don't check if daemon is already running\n" |
||||||
|
+ " -F --force forceably clean up known automounts at start\n" |
||||||
|
" -V --version print version, build config and exit\n" |
||||||
|
, program); |
||||||
|
} |
||||||
|
diff --git a/man/autofs.8.in b/man/autofs.8.in |
||||||
|
index ac0670d..fae0b00 100644 |
||||||
|
--- a/man/autofs.8.in |
||||||
|
+++ b/man/autofs.8.in |
||||||
|
@@ -6,7 +6,7 @@ |
||||||
|
.I start|stop|restart|reload|status |
||||||
|
.SH "DESCRIPTION" |
||||||
|
.B autofs |
||||||
|
-control the operation of the |
||||||
|
+controls the operation of the |
||||||
|
.BR automount (8) |
||||||
|
daemons running on the Linux system. Usually |
||||||
|
.B autofs |
||||||
|
@@ -16,7 +16,7 @@ parameter and at shutdown time with the |
||||||
|
.I stop |
||||||
|
parameter. The |
||||||
|
.B autofs |
||||||
|
-script can also manually be invoked by the system administrator to shut |
||||||
|
+script can also be manually invoked by the system administrator to shut |
||||||
|
down, restart or reload the automounters. |
||||||
|
.P |
||||||
|
.SH "OPERATION" |
||||||
|
diff --git a/man/automount.8 b/man/automount.8 |
||||||
|
index 7cc32c5..844b876 100644 |
||||||
|
--- a/man/automount.8 |
||||||
|
+++ b/man/automount.8 |
||||||
|
@@ -45,7 +45,7 @@ autofs managed mounts. |
||||||
|
Enables logging of general status and progress messages as well as |
||||||
|
debugging messages for all autofs managed mounts. |
||||||
|
.TP |
||||||
|
-.I "\-Dvariable=value" |
||||||
|
+.I "\-Dvariable=value, --define variable=value" |
||||||
|
Define a global macro substitution variable. Global definitions |
||||||
|
are over-ridden macro definitions of the same name specified in |
||||||
|
mount entries. |
@ -0,0 +1,39 @@ |
|||||||
|
autofs-5.0.7 - modules/replicated.c: use sin6_addr.s6_addr32 |
||||||
|
|
||||||
|
From: Chris Packham <chris.packham@alliedtelesis.co.nz> |
||||||
|
|
||||||
|
The exported in6.h kernel header provides a convenience macro s6_addr32 |
||||||
|
for accessing the 32bit words of an ipv6 address. Use this instead of |
||||||
|
__in6_u.__u6_addr32. |
||||||
|
--- |
||||||
|
|
||||||
|
CHANGELOG | 1 + |
||||||
|
modules/replicated.c | 2 +- |
||||||
|
2 files changed, 2 insertions(+), 1 deletions(-) |
||||||
|
|
||||||
|
|
||||||
|
diff --git a/CHANGELOG b/CHANGELOG |
||||||
|
index ed17163..4eaa9f9 100644 |
||||||
|
--- a/CHANGELOG |
||||||
|
+++ b/CHANGELOG |
||||||
|
@@ -26,6 +26,7 @@ |
||||||
|
- use numeric protocol ids instead of protoent structs. |
||||||
|
- lib/defaults.c: use WITH_LDAP conditional around LDAP types. |
||||||
|
- make yellow pages support optional. |
||||||
|
+- modules/replicated.c: use sin6_addr.s6_addr32. |
||||||
|
|
||||||
|
25/07/2012 autofs-5.0.7 |
||||||
|
======================= |
||||||
|
diff --git a/modules/replicated.c b/modules/replicated.c |
||||||
|
index dbd5513..26f64b8 100644 |
||||||
|
--- a/modules/replicated.c |
||||||
|
+++ b/modules/replicated.c |
||||||
|
@@ -1146,7 +1146,7 @@ try_name: |
||||||
|
rr4++; |
||||||
|
} else if (this->ai_family == AF_INET6) { |
||||||
|
struct sockaddr_in6 *addr = (struct sockaddr_in6 *) this->ai_addr; |
||||||
|
- if (!IN6_IS_ADDR_LOOPBACK(addr->sin6_addr.__in6_u.__u6_addr32)) |
||||||
|
+ if (!IN6_IS_ADDR_LOOPBACK(addr->sin6_addr.s6_addr32)) |
||||||
|
rr6++; |
||||||
|
} |
||||||
|
this = this->ai_next; |
@ -0,0 +1,40 @@ |
|||||||
|
autofs-5.0.7 - only probe specific nfs version when requested |
||||||
|
|
||||||
|
From: Ian Kent <raven@themaw.net> |
||||||
|
|
||||||
|
If a specific NFS version is given as an option the set the probe flags |
||||||
|
to probe only that version. |
||||||
|
--- |
||||||
|
CHANGELOG | 1 + |
||||||
|
modules/mount_nfs.c | 10 +++++++++- |
||||||
|
2 files changed, 10 insertions(+), 1 deletion(-) |
||||||
|
|
||||||
|
--- autofs-5.0.7.orig/CHANGELOG |
||||||
|
+++ autofs-5.0.7/CHANGELOG |
||||||
|
@@ -63,6 +63,7 @@ |
||||||
|
- teach dumpmaps to output simple key value pairs. |
||||||
|
- fix get_nfs_info() probe. |
||||||
|
- fix portmap lookup. |
||||||
|
+- only probe specific nfs version if requested. |
||||||
|
|
||||||
|
25/07/2012 autofs-5.0.7 |
||||||
|
======================= |
||||||
|
--- autofs-5.0.7.orig/modules/mount_nfs.c |
||||||
|
+++ autofs-5.0.7/modules/mount_nfs.c |
||||||
|
@@ -146,7 +146,15 @@ int mount_mount(struct autofs_point *ap, |
||||||
|
if (strncmp("vers=4", cp, o_len) == 0 || |
||||||
|
strncmp("nfsvers=4", cp, o_len) == 0) |
||||||
|
vers = NFS4_VERS_MASK | TCP_SUPPORTED; |
||||||
|
- else if (strstr(cp, "port=") == cp && |
||||||
|
+ else if (strncmp("vers=3", cp, o_len) == 0 || |
||||||
|
+ strncmp("nfsvers=3", cp, o_len) == 0) { |
||||||
|
+ vers &= ~(NFS4_VERS_MASK | NFS_VERS_MASK); |
||||||
|
+ vers |= NFS3_REQUESTED; |
||||||
|
+ } else if (strncmp("vers=2", cp, o_len) == 0 || |
||||||
|
+ strncmp("nfsvers=2", cp, o_len) == 0) { |
||||||
|
+ vers &= ~(NFS4_VERS_MASK | NFS_VERS_MASK); |
||||||
|
+ vers |= NFS2_REQUESTED; |
||||||
|
+ } else if (strstr(cp, "port=") == cp && |
||||||
|
o_len - 5 < 25) { |
||||||
|
char optport[25]; |
||||||
|
|
@ -0,0 +1,104 @@ |
|||||||
|
autofs-5.0.7 - probe each nfs version in turn for singleton mounts |
||||||
|
|
||||||
|
From: Ian Kent <raven@themaw.net> |
||||||
|
|
||||||
|
|
||||||
|
--- |
||||||
|
CHANGELOG | 1 + |
||||||
|
include/replicated.h | 2 ++ |
||||||
|
modules/mount_nfs.c | 35 ++++++++++++++++++++++++++++++++++- |
||||||
|
modules/replicated.c | 8 ++++---- |
||||||
|
4 files changed, 41 insertions(+), 5 deletions(-) |
||||||
|
|
||||||
|
diff --git a/CHANGELOG b/CHANGELOG |
||||||
|
index 39d7889..48e9806 100644 |
||||||
|
--- a/CHANGELOG |
||||||
|
+++ b/CHANGELOG |
||||||
|
@@ -48,6 +48,7 @@ |
||||||
|
- fix master map mount options matching. |
||||||
|
- fix master map bogus keywork match. |
||||||
|
- fix fix map entry duplicate offset detection. |
||||||
|
+- probe each nfs version in turn for singleton mounts. |
||||||
|
|
||||||
|
25/07/2012 autofs-5.0.7 |
||||||
|
======================= |
||||||
|
diff --git a/include/replicated.h b/include/replicated.h |
||||||
|
index ff0e7b9..728f131 100644 |
||||||
|
--- a/include/replicated.h |
||||||
|
+++ b/include/replicated.h |
||||||
|
@@ -68,6 +68,8 @@ struct host { |
||||||
|
}; |
||||||
|
|
||||||
|
void seed_random(void); |
||||||
|
+struct host *new_host(const char *, struct sockaddr *, size_t, |
||||||
|
+ unsigned int, unsigned int, unsigned int); |
||||||
|
void free_host_list(struct host **); |
||||||
|
int parse_location(unsigned, struct host **, const char *, unsigned int); |
||||||
|
int prune_host_list(unsigned, struct host **, unsigned int, int); |
||||||
|
diff --git a/modules/mount_nfs.c b/modules/mount_nfs.c |
||||||
|
index 5424d74..81ba3ca 100644 |
||||||
|
--- a/modules/mount_nfs.c |
||||||
|
+++ b/modules/mount_nfs.c |
||||||
|
@@ -180,9 +180,42 @@ int mount_mount(struct autofs_point *ap, const char *root, const char *name, int |
||||||
|
* We can't probe protocol rdma so leave it to mount.nfs(8) |
||||||
|
* and and suffer the delay if a server isn't available. |
||||||
|
*/ |
||||||
|
- if (!rdma) |
||||||
|
+ if (rdma) |
||||||
|
+ goto dont_probe; |
||||||
|
+ |
||||||
|
+ /* |
||||||
|
+ * If this is a singleton mount, and NFSv4 only hasn't been asked |
||||||
|
+ * for, and the default NFS protocol is set to v4 in the autofs |
||||||
|
+ * configuration only probe NFSv4 and let mount.nfs(8) do fallback |
||||||
|
+ * to NFSv3 (if it can). If the NFSv4 probe fails then probe as |
||||||
|
+ * normal. |
||||||
|
+ */ |
||||||
|
+ if (!hosts->next && |
||||||
|
+ mount_default_proto == 4 && |
||||||
|
+ vers & NFS_VERS_MASK != 0 && |
||||||
|
+ vers & NFS4_VERS_MASK != 0) { |
||||||
|
+ unsigned int v4_probe_ok = 0; |
||||||
|
+ struct host *tmp = new_host(hosts->name, |
||||||
|
+ hosts->addr, hosts->addr_len, |
||||||
|
+ hosts->proximity, |
||||||
|
+ hosts->weight, hosts->options); |
||||||
|
+ if (tmp) { |
||||||
|
+ tmp->rr = hosts->rr; |
||||||
|
+ prune_host_list(ap->logopt, &tmp, |
||||||
|
+ NFS4_VERS_MASK|TCP_SUPPORTED, port); |
||||||
|
+ /* If probe succeeds just try the mount with host in hosts */ |
||||||
|
+ if (tmp) { |
||||||
|
+ v4_probe_ok = 1; |
||||||
|
+ free_host_list(&tmp); |
||||||
|
+ } |
||||||
|
+ } |
||||||
|
+ if (!v4_probe_ok) |
||||||
|
+ prune_host_list(ap->logopt, &hosts, vers, port); |
||||||
|
+ } else { |
||||||
|
prune_host_list(ap->logopt, &hosts, vers, port); |
||||||
|
+ } |
||||||
|
|
||||||
|
+dont_probe: |
||||||
|
if (!hosts) { |
||||||
|
info(ap->logopt, MODPREFIX "no hosts available"); |
||||||
|
return 1; |
||||||
|
diff --git a/modules/replicated.c b/modules/replicated.c |
||||||
|
index 6dbdade..0a044b9 100644 |
||||||
|
--- a/modules/replicated.c |
||||||
|
+++ b/modules/replicated.c |
||||||
|
@@ -280,10 +280,10 @@ static unsigned int get_proximity(struct sockaddr *host_addr) |
||||||
|
return PROXIMITY_OTHER; |
||||||
|
} |
||||||
|
|
||||||
|
-static struct host *new_host(const char *name, |
||||||
|
- struct sockaddr *addr, size_t addr_len, |
||||||
|
- unsigned int proximity, unsigned int weight, |
||||||
|
- unsigned int options) |
||||||
|
+struct host *new_host(const char *name, |
||||||
|
+ struct sockaddr *addr, size_t addr_len, |
||||||
|
+ unsigned int proximity, unsigned int weight, |
||||||
|
+ unsigned int options) |
||||||
|
{ |
||||||
|
struct host *new; |
||||||
|
struct sockaddr *tmp2; |
@ -0,0 +1,30 @@ |
|||||||
|
autofs-5.0.7 - recheck valid map entry lookup return in do_readmap_mount() |
||||||
|
|
||||||
|
From: Ian Kent <raven@themaw.net> |
||||||
|
|
||||||
|
After looking for an expected existing valid map entry in do_readmap_mount() |
||||||
|
add a check in case it isn't found. |
||||||
|
|
||||||
|
If it actually isn't found (although it always should be) the only thing |
||||||
|
that can be done is log an error return. |
||||||
|
--- |
||||||
|
daemon/state.c | 6 ++++++ |
||||||
|
1 file changed, 6 insertions(+) |
||||||
|
|
||||||
|
diff --git a/daemon/state.c b/daemon/state.c |
||||||
|
index 6e23022..ddc5556 100644 |
||||||
|
--- a/daemon/state.c |
||||||
|
+++ b/daemon/state.c |
||||||
|
@@ -405,6 +405,12 @@ static void do_readmap_mount(struct autofs_point *ap, struct mnt_list *mnts, |
||||||
|
me->key); |
||||||
|
cache_writelock(vmc); |
||||||
|
valid = cache_lookup_distinct(vmc, me->key); |
||||||
|
+ if (!valid) { |
||||||
|
+ cache_unlock(vmc); |
||||||
|
+ error(ap->logopt, |
||||||
|
+ "failed to find expected existing valid map entry"); |
||||||
|
+ return; |
||||||
|
+ } |
||||||
|
/* Take over the mount if there is one */ |
||||||
|
valid->ioctlfd = me->ioctlfd; |
||||||
|
me->ioctlfd = -1; |
@ -0,0 +1,36 @@ |
|||||||
|
autofs-5.0.7 - remove debug only code in alarm.c |
||||||
|
|
||||||
|
From: Ian Kent <raven@themaw.net> |
||||||
|
|
||||||
|
This code is only ever used for "on-the-fly" debugging so just remove it. |
||||||
|
--- |
||||||
|
lib/alarm.c | 16 ---------------- |
||||||
|
1 file changed, 16 deletions(-) |
||||||
|
|
||||||
|
diff --git a/lib/alarm.c b/lib/alarm.c |
||||||
|
index d5cdc05..0f04ef8 100755 |
||||||
|
--- a/lib/alarm.c |
||||||
|
+++ b/lib/alarm.c |
||||||
|
@@ -40,22 +40,6 @@ do { \ |
||||||
|
fatal(_alm_unlock); \ |
||||||
|
} while (0) |
||||||
|
|
||||||
|
-void dump_alarms(void) |
||||||
|
-{ |
||||||
|
- struct list_head *head; |
||||||
|
- struct list_head *p; |
||||||
|
- |
||||||
|
- pthread_mutex_lock(&mutex); |
||||||
|
- head = &alarms; |
||||||
|
- list_for_each(p, head) { |
||||||
|
- struct alarm *this; |
||||||
|
- |
||||||
|
- this = list_entry(p, struct alarm, list); |
||||||
|
- logmsg("alarm time = %d", this->time); |
||||||
|
- } |
||||||
|
- pthread_mutex_unlock(&mutex); |
||||||
|
-} |
||||||
|
- |
||||||
|
/* Insert alarm entry on ordered list. */ |
||||||
|
int alarm_add(struct autofs_point *ap, time_t seconds) |
||||||
|
{ |
@ -0,0 +1,125 @@ |
|||||||
|
autofs-5.0.7 - setup program map env from macro table |
||||||
|
|
||||||
|
From: Ian Kent <raven@themaw.net> |
||||||
|
|
||||||
|
The ability to pass parameters to program maps, in some way, is needed. |
||||||
|
Standard autofs specifies that program maps have one argument so passing |
||||||
|
parameters as arguments shouldn't be done. |
||||||
|
|
||||||
|
This patch sets the existing macro table definitions (for both global and |
||||||
|
local table) as environment variables before calling the map. The values |
||||||
|
are not checked after return so, at this stage, program maps can't change |
||||||
|
macro definitions. |
||||||
|
--- |
||||||
|
CHANGELOG | 1 + |
||||||
|
include/macros.h | 1 + |
||||||
|
lib/macros.c | 28 ++++++++++++++++++++++++++++ |
||||||
|
modules/lookup_program.c | 20 ++++++++++++++++++++ |
||||||
|
4 files changed, 50 insertions(+) |
||||||
|
|
||||||
|
--- autofs-5.0.7.orig/CHANGELOG |
||||||
|
+++ autofs-5.0.7/CHANGELOG |
||||||
|
@@ -76,6 +76,7 @@ |
||||||
|
- fix options compare. |
||||||
|
- fix fix options compare. |
||||||
|
- fix max() declaration. |
||||||
|
+- setup program map env from macro table. |
||||||
|
|
||||||
|
25/07/2012 autofs-5.0.7 |
||||||
|
======================= |
||||||
|
--- autofs-5.0.7.orig/include/macros.h |
||||||
|
+++ autofs-5.0.7/include/macros.h |
||||||
|
@@ -40,5 +40,6 @@ void macro_free_global_table(void); |
||||||
|
void macro_free_table(struct substvar *table); |
||||||
|
const struct substvar * |
||||||
|
macro_findvar(const struct substvar *table, const char *str, int len); |
||||||
|
+void macro_setenv(struct substvar *table); |
||||||
|
|
||||||
|
#endif |
||||||
|
--- autofs-5.0.7.orig/lib/macros.c |
||||||
|
+++ autofs-5.0.7/lib/macros.c |
||||||
|
@@ -421,3 +421,31 @@ macro_findvar(const struct substvar *tab |
||||||
|
return NULL; |
||||||
|
} |
||||||
|
|
||||||
|
+/* Set environment from macro variable table */ |
||||||
|
+void macro_setenv(struct substvar *table) |
||||||
|
+{ |
||||||
|
+ const struct substvar *sv = system_table; |
||||||
|
+ const struct substvar *lv = table; |
||||||
|
+ |
||||||
|
+ /* |
||||||
|
+ * First set environment from global table, matching local |
||||||
|
+ * variables will overwrite these. |
||||||
|
+ */ |
||||||
|
+ while (sv) { |
||||||
|
+ if (sv->def) |
||||||
|
+ setenv(sv->def, sv->val, 1); |
||||||
|
+ sv = sv->next; |
||||||
|
+ } |
||||||
|
+ |
||||||
|
+ error(LOGOPT_ANY, "table %p", table); |
||||||
|
+ dump_table(table); |
||||||
|
+ |
||||||
|
+ /* Next set environment from the local table */ |
||||||
|
+ while (lv) { |
||||||
|
+ if (lv->def) |
||||||
|
+ setenv(lv->def, lv->val, 1); |
||||||
|
+ lv = lv->next; |
||||||
|
+ } |
||||||
|
+ |
||||||
|
+ return; |
||||||
|
+} |
||||||
|
--- autofs-5.0.7.orig/modules/lookup_program.c |
||||||
|
+++ autofs-5.0.7/modules/lookup_program.c |
||||||
|
@@ -36,9 +36,17 @@ |
||||||
|
|
||||||
|
struct lookup_context { |
||||||
|
const char *mapname; |
||||||
|
+ char *mapfmt; |
||||||
|
struct parse_mod *parse; |
||||||
|
}; |
||||||
|
|
||||||
|
+struct parse_context { |
||||||
|
+ char *optstr; /* Mount options */ |
||||||
|
+ char *macros; /* Map wide macro defines */ |
||||||
|
+ struct substvar *subst; /* $-substitutions */ |
||||||
|
+ int slashify_colons; /* Change colons to slashes? */ |
||||||
|
+}; |
||||||
|
+ |
||||||
|
int lookup_version = AUTOFS_LOOKUP_VERSION; /* Required by protocol */ |
||||||
|
|
||||||
|
int lookup_init(const char *mapfmt, int argc, const char *const *argv, void **context) |
||||||
|
@@ -79,6 +87,8 @@ int lookup_init(const char *mapfmt, int |
||||||
|
if (!mapfmt) |
||||||
|
mapfmt = MAPFMT_DEFAULT; |
||||||
|
|
||||||
|
+ ctxt->mapfmt = strdup(mapfmt); |
||||||
|
+ |
||||||
|
ctxt->parse = open_parse(mapfmt, MODPREFIX, argc - 1, argv + 1); |
||||||
|
if (!ctxt->parse) { |
||||||
|
logmsg(MODPREFIX "failed to open parse context"); |
||||||
|
@@ -255,6 +265,14 @@ int lookup_mount(struct autofs_point *ap |
||||||
|
warn(ap->logopt, |
||||||
|
MODPREFIX "failed to set PWD to %s for map %s", |
||||||
|
ap->path, ctxt->mapname); |
||||||
|
+ /* |
||||||
|
+ * MAPFMT_DEFAULT must be "sun" for ->parse_init() to have setup |
||||||
|
+ * the macro table. |
||||||
|
+ */ |
||||||
|
+ if (ctxt->mapfmt && strcmp(ctxt->mapfmt, "MAPFMT_DEFAULT")) { |
||||||
|
+ struct parse_context *pctxt = (struct parse_context *) ctxt->parse->context; |
||||||
|
+ macro_setenv(pctxt->subst); |
||||||
|
+ } |
||||||
|
execl(ctxt->mapname, ctxt->mapname, name, NULL); |
||||||
|
_exit(255); /* execl() failed */ |
||||||
|
} |
||||||
|
@@ -448,6 +466,8 @@ int lookup_done(void *context) |
||||||
|
{ |
||||||
|
struct lookup_context *ctxt = (struct lookup_context *) context; |
||||||
|
int rv = close_parse(ctxt->parse); |
||||||
|
+ if (ctxt->mapfmt) |
||||||
|
+ free(ctxt->mapfmt); |
||||||
|
free(ctxt); |
||||||
|
return rv; |
||||||
|
} |
@ -0,0 +1,73 @@ |
|||||||
|
autofs-5.0.7 - syncronize handle_mounts() shutdown |
||||||
|
|
||||||
|
From: Ian Kent <ikent@redhat.com> |
||||||
|
|
||||||
|
When re-reading the master map the signal handler thread receives |
||||||
|
a SIGTERM signal from handle_mounts_cleanup() for map entries that |
||||||
|
have been removed. This is done to allow joining with handle_mounts() |
||||||
|
threads before shutting down to ensure clean up has been completed |
||||||
|
before the thread terminates. |
||||||
|
|
||||||
|
But, if more than one map entry is removed, multiple threads may be |
||||||
|
cleaned up during the handling of a single signal so there can be no |
||||||
|
work to do when a subsequent signal is received. In this case the |
||||||
|
signal handler thread interprets the additional SIGTERM signal as a |
||||||
|
request to shutdown and exits. |
||||||
|
--- |
||||||
|
CHANGELOG | 1 + |
||||||
|
daemon/automount.c | 9 +++++++-- |
||||||
|
2 files changed, 8 insertions(+), 2 deletions(-) |
||||||
|
|
||||||
|
diff --git a/CHANGELOG b/CHANGELOG |
||||||
|
index 488ad1e..f1ec1e5 100644 |
||||||
|
--- a/CHANGELOG |
||||||
|
+++ b/CHANGELOG |
||||||
|
@@ -38,6 +38,7 @@ |
||||||
|
- fix systemd unidir in spec file. |
||||||
|
- document browse option in man page. |
||||||
|
- fix some automount(8) typos. |
||||||
|
+- syncronize handle_mounts() shutdown. |
||||||
|
|
||||||
|
25/07/2012 autofs-5.0.7 |
||||||
|
======================= |
||||||
|
diff --git a/daemon/automount.c b/daemon/automount.c |
||||||
|
index 4c651cf..3f9337f 100644 |
||||||
|
--- a/daemon/automount.c |
||||||
|
+++ b/daemon/automount.c |
||||||
|
@@ -1285,7 +1285,8 @@ static int do_hup_signal(struct master *master, time_t age) |
||||||
|
nfs_mount_uses_string_options = check_nfs_mount_version(&vers, &check); |
||||||
|
|
||||||
|
master_mutex_lock(); |
||||||
|
- if (master->reading) { |
||||||
|
+ /* Already doing a map read or shutdown or no mounts */ |
||||||
|
+ if (master->reading || list_empty(&master->mounts)) { |
||||||
|
status = pthread_mutex_unlock(&mrc.mutex); |
||||||
|
if (status) |
||||||
|
fatal(status); |
||||||
|
@@ -1449,6 +1450,7 @@ static void handle_mounts_cleanup(void *arg) |
||||||
|
char path[PATH_MAX + 1]; |
||||||
|
char buf[MAX_ERR_BUF]; |
||||||
|
unsigned int clean = 0, submount, logopt; |
||||||
|
+ unsigned int pending = 0; |
||||||
|
|
||||||
|
ap = (struct autofs_point *) arg; |
||||||
|
|
||||||
|
@@ -1466,6 +1468,9 @@ static void handle_mounts_cleanup(void *arg) |
||||||
|
list_del_init(&ap->mounts); |
||||||
|
} |
||||||
|
|
||||||
|
+ /* Don't signal the handler if we have already done so */ |
||||||
|
+ if (!list_empty(&master_list->completed)) |
||||||
|
+ pending = 1; |
||||||
|
master_remove_mapent(ap->entry); |
||||||
|
master_source_unlock(ap->entry); |
||||||
|
|
||||||
|
@@ -1498,7 +1503,7 @@ static void handle_mounts_cleanup(void *arg) |
||||||
|
* so it can join with any completed handle_mounts() threads and |
||||||
|
* perform final cleanup. |
||||||
|
*/ |
||||||
|
- if (!submount) |
||||||
|
+ if (!submount && !pending) |
||||||
|
pthread_kill(state_mach_thid, SIGTERM); |
||||||
|
|
||||||
|
master_mutex_unlock(); |
@ -0,0 +1,366 @@ |
|||||||
|
autofs-5.0.7 - teach dumpmaps to output simple key value pairs |
||||||
|
|
||||||
|
From: Ian Kent <raven@themaw.net> |
||||||
|
|
||||||
|
The dumpmaps option doesn't allow maps to be output in <key, value> |
||||||
|
pairs suitable for use as a file map. |
||||||
|
|
||||||
|
This could be useful to save current maps as a backup for emergency |
||||||
|
use. |
||||||
|
|
||||||
|
If the dumpmaps option is given and is followed by two parameters, |
||||||
|
"<map type> <map name>" then simple <key, value> pairs that would |
||||||
|
be read in by a map read are printed to stdout if the given map type |
||||||
|
and map name are found in the map configuration. |
||||||
|
|
||||||
|
If the map is an LDAP map and there is more than one map of same name |
||||||
|
in different base dns only the first map encountered by autofs will |
||||||
|
be listed. |
||||||
|
|
||||||
|
If the map type is an old style multi-map and any one of the map |
||||||
|
names in the multi-map entry matches the given map name the entries |
||||||
|
that would be used by autofs for the whole multi-map will be listed. |
||||||
|
--- |
||||||
|
CHANGELOG | 1 |
||||||
|
daemon/automount.c | 56 ++++++++++++--- |
||||||
|
include/master.h | 1 |
||||||
|
lib/master.c | 187 +++++++++++++++++++++++++++++++++++++++++++++++++++++ |
||||||
|
man/automount.8 | 20 +++++ |
||||||
|
5 files changed, 250 insertions(+), 15 deletions(-) |
||||||
|
|
||||||
|
--- autofs-5.0.7.orig/CHANGELOG |
||||||
|
+++ autofs-5.0.7/CHANGELOG |
||||||
|
@@ -60,6 +60,7 @@ |
||||||
|
- fix fix wildcard multi map regression. |
||||||
|
- fix dumpmaps multi output. |
||||||
|
- try and cleanup after dumpmaps. |
||||||
|
+- teach dumpmaps to output simple key value pairs. |
||||||
|
|
||||||
|
25/07/2012 autofs-5.0.7 |
||||||
|
======================= |
||||||
|
--- autofs-5.0.7.orig/daemon/automount.c |
||||||
|
+++ autofs-5.0.7/daemon/automount.c |
||||||
|
@@ -1725,7 +1725,8 @@ static void usage(void) |
||||||
|
" -f --foreground do not fork into background\n" |
||||||
|
" -r --random-multimount-selection\n" |
||||||
|
" use ramdom replicated server selection\n" |
||||||
|
- " -m --dumpmaps dump automounter maps and exit\n" |
||||||
|
+ " -m --dumpmaps [<map type> <map name>]\n" |
||||||
|
+ " dump automounter maps and exit\n" |
||||||
|
" -n --negative-timeout n\n" |
||||||
|
" set the timeout for failed key lookups.\n" |
||||||
|
" -O --global-options\n" |
||||||
|
@@ -2125,22 +2126,33 @@ int main(int argc, char *argv[]) |
||||||
|
program); |
||||||
|
#endif |
||||||
|
|
||||||
|
- if (argc == 0) |
||||||
|
- master_list = master_new(NULL, timeout, ghost); |
||||||
|
- else |
||||||
|
- master_list = master_new(argv[0], timeout, ghost); |
||||||
|
- |
||||||
|
- if (!master_list) { |
||||||
|
- printf("%s: can't create master map %s", program, argv[0]); |
||||||
|
- exit(1); |
||||||
|
- } |
||||||
|
- |
||||||
|
if (dumpmaps) { |
||||||
|
struct master_mapent *entry; |
||||||
|
struct list_head *head, *p; |
||||||
|
struct mapent_cache *nc; |
||||||
|
+ const char *type = NULL; |
||||||
|
+ const char *name = NULL; |
||||||
|
+ const char *master = NULL; |
||||||
|
+ |
||||||
|
+ if (argc > 0) { |
||||||
|
+ if (argc >= 2) { |
||||||
|
+ type = argv[0]; |
||||||
|
+ name = argv[1]; |
||||||
|
+ } |
||||||
|
+ if (argc == 3) |
||||||
|
+ master = argv[2]; |
||||||
|
+ } |
||||||
|
|
||||||
|
- open_log(); |
||||||
|
+ if (master) |
||||||
|
+ master_list = master_new(NULL, timeout, ghost); |
||||||
|
+ else |
||||||
|
+ master_list = master_new(master, timeout, ghost); |
||||||
|
+ if (!master_list) { |
||||||
|
+ printf("%s: can't create master map", program); |
||||||
|
+ exit(1); |
||||||
|
+ } |
||||||
|
+ |
||||||
|
+ log_to_stderr(); |
||||||
|
|
||||||
|
master_init_scan(); |
||||||
|
|
||||||
|
@@ -2153,7 +2165,15 @@ int main(int argc, char *argv[]) |
||||||
|
master_list->nc = nc; |
||||||
|
|
||||||
|
lookup_nss_read_master(master_list, 0); |
||||||
|
- master_show_mounts(master_list); |
||||||
|
+ if (type) { |
||||||
|
+ const char *map = basename(name); |
||||||
|
+ if (!map) |
||||||
|
+ printf("%s: invalid map name %s\n", |
||||||
|
+ program, name); |
||||||
|
+ else |
||||||
|
+ dump_map(master_list, type, map); |
||||||
|
+ } else |
||||||
|
+ master_show_mounts(master_list); |
||||||
|
|
||||||
|
head = &master_list->mounts; |
||||||
|
p = head->next; |
||||||
|
@@ -2168,6 +2188,16 @@ int main(int argc, char *argv[]) |
||||||
|
exit(0); |
||||||
|
} |
||||||
|
|
||||||
|
+ if (argc == 0) |
||||||
|
+ master_list = master_new(NULL, timeout, ghost); |
||||||
|
+ else |
||||||
|
+ master_list = master_new(argv[0], timeout, ghost); |
||||||
|
+ |
||||||
|
+ if (!master_list) { |
||||||
|
+ printf("%s: can't create master map %s", program, argv[0]); |
||||||
|
+ exit(1); |
||||||
|
+ } |
||||||
|
+ |
||||||
|
become_daemon(foreground, daemon_check); |
||||||
|
|
||||||
|
if (pthread_attr_init(&th_attr)) { |
||||||
|
--- autofs-5.0.7.orig/include/master.h |
||||||
|
+++ autofs-5.0.7/include/master.h |
||||||
|
@@ -112,6 +112,7 @@ int master_submount_list_empty(struct au |
||||||
|
int master_notify_submount(struct autofs_point *, const char *path, enum states); |
||||||
|
void master_notify_state_change(struct master *, int); |
||||||
|
int master_mount_mounts(struct master *, time_t, int); |
||||||
|
+int dump_map(struct master *, const char *, const char *); |
||||||
|
int master_show_mounts(struct master *); |
||||||
|
extern inline unsigned int master_get_logopt(void); |
||||||
|
int master_list_empty(struct master *); |
||||||
|
--- autofs-5.0.7.orig/lib/master.c |
||||||
|
+++ autofs-5.0.7/lib/master.c |
||||||
|
@@ -1329,6 +1329,193 @@ static void print_map_info(struct map_so |
||||||
|
return; |
||||||
|
} |
||||||
|
|
||||||
|
+static int match_type(const char *source, const char *type) |
||||||
|
+{ |
||||||
|
+ if (!strcmp(source, type)) |
||||||
|
+ return 1; |
||||||
|
+ /* Sources file and files are synonymous */ |
||||||
|
+ if (!strncmp(source, type, 4) && (strlen(source) <= 5)) |
||||||
|
+ return 1; |
||||||
|
+ return 0; |
||||||
|
+} |
||||||
|
+ |
||||||
|
+static char *get_map_name(const char *string) |
||||||
|
+{ |
||||||
|
+ char *name, *tmp; |
||||||
|
+ char *start, *end, *base; |
||||||
|
+ |
||||||
|
+ tmp = strdup(string); |
||||||
|
+ if (!tmp) { |
||||||
|
+ printf("error: allocation failure: %s\n", strerror(errno)); |
||||||
|
+ return NULL; |
||||||
|
+ } |
||||||
|
+ |
||||||
|
+ base = basename(tmp); |
||||||
|
+ end = strchr(base, ','); |
||||||
|
+ if (end) |
||||||
|
+ *end = '\0'; |
||||||
|
+ start = strchr(tmp, '='); |
||||||
|
+ if (start) |
||||||
|
+ start++; |
||||||
|
+ else { |
||||||
|
+ char *colon = strrchr(base, ':'); |
||||||
|
+ if (colon) |
||||||
|
+ start = ++colon; |
||||||
|
+ else |
||||||
|
+ start = base; |
||||||
|
+ } |
||||||
|
+ |
||||||
|
+ name = strdup(start); |
||||||
|
+ if (!name) |
||||||
|
+ printf("error: allocation failure: %s\n", strerror(errno)); |
||||||
|
+ free(tmp); |
||||||
|
+ |
||||||
|
+ return name; |
||||||
|
+} |
||||||
|
+ |
||||||
|
+static int match_name(struct map_source *source, const char *name) |
||||||
|
+{ |
||||||
|
+ int argc = source->argc; |
||||||
|
+ int ret = 0; |
||||||
|
+ int i; |
||||||
|
+ |
||||||
|
+ /* |
||||||
|
+ * This can't work for old style "multi" type sources since |
||||||
|
+ * there's no way to know from which map the cache entry came |
||||||
|
+ * from and duplicate entries are ignored at map read time. |
||||||
|
+ * All we can really do is list all the entries for the given |
||||||
|
+ * multi map if one of its map names matches. |
||||||
|
+ */ |
||||||
|
+ for (i = 0; i < argc; i++) { |
||||||
|
+ if (i == 0 || !strcmp(source->argv[i], "--")) { |
||||||
|
+ if (i != 0) { |
||||||
|
+ i++; |
||||||
|
+ if (i >= argc) |
||||||
|
+ break; |
||||||
|
+ } |
||||||
|
+ |
||||||
|
+ if (source->argv[i] && *source->argv[i] != '-') { |
||||||
|
+ char *map = get_map_name(source->argv[i]); |
||||||
|
+ if (!map) |
||||||
|
+ break; |
||||||
|
+ if (!strcmp(map, name)) { |
||||||
|
+ ret = 1; |
||||||
|
+ free(map); |
||||||
|
+ break; |
||||||
|
+ } |
||||||
|
+ free(map); |
||||||
|
+ } |
||||||
|
+ } |
||||||
|
+ } |
||||||
|
+ |
||||||
|
+ return ret; |
||||||
|
+} |
||||||
|
+ |
||||||
|
+int dump_map(struct master *master, const char *type, const char *name) |
||||||
|
+{ |
||||||
|
+ struct list_head *p, *head; |
||||||
|
+ |
||||||
|
+ if (list_empty(&master->mounts)) { |
||||||
|
+ printf("no master map entries found\n"); |
||||||
|
+ return 1; |
||||||
|
+ } |
||||||
|
+ |
||||||
|
+ head = &master->mounts; |
||||||
|
+ p = head->next; |
||||||
|
+ while (p != head) { |
||||||
|
+ struct map_source *source; |
||||||
|
+ struct master_mapent *this; |
||||||
|
+ struct autofs_point *ap; |
||||||
|
+ time_t now = time(NULL); |
||||||
|
+ |
||||||
|
+ this = list_entry(p, struct master_mapent, list); |
||||||
|
+ p = p->next; |
||||||
|
+ |
||||||
|
+ ap = this->ap; |
||||||
|
+ |
||||||
|
+ /* |
||||||
|
+ * Ensure we actually read indirect map entries so we can |
||||||
|
+ * list them. The map reads won't read any indirect map |
||||||
|
+ * entries (other than those in a file map) unless the |
||||||
|
+ * browse option is set. |
||||||
|
+ */ |
||||||
|
+ if (ap->type == LKP_INDIRECT) |
||||||
|
+ ap->flags |= MOUNT_FLAG_GHOST; |
||||||
|
+ |
||||||
|
+ /* Read the map content into the cache */ |
||||||
|
+ if (lookup_nss_read_map(ap, NULL, now)) |
||||||
|
+ lookup_prune_cache(ap, now); |
||||||
|
+ else { |
||||||
|
+ printf("failed to read map\n"); |
||||||
|
+ lookup_close_lookup(ap); |
||||||
|
+ continue; |
||||||
|
+ } |
||||||
|
+ |
||||||
|
+ if (!this->maps) { |
||||||
|
+ printf("no map sources found for %s\n", ap->path); |
||||||
|
+ lookup_close_lookup(ap); |
||||||
|
+ continue; |
||||||
|
+ } |
||||||
|
+ |
||||||
|
+ source = this->maps; |
||||||
|
+ while (source) { |
||||||
|
+ struct map_source *instance; |
||||||
|
+ struct mapent *me; |
||||||
|
+ |
||||||
|
+ instance = NULL; |
||||||
|
+ if (source->type) { |
||||||
|
+ if (!match_type(source->type, type)) { |
||||||
|
+ source = source->next; |
||||||
|
+ continue; |
||||||
|
+ } |
||||||
|
+ if (!match_name(source, name)) { |
||||||
|
+ source = source->next; |
||||||
|
+ continue; |
||||||
|
+ } |
||||||
|
+ instance = source; |
||||||
|
+ } else { |
||||||
|
+ struct map_source *map; |
||||||
|
+ |
||||||
|
+ map = source->instance; |
||||||
|
+ while (map) { |
||||||
|
+ if (!match_type(map->type, type)) { |
||||||
|
+ map = map->next; |
||||||
|
+ continue; |
||||||
|
+ } |
||||||
|
+ if (!match_name(map, name)) { |
||||||
|
+ map = map->next; |
||||||
|
+ continue; |
||||||
|
+ } |
||||||
|
+ instance = map; |
||||||
|
+ break; |
||||||
|
+ } |
||||||
|
+ } |
||||||
|
+ |
||||||
|
+ if (!instance) { |
||||||
|
+ source = source->next; |
||||||
|
+ lookup_close_lookup(ap); |
||||||
|
+ continue; |
||||||
|
+ } |
||||||
|
+ |
||||||
|
+ me = cache_lookup_first(source->mc); |
||||||
|
+ if (!me) |
||||||
|
+ printf("no keys found in map\n"); |
||||||
|
+ else { |
||||||
|
+ do { |
||||||
|
+ if (me->source == instance) |
||||||
|
+ printf("%s\t%s\n", me->key, me->mapent); |
||||||
|
+ } while ((me = cache_lookup_next(source->mc, me))); |
||||||
|
+ } |
||||||
|
+ |
||||||
|
+ lookup_close_lookup(ap); |
||||||
|
+ return 1; |
||||||
|
+ } |
||||||
|
+ lookup_close_lookup(ap); |
||||||
|
+ } |
||||||
|
+ |
||||||
|
+ return 0; |
||||||
|
+} |
||||||
|
+ |
||||||
|
int master_show_mounts(struct master *master) |
||||||
|
{ |
||||||
|
struct list_head *p, *head; |
||||||
|
--- autofs-5.0.7.orig/man/automount.8 |
||||||
|
+++ autofs-5.0.7/man/automount.8 |
||||||
|
@@ -57,8 +57,24 @@ Run the daemon in the foreground and log |
||||||
|
Enables the use of ramdom selection when choosing a host from a |
||||||
|
list of replicated servers. |
||||||
|
.TP |
||||||
|
-.I "\-m, \-\-dumpmaps" |
||||||
|
-Dump configured automounter maps, then exit. |
||||||
|
+.I "\-m, \-\-dumpmaps [<map type> <map name>]" |
||||||
|
+With no parameters, list information about the configured automounter |
||||||
|
+maps, then exit. |
||||||
|
+ |
||||||
|
+If the dumpmaps option is given and is followed by two parameters, |
||||||
|
+"<map type> <map name>" then simple "<key, value>" pairs that would |
||||||
|
+be read in by a map read are printed to stdout if the given map type |
||||||
|
+and map name are found in the map configuration. |
||||||
|
+ |
||||||
|
+If the map is an LDAP map and there is more than one map of same name |
||||||
|
+in different base dns only the first map encountered by autofs will |
||||||
|
+be listed. Similarly, if the map is a file map and there is more than |
||||||
|
+one map of the same name in different directories, only the first map |
||||||
|
+encountered will be listed. |
||||||
|
+ |
||||||
|
+If the map type is an old style multi-map and any one of the map |
||||||
|
+names in the multi-map entry matches the given map name the entries |
||||||
|
+that would be used by autofs for the whole multi-map will be listed. |
||||||
|
.TP |
||||||
|
.I "\-O, \-\-global-options" |
||||||
|
Allows the specification of global mount options used for all master |
@ -0,0 +1,63 @@ |
|||||||
|
autofs-5.0.7 - try and cleanup after dumpmaps |
||||||
|
|
||||||
|
From: Ian Kent <raven@themaw.net> |
||||||
|
|
||||||
|
Try and cleanup a little after dumping maps. |
||||||
|
It's not really necessary but but can help by reducing the noise |
||||||
|
from valgrind when checking code. |
||||||
|
--- |
||||||
|
CHANGELOG | 1 + |
||||||
|
daemon/automount.c | 13 +++++++++++++ |
||||||
|
lib/master.c | 2 ++ |
||||||
|
3 files changed, 16 insertions(+) |
||||||
|
|
||||||
|
--- autofs-5.0.7.orig/CHANGELOG |
||||||
|
+++ autofs-5.0.7/CHANGELOG |
||||||
|
@@ -59,6 +59,7 @@ |
||||||
|
- fix syncronize handle_mounts() shutdown. |
||||||
|
- fix fix wildcard multi map regression. |
||||||
|
- fix dumpmaps multi output. |
||||||
|
+- try and cleanup after dumpmaps. |
||||||
|
|
||||||
|
25/07/2012 autofs-5.0.7 |
||||||
|
======================= |
||||||
|
--- autofs-5.0.7.orig/daemon/automount.c |
||||||
|
+++ autofs-5.0.7/daemon/automount.c |
||||||
|
@@ -2136,6 +2136,8 @@ int main(int argc, char *argv[]) |
||||||
|
} |
||||||
|
|
||||||
|
if (dumpmaps) { |
||||||
|
+ struct master_mapent *entry; |
||||||
|
+ struct list_head *head, *p; |
||||||
|
struct mapent_cache *nc; |
||||||
|
|
||||||
|
open_log(); |
||||||
|
@@ -2152,6 +2154,17 @@ int main(int argc, char *argv[]) |
||||||
|
|
||||||
|
lookup_nss_read_master(master_list, 0); |
||||||
|
master_show_mounts(master_list); |
||||||
|
+ |
||||||
|
+ head = &master_list->mounts; |
||||||
|
+ p = head->next; |
||||||
|
+ while (p != head) { |
||||||
|
+ entry = list_entry(p, struct master_mapent, list); |
||||||
|
+ p = p->next; |
||||||
|
+ master_free_mapent_sources(entry, 1); |
||||||
|
+ master_free_mapent(entry); |
||||||
|
+ } |
||||||
|
+ master_kill(master_list); |
||||||
|
+ |
||||||
|
exit(0); |
||||||
|
} |
||||||
|
|
||||||
|
--- autofs-5.0.7.orig/lib/master.c |
||||||
|
+++ autofs-5.0.7/lib/master.c |
||||||
|
@@ -1426,6 +1426,8 @@ int master_show_mounts(struct master *ma |
||||||
|
source = source->next; |
||||||
|
} |
||||||
|
|
||||||
|
+ lookup_close_lookup(ap); |
||||||
|
+ |
||||||
|
printf("\n"); |
||||||
|
} |
||||||
|
|
@ -0,0 +1,92 @@ |
|||||||
|
autofs-5.0.7 - update kernel include files |
||||||
|
|
||||||
|
From: Ian Kent <raven@themaw.net> |
||||||
|
|
||||||
|
Update autofs include files to include the latest changes. |
||||||
|
--- |
||||||
|
include/linux/auto_fs.h | 33 ++++++++++----------------------- |
||||||
|
include/linux/auto_fs4.h | 3 ++- |
||||||
|
2 files changed, 12 insertions(+), 24 deletions(-) |
||||||
|
|
||||||
|
diff --git a/include/linux/auto_fs.h b/include/linux/auto_fs.h |
||||||
|
index 91d414f..64df1a6 100644 |
||||||
|
--- a/include/linux/auto_fs.h |
||||||
|
+++ b/include/linux/auto_fs.h |
||||||
|
@@ -14,13 +14,8 @@ |
||||||
|
#ifndef _LINUX_AUTO_FS_H |
||||||
|
#define _LINUX_AUTO_FS_H |
||||||
|
|
||||||
|
-#ifdef __KERNEL__ |
||||||
|
-#include <linux/fs.h> |
||||||
|
-#include <linux/limits.h> |
||||||
|
#include <linux/types.h> |
||||||
|
-#include <linux/ioctl.h> |
||||||
|
-#else |
||||||
|
-#include <asm/types.h> |
||||||
|
+#ifndef __KERNEL__ |
||||||
|
#include <sys/ioctl.h> |
||||||
|
#endif /* __KERNEL__ */ |
||||||
|
|
||||||
|
@@ -32,25 +27,16 @@ |
||||||
|
#define AUTOFS_MIN_PROTO_VERSION AUTOFS_PROTO_VERSION |
||||||
|
|
||||||
|
/* |
||||||
|
- * Architectures where both 32- and 64-bit binaries can be executed |
||||||
|
- * on 64-bit kernels need this. This keeps the structure format |
||||||
|
- * uniform, and makes sure the wait_queue_token isn't too big to be |
||||||
|
- * passed back down to the kernel. |
||||||
|
- * |
||||||
|
- * This assumes that on these architectures: |
||||||
|
- * mode 32 bit 64 bit |
||||||
|
- * ------------------------- |
||||||
|
- * int 32 bit 32 bit |
||||||
|
- * long 32 bit 64 bit |
||||||
|
- * |
||||||
|
- * If so, 32-bit user-space code should be backwards compatible. |
||||||
|
+ * The wait_queue_token (autofs_wqt_t) is part of a structure which is passed |
||||||
|
+ * back to the kernel via ioctl from userspace. On architectures where 32- and |
||||||
|
+ * 64-bit userspace binaries can be executed it's important that the size of |
||||||
|
+ * autofs_wqt_t stays constant between 32- and 64-bit Linux kernels so that we |
||||||
|
+ * do not break the binary ABI interface by changing the structure size. |
||||||
|
*/ |
||||||
|
- |
||||||
|
-#if defined(__sparc__) || defined(__mips__) || defined(__x86_64__) \ |
||||||
|
- || defined(__powerpc__) || defined(__s390__) |
||||||
|
-typedef unsigned int autofs_wqt_t; |
||||||
|
-#else |
||||||
|
+#if defined(__ia64__) || defined(__alpha__) /* pure 64bit architectures */ |
||||||
|
typedef unsigned long autofs_wqt_t; |
||||||
|
+#else |
||||||
|
+typedef unsigned int autofs_wqt_t; |
||||||
|
#endif |
||||||
|
|
||||||
|
/* Packet types */ |
||||||
|
@@ -81,6 +67,7 @@ struct autofs_packet_expire { |
||||||
|
#define AUTOFS_IOC_FAIL _IO(0x93,0x61) |
||||||
|
#define AUTOFS_IOC_CATATONIC _IO(0x93,0x62) |
||||||
|
#define AUTOFS_IOC_PROTOVER _IOR(0x93,0x63,int) |
||||||
|
+#define AUTOFS_IOC_SETTIMEOUT32 _IOWR(0x93,0x64,compat_ulong_t) |
||||||
|
#define AUTOFS_IOC_SETTIMEOUT _IOWR(0x93,0x64,unsigned long) |
||||||
|
#define AUTOFS_IOC_EXPIRE _IOR(0x93,0x65,struct autofs_packet_expire) |
||||||
|
|
||||||
|
diff --git a/include/linux/auto_fs4.h b/include/linux/auto_fs4.h |
||||||
|
index 55fa478..e02982f 100644 |
||||||
|
--- a/include/linux/auto_fs4.h |
||||||
|
+++ b/include/linux/auto_fs4.h |
||||||
|
@@ -12,6 +12,7 @@ |
||||||
|
#define _LINUX_AUTO_FS4_H |
||||||
|
|
||||||
|
/* Include common v3 definitions */ |
||||||
|
+#include <linux/types.h> |
||||||
|
#include <linux/auto_fs.h> |
||||||
|
|
||||||
|
/* autofs v4 definitions */ |
||||||
|
@@ -23,7 +24,7 @@ |
||||||
|
#define AUTOFS_MIN_PROTO_VERSION 3 |
||||||
|
#define AUTOFS_MAX_PROTO_VERSION 5 |
||||||
|
|
||||||
|
-#define AUTOFS_PROTO_SUBVERSION 1 |
||||||
|
+#define AUTOFS_PROTO_SUBVERSION 2 |
||||||
|
|
||||||
|
/* Mask for expire behaviour */ |
||||||
|
#define AUTOFS_EXP_IMMEDIATE 1 |
@ -0,0 +1,471 @@ |
|||||||
|
autofs-5.0.7 - use numeric protocol ids instead of protoent structs |
||||||
|
|
||||||
|
From: Leonardo Chiquitto <leonardo.lists@gmail.com> |
||||||
|
|
||||||
|
The function getprotobyname() is not reentrant, so we can't call |
||||||
|
it simultaneously from multiple threads. Instead of switching to |
||||||
|
the reentrant version which adds more complexity to the code, |
||||||
|
lets use numeric protocol IDs instead of protoent structures. |
||||||
|
--- |
||||||
|
|
||||||
|
CHANGELOG | 1 + |
||||||
|
include/rpc_subs.h | 4 +-- |
||||||
|
lib/rpc_subs.c | 80 ++++++++++++++++++-------------------------------- |
||||||
|
modules/replicated.c | 42 +++++++++++--------------- |
||||||
|
4 files changed, 50 insertions(+), 77 deletions(-) |
||||||
|
|
||||||
|
|
||||||
|
diff --git a/CHANGELOG b/CHANGELOG |
||||||
|
index 4cf5621..ba1d65b 100644 |
||||||
|
--- a/CHANGELOG |
||||||
|
+++ b/CHANGELOG |
||||||
|
@@ -23,6 +23,7 @@ |
||||||
|
- fix use get_proximity() without libtirpc. |
||||||
|
- don't use dirent d_type to filter out files in scandir() |
||||||
|
- don't schedule new alarms after readmap. |
||||||
|
+- use numeric protocol ids instead of protoent structs. |
||||||
|
|
||||||
|
25/07/2012 autofs-5.0.7 |
||||||
|
======================= |
||||||
|
diff --git a/include/rpc_subs.h b/include/rpc_subs.h |
||||||
|
index ca474d9..b6d59f9 100644 |
||||||
|
--- a/include/rpc_subs.h |
||||||
|
+++ b/include/rpc_subs.h |
||||||
|
@@ -54,7 +54,7 @@ struct conn_info { |
||||||
|
unsigned short port; |
||||||
|
unsigned long program; |
||||||
|
unsigned long version; |
||||||
|
- struct protoent *proto; |
||||||
|
+ int proto; |
||||||
|
unsigned int send_sz; |
||||||
|
unsigned int recv_sz; |
||||||
|
struct timeval timeout; |
||||||
|
@@ -66,7 +66,7 @@ int rpc_udp_getclient(struct conn_info *, unsigned int, unsigned int); |
||||||
|
void rpc_destroy_udp_client(struct conn_info *); |
||||||
|
int rpc_tcp_getclient(struct conn_info *, unsigned int, unsigned int); |
||||||
|
void rpc_destroy_tcp_client(struct conn_info *); |
||||||
|
-int rpc_portmap_getclient(struct conn_info *, const char *, struct sockaddr *, size_t, const char *, unsigned int); |
||||||
|
+int rpc_portmap_getclient(struct conn_info *, const char *, struct sockaddr *, size_t, int, unsigned int); |
||||||
|
int rpc_portmap_getport(struct conn_info *, struct pmap *, unsigned short *); |
||||||
|
int rpc_ping_proto(struct conn_info *); |
||||||
|
int rpc_ping(const char *, long, long, unsigned int); |
||||||
|
diff --git a/lib/rpc_subs.c b/lib/rpc_subs.c |
||||||
|
index d33a3c4..ad1d557 100644 |
||||||
|
--- a/lib/rpc_subs.c |
||||||
|
+++ b/lib/rpc_subs.c |
||||||
|
@@ -170,7 +170,7 @@ static int rpc_do_create_client(struct sockaddr *addr, struct conn_info *info, i |
||||||
|
|
||||||
|
*client = NULL; |
||||||
|
|
||||||
|
- proto = info->proto->p_proto; |
||||||
|
+ proto = info->proto; |
||||||
|
if (proto == IPPROTO_UDP) |
||||||
|
type = SOCK_DGRAM; |
||||||
|
else |
||||||
|
@@ -201,7 +201,7 @@ static int rpc_do_create_client(struct sockaddr *addr, struct conn_info *info, i |
||||||
|
in4_raddr = (struct sockaddr_in *) addr; |
||||||
|
in4_raddr->sin_port = htons(info->port); |
||||||
|
|
||||||
|
- switch (info->proto->p_proto) { |
||||||
|
+ switch (info->proto) { |
||||||
|
case IPPROTO_UDP: |
||||||
|
clnt = clntudp_bufcreate(in4_raddr, |
||||||
|
info->program, info->version, |
||||||
|
@@ -241,7 +241,7 @@ static int rpc_do_create_client(struct sockaddr *addr, struct conn_info *info, i |
||||||
|
|
||||||
|
*client = NULL; |
||||||
|
|
||||||
|
- proto = info->proto->p_proto; |
||||||
|
+ proto = info->proto; |
||||||
|
if (proto == IPPROTO_UDP) |
||||||
|
type = SOCK_DGRAM; |
||||||
|
else |
||||||
|
@@ -292,11 +292,11 @@ static int rpc_do_create_client(struct sockaddr *addr, struct conn_info *info, i |
||||||
|
nb_addr.maxlen = nb_addr.len = slen; |
||||||
|
nb_addr.buf = addr; |
||||||
|
|
||||||
|
- if (info->proto->p_proto == IPPROTO_UDP) |
||||||
|
+ if (info->proto == IPPROTO_UDP) |
||||||
|
clnt = clnt_dg_create(*fd, &nb_addr, |
||||||
|
info->program, info->version, |
||||||
|
info->send_sz, info->recv_sz); |
||||||
|
- else if (info->proto->p_proto == IPPROTO_TCP) { |
||||||
|
+ else if (info->proto == IPPROTO_TCP) { |
||||||
|
ret = connect_nb(*fd, addr, slen, &info->timeout); |
||||||
|
if (ret < 0) |
||||||
|
return ret; |
||||||
|
@@ -355,7 +355,7 @@ static int create_client(struct conn_info *info, CLIENT **client) |
||||||
|
memset(&hints, 0, sizeof(hints)); |
||||||
|
hints.ai_flags = AI_ADDRCONFIG; |
||||||
|
hints.ai_family = AF_UNSPEC; |
||||||
|
- if (info->proto->p_proto == IPPROTO_UDP) |
||||||
|
+ if (info->proto == IPPROTO_UDP) |
||||||
|
hints.ai_socktype = SOCK_DGRAM; |
||||||
|
else |
||||||
|
hints.ai_socktype = SOCK_STREAM; |
||||||
|
@@ -370,7 +370,7 @@ static int create_client(struct conn_info *info, CLIENT **client) |
||||||
|
|
||||||
|
haddr = ai; |
||||||
|
while (haddr) { |
||||||
|
- if (haddr->ai_protocol != info->proto->p_proto) { |
||||||
|
+ if (haddr->ai_protocol != info->proto) { |
||||||
|
haddr = haddr->ai_next; |
||||||
|
continue; |
||||||
|
} |
||||||
|
@@ -417,16 +417,11 @@ out_close: |
||||||
|
int rpc_udp_getclient(struct conn_info *info, |
||||||
|
unsigned int program, unsigned int version) |
||||||
|
{ |
||||||
|
- struct protoent *pe_proto; |
||||||
|
CLIENT *client; |
||||||
|
int ret; |
||||||
|
|
||||||
|
if (!info->client) { |
||||||
|
- pe_proto = getprotobyname("udp"); |
||||||
|
- if (!pe_proto) |
||||||
|
- return -ENOENT; |
||||||
|
- |
||||||
|
- info->proto = pe_proto; |
||||||
|
+ info->proto = IPPROTO_UDP; |
||||||
|
info->timeout.tv_sec = RPC_TOUT_UDP; |
||||||
|
info->timeout.tv_usec = 0; |
||||||
|
info->send_sz = UDPMSGSIZE; |
||||||
|
@@ -458,16 +453,11 @@ void rpc_destroy_udp_client(struct conn_info *info) |
||||||
|
int rpc_tcp_getclient(struct conn_info *info, |
||||||
|
unsigned int program, unsigned int version) |
||||||
|
{ |
||||||
|
- struct protoent *pe_proto; |
||||||
|
CLIENT *client; |
||||||
|
int ret; |
||||||
|
|
||||||
|
if (!info->client) { |
||||||
|
- pe_proto = getprotobyname("tcp"); |
||||||
|
- if (!pe_proto) |
||||||
|
- return -ENOENT; |
||||||
|
- |
||||||
|
- info->proto = pe_proto; |
||||||
|
+ info->proto = IPPROTO_TCP; |
||||||
|
info->timeout.tv_sec = RPC_TOUT_TCP; |
||||||
|
info->timeout.tv_usec = 0; |
||||||
|
info->send_sz = 0; |
||||||
|
@@ -513,23 +503,18 @@ void rpc_destroy_tcp_client(struct conn_info *info) |
||||||
|
|
||||||
|
int rpc_portmap_getclient(struct conn_info *info, |
||||||
|
const char *host, struct sockaddr *addr, size_t addr_len, |
||||||
|
- const char *proto, unsigned int option) |
||||||
|
+ int proto, unsigned int option) |
||||||
|
{ |
||||||
|
- struct protoent *pe_proto; |
||||||
|
CLIENT *client; |
||||||
|
int ret; |
||||||
|
|
||||||
|
- pe_proto = getprotobyname(proto); |
||||||
|
- if (!pe_proto) |
||||||
|
- return -ENOENT; |
||||||
|
- |
||||||
|
info->host = host; |
||||||
|
info->addr = addr; |
||||||
|
info->addr_len = addr_len; |
||||||
|
info->program = PMAPPROG; |
||||||
|
info->port = PMAPPORT; |
||||||
|
info->version = PMAPVERS; |
||||||
|
- info->proto = pe_proto; |
||||||
|
+ info->proto = proto; |
||||||
|
info->send_sz = RPCSMALLMSGSIZE; |
||||||
|
info->recv_sz = RPCSMALLMSGSIZE; |
||||||
|
info->timeout.tv_sec = PMAP_TOUT_UDP; |
||||||
|
@@ -537,7 +522,7 @@ int rpc_portmap_getclient(struct conn_info *info, |
||||||
|
info->close_option = option; |
||||||
|
info->client = NULL; |
||||||
|
|
||||||
|
- if (pe_proto->p_proto == IPPROTO_TCP) |
||||||
|
+ if (info->proto == IPPROTO_TCP) |
||||||
|
info->timeout.tv_sec = PMAP_TOUT_TCP; |
||||||
|
|
||||||
|
ret = create_client(info, &client); |
||||||
|
@@ -555,7 +540,7 @@ int rpc_portmap_getport(struct conn_info *info, |
||||||
|
struct conn_info pmap_info; |
||||||
|
CLIENT *client; |
||||||
|
enum clnt_stat status; |
||||||
|
- int proto = info->proto->p_proto; |
||||||
|
+ int proto = info->proto; |
||||||
|
int ret; |
||||||
|
|
||||||
|
memset(&pmap_info, 0, sizeof(struct conn_info)); |
||||||
|
@@ -633,13 +618,13 @@ int rpc_ping_proto(struct conn_info *info) |
||||||
|
{ |
||||||
|
CLIENT *client; |
||||||
|
enum clnt_stat status; |
||||||
|
- int proto = info->proto->p_proto; |
||||||
|
+ int proto = info->proto; |
||||||
|
int ret; |
||||||
|
|
||||||
|
if (info->client) |
||||||
|
client = info->client; |
||||||
|
else { |
||||||
|
- if (info->proto->p_proto == IPPROTO_UDP) { |
||||||
|
+ if (info->proto == IPPROTO_UDP) { |
||||||
|
info->send_sz = UDPMSGSIZE; |
||||||
|
info->recv_sz = UDPMSGSIZE; |
||||||
|
} |
||||||
|
@@ -688,7 +673,7 @@ int rpc_ping_proto(struct conn_info *info) |
||||||
|
|
||||||
|
static unsigned int __rpc_ping(const char *host, |
||||||
|
unsigned long version, |
||||||
|
- char *proto, |
||||||
|
+ int proto, |
||||||
|
long seconds, long micros, |
||||||
|
unsigned int option) |
||||||
|
{ |
||||||
|
@@ -696,6 +681,7 @@ static unsigned int __rpc_ping(const char *host, |
||||||
|
struct conn_info info; |
||||||
|
struct pmap parms; |
||||||
|
|
||||||
|
+ info.proto = proto; |
||||||
|
info.host = host; |
||||||
|
info.addr = NULL; |
||||||
|
info.addr_len = 0; |
||||||
|
@@ -710,13 +696,9 @@ static unsigned int __rpc_ping(const char *host, |
||||||
|
|
||||||
|
status = RPC_PING_FAIL; |
||||||
|
|
||||||
|
- info.proto = getprotobyname(proto); |
||||||
|
- if (!info.proto) |
||||||
|
- return status; |
||||||
|
- |
||||||
|
parms.pm_prog = NFS_PROGRAM; |
||||||
|
parms.pm_vers = version; |
||||||
|
- parms.pm_prot = info.proto->p_proto; |
||||||
|
+ parms.pm_prot = info.proto; |
||||||
|
parms.pm_port = 0; |
||||||
|
|
||||||
|
status = rpc_portmap_getport(&info, &parms, &info.port); |
||||||
|
@@ -734,19 +716,19 @@ int rpc_ping(const char *host, long seconds, long micros, unsigned int option) |
||||||
|
unsigned long vers2 = NFS2_VERSION; |
||||||
|
unsigned int status; |
||||||
|
|
||||||
|
- status = __rpc_ping(host, vers2, "udp", seconds, micros, option); |
||||||
|
+ status = __rpc_ping(host, vers2, IPPROTO_UDP, seconds, micros, option); |
||||||
|
if (status > 0) |
||||||
|
return RPC_PING_V2 | RPC_PING_UDP; |
||||||
|
|
||||||
|
- status = __rpc_ping(host, vers3, "udp", seconds, micros, option); |
||||||
|
+ status = __rpc_ping(host, vers3, IPPROTO_UDP, seconds, micros, option); |
||||||
|
if (status > 0) |
||||||
|
return RPC_PING_V3 | RPC_PING_UDP; |
||||||
|
|
||||||
|
- status = __rpc_ping(host, vers2, "tcp", seconds, micros, option); |
||||||
|
+ status = __rpc_ping(host, vers2, IPPROTO_TCP, seconds, micros, option); |
||||||
|
if (status > 0) |
||||||
|
return RPC_PING_V2 | RPC_PING_TCP; |
||||||
|
|
||||||
|
- status = __rpc_ping(host, vers3, "tcp", seconds, micros, option); |
||||||
|
+ status = __rpc_ping(host, vers3, IPPROTO_TCP, seconds, micros, option); |
||||||
|
if (status > 0) |
||||||
|
return RPC_PING_V3 | RPC_PING_TCP; |
||||||
|
|
||||||
|
@@ -769,7 +751,7 @@ int rpc_time(const char *host, |
||||||
|
double taken; |
||||||
|
struct timeval start, end; |
||||||
|
struct timezone tz; |
||||||
|
- char *proto = (ping_proto & RPC_PING_UDP) ? "udp" : "tcp"; |
||||||
|
+ int proto = (ping_proto & RPC_PING_UDP) ? IPPROTO_UDP : IPPROTO_TCP; |
||||||
|
unsigned long vers = ping_vers; |
||||||
|
|
||||||
|
gettimeofday(&start, &tz); |
||||||
|
@@ -791,12 +773,12 @@ static int rpc_get_exports_proto(struct conn_info *info, exports *exp) |
||||||
|
{ |
||||||
|
CLIENT *client; |
||||||
|
enum clnt_stat status; |
||||||
|
- int proto = info->proto->p_proto; |
||||||
|
+ int proto = info->proto; |
||||||
|
unsigned int option = info->close_option; |
||||||
|
int vers_entry; |
||||||
|
int ret; |
||||||
|
|
||||||
|
- if (info->proto->p_proto == IPPROTO_UDP) { |
||||||
|
+ if (info->proto == IPPROTO_UDP) { |
||||||
|
info->send_sz = UDPMSGSIZE; |
||||||
|
info->recv_sz = UDPMSGSIZE; |
||||||
|
} |
||||||
|
@@ -903,11 +885,9 @@ exports rpc_get_exports(const char *host, long seconds, long micros, unsigned in |
||||||
|
parms.pm_port = 0; |
||||||
|
|
||||||
|
/* Try UDP first */ |
||||||
|
- info.proto = getprotobyname("udp"); |
||||||
|
- if (!info.proto) |
||||||
|
- goto try_tcp; |
||||||
|
+ info.proto = IPPROTO_UDP; |
||||||
|
|
||||||
|
- parms.pm_prot = info.proto->p_proto; |
||||||
|
+ parms.pm_prot = info.proto; |
||||||
|
|
||||||
|
status = rpc_portmap_getport(&info, &parms, &info.port); |
||||||
|
if (status < 0) |
||||||
|
@@ -920,11 +900,9 @@ exports rpc_get_exports(const char *host, long seconds, long micros, unsigned in |
||||||
|
return exportlist; |
||||||
|
|
||||||
|
try_tcp: |
||||||
|
- info.proto = getprotobyname("tcp"); |
||||||
|
- if (!info.proto) |
||||||
|
- return NULL; |
||||||
|
+ info.proto = IPPROTO_TCP; |
||||||
|
|
||||||
|
- parms.pm_prot = info.proto->p_proto; |
||||||
|
+ parms.pm_prot = info.proto; |
||||||
|
|
||||||
|
status = rpc_portmap_getport(&info, &parms, &info.port); |
||||||
|
if (status < 0) |
||||||
|
diff --git a/modules/replicated.c b/modules/replicated.c |
||||||
|
index 6b96320..dbd5513 100644 |
||||||
|
--- a/modules/replicated.c |
||||||
|
+++ b/modules/replicated.c |
||||||
|
@@ -419,7 +419,7 @@ void free_host_list(struct host **list) |
||||||
|
|
||||||
|
static unsigned int get_nfs_info(unsigned logopt, struct host *host, |
||||||
|
struct conn_info *pm_info, struct conn_info *rpc_info, |
||||||
|
- const char *proto, unsigned int version, int port) |
||||||
|
+ int proto, unsigned int version, int port) |
||||||
|
{ |
||||||
|
unsigned int random_selection = host->options & MOUNT_FLAG_RANDOM_SELECT; |
||||||
|
unsigned int use_weight_only = host->options & MOUNT_FLAG_USE_WEIGHT_ONLY; |
||||||
|
@@ -433,22 +433,18 @@ static unsigned int get_nfs_info(unsigned logopt, struct host *host, |
||||||
|
int status, count = 0; |
||||||
|
|
||||||
|
if (host->addr) |
||||||
|
- debug(logopt, "called with host %s(%s) proto %s version 0x%x", |
||||||
|
+ debug(logopt, "called with host %s(%s) proto %d version 0x%x", |
||||||
|
host->name, get_addr_string(host->addr, buf, len), |
||||||
|
proto, version); |
||||||
|
else |
||||||
|
debug(logopt, |
||||||
|
- "called for host %s proto %s version 0x%x", |
||||||
|
+ "called for host %s proto %d version 0x%x", |
||||||
|
host->name, proto, version); |
||||||
|
|
||||||
|
- rpc_info->proto = getprotobyname(proto); |
||||||
|
- if (!rpc_info->proto) |
||||||
|
- return 0; |
||||||
|
- |
||||||
|
+ rpc_info->proto = proto; |
||||||
|
memset(&parms, 0, sizeof(struct pmap)); |
||||||
|
- |
||||||
|
parms.pm_prog = NFS_PROGRAM; |
||||||
|
- parms.pm_prot = rpc_info->proto->p_proto; |
||||||
|
+ parms.pm_prot = proto; |
||||||
|
|
||||||
|
if (!(version & NFS4_REQUESTED)) |
||||||
|
goto v3_ver; |
||||||
|
@@ -479,7 +475,7 @@ static unsigned int get_nfs_info(unsigned logopt, struct host *host, |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
- if (rpc_info->proto->p_proto == IPPROTO_UDP) |
||||||
|
+ if (rpc_info->proto == IPPROTO_UDP) |
||||||
|
status = rpc_udp_getclient(rpc_info, NFS_PROGRAM, NFS4_VERSION); |
||||||
|
else |
||||||
|
status = rpc_tcp_getclient(rpc_info, NFS_PROGRAM, NFS4_VERSION); |
||||||
|
@@ -540,7 +536,7 @@ v3_ver: |
||||||
|
goto v2_ver; |
||||||
|
} |
||||||
|
|
||||||
|
- if (rpc_info->proto->p_proto == IPPROTO_UDP) |
||||||
|
+ if (rpc_info->proto == IPPROTO_UDP) |
||||||
|
status = rpc_udp_getclient(rpc_info, NFS_PROGRAM, NFS3_VERSION); |
||||||
|
else |
||||||
|
status = rpc_tcp_getclient(rpc_info, NFS_PROGRAM, NFS3_VERSION); |
||||||
|
@@ -587,7 +583,7 @@ v2_ver: |
||||||
|
goto done_ver; |
||||||
|
} |
||||||
|
|
||||||
|
- if (rpc_info->proto->p_proto == IPPROTO_UDP) |
||||||
|
+ if (rpc_info->proto == IPPROTO_UDP) |
||||||
|
status = rpc_udp_getclient(rpc_info, NFS_PROGRAM, NFS2_VERSION); |
||||||
|
else |
||||||
|
status = rpc_tcp_getclient(rpc_info, NFS_PROGRAM, NFS2_VERSION); |
||||||
|
@@ -618,7 +614,7 @@ v2_ver: |
||||||
|
} |
||||||
|
|
||||||
|
done_ver: |
||||||
|
- if (rpc_info->proto->p_proto == IPPROTO_UDP) { |
||||||
|
+ if (rpc_info->proto == IPPROTO_UDP) { |
||||||
|
rpc_destroy_udp_client(rpc_info); |
||||||
|
rpc_destroy_udp_client(pm_info); |
||||||
|
} else { |
||||||
|
@@ -675,7 +671,7 @@ static int get_vers_and_cost(unsigned logopt, struct host *host, |
||||||
|
|
||||||
|
if (version & TCP_REQUESTED) { |
||||||
|
supported = get_nfs_info(logopt, host, |
||||||
|
- &pm_info, &rpc_info, "tcp", vers, port); |
||||||
|
+ &pm_info, &rpc_info, IPPROTO_TCP, vers, port); |
||||||
|
if (IS_ERR(supported)) { |
||||||
|
if (ERR(supported) == EHOSTUNREACH || |
||||||
|
ERR(supported) == ETIMEDOUT) |
||||||
|
@@ -688,7 +684,7 @@ static int get_vers_and_cost(unsigned logopt, struct host *host, |
||||||
|
|
||||||
|
if (version & UDP_REQUESTED) { |
||||||
|
supported = get_nfs_info(logopt, host, |
||||||
|
- &pm_info, &rpc_info, "udp", vers, port); |
||||||
|
+ &pm_info, &rpc_info, IPPROTO_UDP, vers, port); |
||||||
|
if (IS_ERR(supported)) { |
||||||
|
if (!ret && ERR(supported) == ETIMEDOUT) |
||||||
|
return ret; |
||||||
|
@@ -709,7 +705,7 @@ static int get_supported_ver_and_cost(unsigned logopt, struct host *host, |
||||||
|
socklen_t len = INET6_ADDRSTRLEN; |
||||||
|
char buf[len + 1]; |
||||||
|
struct conn_info pm_info, rpc_info; |
||||||
|
- const char *proto; |
||||||
|
+ int proto; |
||||||
|
unsigned int vers; |
||||||
|
struct timeval start, end; |
||||||
|
struct timezone tz; |
||||||
|
@@ -748,10 +744,10 @@ static int get_supported_ver_and_cost(unsigned logopt, struct host *host, |
||||||
|
* So, we do the conversion here. |
||||||
|
*/ |
||||||
|
if (version & UDP_SELECTED_MASK) { |
||||||
|
- proto = "udp"; |
||||||
|
+ proto = IPPROTO_UDP; |
||||||
|
version >>= 8; |
||||||
|
} else |
||||||
|
- proto = "tcp"; |
||||||
|
+ proto = IPPROTO_TCP; |
||||||
|
|
||||||
|
switch (version) { |
||||||
|
case NFS2_SUPPORTED: |
||||||
|
@@ -768,9 +764,7 @@ static int get_supported_ver_and_cost(unsigned logopt, struct host *host, |
||||||
|
return 0; |
||||||
|
} |
||||||
|
|
||||||
|
- rpc_info.proto = getprotobyname(proto); |
||||||
|
- if (!rpc_info.proto) |
||||||
|
- return 0; |
||||||
|
+ rpc_info.proto = proto; |
||||||
|
|
||||||
|
if (port > 0) |
||||||
|
rpc_info.port = port; |
||||||
|
@@ -786,14 +780,14 @@ static int get_supported_ver_and_cost(unsigned logopt, struct host *host, |
||||||
|
|
||||||
|
memset(&parms, 0, sizeof(struct pmap)); |
||||||
|
parms.pm_prog = NFS_PROGRAM; |
||||||
|
- parms.pm_prot = rpc_info.proto->p_proto; |
||||||
|
+ parms.pm_prot = rpc_info.proto; |
||||||
|
parms.pm_vers = vers; |
||||||
|
ret = rpc_portmap_getport(&pm_info, &parms, &rpc_info.port); |
||||||
|
if (ret < 0) |
||||||
|
goto done; |
||||||
|
} |
||||||
|
|
||||||
|
- if (rpc_info.proto->p_proto == IPPROTO_UDP) |
||||||
|
+ if (rpc_info.proto == IPPROTO_UDP) |
||||||
|
status = rpc_udp_getclient(&rpc_info, NFS_PROGRAM, vers); |
||||||
|
else |
||||||
|
status = rpc_tcp_getclient(&rpc_info, NFS_PROGRAM, vers); |
||||||
|
@@ -815,7 +809,7 @@ static int get_supported_ver_and_cost(unsigned logopt, struct host *host, |
||||||
|
} |
||||||
|
} |
||||||
|
done: |
||||||
|
- if (rpc_info.proto->p_proto == IPPROTO_UDP) { |
||||||
|
+ if (rpc_info.proto == IPPROTO_UDP) { |
||||||
|
rpc_destroy_udp_client(&rpc_info); |
||||||
|
rpc_destroy_udp_client(&pm_info); |
||||||
|
} else { |
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in new issue