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.
232 lines
5.8 KiB
232 lines
5.8 KiB
7 years ago
|
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,
|