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.
124 lines
3.5 KiB
124 lines
3.5 KiB
7 years ago
|
autofs-5.0.9 - amd lookup add nfsl and linkx fs types
|
||
|
|
||
|
From: Ian Kent <raven@themaw.net>
|
||
|
|
||
|
|
||
|
---
|
||
|
modules/amd_parse.y | 8 ++++++--
|
||
|
modules/parse_amd.c | 54 +++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
2 files changed, 60 insertions(+), 2 deletions(-)
|
||
|
|
||
|
diff --git a/modules/amd_parse.y b/modules/amd_parse.y
|
||
|
index 77adbe5..1d4a0a3 100644
|
||
|
--- a/modules/amd_parse.y
|
||
|
+++ b/modules/amd_parse.y
|
||
|
@@ -246,9 +246,15 @@ option_assignment: MAP_OPTION OPTION_ASSIGN FS_TYPE
|
||
|
!strcmp($3, "nfs4")) {
|
||
|
entry.flags |= AMD_MOUNT_TYPE_NFS;
|
||
|
entry.type = amd_strdup($3);
|
||
|
+ } else if (!strcmp($3, "nfsl")) {
|
||
|
+ entry.flags |= AMD_MOUNT_TYPE_NFSL;
|
||
|
+ entry.type = amd_strdup($3);
|
||
|
} else if (!strcmp($3, "link")) {
|
||
|
entry.flags |= AMD_MOUNT_TYPE_LINK;
|
||
|
entry.type = amd_strdup($3);
|
||
|
+ } else if (!strcmp($3, "linkx")) {
|
||
|
+ entry.flags |= AMD_MOUNT_TYPE_LINKX;
|
||
|
+ entry.type = amd_strdup($3);
|
||
|
} else if (!strcmp($3, "host")) {
|
||
|
entry.flags |= AMD_MOUNT_TYPE_HOST;
|
||
|
entry.type = amd_strdup($3);
|
||
|
@@ -264,9 +270,7 @@ option_assignment: MAP_OPTION OPTION_ASSIGN FS_TYPE
|
||
|
entry.flags |= AMD_MOUNT_TYPE_EXT;
|
||
|
entry.type = amd_strdup($3);
|
||
|
} else if (!strcmp($3, "jfs") ||
|
||
|
- !strcmp($3, "linkx") ||
|
||
|
!strcmp($3, "nfsx") ||
|
||
|
- !strcmp($3, "nfsl") ||
|
||
|
!strcmp($3, "program") ||
|
||
|
!strcmp($3, "lustre") ||
|
||
|
!strcmp($3, "direct")) {
|
||
|
diff --git a/modules/parse_amd.c b/modules/parse_amd.c
|
||
|
index 4cebce8..7e04beb 100644
|
||
|
--- a/modules/parse_amd.c
|
||
|
+++ b/modules/parse_amd.c
|
||
|
@@ -955,6 +955,23 @@ out:
|
||
|
return ret;
|
||
|
}
|
||
|
|
||
|
+static int do_linkx_mount(struct autofs_point *ap, const char *name,
|
||
|
+ struct amd_entry *entry, unsigned int flags)
|
||
|
+{
|
||
|
+ struct stat st;
|
||
|
+ char *target;
|
||
|
+
|
||
|
+ if (entry->sublink)
|
||
|
+ target = entry->sublink;
|
||
|
+ else
|
||
|
+ target = entry->fs;
|
||
|
+
|
||
|
+ if (lstat(target, &st) < 0)
|
||
|
+ return errno;
|
||
|
+
|
||
|
+ return do_link_mount(ap, name, entry, flags);
|
||
|
+}
|
||
|
+
|
||
|
static int do_generic_mount(struct autofs_point *ap, const char *name,
|
||
|
struct amd_entry *entry, const char *target,
|
||
|
unsigned int flags)
|
||
|
@@ -1020,6 +1037,35 @@ out:
|
||
|
return ret;
|
||
|
}
|
||
|
|
||
|
+static int do_nfsl_mount(struct autofs_point *ap, const char *name,
|
||
|
+ struct amd_entry *entry, struct substvar *sv,
|
||
|
+ unsigned int flags)
|
||
|
+{
|
||
|
+ const struct substvar *host, *hostd;
|
||
|
+ struct stat st;
|
||
|
+ char *target;
|
||
|
+
|
||
|
+ host = macro_findvar(sv, "host", 4);
|
||
|
+ if (!host)
|
||
|
+ return do_nfs_mount(ap, name, entry, flags);
|
||
|
+ hostd = macro_findvar(sv, "hostd", 5);
|
||
|
+ if (!hostd || !*hostd->val)
|
||
|
+ return do_nfs_mount(ap, name, entry, flags);
|
||
|
+
|
||
|
+ if (entry->sublink)
|
||
|
+ target = entry->sublink;
|
||
|
+ else
|
||
|
+ target = entry->fs;
|
||
|
+
|
||
|
+ if (strcasecmp(host->val, entry->rhost) ||
|
||
|
+ strcasecmp(hostd->val, entry->rhost))
|
||
|
+ return do_nfs_mount(ap, name, entry, flags);
|
||
|
+ else if (lstat(target, &st) < 0)
|
||
|
+ return do_nfs_mount(ap, name, entry, flags);
|
||
|
+
|
||
|
+ return do_link_mount(ap, name, entry, flags);
|
||
|
+}
|
||
|
+
|
||
|
static int do_host_mount(struct autofs_point *ap, const char *name,
|
||
|
struct amd_entry *entry, struct map_source *source,
|
||
|
unsigned int flags)
|
||
|
@@ -1078,10 +1124,18 @@ static int amd_mount(struct autofs_point *ap, const char *name,
|
||
|
ret = do_nfs_mount(ap, name, entry, flags);
|
||
|
break;
|
||
|
|
||
|
+ case AMD_MOUNT_TYPE_NFSL:
|
||
|
+ ret = do_nfsl_mount(ap, name, entry, sv, flags);
|
||
|
+ break;
|
||
|
+
|
||
|
case AMD_MOUNT_TYPE_LINK:
|
||
|
ret = do_link_mount(ap, name, entry, flags);
|
||
|
break;
|
||
|
|
||
|
+ case AMD_MOUNT_TYPE_LINKX:
|
||
|
+ ret = do_linkx_mount(ap, name, entry, flags);
|
||
|
+ break;
|
||
|
+
|
||
|
case AMD_MOUNT_TYPE_HOST:
|
||
|
ret = do_host_mount(ap, name, entry, source, flags);
|
||
|
break;
|