You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
126 lines
3.6 KiB
126 lines
3.6 KiB
7 years ago
|
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;
|
||
|
}
|