From 0a2950956d05f8069cd698e28479cbf14a3bba86 Mon Sep 17 00:00:00 2001 From: Wei Yongjun Date: Wed, 14 Mar 2007 15:56:58 +0800 Subject: [PATCH] Use correct UMNT protocol to do umount This patch do following things: 1. When unmounting, we should try /proc/mounts first. Only then in /etc/mtab if it wasn't found. 2. Reject name passed to us which is not starts with a '/' or not contains a ':' 3. Fix the method to get UMNT protocol Signed-off-by: Wei Yongjun Signed-off-by: Neil Brown --- utils/mount/nfsumount.c | 54 ++++++++++++++++++++++------------------- 1 file changed, 29 insertions(+), 25 deletions(-) diff --git a/utils/mount/nfsumount.c b/utils/mount/nfsumount.c index 1f71d5f..c91bfd2 100644 --- a/utils/mount/nfsumount.c +++ b/utils/mount/nfsumount.c @@ -91,33 +91,28 @@ int nfs_call_umount(clnt_addr_t *mnt_server, dirpath *argp) return res; } -u_int get_mntproto(const char *); -u_int -get_mntproto(const char *dirname) +struct mntentchn * +getmntentchn(const char *dir) { - FILE *mtab; - struct mntent mntbuf; - char tmpbuf[BUFSIZ]; - u_int proto = IPPROTO_TCP; /* assume tcp */ - - mtab = setmntent ("/proc/mounts", "r"); - if (mtab == NULL) - mtab = setmntent (_PATH_MOUNTED, "r"); - if (mtab == NULL) - return proto; - - while(getmntent_r(mtab, &mntbuf, tmpbuf, sizeof (tmpbuf))) { - if (strcmp(mntbuf.mnt_type, "nfs")) - continue; - if (strcmp(dirname, mntbuf.mnt_fsname)) + mntFILE *mfp; + nfs_mntent_t *mnt; + struct mntentchn *mc = NULL; + + mfp = nfs_setmntent ("/proc/mounts", "r"); + if (mfp == NULL || mfp->mntent_fp == NULL) + return NULL; + + while ((mnt = nfs_getmntent(mfp)) != NULL) { + if(strcmp(mnt->mnt_fsname, dir) && strcmp(mnt->mnt_dir, dir)) continue; - if (hasmntopt(&mntbuf, "udp")) - proto = IPPROTO_UDP; - break; + + if (!mc) + mc = (struct mntentchn *)xmalloc(sizeof(*mc)); + mc->m = *mnt; } - endmntent (mtab); - return proto; + nfs_endmntent(mfp); + return mc; } /* complain about a failed umount */ @@ -280,7 +275,7 @@ int _nfsumount(const char *spec, const char *opts) pmap->pm_prog = MOUNTPROG; pmap->pm_vers = MOUNTVERS_NFSV3; - pmap->pm_prot = get_mntproto(spec); + pmap->pm_prot = IPPROTO_TCP; if (opts && (p = strstr(opts, "mountprog=")) && isdigit(*(p+10))) pmap->pm_prog = atoi(p+10); if (opts && (p = strstr(opts, "mountport=")) && isdigit(*(p+10))) @@ -295,6 +290,8 @@ int _nfsumount(const char *spec, const char *opts) pmap->pm_vers = nfsvers_to_mnt(atoi(p+5)); if (opts && (p = strstr(opts, "mountvers=")) && isdigit(*(p+10))) pmap->pm_vers = atoi(p+10); + if (opts && (hasmntopt(&mnt, "udp") || hasmntopt(&mnt, "proto=udp"))) + pmap->pm_prot = IPPROTO_UDP; if (!nfs_gethostbyname(hostname, &mnt_server.saddr)) goto out_bad; @@ -361,8 +358,15 @@ int nfsumount(int argc, char *argv[]) return 0; } } + + if (spec == NULL || (*spec != '/' && strchr(spec,':') == NULL)) { + printf(_("umount: %s: not found\n"), spec); + return 0; + } - mc = getmntdirbackward(spec, NULL); + mc = getmntentchn(spec); + if (!mc) + mc = getmntdirbackward(spec, NULL); if (!mc) mc = getmntdevbackward(spec, NULL); if (!mc && verbose) -- 2.39.5