Hello community,
here is the log from the commit of package autofs
checked in at Thu Jul 5 18:31:09 CEST 2007.
--------
--- autofs/autofs.changes 2007-04-27 09:35:43.000000000 +0200
+++ /mounts/work_src_done/STABLE/autofs/autofs.changes 2007-07-05 15:41:59.000000000 +0200
@@ -1,0 +2,13 @@
+Thu Jul 5 12:24:23 CEST 2007 - mkoenig@suse.de
+
+- update to version 5.0.2:
+ * bugfix release
+- new upstream patches
+ autofs-5.0.2-add-krb5-include.patch
+ autofs-5.0.2-bad-proto-init.patch
+ autofs-5.0.2-add-missing-multi-support.patch
+ autofs-5.0.2-add-multi-nsswitch-lookup.patch
+- removed patch (merged upstream)
+ autofs-5.0.1-fix_contained_check.patch
+
+-------------------------------------------------------------------
Old:
----
autofs-5.0.1-fix_contained_check.patch
autofs-5.0.1.tar.bz2
New:
----
autofs-5.0.2-add-krb5-include.patch
autofs-5.0.2-add-missing-multi-support.patch
autofs-5.0.2-add-multi-nsswitch-lookup.patch
autofs-5.0.2-bad-proto-init.patch
autofs-5.0.2.tar.bz2
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ autofs.spec ++++++
--- /var/tmp/diff_new_pack.D17195/_old 2007-07-05 18:29:36.000000000 +0200
+++ /var/tmp/diff_new_pack.D17195/_new 2007-07-05 18:29:36.000000000 +0200
@@ -1,5 +1,5 @@
#
-# spec file for package autofs (Version 5.0.1)
+# spec file for package autofs (Version 5.0.2)
#
# Copyright (c) 2007 SUSE LINUX Products GmbH, Nuernberg, Germany.
# This file and all modifications and additions to the pristine
@@ -11,12 +11,12 @@
# norootforbuild
Name: autofs
-BuildRequires: bison flex module-init-tools nfs-utils openldap2-devel
-License: GNU General Public License (GPL)
+BuildRequires: bison flex module-init-tools nfs-client openldap2-devel
+License: GPL v2 or later
Group: System/Daemons
Autoreqprov: on
Requires: grep
-Version: 5.0.1
+Version: 5.0.2
Release: 1
Summary: A Kernel-Based Automounter
BuildRoot: %{_tmppath}/%{name}-%{version}-build
@@ -25,13 +25,14 @@
Source3: autofs.schema
Source4: README.SuSE.ldap
Source5: README.SuSE
-# Obsolete? referenced file does not exist anymore in NetworkManager package
-#Source6: README.NetworkManager
Source7: NetworkManager-autofs
-Patch0: autofs-suse-auto_master_default.patch
-Patch1: autofs-suse-autofs_init.patch
-Patch2: autofs-5.0.1-fix_contained_check.patch
-Patch3: autofs-5.0.1-mount_xdr_no_strict_aliasing.patch
+Patch0: autofs-5.0.2-add-krb5-include.patch
+Patch1: autofs-5.0.2-bad-proto-init.patch
+Patch2: autofs-5.0.2-add-missing-multi-support.patch
+Patch3: autofs-5.0.2-add-multi-nsswitch-lookup.patch
+Patch10: autofs-suse-auto_master_default.patch
+Patch11: autofs-suse-autofs_init.patch
+Patch12: autofs-5.0.1-mount_xdr_no_strict_aliasing.patch
PreReq: %fillup_prereq %insserv_prereq
%description
@@ -53,12 +54,14 @@
cp %{SOURCE3} .
cp %{SOURCE4} .
cp %{SOURCE5} .
-#cp %{SOURCE6} .
#
%patch0 -p1
%patch1 -p1
%patch2 -p1
%patch3 -p1
+%patch10 -p1
+%patch11 -p1
+%patch12 -p1
%build
autoconf -f
@@ -94,6 +97,9 @@
fi
%{fillup_only -n autofs}
+%preun
+%{stop_on_removal autofs}
+
%postun
%{insserv_cleanup}
@@ -104,11 +110,11 @@
%config(noreplace) /etc/auto.misc
%config(noreplace) /etc/auto.net
%config(noreplace) /etc/auto.smb
+%config(noreplace) /etc/autofs_ldap_auth.conf
%config /etc/init.d/autofs
%dir /etc/NetworkManager
%dir /etc/NetworkManager/dispatcher.d
/etc/NetworkManager/dispatcher.d/autofs
-/etc/autofs_ldap_auth.conf
/usr/sbin/rcautofs
%doc COPYRIGHT README README.changer README.smbfs README.SuSE
%doc autofs.schema README.SuSE.ldap README.v5.release
@@ -118,6 +124,16 @@
/usr/sbin/automount
%changelog
+* Thu Jul 05 2007 - mkoenig@suse.de
+- update to version 5.0.2:
+ * bugfix release
+- new upstream patches
+ autofs-5.0.2-add-krb5-include.patch
+ autofs-5.0.2-bad-proto-init.patch
+ autofs-5.0.2-add-missing-multi-support.patch
+ autofs-5.0.2-add-multi-nsswitch-lookup.patch
+- removed patch (merged upstream)
+ autofs-5.0.1-fix_contained_check.patch
* Thu Apr 26 2007 - mkoenig@suse.de
- update to version 5.0.1:
* autofs5 is a major rewrite
++++++ autofs-5.0.2-add-krb5-include.patch ++++++
diff --git a/CHANGELOG b/CHANGELOG
index 172d0cd..6931791 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,3 +1,7 @@
+??/??/2007 autofs-5.0.3
+-----------------------
+- include krb5.h in lookup_ldap.h (some openssl doesn't implicitly include it).
+
18/06/2007 autofs-5.0.2
-----------------------
- fix return check for getpwuid_r and getgrgid_r.
diff --git a/include/lookup_ldap.h b/include/lookup_ldap.h
index e1c5b4e..0a9deca 100644
--- a/include/lookup_ldap.h
+++ b/include/lookup_ldap.h
@@ -7,6 +7,7 @@
#include
#include
#include
+#include
#endif
struct lookup_context {
++++++ autofs-5.0.2-add-missing-multi-support.patch ++++++
diff --git a/CHANGELOG b/CHANGELOG
index 91903e9..6b16b0f 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -2,6 +2,7 @@
-----------------------
- include krb5.h in lookup_ldap.h (some openssl doesn't implicitly include it).
- correct initialization of local var in parse_server_string.
+- add missing "multi" map support.
18/06/2007 autofs-5.0.2
-----------------------
diff --git a/daemon/lookup.c b/daemon/lookup.c
index 06fcecc..70b9e02 100644
--- a/daemon/lookup.c
+++ b/daemon/lookup.c
@@ -456,8 +456,12 @@ int lookup_nss_read_map(struct autofs_point *ap, struct map_source *source, time
}
if (map->type) {
- debug(ap->logopt,
- "reading map %s %s", map->type, map->argv[0]);
+ if (!strncmp(map->type, "multi", 5))
+ debug(ap->logopt, "reading multi map");
+ else
+ debug(ap->logopt,
+ "reading map %s %s",
+ map->type, map->argv[0]);
result = do_read_map(ap, map, age);
map = map->next;
continue;
diff --git a/include/automount.h b/include/automount.h
index 85e6e9c..106ed0a 100644
--- a/include/automount.h
+++ b/include/automount.h
@@ -192,6 +192,7 @@ char *cache_get_offset(const char *prefix, char *offset, int start, struct list_
/* Utility functions */
char **add_argv(int argc, char **argv, char *str);
+char **append_argv(int argc1, char **argv1, int argc2, char **argv2);
const char **copy_argv(int argc, const char **argv);
int compare_argv(int argc1, const char **argv1, int argc2, const char **argv2);
int free_argv(int argc, const char **argv);
diff --git a/lib/args.c b/lib/args.c
index 9e35388..fbfb004 100644
--- a/lib/args.c
+++ b/lib/args.c
@@ -62,6 +62,45 @@ char **add_argv(int argc, char **argv, char *str)
return vector;
}
+char **append_argv(int argc1, char **argv1, int argc2, char **argv2)
+{
+ char **vector;
+ size_t vector_size;
+ int len, i, j;
+
+ len = argc1 + argc2;
+ vector_size = (len + 1) * sizeof(char *);
+ vector = (char **) realloc(argv1, vector_size);
+ if (!vector) {
+ free_argv(argc1, (const char **) argv1);
+ free_argv(argc2, (const char **) argv2);
+ return NULL;
+ }
+
+ for (i = argc1, j = 0; i <= len; i++, j++) {
+ if (argv2[j]) {
+ vector[i] = strdup(argv2[j]);
+ if (!vector[i]) {
+ error(LOGOPT_ANY, "failed to strdup arg");
+ break;
+ }
+ } else
+ vector[i] = NULL;
+ }
+
+ if (i < len) {
+ free_argv(len, (const char **) vector);
+ free_argv(argc2, (const char **) argv2);
+ return NULL;
+ }
+
+ vector[len] = NULL;
+
+ free_argv(argc2, (const char **) argv2);
+
+ return vector;
+}
+
const char **copy_argv(int argc, const char **argv)
{
char **vector;
diff --git a/lib/master_parse.y b/lib/master_parse.y
index 8d2be02..f9cba05 100644
--- a/lib/master_parse.y
+++ b/lib/master_parse.y
@@ -22,6 +22,7 @@
#include
#include
#include
+#include
#include
#include "automount.h"
@@ -44,6 +45,7 @@ extern void master_set_scan_buffer(const char *);
static char *master_strdup(char *);
static void local_init_vars(void);
static void local_free_vars(void);
+static int add_multi_mapstr(void);
static int master_error(const char *s);
static int master_notify(const char *s);
@@ -53,6 +55,8 @@ static char *type;
static char *format;
static long timeout;
static unsigned ghost;
+static char **tmp_argv;
+static int tmp_argc;
static char **local_argv;
static int local_argc;
@@ -89,7 +93,7 @@ static int master_fprintf(FILE *, char *, ...);
%token COMMENT
%token MAP
%token OPT_TIMEOUT OPT_NOGHOST OPT_GHOST OPT_VERBOSE OPT_DEBUG
-%token COLON COMMA NL
+%token COLON COMMA NL DDASH
%type <strtype> map
%type <strtype> options
%type <strtype> dn
@@ -103,6 +107,7 @@ static int master_fprintf(FILE *, char *, ...);
%token <strtype> NILL
%token <strtype> SPACE
%token <strtype> EQUAL
+%token <strtype> MULTITYPE
%token <strtype> MAPTYPE
%token <strtype> DNSERVER
%token <strtype> DNATTR
@@ -126,7 +131,7 @@ file: {
;
line:
- | PATH map
+ | PATH mapspec
{
path = master_strdup($1);
if (!path) {
@@ -134,14 +139,49 @@ line:
YYABORT;
}
}
- | PATH map options
+ | PATH MULTITYPE maplist
{
+ char *tmp;
+
+ tmp = strchr($2, ':');
+ if (tmp)
+ *tmp = '\0';
+ else {
+ int len = strlen($2);
+ while (len-- && isblank($2[len]))
+ $2[len] = '\0';
+ if (len < 4) {
+ master_notify($2);
+ local_free_vars();
+ YYABORT;
+ }
+ }
+
path = master_strdup($1);
if (!path) {
+ master_error("memory allocation error");
local_free_vars();
YYABORT;
}
- }
+
+ if ((tmp = strchr($2, ',')))
+ *tmp++ = '\0';
+
+ type = master_strdup($2);
+ if (!type) {
+ master_error("memory allocation error");
+ local_free_vars();
+ YYABORT;
+ }
+ if (tmp) {
+ format = master_strdup(tmp);
+ if (!format) {
+ master_error("memory allocation error");
+ local_free_vars();
+ YYABORT;
+ }
+ }
+ }
| PATH COLON { master_notify($1); YYABORT; }
| PATH OPTION { master_notify($2); YYABORT; }
| PATH NILL { master_notify($2); YYABORT; }
@@ -157,25 +197,89 @@ line:
| COMMENT { YYABORT; }
;
-map: PATH
+mapspec: map
+ {
+ local_argc = tmp_argc;
+ local_argv = tmp_argv;
+ tmp_argc = 0;
+ tmp_argv = NULL;
+ }
+ | map options
+ {
+ local_argc = tmp_argc;
+ local_argv = tmp_argv;
+ tmp_argc = 0;
+ tmp_argv = NULL;
+ }
+ ;
+
+maplist: map
+ {
+ if (!add_multi_mapstr()) {
+ master_error("memory allocation error");
+ local_free_vars();
+ YYABORT;
+ }
+ }
+ | map options
+ {
+ if (!add_multi_mapstr()) {
+ master_error("memory allocation error");
+ local_free_vars();
+ YYABORT;
+ }
+ }
+ | maplist DDASH map
{
local_argc++;
- local_argv = add_argv(local_argc, local_argv, $1);
+ local_argv = add_argv(local_argc, local_argv, "--");
if (!local_argv) {
master_error("memory allocation error");
local_free_vars();
YYABORT;
}
+ if (!add_multi_mapstr()) {
+ master_error("memory allocation error");
+ local_free_vars();
+ YYABORT;
+ }
}
- | MAPNAME
+ | maplist DDASH map options
{
local_argc++;
- local_argv = add_argv(local_argc, local_argv, $1);
+ local_argv = add_argv(local_argc, local_argv, "--");
if (!local_argv) {
master_error("memory allocation error");
local_free_vars();
YYABORT;
}
+ if (!add_multi_mapstr()) {
+ master_error("memory allocation error");
+ local_free_vars();
+ YYABORT;
+ }
+ }
+ ;
+
+map: PATH
+ {
+ tmp_argc++;
+ tmp_argv = add_argv(tmp_argc, tmp_argv, $1);
+ if (!tmp_argv) {
+ master_error("memory allocation error");
+ local_free_vars();
+ YYABORT;
+ }
+ }
+ | MAPNAME
+ {
+ tmp_argc++;
+ tmp_argv = add_argv(tmp_argc, tmp_argv, $1);
+ if (!tmp_argv) {
+ master_error("memory allocation error");
+ local_free_vars();
+ YYABORT;
+ }
}
| MAPHOSTS
{
@@ -200,9 +304,9 @@ map: PATH
local_free_vars();
YYABORT;
}
- local_argc++;
- local_argv = add_argv(local_argc, local_argv, $1);
- if (!local_argv) {
+ tmp_argc++;
+ tmp_argv = add_argv(tmp_argc, tmp_argv, $1);
+ if (!tmp_argv) {
master_error("memory allocation error");
local_free_vars();
YYABORT;
@@ -227,9 +331,9 @@ map: PATH
YYABORT;
}
}
- local_argc++;
- local_argv = add_argv(local_argc, local_argv, $3);
- if (!local_argv) {
+ tmp_argc++;
+ tmp_argv = add_argv(tmp_argc, tmp_argv, $3);
+ if (!tmp_argv) {
master_error("memory allocation error");
local_free_vars();
YYABORT;
@@ -254,9 +358,9 @@ map: PATH
YYABORT;
}
}
- local_argc++;
- local_argv = add_argv(local_argc, local_argv, $3);
- if (!local_argv) {
+ tmp_argc++;
+ tmp_argv = add_argv(tmp_argc, tmp_argv, $3);
+ if (!tmp_argv) {
master_error("memory allocation error");
local_free_vars();
YYABORT;
@@ -281,25 +385,25 @@ map: PATH
YYABORT;
}
}
- local_argc++;
- local_argv = add_argv(local_argc, local_argv, $3);
- if (!local_argv) {
+ tmp_argc++;
+ tmp_argv = add_argv(tmp_argc, tmp_argv, $3);
+ if (!tmp_argv) {
master_error("memory allocation error");
local_free_vars();
YYABORT;
}
/* Add back the type for lookup_ldap.c to handle ldaps */
- if (*local_argv[0]) {
- tmp = malloc(strlen(type) + strlen(local_argv[0]) + 2);
+ if (*tmp_argv[0]) {
+ tmp = malloc(strlen(type) + strlen(tmp_argv[0]) + 2);
if (!tmp) {
local_free_vars();
YYABORT;
}
strcpy(tmp, type);
strcat(tmp, ":");
- strcat(tmp, local_argv[0]);
- free(local_argv[0]);
- local_argv[0] = tmp;
+ strcat(tmp, tmp_argv[0]);
+ free(tmp_argv[0]);
+ tmp_argv[0] = tmp;
}
}
;
@@ -441,9 +545,9 @@ daemon_option: OPT_TIMEOUT NUMBER { timeout = $2; }
mount_option: OPTION
{
- local_argc++;
- local_argv = add_argv(local_argc, local_argv, $1);
- if (!local_argv) {
+ tmp_argc++;
+ tmp_argv = add_argv(tmp_argc, tmp_argv, $1);
+ if (!tmp_argv) {
master_error("memory allocation error");
local_free_vars();
YYABORT;
@@ -494,6 +598,8 @@ static void local_init_vars(void)
debug = 0;
timeout = -1;
ghost = defaults_get_browse_mode();
+ tmp_argv = NULL;
+ tmp_argc = 0;
local_argv = NULL;
local_argc = 0;
}
@@ -509,8 +615,62 @@ static void local_free_vars(void)
if (format)
free(format);
- if (local_argv)
+ if (local_argv) {
free_argv(local_argc, (const char **) local_argv);
+ local_argv = NULL;
+ local_argc = 0;
+ }
+
+ if (tmp_argv) {
+ free_argv(tmp_argc, (const char **) tmp_argv);
+ tmp_argv = NULL;
+ tmp_argc = 0;
+ }
+}
+
+static int add_multi_mapstr(void)
+{
+ /* We need the individual map types for a multi map */
+ if (!type) {
+ if (tmp_argc > 0 && *tmp_argv[0] == '/')
+ type = strdup("file");
+ else
+ return 0;
+ }
+
+ if (format) {
+ char *tmp = realloc(type, strlen(type) + strlen(format) + 2);
+ if (!tmp)
+ return 0;
+ type = tmp;
+ strcat(type, ",");
+ strcat(type, format);
+ free(format);
+ format = NULL;
+ }
+
+ local_argc++;
+ local_argv = add_argv(local_argc, local_argv, type);
+ if (!local_argv) {
+ free(type);
+ type = NULL;
+ return 0;
+ }
+
+ local_argv = append_argv(local_argc, local_argv, tmp_argc, tmp_argv);
+ if (!local_argv) {
+ free(type);
+ type = NULL;
+ return 0;
+ }
+ local_argc += tmp_argc;
+
+ tmp_argc = 0;
+ tmp_argv = NULL;
+ free(type);
+ type = NULL;
+
+ return 1;
}
void master_init_scan(void)
diff --git a/lib/master_tok.l b/lib/master_tok.l
index ee2a4eb..0548de1 100644
--- a/lib/master_tok.l
+++ b/lib/master_tok.l
@@ -27,6 +27,7 @@ static void master_echo(void); /* forward definition */
#include
#include
#include
+#include
#include "master_parse.tab.h"
/*
@@ -110,7 +111,9 @@ DNATTRSTR {AT_CN}|{AT_NMN}|{AT_AMN}|{AT_OU}|{AT_DC}|{AT_O}|{AT_C}
DNNAMESTR ([[:alnum:]_.\-]+)
INTMAP (-hosts|-null)
-MTYPE ((file|program|yp|nis|nisplus|ldap|ldaps|hesiod|userdir)(,(sun|hesiod))?)
+MULTI ((multi)(,(sun|hesiod))?[\:]?{OPTWS})
+MULTISEP ([\-]{2}[[:blank:]]+)
+MTYPE ((file|program|yp|nis|nisplus|ldap|ldaps|hesiod|userdir)(,(sun|hesiod))?)
OPTTOUT (-t{OPTWS}|-t{OPTWS}={OPTWS}|--timeout{OPTWS}|--timeout{OPTWS}={OPTWS})
@@ -184,11 +187,18 @@ OPTTOUT (-t{OPTWS}|-t{OPTWS}={OPTWS}|--timeout{OPTWS}|--timeout{OPTWS}={OPTWS})
<MAPSTR>{
{OPTWS}\\\n{OPTWS} {}
+ {MULTI} {
+ strcpy(master_lval.strtype, master_text);
+ return(MULTITYPE);
+ }
+
{MTYPE}/":" {
strcpy(master_lval.strtype, master_text);
return(MAPTYPE);
}
+ {MULTISEP} { return(DDASH); }
+
":" { return(COLON); }
"-hosts" {
@@ -298,6 +308,11 @@ OPTTOUT (-t{OPTWS}|-t{OPTWS}={OPTWS}|--timeout{OPTWS}|--timeout{OPTWS}={OPTWS})
<OPTSTR>{
{OPTWS}\\\n{OPTWS} {}
+ {MULTISEP} {
+ BEGIN(MAPSTR);
+ return(DDASH);
+ }
+
{OPTTOUT} { return(OPT_TIMEOUT); }
{NUMBER} {
diff --git a/modules/lookup_multi.c b/modules/lookup_multi.c
index 00ab28e..38ca36c 100644
--- a/modules/lookup_multi.c
+++ b/modules/lookup_multi.c
@@ -45,7 +45,7 @@ int lookup_init(const char *my_mapfmt, int argc, const char *const *argv, void *
struct lookup_context *ctxt;
char buf[MAX_ERR_BUF];
char *map, *mapfmt;
- int i, j, an;
+ int i, an;
char *estr;
ctxt = malloc(sizeof(struct lookup_context));
@@ -73,7 +73,7 @@ int lookup_init(const char *my_mapfmt, int argc, const char *const *argv, void *
memcpy(ctxt->argl, argv, (argc + 1) * sizeof(const char *));
- for (i = j = an = 0; ctxt->argl[an]; an++) {
+ for (i = an = 0; ctxt->argl[an]; an++) {
if (ctxt->m[i].argc == 0) {
ctxt->m[i].argv = &ctxt->argl[an];
}
@@ -100,9 +100,12 @@ int lookup_init(const char *my_mapfmt, int argc, const char *const *argv, void *
if (!(ctxt->m[i].mod = open_lookup(map, MODPREFIX,
mapfmt ? mapfmt : my_mapfmt,
ctxt->m[i].argc - 1,
- ctxt->m[i].argv + 1)))
+ ctxt->m[i].argv + 1))) {
error(LOGOPT_ANY, MODPREFIX "error opening module");
+ free(map);
goto error_out;
+ }
+ free(map);
}
*context = ctxt;
++++++ autofs-5.0.2-add-multi-nsswitch-lookup.patch ++++++
diff --git a/CHANGELOG b/CHANGELOG
index 6b16b0f..d66b8fc 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -3,6 +3,7 @@
- include krb5.h in lookup_ldap.h (some openssl doesn't implicitly include it).
- correct initialization of local var in parse_server_string.
- add missing "multi" map support.
+- add multi nsswitch lookup.
18/06/2007 autofs-5.0.2
-----------------------
diff --git a/lib/master_parse.y b/lib/master_parse.y
index f9cba05..ab2895d 100644
--- a/lib/master_parse.y
+++ b/lib/master_parse.y
@@ -45,6 +45,7 @@ extern void master_set_scan_buffer(const char *);
static char *master_strdup(char *);
static void local_init_vars(void);
static void local_free_vars(void);
+static void trim_maptype(char *);
static int add_multi_mapstr(void);
static int master_error(const char *s);
@@ -141,21 +142,9 @@ line:
}
| PATH MULTITYPE maplist
{
- char *tmp;
-
- tmp = strchr($2, ':');
- if (tmp)
- *tmp = '\0';
- else {
- int len = strlen($2);
- while (len-- && isblank($2[len]))
- $2[len] = '\0';
- if (len < 4) {
- master_notify($2);
- local_free_vars();
- YYABORT;
- }
- }
+ char *tmp = NULL;
+
+ trim_maptype($2);
path = master_strdup($1);
if (!path) {
@@ -312,81 +301,93 @@ map: PATH
YYABORT;
}
}
- | MAPTYPE COLON PATH
+ | MAPTYPE PATH
{
char *tmp = NULL;
+ trim_maptype($1);
+
if ((tmp = strchr($1, ',')))
*tmp++ = '\0';
type = master_strdup($1);
if (!type) {
+ master_error("memory allocation error");
local_free_vars();
YYABORT;
}
if (tmp) {
format = master_strdup(tmp);
if (!format) {
+ master_error("memory allocation error");
local_free_vars();
YYABORT;
}
}
tmp_argc++;
- tmp_argv = add_argv(tmp_argc, tmp_argv, $3);
+ tmp_argv = add_argv(tmp_argc, tmp_argv, $2);
if (!tmp_argv) {
master_error("memory allocation error");
local_free_vars();
YYABORT;
}
}
- | MAPTYPE COLON MAPNAME
+ | MAPTYPE MAPNAME
{
char *tmp = NULL;
+ trim_maptype($1);
+
if ((tmp = strchr($1, ',')))
*tmp++ = '\0';
type = master_strdup($1);
if (!type) {
+ master_error("memory allocation error");
local_free_vars();
YYABORT;
}
if (tmp) {
format = master_strdup(tmp);
if (!format) {
+ master_error("memory allocation error");
local_free_vars();
YYABORT;
}
}
tmp_argc++;
- tmp_argv = add_argv(tmp_argc, tmp_argv, $3);
+ tmp_argv = add_argv(tmp_argc, tmp_argv, $2);
if (!tmp_argv) {
master_error("memory allocation error");
local_free_vars();
YYABORT;
}
}
- | MAPTYPE COLON dn
+ | MAPTYPE dn
{
char *tmp = NULL;
+ trim_maptype($1);
+
if ((tmp = strchr($1, ',')))
*tmp++ = '\0';
type = master_strdup($1);
if (!type) {
+ master_error("memory allocation error");
local_free_vars();
YYABORT;
}
if (tmp) {
format = master_strdup(tmp);
if (!format) {
+ master_error("memory allocation error");
local_free_vars();
YYABORT;
}
}
tmp_argc++;
- tmp_argv = add_argv(tmp_argc, tmp_argv, $3);
+ tmp_argv = add_argv(tmp_argc, tmp_argv, $2);
if (!tmp_argv) {
master_error("memory allocation error");
local_free_vars();
@@ -396,6 +397,7 @@ map: PATH
if (*tmp_argv[0]) {
tmp = malloc(strlen(type) + strlen(tmp_argv[0]) + 2);
if (!tmp) {
+ master_error("memory allocation error");
local_free_vars();
YYABORT;
}
@@ -628,33 +630,47 @@ static void local_free_vars(void)
}
}
-static int add_multi_mapstr(void)
+static void trim_maptype(char *type)
{
- /* We need the individual map types for a multi map */
- if (!type) {
- if (tmp_argc > 0 && *tmp_argv[0] == '/')
- type = strdup("file");
- else
- return 0;
+ char *tmp;
+
+ tmp = strchr(type, ':');
+ if (tmp)
+ *tmp = '\0';
+ else {
+ int len = strlen(type);
+ while (len-- && isblank(type[len]))
+ type[len] = '\0';
}
+ return;
+}
+
+static int add_multi_mapstr(void)
+{
+ if (type) {
+ /* If type given and format is non-null add it back */
+ if (format) {
+ int len = strlen(type) + strlen(format) + 2;
+ char *tmp = realloc(type, len);
+ if (!tmp)
+ return 0;
+ type = tmp;
+ strcat(type, ",");
+ strcat(type, format);
+ free(format);
+ format = NULL;
+ }
- if (format) {
- char *tmp = realloc(type, strlen(type) + strlen(format) + 2);
- if (!tmp)
+ local_argc++;
+ local_argv = add_argv(local_argc, local_argv, type);
+ if (!local_argv) {
+ free(type);
+ type = NULL;
return 0;
- type = tmp;
- strcat(type, ",");
- strcat(type, format);
- free(format);
- format = NULL;
- }
+ }
- local_argc++;
- local_argv = add_argv(local_argc, local_argv, type);
- if (!local_argv) {
free(type);
type = NULL;
- return 0;
}
local_argv = append_argv(local_argc, local_argv, tmp_argc, tmp_argv);
@@ -667,8 +683,6 @@ static int add_multi_mapstr(void)
tmp_argc = 0;
tmp_argv = NULL;
- free(type);
- type = NULL;
return 1;
}
diff --git a/lib/master_tok.l b/lib/master_tok.l
index 0548de1..9bfeefa 100644
--- a/lib/master_tok.l
+++ b/lib/master_tok.l
@@ -111,9 +111,9 @@ DNATTRSTR {AT_CN}|{AT_NMN}|{AT_AMN}|{AT_OU}|{AT_DC}|{AT_O}|{AT_C}
DNNAMESTR ([[:alnum:]_.\-]+)
INTMAP (-hosts|-null)
-MULTI ((multi)(,(sun|hesiod))?[\:]?{OPTWS})
+MULTI ((multi)(,(sun|hesiod))?(:{OPTWS}|{WS}))
MULTISEP ([\-]{2}[[:blank:]]+)
-MTYPE ((file|program|yp|nis|nisplus|ldap|ldaps|hesiod|userdir)(,(sun|hesiod))?)
+MTYPE ((file|program|yp|nis|nisplus|ldap|ldaps|hesiod|userdir)(,(sun|hesiod))?(:{OPTWS}|{WS}))
OPTTOUT (-t{OPTWS}|-t{OPTWS}={OPTWS}|--timeout{OPTWS}|--timeout{OPTWS}={OPTWS})
@@ -192,7 +192,7 @@ OPTTOUT (-t{OPTWS}|-t{OPTWS}={OPTWS}|--timeout{OPTWS}|--timeout{OPTWS}={OPTWS})
return(MULTITYPE);
}
- {MTYPE}/":" {
+ {MTYPE} {
strcpy(master_lval.strtype, master_text);
return(MAPTYPE);
}
diff --git a/man/auto.master.5.in b/man/auto.master.5.in
index 0e36a6f..98afaa9 100644
--- a/man/auto.master.5.in
+++ b/man/auto.master.5.in
@@ -103,6 +103,10 @@ entries are used for maps.
.B ldap \fPor\fB ldaps
The map is stored in an LDAP directory. If \fBldaps\fP is used the
appropriate certificate must be configured in the LDAP client.
+.TP
+.B multi
+This map type allows the specification of multiple maps separated
+by "--". These maps are searched in order to resolve key lookups.
.RE
.TP
\fBformat\fP
diff --git a/modules/lookup_multi.c b/modules/lookup_multi.c
index 38ca36c..8fa94ae 100644
--- a/modules/lookup_multi.c
+++ b/modules/lookup_multi.c
@@ -19,6 +19,7 @@
#include
#include
#include
+#include
#define MODULE_LOOKUP
#include "automount.h"
@@ -28,7 +29,7 @@
struct module_info {
int argc;
- const char *const *argv;
+ const char **argv;
struct lookup_mod *mod;
};
@@ -40,11 +41,105 @@ struct lookup_context {
int lookup_version = AUTOFS_LOOKUP_VERSION; /* Required by protocol */
+static struct lookup_mod *nss_open_lookup(const char *format, int argc, const char **argv)
+{
+ struct list_head nsslist;
+ struct list_head *head, *p;
+ struct lookup_mod *mod;
+ char buf[MAX_ERR_BUF], *estr;
+
+ if (!argv || !argv[0])
+ return NULL;
+
+ if (*argv[0] == '/')
+ return open_lookup("file", MODPREFIX, format, argc, argv);
+
+ if (!strncmp(argv[0], "file", 4) ||
+ !strncmp(argv[0], "yp", 2) ||
+ !strncmp(argv[0], "nisplus", 7) ||
+ !strncmp(argv[0], "nis", 3) ||
+ !strncmp(argv[0], "ldaps", 5) ||
+ !strncmp(argv[0], "ldap", 4)) {
+ const char *fmt = strchr(argv[0], ',');
+ if (fmt)
+ fmt++;
+ else
+ fmt = format;
+ return open_lookup(argv[0], MODPREFIX, fmt, argc -1, argv + 1);
+ }
+
+ INIT_LIST_HEAD(&nsslist);
+
+ if (nsswitch_parse(&nsslist)) {
+ if (!list_empty(&nsslist))
+ free_sources(&nsslist);
+ error(LOGOPT_ANY, "can't to read name service switch config.");
+ return NULL;
+ }
+
+ head = &nsslist;
+ list_for_each(p, head) {
+ struct nss_source *this;
+
+ this = list_entry(p, struct nss_source, list);
+
+ if (!strcmp(this->source, "files")) {
+ char src_file[] = "file";
+ char src_prog[] = "program";
+ struct stat st;
+ char *type, *path, *save_argv0;
+
+ path = malloc(strlen(AUTOFS_MAP_DIR) + strlen(argv[0]) + 2);
+ if (!path) {
+ estr = strerror_r(errno, buf, MAX_ERR_BUF);
+ crit(LOGOPT_ANY, MODPREFIX "error: %s", estr);
+ free_sources(&nsslist);
+ return NULL;
+ }
+ strcpy(path, AUTOFS_MAP_DIR);
+ strcat(path, "/");
+ strcat(path, argv[0]);
+
+ if (stat(path, &st) == -1 || !S_ISREG(st.st_mode)) {
+ free(path);
+ continue;
+ }
+
+ if (st.st_mode & __S_IEXEC)
+ type = src_prog;
+ else
+ type = src_file;
+
+ save_argv0 = (char *) argv[0];
+ argv[0] = path;
+
+ mod = open_lookup(type, MODPREFIX, format, argc, argv);
+ if (mod) {
+ free_sources(&nsslist);
+ free(save_argv0);
+ return mod;
+ }
+
+ argv[0] = save_argv0;
+ free(path);
+ }
+
+ mod = open_lookup(this->source, MODPREFIX, format, argc, argv);
+ if (mod) {
+ free_sources(&nsslist);
+ return mod;
+ }
+ }
+ free_sources(&nsslist);
+
+ return NULL;
+}
+
int lookup_init(const char *my_mapfmt, int argc, const char *const *argv, void **context)
{
struct lookup_context *ctxt;
char buf[MAX_ERR_BUF];
- char *map, *mapfmt;
+ char **args;
int i, an;
char *estr;
@@ -73,39 +168,42 @@ int lookup_init(const char *my_mapfmt, int argc, const char *const *argv, void *
memcpy(ctxt->argl, argv, (argc + 1) * sizeof(const char *));
+ args = NULL;
for (i = an = 0; ctxt->argl[an]; an++) {
if (ctxt->m[i].argc == 0) {
- ctxt->m[i].argv = &ctxt->argl[an];
+ args = (char **) &ctxt->argl[an];
}
if (!strcmp(ctxt->argl[an], "--")) {
ctxt->argl[an] = NULL;
+ if (!args) {
+ crit(LOGOPT_ANY,
+ MODPREFIX "error assigning map args");
+ goto error_out;
+ }
+ ctxt->m[i].argv = copy_argv(ctxt->m[i].argc, (const char **) args);
+ if (!ctxt->m[i].argv)
+ goto nomem;
+ args = NULL;
i++;
} else {
ctxt->m[i].argc++;
}
}
- for (i = 0; i < ctxt->n; i++) {
- if (!ctxt->m[i].argv[0]) {
- crit(LOGOPT_ANY, MODPREFIX "missing module name");
- goto error_out;
- }
- map = strdup(ctxt->m[i].argv[0]);
- if (!map)
+ /* catch the last one */
+ if (args) {
+ ctxt->m[i].argv = copy_argv(ctxt->m[i].argc, (const char **) args);
+ if (!ctxt->m[i].argv)
goto nomem;
+ }
- if ((mapfmt = strchr(map, ',')))
- *(mapfmt++) = '\0';
-
- if (!(ctxt->m[i].mod = open_lookup(map, MODPREFIX,
- mapfmt ? mapfmt : my_mapfmt,
- ctxt->m[i].argc - 1,
- ctxt->m[i].argv + 1))) {
+ for (i = 0; i < ctxt->n; i++) {
+ ctxt->m[i].mod = nss_open_lookup(my_mapfmt,
+ ctxt->m[i].argc, ctxt->m[i].argv);
+ if (!ctxt->m[i].mod) {
error(LOGOPT_ANY, MODPREFIX "error opening module");
- free(map);
goto error_out;
}
- free(map);
}
*context = ctxt;
@@ -116,9 +214,12 @@ nomem:
crit(LOGOPT_ANY, MODPREFIX "error: %s", estr);
error_out:
if (ctxt) {
- for (i = 0; i < ctxt->n; i++)
+ for (i = 0; i < ctxt->n; i++) {
if (ctxt->m[i].mod)
close_lookup(ctxt->m[i].mod);
+ if (ctxt->m[i].argv)
+ free_argv(ctxt->m[i].argc, ctxt->m[i].argv);
+ }
if (ctxt->m)
free(ctxt->m);
if (ctxt->argl)
@@ -188,6 +289,8 @@ int lookup_done(void *context)
for (i = 0; i < ctxt->n; i++) {
if (ctxt->m[i].mod)
rv = rv || close_lookup(ctxt->m[i].mod);
+ if (ctxt->m[i].argv)
+ free_argv(ctxt->m[i].argc, ctxt->m[i].argv);
}
free(ctxt->argl);
free(ctxt->m);
++++++ autofs-5.0.2-bad-proto-init.patch ++++++
diff --git a/CHANGELOG b/CHANGELOG
index 6931791..91903e9 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,6 +1,7 @@
??/??/2007 autofs-5.0.3
-----------------------
- include krb5.h in lookup_ldap.h (some openssl doesn't implicitly include it).
+- correct initialization of local var in parse_server_string.
18/06/2007 autofs-5.0.2
-----------------------
diff --git a/modules/lookup_ldap.c b/modules/lookup_ldap.c
index 06506a0..de8d515 100644
--- a/modules/lookup_ldap.c
+++ b/modules/lookup_ldap.c
@@ -549,7 +549,7 @@ static int parse_server_string(const char *url, struct lookup_context *ctxt)
const char *ptr, *name;
int l, al_len;
- *proto = '\0';
+ memset(proto, 0, 9);
ptr = url;
debug(LOGOPT_NONE,
@@ -620,7 +620,7 @@ static int parse_server_string(const char *url, struct lookup_context *ctxt)
} else if (strchr(ptr, ':') != NULL) {
char *q = NULL;
- /* Isolate the server(s). Include the port spec */
+ /* Isolate the server. Include the port spec */
q = strchr(ptr, ':');
if (isdigit(*q))
while (isdigit(*q))
@@ -633,7 +633,7 @@ static int parse_server_string(const char *url, struct lookup_context *ctxt)
}
l = q - ptr;
- if (proto) {
+ if (*proto) {
al_len = l + strlen(proto) + 2;
tmp = malloc(al_len);
} else {
++++++ autofs-5.0.1.tar.bz2 -> autofs-5.0.2.tar.bz2 ++++++
++++ 14025 lines of diff (skipped)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Remember to have fun...
---------------------------------------------------------------------
To unsubscribe, e-mail: opensuse-commit+unsubscribe@opensuse.org
For additional commands, e-mail: opensuse-commit+help@opensuse.org