X-Git-Url: https://git.decadent.org.uk/gitweb/?p=nfs-utils.git;a=blobdiff_plain;f=utils%2Fmount%2Fnfsumount.c;h=077219d6ae87e223669492c642e55bfc9d481b5e;hp=1f71d5fbeb9ff8d806624ccc37afd635287ad06a;hb=1e42be20a3283994d0ffd6c5f80c36fab5a887a8;hpb=6501bd27df2c723ff0e18ee58e9434287acf3539 diff --git a/utils/mount/nfsumount.c b/utils/mount/nfsumount.c index 1f71d5f..077219d 100644 --- a/utils/mount/nfsumount.c +++ b/utils/mount/nfsumount.c @@ -91,35 +91,6 @@ 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) -{ - 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)) - continue; - if (hasmntopt(&mntbuf, "udp")) - proto = IPPROTO_UDP; - break; - } - endmntent (mtab); - - return proto; -} - /* complain about a failed umount */ static void complain(int err, const char *dev) { switch (err) { @@ -144,12 +115,11 @@ static void complain(int err, const char *dev) { } } -int add_mtab2(const char *spec, const char *node, const char *type, - const char *opts, struct mntentchn *mc) +int del_mtab(const char *spec, const char *node) { - int umnt_err, umnt_err2, res; + int umnt_err, res; - umnt_err = umnt_err2 = 0; + umnt_err = 0; if (lazy) { res = umount2 (node, MNT_DETACH); if (res < 0) @@ -172,27 +142,7 @@ int add_mtab2(const char *spec, const char *node, const char *type, } else res = umount (node); - if (res < 0) { - umnt_err = errno; - /* A device might have been mounted on a node that has since - been deleted or renamed, so if node fails, also try spec. */ - /* Note that this is incorrect in case spec was mounted - several times. */ - /* if (umnt_err == ENOENT || umnt_err == EINVAL) */ - if (umnt_err != EBUSY && strcmp(node, spec)) { - if (verbose) - printf (_("could not umount %s - trying %s instead\n"), - node, spec); - res = umount (spec); - if (res < 0) - umnt_err2 = errno; - /* Do not complain about remote NFS mount points */ - if (errno == ENOENT && index(spec, ':')) - umnt_err2 = 0; - } - } - - if (res < 0 && remount && (umnt_err == EBUSY || umnt_err2 == EBUSY)) { + if (res < 0 && remount && errno == EBUSY && spec) { /* Umount failed - let us try a remount */ res = mount(spec, node, NULL, MS_MGC_VAL | MS_REMOUNT | MS_RDONLY, NULL); @@ -218,21 +168,19 @@ int add_mtab2(const char *spec, const char *node, const char *type, if (res >= 0) { /* Umount succeeded */ if (verbose) - printf (_("%s umounted\n"), spec); + printf (_("%s umounted\n"), spec ? spec : node); } writemtab: if (!nomtab && (umnt_err == 0 || umnt_err == EINVAL || umnt_err == ENOENT)) { - update_mtab (node, NULL); + update_mtab(node, NULL); } if (res >= 0) return 0; - if (umnt_err2) - complain(umnt_err2, spec); - if (umnt_err && umnt_err != umnt_err2) + if (umnt_err) complain(umnt_err, node); return 1; } @@ -280,7 +228,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 +243,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,23 +311,28 @@ 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); - if (!mc) + if (*spec == '/') + mc = getmntdirbackward(spec, NULL); + else mc = getmntdevbackward(spec, NULL); if (!mc && verbose) printf(_("Could not find %s in mtab\n"), spec); - if(mc) { + if (mc) { ret = _nfsumount(mc->m.mnt_fsname, mc->m.mnt_opts); if(ret) - ret = add_mtab2(mc->m.mnt_fsname, mc->m.mnt_dir, - mc->m.mnt_type, mc->m.mnt_opts, mc); - } - else { - ret = _nfsumount(spec, NULL); - if(ret) - ret = add_mtab2(spec, spec, spec, spec, NULL); + ret = del_mtab(mc->m.mnt_fsname, mc->m.mnt_dir); + } else { + if (*spec != '/') + ret = _nfsumount(spec, "tcp,v3"); + else + ret = del_mtab(NULL, spec); } return(ret);