diff options
author | Karel Zak <kzak@redhat.com> | 2011-04-06 11:36:40 -0400 |
---|---|---|
committer | Steve Dickson <steved@redhat.com> | 2011-04-06 12:40:20 -0400 |
commit | c01e5ca6179b8f5b041605d9bbd75a0f76812d54 (patch) | |
tree | 9dff0f99f8e10ba556911828529f11a870005056 /utils/mount/network.c | |
parent | d6c1b35c6b40243bfd6fba2591c9f8f2653078c0 (diff) | |
download | nfs-utils-c01e5ca6179b8f5b041605d9bbd75a0f76812d54.tar.gz nfs-utils-c01e5ca6179b8f5b041605d9bbd75a0f76812d54.tar.xz nfs-utils-c01e5ca6179b8f5b041605d9bbd75a0f76812d54.zip |
mount: move generic functions to utils.c and network.c
Move generic code that could be shared between standard mount.nfs and
libmount version to utils.c and network.c.
CC: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Karel Zak <kzak@redhat.com>
Signed-off-by: Steve Dickson <steved@redhat.com>
Diffstat (limited to 'utils/mount/network.c')
-rw-r--r-- | utils/mount/network.c | 68 |
1 files changed, 68 insertions, 0 deletions
diff --git a/utils/mount/network.c b/utils/mount/network.c index 52a5389..d1f91dc 100644 --- a/utils/mount/network.c +++ b/utils/mount/network.c @@ -1624,3 +1624,71 @@ int nfs_options2pmap(struct mount_options *options, return 1; } + +/* + * Discover mount server's hostname/address by examining mount options + * + * Returns a pointer to a string that the caller must free, on + * success; otherwise NULL is returned. + */ +static char *nfs_umount_hostname(struct mount_options *options, + char *hostname) +{ + char *option; + + option = po_get(options, "mountaddr"); + if (option) + goto out; + option = po_get(options, "mounthost"); + if (option) + goto out; + option = po_get(options, "addr"); + if (option) + goto out; + + return hostname; + +out: + free(hostname); + return strdup(option); +} + + +/* + * Returns EX_SUCCESS if mount options and device name have been + * parsed successfully; otherwise EX_FAIL. + */ +int nfs_umount_do_umnt(struct mount_options *options, + char **hostname, char **dirname) +{ + union nfs_sockaddr address; + struct sockaddr *sap = &address.sa; + socklen_t salen = sizeof(address); + struct pmap nfs_pmap, mnt_pmap; + sa_family_t family; + + if (!nfs_options2pmap(options, &nfs_pmap, &mnt_pmap)) + return EX_FAIL; + + /* Skip UMNT call for vers=4 mounts */ + if (nfs_pmap.pm_vers == 4) + return EX_SUCCESS; + + *hostname = nfs_umount_hostname(options, *hostname); + if (!*hostname) { + nfs_error(_("%s: out of memory"), progname); + return EX_FAIL; + } + + if (!nfs_mount_proto_family(options, &family)) + return 0; + if (!nfs_lookup(*hostname, family, sap, &salen)) + /* nfs_lookup reports any errors */ + return EX_FAIL; + + if (nfs_advise_umount(sap, salen, &mnt_pmap, dirname) == 0) + /* nfs_advise_umount reports any errors */ + return EX_FAIL; + + return EX_SUCCESS; +} |