freebsd-nq/sbin/umount/umount.c

609 lines
15 KiB
C
Raw Normal View History

/*-
* Copyright (c) 1980, 1989, 1993
* The Regents of the University of California. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 4. Neither the name of the University nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*/
#ifndef lint
static const char copyright[] =
"@(#) Copyright (c) 1980, 1989, 1993\n\
The Regents of the University of California. All rights reserved.\n";
#endif /* not lint */
#ifndef lint
#if 0
static char sccsid[] = "@(#)umount.c 8.8 (Berkeley) 5/8/95";
#endif
static const char rcsid[] =
1999-08-28 00:22:10 +00:00
"$FreeBSD$";
#endif /* not lint */
#include <sys/param.h>
#include <sys/mount.h>
Bring in a hybrid of SunSoft's transport-independent RPC (TI-RPC) and associated changes that had to happen to make this possible as well as bugs fixed along the way. Bring in required TLI library routines to support this. Since we don't support TLI we've essentially copied what NetBSD has done, adding a thin layer to emulate direct the TLI calls into BSD socket calls. This is mostly from Sun's tirpc release that was made in 1994, however some fixes were backported from the 1999 release (supposedly only made available after this porting effort was underway). The submitter has agreed to continue on and bring us up to the 1999 release. Several key features are introduced with this update: Client calls are thread safe. (1999 code has server side thread safe) Updated, a more modern interface. Many userland updates were done to bring the code up to par with the recent RPC API. There is an update to the pthreads library, a function pthread_main_np() was added to emulate a function of Sun's threads library. While we're at it, bring in NetBSD's lockd, it's been far too long of a wait. New rpcbind(8) replaces portmap(8) (supporting communication over an authenticated Unix-domain socket, and by default only allowing set and unset requests over that channel). It's much more secure than the old portmapper. Umount(8), mountd(8), mount_nfs(8), nfsd(8) have also been upgraded to support TI-RPC and to support IPV6. Umount(8) is also fixed to unmount pathnames longer than 80 chars, which are currently truncated by the Kernel statfs structure. Submitted by: Martin Blapp <mb@imp.ch> Manpage review: ru Secure RPC implemented by: wpaul
2001-03-19 12:50:13 +00:00
#include <sys/socket.h>
#include <sys/stat.h>
#include <netdb.h>
#include <rpc/rpc.h>
#include <rpcsvc/mount.h>
#include <ctype.h>
#include <err.h>
#include <errno.h>
#include <fstab.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include "mounttab.h"
typedef enum { FIND, REMOVE, CHECKUNIQUE } dowhat;
quoting << Martin_Blapp - Completly changed the internals of umount(8). We do three checks now to see if 'argv' is in the mounttable. It they all fail, we return to main and print a warning. - fixed the umount mount-order. The checks are rather complex to do this. Cause umount(8) should also be able to unmount several devices at once ('umount -a', 'umount -A', 'umount /mnt /mnt2'), the mount-order get's important. I added checks to mark and unmark already unmounted devices. - Various fixes with nfs-unmounts (no rpc-calls were done, or they were done although there was an existing mount). Since we allow overlay-mounts, we should also handle them properly. - Translate the deprecated nfs-syntax with '@' to ':' like mount_nfs does. The ':' syntax has now precedence, but '@' still works. - 'umount -v' is now fixed for all cases and doesn't print garbage like two times the mountpoint etc. - removed non documented and useless umount '-F'. - hanged nfsmounts can now unmounted 'without' any problems. I've removed stat() and realpath() checks on the mountpoint. Instead we just do a realpath() on the basedir of the mountpath and add the dirname again. Implemented this as an idea from phk. But there are still vfs-restrictions if the nfs_mount is busy. If there are unwritten metadata on a hanged nfs-mount, and we modify nfs_vfsops.c to not return EBUSY, we get a deadlock :( The problem has now moved from userland to kernel. - removed the BUGS part from the umount(8) manpage. - Converted it to ANSI C (more than 60% of the code have changed). Martin_Blapp Fixed PR's ---------- o [1999/02/03] bin/9893 NFS umount of regular file impossible s [1995/11/27] bin/841 stale nfs mounts cannot be umounted o [1999/08/01] bin/12911 alfred NFS umounts are not properly done if just the mountpoint gets umounted Only partially solved: ---------------------- The problem is now in kernel: o [1999/04/07] bin/11005 `umount -f' does not work if the NFS-server is down. PR: bin/9893 bin/841 bin/12911 bin/11005 Submitted by: Martin Blapp <mb@imp.ch>
1999-10-17 16:26:58 +00:00
static struct addrinfo *nfshost_ai = NULL;
static int fflag, vflag;
static char *nfshost;
quoting << Martin_Blapp - Completly changed the internals of umount(8). We do three checks now to see if 'argv' is in the mounttable. It they all fail, we return to main and print a warning. - fixed the umount mount-order. The checks are rather complex to do this. Cause umount(8) should also be able to unmount several devices at once ('umount -a', 'umount -A', 'umount /mnt /mnt2'), the mount-order get's important. I added checks to mark and unmark already unmounted devices. - Various fixes with nfs-unmounts (no rpc-calls were done, or they were done although there was an existing mount). Since we allow overlay-mounts, we should also handle them properly. - Translate the deprecated nfs-syntax with '@' to ':' like mount_nfs does. The ':' syntax has now precedence, but '@' still works. - 'umount -v' is now fixed for all cases and doesn't print garbage like two times the mountpoint etc. - removed non documented and useless umount '-F'. - hanged nfsmounts can now unmounted 'without' any problems. I've removed stat() and realpath() checks on the mountpoint. Instead we just do a realpath() on the basedir of the mountpath and add the dirname again. Implemented this as an idea from phk. But there are still vfs-restrictions if the nfs_mount is busy. If there are unwritten metadata on a hanged nfs-mount, and we modify nfs_vfsops.c to not return EBUSY, we get a deadlock :( The problem has now moved from userland to kernel. - removed the BUGS part from the umount(8) manpage. - Converted it to ANSI C (more than 60% of the code have changed). Martin_Blapp Fixed PR's ---------- o [1999/02/03] bin/9893 NFS umount of regular file impossible s [1995/11/27] bin/841 stale nfs mounts cannot be umounted o [1999/08/01] bin/12911 alfred NFS umounts are not properly done if just the mountpoint gets umounted Only partially solved: ---------------------- The problem is now in kernel: o [1999/04/07] bin/11005 `umount -f' does not work if the NFS-server is down. PR: bin/9893 bin/841 bin/12911 bin/11005 Submitted by: Martin Blapp <mb@imp.ch>
1999-10-17 16:26:58 +00:00
struct statfs *checkmntlist(char *);
quoting << Martin_Blapp - Completly changed the internals of umount(8). We do three checks now to see if 'argv' is in the mounttable. It they all fail, we return to main and print a warning. - fixed the umount mount-order. The checks are rather complex to do this. Cause umount(8) should also be able to unmount several devices at once ('umount -a', 'umount -A', 'umount /mnt /mnt2'), the mount-order get's important. I added checks to mark and unmark already unmounted devices. - Various fixes with nfs-unmounts (no rpc-calls were done, or they were done although there was an existing mount). Since we allow overlay-mounts, we should also handle them properly. - Translate the deprecated nfs-syntax with '@' to ':' like mount_nfs does. The ':' syntax has now precedence, but '@' still works. - 'umount -v' is now fixed for all cases and doesn't print garbage like two times the mountpoint etc. - removed non documented and useless umount '-F'. - hanged nfsmounts can now unmounted 'without' any problems. I've removed stat() and realpath() checks on the mountpoint. Instead we just do a realpath() on the basedir of the mountpath and add the dirname again. Implemented this as an idea from phk. But there are still vfs-restrictions if the nfs_mount is busy. If there are unwritten metadata on a hanged nfs-mount, and we modify nfs_vfsops.c to not return EBUSY, we get a deadlock :( The problem has now moved from userland to kernel. - removed the BUGS part from the umount(8) manpage. - Converted it to ANSI C (more than 60% of the code have changed). Martin_Blapp Fixed PR's ---------- o [1999/02/03] bin/9893 NFS umount of regular file impossible s [1995/11/27] bin/841 stale nfs mounts cannot be umounted o [1999/08/01] bin/12911 alfred NFS umounts are not properly done if just the mountpoint gets umounted Only partially solved: ---------------------- The problem is now in kernel: o [1999/04/07] bin/11005 `umount -f' does not work if the NFS-server is down. PR: bin/9893 bin/841 bin/12911 bin/11005 Submitted by: Martin Blapp <mb@imp.ch>
1999-10-17 16:26:58 +00:00
int checkvfsname (const char *, char **);
struct statfs *getmntentry(const char *fromname, const char *onname,
fsid_t *fsid, dowhat what);
quoting << Martin_Blapp - Completly changed the internals of umount(8). We do three checks now to see if 'argv' is in the mounttable. It they all fail, we return to main and print a warning. - fixed the umount mount-order. The checks are rather complex to do this. Cause umount(8) should also be able to unmount several devices at once ('umount -a', 'umount -A', 'umount /mnt /mnt2'), the mount-order get's important. I added checks to mark and unmark already unmounted devices. - Various fixes with nfs-unmounts (no rpc-calls were done, or they were done although there was an existing mount). Since we allow overlay-mounts, we should also handle them properly. - Translate the deprecated nfs-syntax with '@' to ':' like mount_nfs does. The ':' syntax has now precedence, but '@' still works. - 'umount -v' is now fixed for all cases and doesn't print garbage like two times the mountpoint etc. - removed non documented and useless umount '-F'. - hanged nfsmounts can now unmounted 'without' any problems. I've removed stat() and realpath() checks on the mountpoint. Instead we just do a realpath() on the basedir of the mountpath and add the dirname again. Implemented this as an idea from phk. But there are still vfs-restrictions if the nfs_mount is busy. If there are unwritten metadata on a hanged nfs-mount, and we modify nfs_vfsops.c to not return EBUSY, we get a deadlock :( The problem has now moved from userland to kernel. - removed the BUGS part from the umount(8) manpage. - Converted it to ANSI C (more than 60% of the code have changed). Martin_Blapp Fixed PR's ---------- o [1999/02/03] bin/9893 NFS umount of regular file impossible s [1995/11/27] bin/841 stale nfs mounts cannot be umounted o [1999/08/01] bin/12911 alfred NFS umounts are not properly done if just the mountpoint gets umounted Only partially solved: ---------------------- The problem is now in kernel: o [1999/04/07] bin/11005 `umount -f' does not work if the NFS-server is down. PR: bin/9893 bin/841 bin/12911 bin/11005 Submitted by: Martin Blapp <mb@imp.ch>
1999-10-17 16:26:58 +00:00
char **makevfslist (const char *);
size_t mntinfo (struct statfs **);
Bring in a hybrid of SunSoft's transport-independent RPC (TI-RPC) and associated changes that had to happen to make this possible as well as bugs fixed along the way. Bring in required TLI library routines to support this. Since we don't support TLI we've essentially copied what NetBSD has done, adding a thin layer to emulate direct the TLI calls into BSD socket calls. This is mostly from Sun's tirpc release that was made in 1994, however some fixes were backported from the 1999 release (supposedly only made available after this porting effort was underway). The submitter has agreed to continue on and bring us up to the 1999 release. Several key features are introduced with this update: Client calls are thread safe. (1999 code has server side thread safe) Updated, a more modern interface. Many userland updates were done to bring the code up to par with the recent RPC API. There is an update to the pthreads library, a function pthread_main_np() was added to emulate a function of Sun's threads library. While we're at it, bring in NetBSD's lockd, it's been far too long of a wait. New rpcbind(8) replaces portmap(8) (supporting communication over an authenticated Unix-domain socket, and by default only allowing set and unset requests over that channel). It's much more secure than the old portmapper. Umount(8), mountd(8), mount_nfs(8), nfsd(8) have also been upgraded to support TI-RPC and to support IPV6. Umount(8) is also fixed to unmount pathnames longer than 80 chars, which are currently truncated by the Kernel statfs structure. Submitted by: Martin Blapp <mb@imp.ch> Manpage review: ru Secure RPC implemented by: wpaul
2001-03-19 12:50:13 +00:00
int namematch (struct addrinfo *);
int parsehexfsid(const char *hex, fsid_t *fsid);
int sacmp (void *, void *);
quoting << Martin_Blapp - Completly changed the internals of umount(8). We do three checks now to see if 'argv' is in the mounttable. It they all fail, we return to main and print a warning. - fixed the umount mount-order. The checks are rather complex to do this. Cause umount(8) should also be able to unmount several devices at once ('umount -a', 'umount -A', 'umount /mnt /mnt2'), the mount-order get's important. I added checks to mark and unmark already unmounted devices. - Various fixes with nfs-unmounts (no rpc-calls were done, or they were done although there was an existing mount). Since we allow overlay-mounts, we should also handle them properly. - Translate the deprecated nfs-syntax with '@' to ':' like mount_nfs does. The ':' syntax has now precedence, but '@' still works. - 'umount -v' is now fixed for all cases and doesn't print garbage like two times the mountpoint etc. - removed non documented and useless umount '-F'. - hanged nfsmounts can now unmounted 'without' any problems. I've removed stat() and realpath() checks on the mountpoint. Instead we just do a realpath() on the basedir of the mountpath and add the dirname again. Implemented this as an idea from phk. But there are still vfs-restrictions if the nfs_mount is busy. If there are unwritten metadata on a hanged nfs-mount, and we modify nfs_vfsops.c to not return EBUSY, we get a deadlock :( The problem has now moved from userland to kernel. - removed the BUGS part from the umount(8) manpage. - Converted it to ANSI C (more than 60% of the code have changed). Martin_Blapp Fixed PR's ---------- o [1999/02/03] bin/9893 NFS umount of regular file impossible s [1995/11/27] bin/841 stale nfs mounts cannot be umounted o [1999/08/01] bin/12911 alfred NFS umounts are not properly done if just the mountpoint gets umounted Only partially solved: ---------------------- The problem is now in kernel: o [1999/04/07] bin/11005 `umount -f' does not work if the NFS-server is down. PR: bin/9893 bin/841 bin/12911 bin/11005 Submitted by: Martin Blapp <mb@imp.ch>
1999-10-17 16:26:58 +00:00
int umountall (char **);
Bring in a hybrid of SunSoft's transport-independent RPC (TI-RPC) and associated changes that had to happen to make this possible as well as bugs fixed along the way. Bring in required TLI library routines to support this. Since we don't support TLI we've essentially copied what NetBSD has done, adding a thin layer to emulate direct the TLI calls into BSD socket calls. This is mostly from Sun's tirpc release that was made in 1994, however some fixes were backported from the 1999 release (supposedly only made available after this porting effort was underway). The submitter has agreed to continue on and bring us up to the 1999 release. Several key features are introduced with this update: Client calls are thread safe. (1999 code has server side thread safe) Updated, a more modern interface. Many userland updates were done to bring the code up to par with the recent RPC API. There is an update to the pthreads library, a function pthread_main_np() was added to emulate a function of Sun's threads library. While we're at it, bring in NetBSD's lockd, it's been far too long of a wait. New rpcbind(8) replaces portmap(8) (supporting communication over an authenticated Unix-domain socket, and by default only allowing set and unset requests over that channel). It's much more secure than the old portmapper. Umount(8), mountd(8), mount_nfs(8), nfsd(8) have also been upgraded to support TI-RPC and to support IPV6. Umount(8) is also fixed to unmount pathnames longer than 80 chars, which are currently truncated by the Kernel statfs structure. Submitted by: Martin Blapp <mb@imp.ch> Manpage review: ru Secure RPC implemented by: wpaul
2001-03-19 12:50:13 +00:00
int checkname (char *, char **);
int umountfs(struct statfs *sfs);
quoting << Martin_Blapp - Completly changed the internals of umount(8). We do three checks now to see if 'argv' is in the mounttable. It they all fail, we return to main and print a warning. - fixed the umount mount-order. The checks are rather complex to do this. Cause umount(8) should also be able to unmount several devices at once ('umount -a', 'umount -A', 'umount /mnt /mnt2'), the mount-order get's important. I added checks to mark and unmark already unmounted devices. - Various fixes with nfs-unmounts (no rpc-calls were done, or they were done although there was an existing mount). Since we allow overlay-mounts, we should also handle them properly. - Translate the deprecated nfs-syntax with '@' to ':' like mount_nfs does. The ':' syntax has now precedence, but '@' still works. - 'umount -v' is now fixed for all cases and doesn't print garbage like two times the mountpoint etc. - removed non documented and useless umount '-F'. - hanged nfsmounts can now unmounted 'without' any problems. I've removed stat() and realpath() checks on the mountpoint. Instead we just do a realpath() on the basedir of the mountpath and add the dirname again. Implemented this as an idea from phk. But there are still vfs-restrictions if the nfs_mount is busy. If there are unwritten metadata on a hanged nfs-mount, and we modify nfs_vfsops.c to not return EBUSY, we get a deadlock :( The problem has now moved from userland to kernel. - removed the BUGS part from the umount(8) manpage. - Converted it to ANSI C (more than 60% of the code have changed). Martin_Blapp Fixed PR's ---------- o [1999/02/03] bin/9893 NFS umount of regular file impossible s [1995/11/27] bin/841 stale nfs mounts cannot be umounted o [1999/08/01] bin/12911 alfred NFS umounts are not properly done if just the mountpoint gets umounted Only partially solved: ---------------------- The problem is now in kernel: o [1999/04/07] bin/11005 `umount -f' does not work if the NFS-server is down. PR: bin/9893 bin/841 bin/12911 bin/11005 Submitted by: Martin Blapp <mb@imp.ch>
1999-10-17 16:26:58 +00:00
void usage (void);
int xdr_dir (XDR *, char *);
int
quoting << Martin_Blapp - Completly changed the internals of umount(8). We do three checks now to see if 'argv' is in the mounttable. It they all fail, we return to main and print a warning. - fixed the umount mount-order. The checks are rather complex to do this. Cause umount(8) should also be able to unmount several devices at once ('umount -a', 'umount -A', 'umount /mnt /mnt2'), the mount-order get's important. I added checks to mark and unmark already unmounted devices. - Various fixes with nfs-unmounts (no rpc-calls were done, or they were done although there was an existing mount). Since we allow overlay-mounts, we should also handle them properly. - Translate the deprecated nfs-syntax with '@' to ':' like mount_nfs does. The ':' syntax has now precedence, but '@' still works. - 'umount -v' is now fixed for all cases and doesn't print garbage like two times the mountpoint etc. - removed non documented and useless umount '-F'. - hanged nfsmounts can now unmounted 'without' any problems. I've removed stat() and realpath() checks on the mountpoint. Instead we just do a realpath() on the basedir of the mountpath and add the dirname again. Implemented this as an idea from phk. But there are still vfs-restrictions if the nfs_mount is busy. If there are unwritten metadata on a hanged nfs-mount, and we modify nfs_vfsops.c to not return EBUSY, we get a deadlock :( The problem has now moved from userland to kernel. - removed the BUGS part from the umount(8) manpage. - Converted it to ANSI C (more than 60% of the code have changed). Martin_Blapp Fixed PR's ---------- o [1999/02/03] bin/9893 NFS umount of regular file impossible s [1995/11/27] bin/841 stale nfs mounts cannot be umounted o [1999/08/01] bin/12911 alfred NFS umounts are not properly done if just the mountpoint gets umounted Only partially solved: ---------------------- The problem is now in kernel: o [1999/04/07] bin/11005 `umount -f' does not work if the NFS-server is down. PR: bin/9893 bin/841 bin/12911 bin/11005 Submitted by: Martin Blapp <mb@imp.ch>
1999-10-17 16:26:58 +00:00
main(int argc, char *argv[])
{
Bring in a hybrid of SunSoft's transport-independent RPC (TI-RPC) and associated changes that had to happen to make this possible as well as bugs fixed along the way. Bring in required TLI library routines to support this. Since we don't support TLI we've essentially copied what NetBSD has done, adding a thin layer to emulate direct the TLI calls into BSD socket calls. This is mostly from Sun's tirpc release that was made in 1994, however some fixes were backported from the 1999 release (supposedly only made available after this porting effort was underway). The submitter has agreed to continue on and bring us up to the 1999 release. Several key features are introduced with this update: Client calls are thread safe. (1999 code has server side thread safe) Updated, a more modern interface. Many userland updates were done to bring the code up to par with the recent RPC API. There is an update to the pthreads library, a function pthread_main_np() was added to emulate a function of Sun's threads library. While we're at it, bring in NetBSD's lockd, it's been far too long of a wait. New rpcbind(8) replaces portmap(8) (supporting communication over an authenticated Unix-domain socket, and by default only allowing set and unset requests over that channel). It's much more secure than the old portmapper. Umount(8), mountd(8), mount_nfs(8), nfsd(8) have also been upgraded to support TI-RPC and to support IPV6. Umount(8) is also fixed to unmount pathnames longer than 80 chars, which are currently truncated by the Kernel statfs structure. Submitted by: Martin Blapp <mb@imp.ch> Manpage review: ru Secure RPC implemented by: wpaul
2001-03-19 12:50:13 +00:00
int all, errs, ch, mntsize, error;
char **typelist = NULL;
struct statfs *mntbuf, *sfs;
Bring in a hybrid of SunSoft's transport-independent RPC (TI-RPC) and associated changes that had to happen to make this possible as well as bugs fixed along the way. Bring in required TLI library routines to support this. Since we don't support TLI we've essentially copied what NetBSD has done, adding a thin layer to emulate direct the TLI calls into BSD socket calls. This is mostly from Sun's tirpc release that was made in 1994, however some fixes were backported from the 1999 release (supposedly only made available after this porting effort was underway). The submitter has agreed to continue on and bring us up to the 1999 release. Several key features are introduced with this update: Client calls are thread safe. (1999 code has server side thread safe) Updated, a more modern interface. Many userland updates were done to bring the code up to par with the recent RPC API. There is an update to the pthreads library, a function pthread_main_np() was added to emulate a function of Sun's threads library. While we're at it, bring in NetBSD's lockd, it's been far too long of a wait. New rpcbind(8) replaces portmap(8) (supporting communication over an authenticated Unix-domain socket, and by default only allowing set and unset requests over that channel). It's much more secure than the old portmapper. Umount(8), mountd(8), mount_nfs(8), nfsd(8) have also been upgraded to support TI-RPC and to support IPV6. Umount(8) is also fixed to unmount pathnames longer than 80 chars, which are currently truncated by the Kernel statfs structure. Submitted by: Martin Blapp <mb@imp.ch> Manpage review: ru Secure RPC implemented by: wpaul
2001-03-19 12:50:13 +00:00
struct addrinfo hints;
all = errs = 0;
while ((ch = getopt(argc, argv, "AaF:fh:t:v")) != -1)
switch (ch) {
case 'A':
all = 2;
break;
case 'a':
all = 1;
break;
case 'F':
setfstab(optarg);
break;
case 'f':
fflag = MNT_FORCE;
break;
case 'h': /* -h implies -A. */
all = 2;
nfshost = optarg;
break;
case 't':
if (typelist != NULL)
quoting << Martin_Blapp - Completly changed the internals of umount(8). We do three checks now to see if 'argv' is in the mounttable. It they all fail, we return to main and print a warning. - fixed the umount mount-order. The checks are rather complex to do this. Cause umount(8) should also be able to unmount several devices at once ('umount -a', 'umount -A', 'umount /mnt /mnt2'), the mount-order get's important. I added checks to mark and unmark already unmounted devices. - Various fixes with nfs-unmounts (no rpc-calls were done, or they were done although there was an existing mount). Since we allow overlay-mounts, we should also handle them properly. - Translate the deprecated nfs-syntax with '@' to ':' like mount_nfs does. The ':' syntax has now precedence, but '@' still works. - 'umount -v' is now fixed for all cases and doesn't print garbage like two times the mountpoint etc. - removed non documented and useless umount '-F'. - hanged nfsmounts can now unmounted 'without' any problems. I've removed stat() and realpath() checks on the mountpoint. Instead we just do a realpath() on the basedir of the mountpath and add the dirname again. Implemented this as an idea from phk. But there are still vfs-restrictions if the nfs_mount is busy. If there are unwritten metadata on a hanged nfs-mount, and we modify nfs_vfsops.c to not return EBUSY, we get a deadlock :( The problem has now moved from userland to kernel. - removed the BUGS part from the umount(8) manpage. - Converted it to ANSI C (more than 60% of the code have changed). Martin_Blapp Fixed PR's ---------- o [1999/02/03] bin/9893 NFS umount of regular file impossible s [1995/11/27] bin/841 stale nfs mounts cannot be umounted o [1999/08/01] bin/12911 alfred NFS umounts are not properly done if just the mountpoint gets umounted Only partially solved: ---------------------- The problem is now in kernel: o [1999/04/07] bin/11005 `umount -f' does not work if the NFS-server is down. PR: bin/9893 bin/841 bin/12911 bin/11005 Submitted by: Martin Blapp <mb@imp.ch>
1999-10-17 16:26:58 +00:00
err(1, "only one -t option may be specified");
typelist = makevfslist(optarg);
break;
case 'v':
vflag = 1;
break;
default:
usage();
/* NOTREACHED */
}
argc -= optind;
argv += optind;
/* Start disks transferring immediately. */
if ((fflag & MNT_FORCE) == 0)
sync();
if ((argc == 0 && !all) || (argc != 0 && all))
usage();
/* -h implies "-t nfs" if no -t flag. */
if ((nfshost != NULL) && (typelist == NULL))
typelist = makevfslist("nfs");
1995-05-30 06:12:45 +00:00
Bring in a hybrid of SunSoft's transport-independent RPC (TI-RPC) and associated changes that had to happen to make this possible as well as bugs fixed along the way. Bring in required TLI library routines to support this. Since we don't support TLI we've essentially copied what NetBSD has done, adding a thin layer to emulate direct the TLI calls into BSD socket calls. This is mostly from Sun's tirpc release that was made in 1994, however some fixes were backported from the 1999 release (supposedly only made available after this porting effort was underway). The submitter has agreed to continue on and bring us up to the 1999 release. Several key features are introduced with this update: Client calls are thread safe. (1999 code has server side thread safe) Updated, a more modern interface. Many userland updates were done to bring the code up to par with the recent RPC API. There is an update to the pthreads library, a function pthread_main_np() was added to emulate a function of Sun's threads library. While we're at it, bring in NetBSD's lockd, it's been far too long of a wait. New rpcbind(8) replaces portmap(8) (supporting communication over an authenticated Unix-domain socket, and by default only allowing set and unset requests over that channel). It's much more secure than the old portmapper. Umount(8), mountd(8), mount_nfs(8), nfsd(8) have also been upgraded to support TI-RPC and to support IPV6. Umount(8) is also fixed to unmount pathnames longer than 80 chars, which are currently truncated by the Kernel statfs structure. Submitted by: Martin Blapp <mb@imp.ch> Manpage review: ru Secure RPC implemented by: wpaul
2001-03-19 12:50:13 +00:00
if (nfshost != NULL) {
memset(&hints, 0, sizeof hints);
error = getaddrinfo(nfshost, NULL, &hints, &nfshost_ai);
if (error)
errx(1, "%s: %s", nfshost, gai_strerror(error));
Bring in a hybrid of SunSoft's transport-independent RPC (TI-RPC) and associated changes that had to happen to make this possible as well as bugs fixed along the way. Bring in required TLI library routines to support this. Since we don't support TLI we've essentially copied what NetBSD has done, adding a thin layer to emulate direct the TLI calls into BSD socket calls. This is mostly from Sun's tirpc release that was made in 1994, however some fixes were backported from the 1999 release (supposedly only made available after this porting effort was underway). The submitter has agreed to continue on and bring us up to the 1999 release. Several key features are introduced with this update: Client calls are thread safe. (1999 code has server side thread safe) Updated, a more modern interface. Many userland updates were done to bring the code up to par with the recent RPC API. There is an update to the pthreads library, a function pthread_main_np() was added to emulate a function of Sun's threads library. While we're at it, bring in NetBSD's lockd, it's been far too long of a wait. New rpcbind(8) replaces portmap(8) (supporting communication over an authenticated Unix-domain socket, and by default only allowing set and unset requests over that channel). It's much more secure than the old portmapper. Umount(8), mountd(8), mount_nfs(8), nfsd(8) have also been upgraded to support TI-RPC and to support IPV6. Umount(8) is also fixed to unmount pathnames longer than 80 chars, which are currently truncated by the Kernel statfs structure. Submitted by: Martin Blapp <mb@imp.ch> Manpage review: ru Secure RPC implemented by: wpaul
2001-03-19 12:50:13 +00:00
}
switch (all) {
case 2:
quoting << Martin_Blapp - Completly changed the internals of umount(8). We do three checks now to see if 'argv' is in the mounttable. It they all fail, we return to main and print a warning. - fixed the umount mount-order. The checks are rather complex to do this. Cause umount(8) should also be able to unmount several devices at once ('umount -a', 'umount -A', 'umount /mnt /mnt2'), the mount-order get's important. I added checks to mark and unmark already unmounted devices. - Various fixes with nfs-unmounts (no rpc-calls were done, or they were done although there was an existing mount). Since we allow overlay-mounts, we should also handle them properly. - Translate the deprecated nfs-syntax with '@' to ':' like mount_nfs does. The ':' syntax has now precedence, but '@' still works. - 'umount -v' is now fixed for all cases and doesn't print garbage like two times the mountpoint etc. - removed non documented and useless umount '-F'. - hanged nfsmounts can now unmounted 'without' any problems. I've removed stat() and realpath() checks on the mountpoint. Instead we just do a realpath() on the basedir of the mountpath and add the dirname again. Implemented this as an idea from phk. But there are still vfs-restrictions if the nfs_mount is busy. If there are unwritten metadata on a hanged nfs-mount, and we modify nfs_vfsops.c to not return EBUSY, we get a deadlock :( The problem has now moved from userland to kernel. - removed the BUGS part from the umount(8) manpage. - Converted it to ANSI C (more than 60% of the code have changed). Martin_Blapp Fixed PR's ---------- o [1999/02/03] bin/9893 NFS umount of regular file impossible s [1995/11/27] bin/841 stale nfs mounts cannot be umounted o [1999/08/01] bin/12911 alfred NFS umounts are not properly done if just the mountpoint gets umounted Only partially solved: ---------------------- The problem is now in kernel: o [1999/04/07] bin/11005 `umount -f' does not work if the NFS-server is down. PR: bin/9893 bin/841 bin/12911 bin/11005 Submitted by: Martin Blapp <mb@imp.ch>
1999-10-17 16:26:58 +00:00
if ((mntsize = mntinfo(&mntbuf)) <= 0)
break;
quoting << Martin_Blapp - Completly changed the internals of umount(8). We do three checks now to see if 'argv' is in the mounttable. It they all fail, we return to main and print a warning. - fixed the umount mount-order. The checks are rather complex to do this. Cause umount(8) should also be able to unmount several devices at once ('umount -a', 'umount -A', 'umount /mnt /mnt2'), the mount-order get's important. I added checks to mark and unmark already unmounted devices. - Various fixes with nfs-unmounts (no rpc-calls were done, or they were done although there was an existing mount). Since we allow overlay-mounts, we should also handle them properly. - Translate the deprecated nfs-syntax with '@' to ':' like mount_nfs does. The ':' syntax has now precedence, but '@' still works. - 'umount -v' is now fixed for all cases and doesn't print garbage like two times the mountpoint etc. - removed non documented and useless umount '-F'. - hanged nfsmounts can now unmounted 'without' any problems. I've removed stat() and realpath() checks on the mountpoint. Instead we just do a realpath() on the basedir of the mountpath and add the dirname again. Implemented this as an idea from phk. But there are still vfs-restrictions if the nfs_mount is busy. If there are unwritten metadata on a hanged nfs-mount, and we modify nfs_vfsops.c to not return EBUSY, we get a deadlock :( The problem has now moved from userland to kernel. - removed the BUGS part from the umount(8) manpage. - Converted it to ANSI C (more than 60% of the code have changed). Martin_Blapp Fixed PR's ---------- o [1999/02/03] bin/9893 NFS umount of regular file impossible s [1995/11/27] bin/841 stale nfs mounts cannot be umounted o [1999/08/01] bin/12911 alfred NFS umounts are not properly done if just the mountpoint gets umounted Only partially solved: ---------------------- The problem is now in kernel: o [1999/04/07] bin/11005 `umount -f' does not work if the NFS-server is down. PR: bin/9893 bin/841 bin/12911 bin/11005 Submitted by: Martin Blapp <mb@imp.ch>
1999-10-17 16:26:58 +00:00
/*
* We unmount the nfs-mounts in the reverse order
* that they were mounted.
*/
for (errs = 0, mntsize--; mntsize > 0; mntsize--) {
sfs = &mntbuf[mntsize];
if (checkvfsname(sfs->f_fstypename, typelist))
continue;
if (strcmp(sfs->f_mntonname, "/dev") == 0)
continue;
if (umountfs(sfs) != 0)
errs = 1;
}
quoting << Martin_Blapp - Completly changed the internals of umount(8). We do three checks now to see if 'argv' is in the mounttable. It they all fail, we return to main and print a warning. - fixed the umount mount-order. The checks are rather complex to do this. Cause umount(8) should also be able to unmount several devices at once ('umount -a', 'umount -A', 'umount /mnt /mnt2'), the mount-order get's important. I added checks to mark and unmark already unmounted devices. - Various fixes with nfs-unmounts (no rpc-calls were done, or they were done although there was an existing mount). Since we allow overlay-mounts, we should also handle them properly. - Translate the deprecated nfs-syntax with '@' to ':' like mount_nfs does. The ':' syntax has now precedence, but '@' still works. - 'umount -v' is now fixed for all cases and doesn't print garbage like two times the mountpoint etc. - removed non documented and useless umount '-F'. - hanged nfsmounts can now unmounted 'without' any problems. I've removed stat() and realpath() checks on the mountpoint. Instead we just do a realpath() on the basedir of the mountpath and add the dirname again. Implemented this as an idea from phk. But there are still vfs-restrictions if the nfs_mount is busy. If there are unwritten metadata on a hanged nfs-mount, and we modify nfs_vfsops.c to not return EBUSY, we get a deadlock :( The problem has now moved from userland to kernel. - removed the BUGS part from the umount(8) manpage. - Converted it to ANSI C (more than 60% of the code have changed). Martin_Blapp Fixed PR's ---------- o [1999/02/03] bin/9893 NFS umount of regular file impossible s [1995/11/27] bin/841 stale nfs mounts cannot be umounted o [1999/08/01] bin/12911 alfred NFS umounts are not properly done if just the mountpoint gets umounted Only partially solved: ---------------------- The problem is now in kernel: o [1999/04/07] bin/11005 `umount -f' does not work if the NFS-server is down. PR: bin/9893 bin/841 bin/12911 bin/11005 Submitted by: Martin Blapp <mb@imp.ch>
1999-10-17 16:26:58 +00:00
free(mntbuf);
break;
case 1:
if (setfsent() == 0)
err(1, "%s", getfstab());
errs = umountall(typelist);
break;
case 0:
for (errs = 0; *argv != NULL; ++argv)
Bring in a hybrid of SunSoft's transport-independent RPC (TI-RPC) and associated changes that had to happen to make this possible as well as bugs fixed along the way. Bring in required TLI library routines to support this. Since we don't support TLI we've essentially copied what NetBSD has done, adding a thin layer to emulate direct the TLI calls into BSD socket calls. This is mostly from Sun's tirpc release that was made in 1994, however some fixes were backported from the 1999 release (supposedly only made available after this porting effort was underway). The submitter has agreed to continue on and bring us up to the 1999 release. Several key features are introduced with this update: Client calls are thread safe. (1999 code has server side thread safe) Updated, a more modern interface. Many userland updates were done to bring the code up to par with the recent RPC API. There is an update to the pthreads library, a function pthread_main_np() was added to emulate a function of Sun's threads library. While we're at it, bring in NetBSD's lockd, it's been far too long of a wait. New rpcbind(8) replaces portmap(8) (supporting communication over an authenticated Unix-domain socket, and by default only allowing set and unset requests over that channel). It's much more secure than the old portmapper. Umount(8), mountd(8), mount_nfs(8), nfsd(8) have also been upgraded to support TI-RPC and to support IPV6. Umount(8) is also fixed to unmount pathnames longer than 80 chars, which are currently truncated by the Kernel statfs structure. Submitted by: Martin Blapp <mb@imp.ch> Manpage review: ru Secure RPC implemented by: wpaul
2001-03-19 12:50:13 +00:00
if (checkname(*argv, typelist) != 0)
errs = 1;
break;
}
exit(errs);
}
int
quoting << Martin_Blapp - Completly changed the internals of umount(8). We do three checks now to see if 'argv' is in the mounttable. It they all fail, we return to main and print a warning. - fixed the umount mount-order. The checks are rather complex to do this. Cause umount(8) should also be able to unmount several devices at once ('umount -a', 'umount -A', 'umount /mnt /mnt2'), the mount-order get's important. I added checks to mark and unmark already unmounted devices. - Various fixes with nfs-unmounts (no rpc-calls were done, or they were done although there was an existing mount). Since we allow overlay-mounts, we should also handle them properly. - Translate the deprecated nfs-syntax with '@' to ':' like mount_nfs does. The ':' syntax has now precedence, but '@' still works. - 'umount -v' is now fixed for all cases and doesn't print garbage like two times the mountpoint etc. - removed non documented and useless umount '-F'. - hanged nfsmounts can now unmounted 'without' any problems. I've removed stat() and realpath() checks on the mountpoint. Instead we just do a realpath() on the basedir of the mountpath and add the dirname again. Implemented this as an idea from phk. But there are still vfs-restrictions if the nfs_mount is busy. If there are unwritten metadata on a hanged nfs-mount, and we modify nfs_vfsops.c to not return EBUSY, we get a deadlock :( The problem has now moved from userland to kernel. - removed the BUGS part from the umount(8) manpage. - Converted it to ANSI C (more than 60% of the code have changed). Martin_Blapp Fixed PR's ---------- o [1999/02/03] bin/9893 NFS umount of regular file impossible s [1995/11/27] bin/841 stale nfs mounts cannot be umounted o [1999/08/01] bin/12911 alfred NFS umounts are not properly done if just the mountpoint gets umounted Only partially solved: ---------------------- The problem is now in kernel: o [1999/04/07] bin/11005 `umount -f' does not work if the NFS-server is down. PR: bin/9893 bin/841 bin/12911 bin/11005 Submitted by: Martin Blapp <mb@imp.ch>
1999-10-17 16:26:58 +00:00
umountall(char **typelist)
{
struct xvfsconf vfc;
struct fstab *fs;
int rval;
char *cp;
static int firstcall = 1;
if ((fs = getfsent()) != NULL)
firstcall = 0;
else if (firstcall)
errx(1, "fstab reading failure");
else
return (0);
quoting << Martin_Blapp - Completly changed the internals of umount(8). We do three checks now to see if 'argv' is in the mounttable. It they all fail, we return to main and print a warning. - fixed the umount mount-order. The checks are rather complex to do this. Cause umount(8) should also be able to unmount several devices at once ('umount -a', 'umount -A', 'umount /mnt /mnt2'), the mount-order get's important. I added checks to mark and unmark already unmounted devices. - Various fixes with nfs-unmounts (no rpc-calls were done, or they were done although there was an existing mount). Since we allow overlay-mounts, we should also handle them properly. - Translate the deprecated nfs-syntax with '@' to ':' like mount_nfs does. The ':' syntax has now precedence, but '@' still works. - 'umount -v' is now fixed for all cases and doesn't print garbage like two times the mountpoint etc. - removed non documented and useless umount '-F'. - hanged nfsmounts can now unmounted 'without' any problems. I've removed stat() and realpath() checks on the mountpoint. Instead we just do a realpath() on the basedir of the mountpath and add the dirname again. Implemented this as an idea from phk. But there are still vfs-restrictions if the nfs_mount is busy. If there are unwritten metadata on a hanged nfs-mount, and we modify nfs_vfsops.c to not return EBUSY, we get a deadlock :( The problem has now moved from userland to kernel. - removed the BUGS part from the umount(8) manpage. - Converted it to ANSI C (more than 60% of the code have changed). Martin_Blapp Fixed PR's ---------- o [1999/02/03] bin/9893 NFS umount of regular file impossible s [1995/11/27] bin/841 stale nfs mounts cannot be umounted o [1999/08/01] bin/12911 alfred NFS umounts are not properly done if just the mountpoint gets umounted Only partially solved: ---------------------- The problem is now in kernel: o [1999/04/07] bin/11005 `umount -f' does not work if the NFS-server is down. PR: bin/9893 bin/841 bin/12911 bin/11005 Submitted by: Martin Blapp <mb@imp.ch>
1999-10-17 16:26:58 +00:00
do {
/* Ignore the root. */
if (strcmp(fs->fs_file, "/") == 0)
continue;
/*
* !!!
* Historic practice: ignore unknown FSTAB_* fields.
*/
if (strcmp(fs->fs_type, FSTAB_RW) &&
strcmp(fs->fs_type, FSTAB_RO) &&
strcmp(fs->fs_type, FSTAB_RQ))
continue;
/* Ignore unknown file system types. */
if (getvfsbyname(fs->fs_vfstype, &vfc) == -1)
continue;
if (checkvfsname(fs->fs_vfstype, typelist))
continue;
1995-05-30 06:12:45 +00:00
/*
* We want to unmount the file systems in the reverse order
* that they were mounted. So, we save off the file name
* in some allocated memory, and then call recursively.
*/
if ((cp = malloc((size_t)strlen(fs->fs_file) + 1)) == NULL)
quoting << Martin_Blapp - Completly changed the internals of umount(8). We do three checks now to see if 'argv' is in the mounttable. It they all fail, we return to main and print a warning. - fixed the umount mount-order. The checks are rather complex to do this. Cause umount(8) should also be able to unmount several devices at once ('umount -a', 'umount -A', 'umount /mnt /mnt2'), the mount-order get's important. I added checks to mark and unmark already unmounted devices. - Various fixes with nfs-unmounts (no rpc-calls were done, or they were done although there was an existing mount). Since we allow overlay-mounts, we should also handle them properly. - Translate the deprecated nfs-syntax with '@' to ':' like mount_nfs does. The ':' syntax has now precedence, but '@' still works. - 'umount -v' is now fixed for all cases and doesn't print garbage like two times the mountpoint etc. - removed non documented and useless umount '-F'. - hanged nfsmounts can now unmounted 'without' any problems. I've removed stat() and realpath() checks on the mountpoint. Instead we just do a realpath() on the basedir of the mountpath and add the dirname again. Implemented this as an idea from phk. But there are still vfs-restrictions if the nfs_mount is busy. If there are unwritten metadata on a hanged nfs-mount, and we modify nfs_vfsops.c to not return EBUSY, we get a deadlock :( The problem has now moved from userland to kernel. - removed the BUGS part from the umount(8) manpage. - Converted it to ANSI C (more than 60% of the code have changed). Martin_Blapp Fixed PR's ---------- o [1999/02/03] bin/9893 NFS umount of regular file impossible s [1995/11/27] bin/841 stale nfs mounts cannot be umounted o [1999/08/01] bin/12911 alfred NFS umounts are not properly done if just the mountpoint gets umounted Only partially solved: ---------------------- The problem is now in kernel: o [1999/04/07] bin/11005 `umount -f' does not work if the NFS-server is down. PR: bin/9893 bin/841 bin/12911 bin/11005 Submitted by: Martin Blapp <mb@imp.ch>
1999-10-17 16:26:58 +00:00
err(1, "malloc failed");
(void)strcpy(cp, fs->fs_file);
rval = umountall(typelist);
Bring in a hybrid of SunSoft's transport-independent RPC (TI-RPC) and associated changes that had to happen to make this possible as well as bugs fixed along the way. Bring in required TLI library routines to support this. Since we don't support TLI we've essentially copied what NetBSD has done, adding a thin layer to emulate direct the TLI calls into BSD socket calls. This is mostly from Sun's tirpc release that was made in 1994, however some fixes were backported from the 1999 release (supposedly only made available after this porting effort was underway). The submitter has agreed to continue on and bring us up to the 1999 release. Several key features are introduced with this update: Client calls are thread safe. (1999 code has server side thread safe) Updated, a more modern interface. Many userland updates were done to bring the code up to par with the recent RPC API. There is an update to the pthreads library, a function pthread_main_np() was added to emulate a function of Sun's threads library. While we're at it, bring in NetBSD's lockd, it's been far too long of a wait. New rpcbind(8) replaces portmap(8) (supporting communication over an authenticated Unix-domain socket, and by default only allowing set and unset requests over that channel). It's much more secure than the old portmapper. Umount(8), mountd(8), mount_nfs(8), nfsd(8) have also been upgraded to support TI-RPC and to support IPV6. Umount(8) is also fixed to unmount pathnames longer than 80 chars, which are currently truncated by the Kernel statfs structure. Submitted by: Martin Blapp <mb@imp.ch> Manpage review: ru Secure RPC implemented by: wpaul
2001-03-19 12:50:13 +00:00
rval = checkname(cp, typelist) || rval;
free(cp);
return (rval);
quoting << Martin_Blapp - Completly changed the internals of umount(8). We do three checks now to see if 'argv' is in the mounttable. It they all fail, we return to main and print a warning. - fixed the umount mount-order. The checks are rather complex to do this. Cause umount(8) should also be able to unmount several devices at once ('umount -a', 'umount -A', 'umount /mnt /mnt2'), the mount-order get's important. I added checks to mark and unmark already unmounted devices. - Various fixes with nfs-unmounts (no rpc-calls were done, or they were done although there was an existing mount). Since we allow overlay-mounts, we should also handle them properly. - Translate the deprecated nfs-syntax with '@' to ':' like mount_nfs does. The ':' syntax has now precedence, but '@' still works. - 'umount -v' is now fixed for all cases and doesn't print garbage like two times the mountpoint etc. - removed non documented and useless umount '-F'. - hanged nfsmounts can now unmounted 'without' any problems. I've removed stat() and realpath() checks on the mountpoint. Instead we just do a realpath() on the basedir of the mountpath and add the dirname again. Implemented this as an idea from phk. But there are still vfs-restrictions if the nfs_mount is busy. If there are unwritten metadata on a hanged nfs-mount, and we modify nfs_vfsops.c to not return EBUSY, we get a deadlock :( The problem has now moved from userland to kernel. - removed the BUGS part from the umount(8) manpage. - Converted it to ANSI C (more than 60% of the code have changed). Martin_Blapp Fixed PR's ---------- o [1999/02/03] bin/9893 NFS umount of regular file impossible s [1995/11/27] bin/841 stale nfs mounts cannot be umounted o [1999/08/01] bin/12911 alfred NFS umounts are not properly done if just the mountpoint gets umounted Only partially solved: ---------------------- The problem is now in kernel: o [1999/04/07] bin/11005 `umount -f' does not work if the NFS-server is down. PR: bin/9893 bin/841 bin/12911 bin/11005 Submitted by: Martin Blapp <mb@imp.ch>
1999-10-17 16:26:58 +00:00
} while ((fs = getfsent()) != NULL);
return (0);
}
Bring in a hybrid of SunSoft's transport-independent RPC (TI-RPC) and associated changes that had to happen to make this possible as well as bugs fixed along the way. Bring in required TLI library routines to support this. Since we don't support TLI we've essentially copied what NetBSD has done, adding a thin layer to emulate direct the TLI calls into BSD socket calls. This is mostly from Sun's tirpc release that was made in 1994, however some fixes were backported from the 1999 release (supposedly only made available after this porting effort was underway). The submitter has agreed to continue on and bring us up to the 1999 release. Several key features are introduced with this update: Client calls are thread safe. (1999 code has server side thread safe) Updated, a more modern interface. Many userland updates were done to bring the code up to par with the recent RPC API. There is an update to the pthreads library, a function pthread_main_np() was added to emulate a function of Sun's threads library. While we're at it, bring in NetBSD's lockd, it's been far too long of a wait. New rpcbind(8) replaces portmap(8) (supporting communication over an authenticated Unix-domain socket, and by default only allowing set and unset requests over that channel). It's much more secure than the old portmapper. Umount(8), mountd(8), mount_nfs(8), nfsd(8) have also been upgraded to support TI-RPC and to support IPV6. Umount(8) is also fixed to unmount pathnames longer than 80 chars, which are currently truncated by the Kernel statfs structure. Submitted by: Martin Blapp <mb@imp.ch> Manpage review: ru Secure RPC implemented by: wpaul
2001-03-19 12:50:13 +00:00
/*
* Do magic checks on mountpoint/device/fsid, and then call unmount(2).
Bring in a hybrid of SunSoft's transport-independent RPC (TI-RPC) and associated changes that had to happen to make this possible as well as bugs fixed along the way. Bring in required TLI library routines to support this. Since we don't support TLI we've essentially copied what NetBSD has done, adding a thin layer to emulate direct the TLI calls into BSD socket calls. This is mostly from Sun's tirpc release that was made in 1994, however some fixes were backported from the 1999 release (supposedly only made available after this porting effort was underway). The submitter has agreed to continue on and bring us up to the 1999 release. Several key features are introduced with this update: Client calls are thread safe. (1999 code has server side thread safe) Updated, a more modern interface. Many userland updates were done to bring the code up to par with the recent RPC API. There is an update to the pthreads library, a function pthread_main_np() was added to emulate a function of Sun's threads library. While we're at it, bring in NetBSD's lockd, it's been far too long of a wait. New rpcbind(8) replaces portmap(8) (supporting communication over an authenticated Unix-domain socket, and by default only allowing set and unset requests over that channel). It's much more secure than the old portmapper. Umount(8), mountd(8), mount_nfs(8), nfsd(8) have also been upgraded to support TI-RPC and to support IPV6. Umount(8) is also fixed to unmount pathnames longer than 80 chars, which are currently truncated by the Kernel statfs structure. Submitted by: Martin Blapp <mb@imp.ch> Manpage review: ru Secure RPC implemented by: wpaul
2001-03-19 12:50:13 +00:00
*/
int
checkname(char *mntname, char **typelist)
{
char buf[MAXPATHLEN];
struct statfs sfsbuf;
struct stat sb;
struct statfs *sfs;
char *delimp;
dev_t dev;
int len;
quoting << Martin_Blapp - Completly changed the internals of umount(8). We do three checks now to see if 'argv' is in the mounttable. It they all fail, we return to main and print a warning. - fixed the umount mount-order. The checks are rather complex to do this. Cause umount(8) should also be able to unmount several devices at once ('umount -a', 'umount -A', 'umount /mnt /mnt2'), the mount-order get's important. I added checks to mark and unmark already unmounted devices. - Various fixes with nfs-unmounts (no rpc-calls were done, or they were done although there was an existing mount). Since we allow overlay-mounts, we should also handle them properly. - Translate the deprecated nfs-syntax with '@' to ':' like mount_nfs does. The ':' syntax has now precedence, but '@' still works. - 'umount -v' is now fixed for all cases and doesn't print garbage like two times the mountpoint etc. - removed non documented and useless umount '-F'. - hanged nfsmounts can now unmounted 'without' any problems. I've removed stat() and realpath() checks on the mountpoint. Instead we just do a realpath() on the basedir of the mountpath and add the dirname again. Implemented this as an idea from phk. But there are still vfs-restrictions if the nfs_mount is busy. If there are unwritten metadata on a hanged nfs-mount, and we modify nfs_vfsops.c to not return EBUSY, we get a deadlock :( The problem has now moved from userland to kernel. - removed the BUGS part from the umount(8) manpage. - Converted it to ANSI C (more than 60% of the code have changed). Martin_Blapp Fixed PR's ---------- o [1999/02/03] bin/9893 NFS umount of regular file impossible s [1995/11/27] bin/841 stale nfs mounts cannot be umounted o [1999/08/01] bin/12911 alfred NFS umounts are not properly done if just the mountpoint gets umounted Only partially solved: ---------------------- The problem is now in kernel: o [1999/04/07] bin/11005 `umount -f' does not work if the NFS-server is down. PR: bin/9893 bin/841 bin/12911 bin/11005 Submitted by: Martin Blapp <mb@imp.ch>
1999-10-17 16:26:58 +00:00
/*
* 1. Check if the name exists in the mounttable.
*/
sfs = checkmntlist(mntname);
quoting << Martin_Blapp - Completly changed the internals of umount(8). We do three checks now to see if 'argv' is in the mounttable. It they all fail, we return to main and print a warning. - fixed the umount mount-order. The checks are rather complex to do this. Cause umount(8) should also be able to unmount several devices at once ('umount -a', 'umount -A', 'umount /mnt /mnt2'), the mount-order get's important. I added checks to mark and unmark already unmounted devices. - Various fixes with nfs-unmounts (no rpc-calls were done, or they were done although there was an existing mount). Since we allow overlay-mounts, we should also handle them properly. - Translate the deprecated nfs-syntax with '@' to ':' like mount_nfs does. The ':' syntax has now precedence, but '@' still works. - 'umount -v' is now fixed for all cases and doesn't print garbage like two times the mountpoint etc. - removed non documented and useless umount '-F'. - hanged nfsmounts can now unmounted 'without' any problems. I've removed stat() and realpath() checks on the mountpoint. Instead we just do a realpath() on the basedir of the mountpath and add the dirname again. Implemented this as an idea from phk. But there are still vfs-restrictions if the nfs_mount is busy. If there are unwritten metadata on a hanged nfs-mount, and we modify nfs_vfsops.c to not return EBUSY, we get a deadlock :( The problem has now moved from userland to kernel. - removed the BUGS part from the umount(8) manpage. - Converted it to ANSI C (more than 60% of the code have changed). Martin_Blapp Fixed PR's ---------- o [1999/02/03] bin/9893 NFS umount of regular file impossible s [1995/11/27] bin/841 stale nfs mounts cannot be umounted o [1999/08/01] bin/12911 alfred NFS umounts are not properly done if just the mountpoint gets umounted Only partially solved: ---------------------- The problem is now in kernel: o [1999/04/07] bin/11005 `umount -f' does not work if the NFS-server is down. PR: bin/9893 bin/841 bin/12911 bin/11005 Submitted by: Martin Blapp <mb@imp.ch>
1999-10-17 16:26:58 +00:00
/*
* 2. Remove trailing slashes if there are any. After that
* we look up the name in the mounttable again.
*/
if (sfs == NULL) {
len = strlen(mntname);
while (len > 1 && mntname[len - 1] == '/')
mntname[--len] = '\0';
sfs = checkmntlist(mntname);
}
/*
* 3. Check if the deprecated NFS syntax with an '@' has been used
* and translate it to the ':' syntax. Look up the name in the
* mount table again.
*/
if (sfs == NULL && (delimp = strrchr(mntname, '@')) != NULL) {
snprintf(buf, sizeof(buf), "%s:%.*s", delimp + 1,
(int)(delimp - mntname), mntname);
len = strlen(buf);
while (len > 1 && buf[len - 1] == '/')
buf[--len] = '\0';
sfs = checkmntlist(buf);
}
/*
* 4. Resort to a statfs(2) call. This is the last check so that
* hung NFS filesystems for example can be unmounted without
* potentially blocking forever in statfs() as long as the
* filesystem is specified unambiguously. This covers all the
* hard cases such as symlinks and mismatches between the
* mount list and reality.
* We also do this if an ambiguous mount point was specified.
*/
if (sfs == NULL || (getmntentry(NULL, mntname, NULL, FIND) != NULL &&
getmntentry(NULL, mntname, NULL, CHECKUNIQUE) == NULL)) {
if (statfs(mntname, &sfsbuf) != 0) {
warn("%s: statfs", mntname);
} else if (stat(mntname, &sb) != 0) {
warn("%s: stat", mntname);
} else if (S_ISDIR(sb.st_mode)) {
/* Check that `mntname' is the root directory. */
dev = sb.st_dev;
snprintf(buf, sizeof(buf), "%s/..", mntname);
if (stat(buf, &sb) != 0) {
warn("%s: stat", buf);
} else if (sb.st_dev == dev) {
warnx("%s: not a file system root directory",
mntname);
return (1);
} else
sfs = &sfsbuf;
}
}
if (sfs == NULL) {
warnx("%s: unknown file system", mntname);
return (1);
}
if (checkvfsname(sfs->f_fstypename, typelist))
return (1);
return (umountfs(sfs));
Bring in a hybrid of SunSoft's transport-independent RPC (TI-RPC) and associated changes that had to happen to make this possible as well as bugs fixed along the way. Bring in required TLI library routines to support this. Since we don't support TLI we've essentially copied what NetBSD has done, adding a thin layer to emulate direct the TLI calls into BSD socket calls. This is mostly from Sun's tirpc release that was made in 1994, however some fixes were backported from the 1999 release (supposedly only made available after this porting effort was underway). The submitter has agreed to continue on and bring us up to the 1999 release. Several key features are introduced with this update: Client calls are thread safe. (1999 code has server side thread safe) Updated, a more modern interface. Many userland updates were done to bring the code up to par with the recent RPC API. There is an update to the pthreads library, a function pthread_main_np() was added to emulate a function of Sun's threads library. While we're at it, bring in NetBSD's lockd, it's been far too long of a wait. New rpcbind(8) replaces portmap(8) (supporting communication over an authenticated Unix-domain socket, and by default only allowing set and unset requests over that channel). It's much more secure than the old portmapper. Umount(8), mountd(8), mount_nfs(8), nfsd(8) have also been upgraded to support TI-RPC and to support IPV6. Umount(8) is also fixed to unmount pathnames longer than 80 chars, which are currently truncated by the Kernel statfs structure. Submitted by: Martin Blapp <mb@imp.ch> Manpage review: ru Secure RPC implemented by: wpaul
2001-03-19 12:50:13 +00:00
}
/*
* NFS stuff and unmount(2) call
*/
int
umountfs(struct statfs *sfs)
Bring in a hybrid of SunSoft's transport-independent RPC (TI-RPC) and associated changes that had to happen to make this possible as well as bugs fixed along the way. Bring in required TLI library routines to support this. Since we don't support TLI we've essentially copied what NetBSD has done, adding a thin layer to emulate direct the TLI calls into BSD socket calls. This is mostly from Sun's tirpc release that was made in 1994, however some fixes were backported from the 1999 release (supposedly only made available after this porting effort was underway). The submitter has agreed to continue on and bring us up to the 1999 release. Several key features are introduced with this update: Client calls are thread safe. (1999 code has server side thread safe) Updated, a more modern interface. Many userland updates were done to bring the code up to par with the recent RPC API. There is an update to the pthreads library, a function pthread_main_np() was added to emulate a function of Sun's threads library. While we're at it, bring in NetBSD's lockd, it's been far too long of a wait. New rpcbind(8) replaces portmap(8) (supporting communication over an authenticated Unix-domain socket, and by default only allowing set and unset requests over that channel). It's much more secure than the old portmapper. Umount(8), mountd(8), mount_nfs(8), nfsd(8) have also been upgraded to support TI-RPC and to support IPV6. Umount(8) is also fixed to unmount pathnames longer than 80 chars, which are currently truncated by the Kernel statfs structure. Submitted by: Martin Blapp <mb@imp.ch> Manpage review: ru Secure RPC implemented by: wpaul
2001-03-19 12:50:13 +00:00
{
char fsidbuf[64];
Bring in a hybrid of SunSoft's transport-independent RPC (TI-RPC) and associated changes that had to happen to make this possible as well as bugs fixed along the way. Bring in required TLI library routines to support this. Since we don't support TLI we've essentially copied what NetBSD has done, adding a thin layer to emulate direct the TLI calls into BSD socket calls. This is mostly from Sun's tirpc release that was made in 1994, however some fixes were backported from the 1999 release (supposedly only made available after this porting effort was underway). The submitter has agreed to continue on and bring us up to the 1999 release. Several key features are introduced with this update: Client calls are thread safe. (1999 code has server side thread safe) Updated, a more modern interface. Many userland updates were done to bring the code up to par with the recent RPC API. There is an update to the pthreads library, a function pthread_main_np() was added to emulate a function of Sun's threads library. While we're at it, bring in NetBSD's lockd, it's been far too long of a wait. New rpcbind(8) replaces portmap(8) (supporting communication over an authenticated Unix-domain socket, and by default only allowing set and unset requests over that channel). It's much more secure than the old portmapper. Umount(8), mountd(8), mount_nfs(8), nfsd(8) have also been upgraded to support TI-RPC and to support IPV6. Umount(8) is also fixed to unmount pathnames longer than 80 chars, which are currently truncated by the Kernel statfs structure. Submitted by: Martin Blapp <mb@imp.ch> Manpage review: ru Secure RPC implemented by: wpaul
2001-03-19 12:50:13 +00:00
enum clnt_stat clnt_stat;
struct timeval try;
struct addrinfo *ai, hints;
int do_rpc;
CLIENT *clp;
char *nfsdirname, *orignfsdirname;
char *hostp, *delimp;
ai = NULL;
do_rpc = 0;
hostp = NULL;
Bring in a hybrid of SunSoft's transport-independent RPC (TI-RPC) and associated changes that had to happen to make this possible as well as bugs fixed along the way. Bring in required TLI library routines to support this. Since we don't support TLI we've essentially copied what NetBSD has done, adding a thin layer to emulate direct the TLI calls into BSD socket calls. This is mostly from Sun's tirpc release that was made in 1994, however some fixes were backported from the 1999 release (supposedly only made available after this porting effort was underway). The submitter has agreed to continue on and bring us up to the 1999 release. Several key features are introduced with this update: Client calls are thread safe. (1999 code has server side thread safe) Updated, a more modern interface. Many userland updates were done to bring the code up to par with the recent RPC API. There is an update to the pthreads library, a function pthread_main_np() was added to emulate a function of Sun's threads library. While we're at it, bring in NetBSD's lockd, it's been far too long of a wait. New rpcbind(8) replaces portmap(8) (supporting communication over an authenticated Unix-domain socket, and by default only allowing set and unset requests over that channel). It's much more secure than the old portmapper. Umount(8), mountd(8), mount_nfs(8), nfsd(8) have also been upgraded to support TI-RPC and to support IPV6. Umount(8) is also fixed to unmount pathnames longer than 80 chars, which are currently truncated by the Kernel statfs structure. Submitted by: Martin Blapp <mb@imp.ch> Manpage review: ru Secure RPC implemented by: wpaul
2001-03-19 12:50:13 +00:00
nfsdirname = delimp = orignfsdirname = NULL;
memset(&hints, 0, sizeof hints);
if (strcmp(sfs->f_fstypename, "nfs") == 0) {
if ((nfsdirname = strdup(sfs->f_mntfromname)) == NULL)
Bring in a hybrid of SunSoft's transport-independent RPC (TI-RPC) and associated changes that had to happen to make this possible as well as bugs fixed along the way. Bring in required TLI library routines to support this. Since we don't support TLI we've essentially copied what NetBSD has done, adding a thin layer to emulate direct the TLI calls into BSD socket calls. This is mostly from Sun's tirpc release that was made in 1994, however some fixes were backported from the 1999 release (supposedly only made available after this porting effort was underway). The submitter has agreed to continue on and bring us up to the 1999 release. Several key features are introduced with this update: Client calls are thread safe. (1999 code has server side thread safe) Updated, a more modern interface. Many userland updates were done to bring the code up to par with the recent RPC API. There is an update to the pthreads library, a function pthread_main_np() was added to emulate a function of Sun's threads library. While we're at it, bring in NetBSD's lockd, it's been far too long of a wait. New rpcbind(8) replaces portmap(8) (supporting communication over an authenticated Unix-domain socket, and by default only allowing set and unset requests over that channel). It's much more secure than the old portmapper. Umount(8), mountd(8), mount_nfs(8), nfsd(8) have also been upgraded to support TI-RPC and to support IPV6. Umount(8) is also fixed to unmount pathnames longer than 80 chars, which are currently truncated by the Kernel statfs structure. Submitted by: Martin Blapp <mb@imp.ch> Manpage review: ru Secure RPC implemented by: wpaul
2001-03-19 12:50:13 +00:00
err(1, "strdup");
orignfsdirname = nfsdirname;
if (*nfsdirname == '[' &&
(delimp = strchr(nfsdirname + 1, ']')) != NULL &&
*(delimp + 1) == ':') {
hostp = nfsdirname + 1;
nfsdirname = delimp + 2;
} else if ((delimp = strrchr(nfsdirname, ':')) != NULL) {
Bring in a hybrid of SunSoft's transport-independent RPC (TI-RPC) and associated changes that had to happen to make this possible as well as bugs fixed along the way. Bring in required TLI library routines to support this. Since we don't support TLI we've essentially copied what NetBSD has done, adding a thin layer to emulate direct the TLI calls into BSD socket calls. This is mostly from Sun's tirpc release that was made in 1994, however some fixes were backported from the 1999 release (supposedly only made available after this porting effort was underway). The submitter has agreed to continue on and bring us up to the 1999 release. Several key features are introduced with this update: Client calls are thread safe. (1999 code has server side thread safe) Updated, a more modern interface. Many userland updates were done to bring the code up to par with the recent RPC API. There is an update to the pthreads library, a function pthread_main_np() was added to emulate a function of Sun's threads library. While we're at it, bring in NetBSD's lockd, it's been far too long of a wait. New rpcbind(8) replaces portmap(8) (supporting communication over an authenticated Unix-domain socket, and by default only allowing set and unset requests over that channel). It's much more secure than the old portmapper. Umount(8), mountd(8), mount_nfs(8), nfsd(8) have also been upgraded to support TI-RPC and to support IPV6. Umount(8) is also fixed to unmount pathnames longer than 80 chars, which are currently truncated by the Kernel statfs structure. Submitted by: Martin Blapp <mb@imp.ch> Manpage review: ru Secure RPC implemented by: wpaul
2001-03-19 12:50:13 +00:00
hostp = nfsdirname;
nfsdirname = delimp + 1;
}
if (hostp != NULL) {
*delimp = '\0';
Bring in a hybrid of SunSoft's transport-independent RPC (TI-RPC) and associated changes that had to happen to make this possible as well as bugs fixed along the way. Bring in required TLI library routines to support this. Since we don't support TLI we've essentially copied what NetBSD has done, adding a thin layer to emulate direct the TLI calls into BSD socket calls. This is mostly from Sun's tirpc release that was made in 1994, however some fixes were backported from the 1999 release (supposedly only made available after this porting effort was underway). The submitter has agreed to continue on and bring us up to the 1999 release. Several key features are introduced with this update: Client calls are thread safe. (1999 code has server side thread safe) Updated, a more modern interface. Many userland updates were done to bring the code up to par with the recent RPC API. There is an update to the pthreads library, a function pthread_main_np() was added to emulate a function of Sun's threads library. While we're at it, bring in NetBSD's lockd, it's been far too long of a wait. New rpcbind(8) replaces portmap(8) (supporting communication over an authenticated Unix-domain socket, and by default only allowing set and unset requests over that channel). It's much more secure than the old portmapper. Umount(8), mountd(8), mount_nfs(8), nfsd(8) have also been upgraded to support TI-RPC and to support IPV6. Umount(8) is also fixed to unmount pathnames longer than 80 chars, which are currently truncated by the Kernel statfs structure. Submitted by: Martin Blapp <mb@imp.ch> Manpage review: ru Secure RPC implemented by: wpaul
2001-03-19 12:50:13 +00:00
getaddrinfo(hostp, NULL, &hints, &ai);
if (ai == NULL) {
warnx("can't get net id for host");
}
}
/*
* Check if we have to start the rpc-call later.
* If there are still identical nfs-names mounted,
* we skip the rpc-call. Obviously this has to
* happen before unmount(2), but it should happen
* after the previous namecheck.
* A non-NULL return means that this is the last
* mount from mntfromname that is still mounted.
*/
if (getmntentry(sfs->f_mntfromname, NULL, NULL,
CHECKUNIQUE) != NULL)
do_rpc = 1;
Bring in a hybrid of SunSoft's transport-independent RPC (TI-RPC) and associated changes that had to happen to make this possible as well as bugs fixed along the way. Bring in required TLI library routines to support this. Since we don't support TLI we've essentially copied what NetBSD has done, adding a thin layer to emulate direct the TLI calls into BSD socket calls. This is mostly from Sun's tirpc release that was made in 1994, however some fixes were backported from the 1999 release (supposedly only made available after this porting effort was underway). The submitter has agreed to continue on and bring us up to the 1999 release. Several key features are introduced with this update: Client calls are thread safe. (1999 code has server side thread safe) Updated, a more modern interface. Many userland updates were done to bring the code up to par with the recent RPC API. There is an update to the pthreads library, a function pthread_main_np() was added to emulate a function of Sun's threads library. While we're at it, bring in NetBSD's lockd, it's been far too long of a wait. New rpcbind(8) replaces portmap(8) (supporting communication over an authenticated Unix-domain socket, and by default only allowing set and unset requests over that channel). It's much more secure than the old portmapper. Umount(8), mountd(8), mount_nfs(8), nfsd(8) have also been upgraded to support TI-RPC and to support IPV6. Umount(8) is also fixed to unmount pathnames longer than 80 chars, which are currently truncated by the Kernel statfs structure. Submitted by: Martin Blapp <mb@imp.ch> Manpage review: ru Secure RPC implemented by: wpaul
2001-03-19 12:50:13 +00:00
}
if (!namematch(ai))
return (1);
/* First try to unmount using the file system ID. */
snprintf(fsidbuf, sizeof(fsidbuf), "FSID:%d:%d", sfs->f_fsid.val[0],
sfs->f_fsid.val[1]);
if (unmount(fsidbuf, fflag | MNT_BYFSID) != 0) {
/* XXX, non-root users get a zero fsid, so don't warn. */
if (errno != ENOENT || sfs->f_fsid.val[0] != 0 ||
sfs->f_fsid.val[1] != 0)
warn("unmount of %s failed", sfs->f_mntonname);
if (errno != ENOENT)
return (1);
/* Compatibility for old kernels. */
if (sfs->f_fsid.val[0] != 0 || sfs->f_fsid.val[1] != 0)
warnx("retrying using path instead of file system ID");
if (unmount(sfs->f_mntonname, fflag) != 0) {
warn("unmount of %s failed", sfs->f_mntonname);
return (1);
}
}
/* Mark this this file system as unmounted. */
getmntentry(NULL, NULL, &sfs->f_fsid, REMOVE);
quoting << Martin_Blapp - Completly changed the internals of umount(8). We do three checks now to see if 'argv' is in the mounttable. It they all fail, we return to main and print a warning. - fixed the umount mount-order. The checks are rather complex to do this. Cause umount(8) should also be able to unmount several devices at once ('umount -a', 'umount -A', 'umount /mnt /mnt2'), the mount-order get's important. I added checks to mark and unmark already unmounted devices. - Various fixes with nfs-unmounts (no rpc-calls were done, or they were done although there was an existing mount). Since we allow overlay-mounts, we should also handle them properly. - Translate the deprecated nfs-syntax with '@' to ':' like mount_nfs does. The ':' syntax has now precedence, but '@' still works. - 'umount -v' is now fixed for all cases and doesn't print garbage like two times the mountpoint etc. - removed non documented and useless umount '-F'. - hanged nfsmounts can now unmounted 'without' any problems. I've removed stat() and realpath() checks on the mountpoint. Instead we just do a realpath() on the basedir of the mountpath and add the dirname again. Implemented this as an idea from phk. But there are still vfs-restrictions if the nfs_mount is busy. If there are unwritten metadata on a hanged nfs-mount, and we modify nfs_vfsops.c to not return EBUSY, we get a deadlock :( The problem has now moved from userland to kernel. - removed the BUGS part from the umount(8) manpage. - Converted it to ANSI C (more than 60% of the code have changed). Martin_Blapp Fixed PR's ---------- o [1999/02/03] bin/9893 NFS umount of regular file impossible s [1995/11/27] bin/841 stale nfs mounts cannot be umounted o [1999/08/01] bin/12911 alfred NFS umounts are not properly done if just the mountpoint gets umounted Only partially solved: ---------------------- The problem is now in kernel: o [1999/04/07] bin/11005 `umount -f' does not work if the NFS-server is down. PR: bin/9893 bin/841 bin/12911 bin/11005 Submitted by: Martin Blapp <mb@imp.ch>
1999-10-17 16:26:58 +00:00
if (vflag)
(void)printf("%s: unmount from %s\n", sfs->f_mntfromname,
sfs->f_mntonname);
quoting << Martin_Blapp - Completly changed the internals of umount(8). We do three checks now to see if 'argv' is in the mounttable. It they all fail, we return to main and print a warning. - fixed the umount mount-order. The checks are rather complex to do this. Cause umount(8) should also be able to unmount several devices at once ('umount -a', 'umount -A', 'umount /mnt /mnt2'), the mount-order get's important. I added checks to mark and unmark already unmounted devices. - Various fixes with nfs-unmounts (no rpc-calls were done, or they were done although there was an existing mount). Since we allow overlay-mounts, we should also handle them properly. - Translate the deprecated nfs-syntax with '@' to ':' like mount_nfs does. The ':' syntax has now precedence, but '@' still works. - 'umount -v' is now fixed for all cases and doesn't print garbage like two times the mountpoint etc. - removed non documented and useless umount '-F'. - hanged nfsmounts can now unmounted 'without' any problems. I've removed stat() and realpath() checks on the mountpoint. Instead we just do a realpath() on the basedir of the mountpath and add the dirname again. Implemented this as an idea from phk. But there are still vfs-restrictions if the nfs_mount is busy. If there are unwritten metadata on a hanged nfs-mount, and we modify nfs_vfsops.c to not return EBUSY, we get a deadlock :( The problem has now moved from userland to kernel. - removed the BUGS part from the umount(8) manpage. - Converted it to ANSI C (more than 60% of the code have changed). Martin_Blapp Fixed PR's ---------- o [1999/02/03] bin/9893 NFS umount of regular file impossible s [1995/11/27] bin/841 stale nfs mounts cannot be umounted o [1999/08/01] bin/12911 alfred NFS umounts are not properly done if just the mountpoint gets umounted Only partially solved: ---------------------- The problem is now in kernel: o [1999/04/07] bin/11005 `umount -f' does not work if the NFS-server is down. PR: bin/9893 bin/841 bin/12911 bin/11005 Submitted by: Martin Blapp <mb@imp.ch>
1999-10-17 16:26:58 +00:00
/*
* Report to mountd-server which nfsname
* has been unmounted.
*/
Bring in a hybrid of SunSoft's transport-independent RPC (TI-RPC) and associated changes that had to happen to make this possible as well as bugs fixed along the way. Bring in required TLI library routines to support this. Since we don't support TLI we've essentially copied what NetBSD has done, adding a thin layer to emulate direct the TLI calls into BSD socket calls. This is mostly from Sun's tirpc release that was made in 1994, however some fixes were backported from the 1999 release (supposedly only made available after this porting effort was underway). The submitter has agreed to continue on and bring us up to the 1999 release. Several key features are introduced with this update: Client calls are thread safe. (1999 code has server side thread safe) Updated, a more modern interface. Many userland updates were done to bring the code up to par with the recent RPC API. There is an update to the pthreads library, a function pthread_main_np() was added to emulate a function of Sun's threads library. While we're at it, bring in NetBSD's lockd, it's been far too long of a wait. New rpcbind(8) replaces portmap(8) (supporting communication over an authenticated Unix-domain socket, and by default only allowing set and unset requests over that channel). It's much more secure than the old portmapper. Umount(8), mountd(8), mount_nfs(8), nfsd(8) have also been upgraded to support TI-RPC and to support IPV6. Umount(8) is also fixed to unmount pathnames longer than 80 chars, which are currently truncated by the Kernel statfs structure. Submitted by: Martin Blapp <mb@imp.ch> Manpage review: ru Secure RPC implemented by: wpaul
2001-03-19 12:50:13 +00:00
if (ai != NULL && !(fflag & MNT_FORCE) && do_rpc) {
clp = clnt_create(hostp, MOUNTPROG, MOUNTVERS, "udp");
Bring in a hybrid of SunSoft's transport-independent RPC (TI-RPC) and associated changes that had to happen to make this possible as well as bugs fixed along the way. Bring in required TLI library routines to support this. Since we don't support TLI we've essentially copied what NetBSD has done, adding a thin layer to emulate direct the TLI calls into BSD socket calls. This is mostly from Sun's tirpc release that was made in 1994, however some fixes were backported from the 1999 release (supposedly only made available after this porting effort was underway). The submitter has agreed to continue on and bring us up to the 1999 release. Several key features are introduced with this update: Client calls are thread safe. (1999 code has server side thread safe) Updated, a more modern interface. Many userland updates were done to bring the code up to par with the recent RPC API. There is an update to the pthreads library, a function pthread_main_np() was added to emulate a function of Sun's threads library. While we're at it, bring in NetBSD's lockd, it's been far too long of a wait. New rpcbind(8) replaces portmap(8) (supporting communication over an authenticated Unix-domain socket, and by default only allowing set and unset requests over that channel). It's much more secure than the old portmapper. Umount(8), mountd(8), mount_nfs(8), nfsd(8) have also been upgraded to support TI-RPC and to support IPV6. Umount(8) is also fixed to unmount pathnames longer than 80 chars, which are currently truncated by the Kernel statfs structure. Submitted by: Martin Blapp <mb@imp.ch> Manpage review: ru Secure RPC implemented by: wpaul
2001-03-19 12:50:13 +00:00
if (clp == NULL) {
warnx("%s: %s", hostp,
clnt_spcreateerror("MOUNTPROG"));
return (1);
}
Bring in a hybrid of SunSoft's transport-independent RPC (TI-RPC) and associated changes that had to happen to make this possible as well as bugs fixed along the way. Bring in required TLI library routines to support this. Since we don't support TLI we've essentially copied what NetBSD has done, adding a thin layer to emulate direct the TLI calls into BSD socket calls. This is mostly from Sun's tirpc release that was made in 1994, however some fixes were backported from the 1999 release (supposedly only made available after this porting effort was underway). The submitter has agreed to continue on and bring us up to the 1999 release. Several key features are introduced with this update: Client calls are thread safe. (1999 code has server side thread safe) Updated, a more modern interface. Many userland updates were done to bring the code up to par with the recent RPC API. There is an update to the pthreads library, a function pthread_main_np() was added to emulate a function of Sun's threads library. While we're at it, bring in NetBSD's lockd, it's been far too long of a wait. New rpcbind(8) replaces portmap(8) (supporting communication over an authenticated Unix-domain socket, and by default only allowing set and unset requests over that channel). It's much more secure than the old portmapper. Umount(8), mountd(8), mount_nfs(8), nfsd(8) have also been upgraded to support TI-RPC and to support IPV6. Umount(8) is also fixed to unmount pathnames longer than 80 chars, which are currently truncated by the Kernel statfs structure. Submitted by: Martin Blapp <mb@imp.ch> Manpage review: ru Secure RPC implemented by: wpaul
2001-03-19 12:50:13 +00:00
clp->cl_auth = authsys_create_default();
try.tv_sec = 20;
try.tv_usec = 0;
clnt_stat = clnt_call(clp, MOUNTPROC_UMNT, (xdrproc_t)xdr_dir,
2003-04-07 11:44:48 +00:00
nfsdirname, (xdrproc_t)xdr_void, (caddr_t)0, try);
if (clnt_stat != RPC_SUCCESS) {
warnx("%s: %s", hostp,
clnt_sperror(clp, "RPCMNT_UMOUNT"));
return (1);
}
/*
* Remove the unmounted entry from /var/db/mounttab.
*/
if (read_mtab()) {
clean_mtab(hostp, nfsdirname, vflag);
if(!write_mtab(vflag))
warnx("cannot remove mounttab entry %s:%s",
hostp, nfsdirname);
free_mtab();
}
quoting << Martin_Blapp - Completly changed the internals of umount(8). We do three checks now to see if 'argv' is in the mounttable. It they all fail, we return to main and print a warning. - fixed the umount mount-order. The checks are rather complex to do this. Cause umount(8) should also be able to unmount several devices at once ('umount -a', 'umount -A', 'umount /mnt /mnt2'), the mount-order get's important. I added checks to mark and unmark already unmounted devices. - Various fixes with nfs-unmounts (no rpc-calls were done, or they were done although there was an existing mount). Since we allow overlay-mounts, we should also handle them properly. - Translate the deprecated nfs-syntax with '@' to ':' like mount_nfs does. The ':' syntax has now precedence, but '@' still works. - 'umount -v' is now fixed for all cases and doesn't print garbage like two times the mountpoint etc. - removed non documented and useless umount '-F'. - hanged nfsmounts can now unmounted 'without' any problems. I've removed stat() and realpath() checks on the mountpoint. Instead we just do a realpath() on the basedir of the mountpath and add the dirname again. Implemented this as an idea from phk. But there are still vfs-restrictions if the nfs_mount is busy. If there are unwritten metadata on a hanged nfs-mount, and we modify nfs_vfsops.c to not return EBUSY, we get a deadlock :( The problem has now moved from userland to kernel. - removed the BUGS part from the umount(8) manpage. - Converted it to ANSI C (more than 60% of the code have changed). Martin_Blapp Fixed PR's ---------- o [1999/02/03] bin/9893 NFS umount of regular file impossible s [1995/11/27] bin/841 stale nfs mounts cannot be umounted o [1999/08/01] bin/12911 alfred NFS umounts are not properly done if just the mountpoint gets umounted Only partially solved: ---------------------- The problem is now in kernel: o [1999/04/07] bin/11005 `umount -f' does not work if the NFS-server is down. PR: bin/9893 bin/841 bin/12911 bin/11005 Submitted by: Martin Blapp <mb@imp.ch>
1999-10-17 16:26:58 +00:00
free(orignfsdirname);
auth_destroy(clp->cl_auth);
clnt_destroy(clp);
}
return (0);
}
struct statfs *
getmntentry(const char *fromname, const char *onname, fsid_t *fsid, dowhat what)
{
static struct statfs *mntbuf;
quoting << Martin_Blapp - Completly changed the internals of umount(8). We do three checks now to see if 'argv' is in the mounttable. It they all fail, we return to main and print a warning. - fixed the umount mount-order. The checks are rather complex to do this. Cause umount(8) should also be able to unmount several devices at once ('umount -a', 'umount -A', 'umount /mnt /mnt2'), the mount-order get's important. I added checks to mark and unmark already unmounted devices. - Various fixes with nfs-unmounts (no rpc-calls were done, or they were done although there was an existing mount). Since we allow overlay-mounts, we should also handle them properly. - Translate the deprecated nfs-syntax with '@' to ':' like mount_nfs does. The ':' syntax has now precedence, but '@' still works. - 'umount -v' is now fixed for all cases and doesn't print garbage like two times the mountpoint etc. - removed non documented and useless umount '-F'. - hanged nfsmounts can now unmounted 'without' any problems. I've removed stat() and realpath() checks on the mountpoint. Instead we just do a realpath() on the basedir of the mountpath and add the dirname again. Implemented this as an idea from phk. But there are still vfs-restrictions if the nfs_mount is busy. If there are unwritten metadata on a hanged nfs-mount, and we modify nfs_vfsops.c to not return EBUSY, we get a deadlock :( The problem has now moved from userland to kernel. - removed the BUGS part from the umount(8) manpage. - Converted it to ANSI C (more than 60% of the code have changed). Martin_Blapp Fixed PR's ---------- o [1999/02/03] bin/9893 NFS umount of regular file impossible s [1995/11/27] bin/841 stale nfs mounts cannot be umounted o [1999/08/01] bin/12911 alfred NFS umounts are not properly done if just the mountpoint gets umounted Only partially solved: ---------------------- The problem is now in kernel: o [1999/04/07] bin/11005 `umount -f' does not work if the NFS-server is down. PR: bin/9893 bin/841 bin/12911 bin/11005 Submitted by: Martin Blapp <mb@imp.ch>
1999-10-17 16:26:58 +00:00
static size_t mntsize = 0;
static char *mntcheck = NULL;
struct statfs *sfs, *foundsfs;
quoting << Martin_Blapp - Completly changed the internals of umount(8). We do three checks now to see if 'argv' is in the mounttable. It they all fail, we return to main and print a warning. - fixed the umount mount-order. The checks are rather complex to do this. Cause umount(8) should also be able to unmount several devices at once ('umount -a', 'umount -A', 'umount /mnt /mnt2'), the mount-order get's important. I added checks to mark and unmark already unmounted devices. - Various fixes with nfs-unmounts (no rpc-calls were done, or they were done although there was an existing mount). Since we allow overlay-mounts, we should also handle them properly. - Translate the deprecated nfs-syntax with '@' to ':' like mount_nfs does. The ':' syntax has now precedence, but '@' still works. - 'umount -v' is now fixed for all cases and doesn't print garbage like two times the mountpoint etc. - removed non documented and useless umount '-F'. - hanged nfsmounts can now unmounted 'without' any problems. I've removed stat() and realpath() checks on the mountpoint. Instead we just do a realpath() on the basedir of the mountpath and add the dirname again. Implemented this as an idea from phk. But there are still vfs-restrictions if the nfs_mount is busy. If there are unwritten metadata on a hanged nfs-mount, and we modify nfs_vfsops.c to not return EBUSY, we get a deadlock :( The problem has now moved from userland to kernel. - removed the BUGS part from the umount(8) manpage. - Converted it to ANSI C (more than 60% of the code have changed). Martin_Blapp Fixed PR's ---------- o [1999/02/03] bin/9893 NFS umount of regular file impossible s [1995/11/27] bin/841 stale nfs mounts cannot be umounted o [1999/08/01] bin/12911 alfred NFS umounts are not properly done if just the mountpoint gets umounted Only partially solved: ---------------------- The problem is now in kernel: o [1999/04/07] bin/11005 `umount -f' does not work if the NFS-server is down. PR: bin/9893 bin/841 bin/12911 bin/11005 Submitted by: Martin Blapp <mb@imp.ch>
1999-10-17 16:26:58 +00:00
int i, count;
if (mntsize <= 0) {
if ((mntsize = mntinfo(&mntbuf)) <= 0)
return (NULL);
}
quoting << Martin_Blapp - Completly changed the internals of umount(8). We do three checks now to see if 'argv' is in the mounttable. It they all fail, we return to main and print a warning. - fixed the umount mount-order. The checks are rather complex to do this. Cause umount(8) should also be able to unmount several devices at once ('umount -a', 'umount -A', 'umount /mnt /mnt2'), the mount-order get's important. I added checks to mark and unmark already unmounted devices. - Various fixes with nfs-unmounts (no rpc-calls were done, or they were done although there was an existing mount). Since we allow overlay-mounts, we should also handle them properly. - Translate the deprecated nfs-syntax with '@' to ':' like mount_nfs does. The ':' syntax has now precedence, but '@' still works. - 'umount -v' is now fixed for all cases and doesn't print garbage like two times the mountpoint etc. - removed non documented and useless umount '-F'. - hanged nfsmounts can now unmounted 'without' any problems. I've removed stat() and realpath() checks on the mountpoint. Instead we just do a realpath() on the basedir of the mountpath and add the dirname again. Implemented this as an idea from phk. But there are still vfs-restrictions if the nfs_mount is busy. If there are unwritten metadata on a hanged nfs-mount, and we modify nfs_vfsops.c to not return EBUSY, we get a deadlock :( The problem has now moved from userland to kernel. - removed the BUGS part from the umount(8) manpage. - Converted it to ANSI C (more than 60% of the code have changed). Martin_Blapp Fixed PR's ---------- o [1999/02/03] bin/9893 NFS umount of regular file impossible s [1995/11/27] bin/841 stale nfs mounts cannot be umounted o [1999/08/01] bin/12911 alfred NFS umounts are not properly done if just the mountpoint gets umounted Only partially solved: ---------------------- The problem is now in kernel: o [1999/04/07] bin/11005 `umount -f' does not work if the NFS-server is down. PR: bin/9893 bin/841 bin/12911 bin/11005 Submitted by: Martin Blapp <mb@imp.ch>
1999-10-17 16:26:58 +00:00
if (mntcheck == NULL) {
if ((mntcheck = calloc(mntsize + 1, sizeof(int))) == NULL)
quoting << Martin_Blapp - Completly changed the internals of umount(8). We do three checks now to see if 'argv' is in the mounttable. It they all fail, we return to main and print a warning. - fixed the umount mount-order. The checks are rather complex to do this. Cause umount(8) should also be able to unmount several devices at once ('umount -a', 'umount -A', 'umount /mnt /mnt2'), the mount-order get's important. I added checks to mark and unmark already unmounted devices. - Various fixes with nfs-unmounts (no rpc-calls were done, or they were done although there was an existing mount). Since we allow overlay-mounts, we should also handle them properly. - Translate the deprecated nfs-syntax with '@' to ':' like mount_nfs does. The ':' syntax has now precedence, but '@' still works. - 'umount -v' is now fixed for all cases and doesn't print garbage like two times the mountpoint etc. - removed non documented and useless umount '-F'. - hanged nfsmounts can now unmounted 'without' any problems. I've removed stat() and realpath() checks on the mountpoint. Instead we just do a realpath() on the basedir of the mountpath and add the dirname again. Implemented this as an idea from phk. But there are still vfs-restrictions if the nfs_mount is busy. If there are unwritten metadata on a hanged nfs-mount, and we modify nfs_vfsops.c to not return EBUSY, we get a deadlock :( The problem has now moved from userland to kernel. - removed the BUGS part from the umount(8) manpage. - Converted it to ANSI C (more than 60% of the code have changed). Martin_Blapp Fixed PR's ---------- o [1999/02/03] bin/9893 NFS umount of regular file impossible s [1995/11/27] bin/841 stale nfs mounts cannot be umounted o [1999/08/01] bin/12911 alfred NFS umounts are not properly done if just the mountpoint gets umounted Only partially solved: ---------------------- The problem is now in kernel: o [1999/04/07] bin/11005 `umount -f' does not work if the NFS-server is down. PR: bin/9893 bin/841 bin/12911 bin/11005 Submitted by: Martin Blapp <mb@imp.ch>
1999-10-17 16:26:58 +00:00
err(1, "calloc");
}
/*
* We want to get the file systems in the reverse order
* that they were mounted. Unmounted file systems are marked
* in a table called 'mntcheck'.
quoting << Martin_Blapp - Completly changed the internals of umount(8). We do three checks now to see if 'argv' is in the mounttable. It they all fail, we return to main and print a warning. - fixed the umount mount-order. The checks are rather complex to do this. Cause umount(8) should also be able to unmount several devices at once ('umount -a', 'umount -A', 'umount /mnt /mnt2'), the mount-order get's important. I added checks to mark and unmark already unmounted devices. - Various fixes with nfs-unmounts (no rpc-calls were done, or they were done although there was an existing mount). Since we allow overlay-mounts, we should also handle them properly. - Translate the deprecated nfs-syntax with '@' to ':' like mount_nfs does. The ':' syntax has now precedence, but '@' still works. - 'umount -v' is now fixed for all cases and doesn't print garbage like two times the mountpoint etc. - removed non documented and useless umount '-F'. - hanged nfsmounts can now unmounted 'without' any problems. I've removed stat() and realpath() checks on the mountpoint. Instead we just do a realpath() on the basedir of the mountpath and add the dirname again. Implemented this as an idea from phk. But there are still vfs-restrictions if the nfs_mount is busy. If there are unwritten metadata on a hanged nfs-mount, and we modify nfs_vfsops.c to not return EBUSY, we get a deadlock :( The problem has now moved from userland to kernel. - removed the BUGS part from the umount(8) manpage. - Converted it to ANSI C (more than 60% of the code have changed). Martin_Blapp Fixed PR's ---------- o [1999/02/03] bin/9893 NFS umount of regular file impossible s [1995/11/27] bin/841 stale nfs mounts cannot be umounted o [1999/08/01] bin/12911 alfred NFS umounts are not properly done if just the mountpoint gets umounted Only partially solved: ---------------------- The problem is now in kernel: o [1999/04/07] bin/11005 `umount -f' does not work if the NFS-server is down. PR: bin/9893 bin/841 bin/12911 bin/11005 Submitted by: Martin Blapp <mb@imp.ch>
1999-10-17 16:26:58 +00:00
*/
count = 0;
foundsfs = NULL;
for (i = mntsize - 1; i >= 0; i--) {
if (mntcheck[i])
continue;
sfs = &mntbuf[i];
if (fromname != NULL && strcmp(sfs->f_mntfromname,
fromname) != 0)
continue;
if (onname != NULL && strcmp(sfs->f_mntonname, onname) != 0)
continue;
if (fsid != NULL && bcmp(&sfs->f_fsid, fsid,
sizeof(*fsid)) != 0)
continue;
switch (what) {
case CHECKUNIQUE:
foundsfs = sfs;
count++;
continue;
case REMOVE:
mntcheck[i] = 1;
break;
default:
break;
quoting << Martin_Blapp - Completly changed the internals of umount(8). We do three checks now to see if 'argv' is in the mounttable. It they all fail, we return to main and print a warning. - fixed the umount mount-order. The checks are rather complex to do this. Cause umount(8) should also be able to unmount several devices at once ('umount -a', 'umount -A', 'umount /mnt /mnt2'), the mount-order get's important. I added checks to mark and unmark already unmounted devices. - Various fixes with nfs-unmounts (no rpc-calls were done, or they were done although there was an existing mount). Since we allow overlay-mounts, we should also handle them properly. - Translate the deprecated nfs-syntax with '@' to ':' like mount_nfs does. The ':' syntax has now precedence, but '@' still works. - 'umount -v' is now fixed for all cases and doesn't print garbage like two times the mountpoint etc. - removed non documented and useless umount '-F'. - hanged nfsmounts can now unmounted 'without' any problems. I've removed stat() and realpath() checks on the mountpoint. Instead we just do a realpath() on the basedir of the mountpath and add the dirname again. Implemented this as an idea from phk. But there are still vfs-restrictions if the nfs_mount is busy. If there are unwritten metadata on a hanged nfs-mount, and we modify nfs_vfsops.c to not return EBUSY, we get a deadlock :( The problem has now moved from userland to kernel. - removed the BUGS part from the umount(8) manpage. - Converted it to ANSI C (more than 60% of the code have changed). Martin_Blapp Fixed PR's ---------- o [1999/02/03] bin/9893 NFS umount of regular file impossible s [1995/11/27] bin/841 stale nfs mounts cannot be umounted o [1999/08/01] bin/12911 alfred NFS umounts are not properly done if just the mountpoint gets umounted Only partially solved: ---------------------- The problem is now in kernel: o [1999/04/07] bin/11005 `umount -f' does not work if the NFS-server is down. PR: bin/9893 bin/841 bin/12911 bin/11005 Submitted by: Martin Blapp <mb@imp.ch>
1999-10-17 16:26:58 +00:00
}
return (sfs);
}
if (what == CHECKUNIQUE && count == 1)
return (foundsfs);
return (NULL);
}
int
sacmp(void *sa1, void *sa2)
{
Bring in a hybrid of SunSoft's transport-independent RPC (TI-RPC) and associated changes that had to happen to make this possible as well as bugs fixed along the way. Bring in required TLI library routines to support this. Since we don't support TLI we've essentially copied what NetBSD has done, adding a thin layer to emulate direct the TLI calls into BSD socket calls. This is mostly from Sun's tirpc release that was made in 1994, however some fixes were backported from the 1999 release (supposedly only made available after this porting effort was underway). The submitter has agreed to continue on and bring us up to the 1999 release. Several key features are introduced with this update: Client calls are thread safe. (1999 code has server side thread safe) Updated, a more modern interface. Many userland updates were done to bring the code up to par with the recent RPC API. There is an update to the pthreads library, a function pthread_main_np() was added to emulate a function of Sun's threads library. While we're at it, bring in NetBSD's lockd, it's been far too long of a wait. New rpcbind(8) replaces portmap(8) (supporting communication over an authenticated Unix-domain socket, and by default only allowing set and unset requests over that channel). It's much more secure than the old portmapper. Umount(8), mountd(8), mount_nfs(8), nfsd(8) have also been upgraded to support TI-RPC and to support IPV6. Umount(8) is also fixed to unmount pathnames longer than 80 chars, which are currently truncated by the Kernel statfs structure. Submitted by: Martin Blapp <mb@imp.ch> Manpage review: ru Secure RPC implemented by: wpaul
2001-03-19 12:50:13 +00:00
void *p1, *p2;
int len;
if (((struct sockaddr *)sa1)->sa_family !=
((struct sockaddr *)sa2)->sa_family)
return (1);
switch (((struct sockaddr *)sa1)->sa_family) {
Bring in a hybrid of SunSoft's transport-independent RPC (TI-RPC) and associated changes that had to happen to make this possible as well as bugs fixed along the way. Bring in required TLI library routines to support this. Since we don't support TLI we've essentially copied what NetBSD has done, adding a thin layer to emulate direct the TLI calls into BSD socket calls. This is mostly from Sun's tirpc release that was made in 1994, however some fixes were backported from the 1999 release (supposedly only made available after this porting effort was underway). The submitter has agreed to continue on and bring us up to the 1999 release. Several key features are introduced with this update: Client calls are thread safe. (1999 code has server side thread safe) Updated, a more modern interface. Many userland updates were done to bring the code up to par with the recent RPC API. There is an update to the pthreads library, a function pthread_main_np() was added to emulate a function of Sun's threads library. While we're at it, bring in NetBSD's lockd, it's been far too long of a wait. New rpcbind(8) replaces portmap(8) (supporting communication over an authenticated Unix-domain socket, and by default only allowing set and unset requests over that channel). It's much more secure than the old portmapper. Umount(8), mountd(8), mount_nfs(8), nfsd(8) have also been upgraded to support TI-RPC and to support IPV6. Umount(8) is also fixed to unmount pathnames longer than 80 chars, which are currently truncated by the Kernel statfs structure. Submitted by: Martin Blapp <mb@imp.ch> Manpage review: ru Secure RPC implemented by: wpaul
2001-03-19 12:50:13 +00:00
case AF_INET:
p1 = &((struct sockaddr_in *)sa1)->sin_addr;
p2 = &((struct sockaddr_in *)sa2)->sin_addr;
len = 4;
break;
case AF_INET6:
p1 = &((struct sockaddr_in6 *)sa1)->sin6_addr;
p2 = &((struct sockaddr_in6 *)sa2)->sin6_addr;
len = 16;
if (((struct sockaddr_in6 *)sa1)->sin6_scope_id !=
((struct sockaddr_in6 *)sa2)->sin6_scope_id)
return (1);
Bring in a hybrid of SunSoft's transport-independent RPC (TI-RPC) and associated changes that had to happen to make this possible as well as bugs fixed along the way. Bring in required TLI library routines to support this. Since we don't support TLI we've essentially copied what NetBSD has done, adding a thin layer to emulate direct the TLI calls into BSD socket calls. This is mostly from Sun's tirpc release that was made in 1994, however some fixes were backported from the 1999 release (supposedly only made available after this porting effort was underway). The submitter has agreed to continue on and bring us up to the 1999 release. Several key features are introduced with this update: Client calls are thread safe. (1999 code has server side thread safe) Updated, a more modern interface. Many userland updates were done to bring the code up to par with the recent RPC API. There is an update to the pthreads library, a function pthread_main_np() was added to emulate a function of Sun's threads library. While we're at it, bring in NetBSD's lockd, it's been far too long of a wait. New rpcbind(8) replaces portmap(8) (supporting communication over an authenticated Unix-domain socket, and by default only allowing set and unset requests over that channel). It's much more secure than the old portmapper. Umount(8), mountd(8), mount_nfs(8), nfsd(8) have also been upgraded to support TI-RPC and to support IPV6. Umount(8) is also fixed to unmount pathnames longer than 80 chars, which are currently truncated by the Kernel statfs structure. Submitted by: Martin Blapp <mb@imp.ch> Manpage review: ru Secure RPC implemented by: wpaul
2001-03-19 12:50:13 +00:00
break;
default:
return (1);
}
Bring in a hybrid of SunSoft's transport-independent RPC (TI-RPC) and associated changes that had to happen to make this possible as well as bugs fixed along the way. Bring in required TLI library routines to support this. Since we don't support TLI we've essentially copied what NetBSD has done, adding a thin layer to emulate direct the TLI calls into BSD socket calls. This is mostly from Sun's tirpc release that was made in 1994, however some fixes were backported from the 1999 release (supposedly only made available after this porting effort was underway). The submitter has agreed to continue on and bring us up to the 1999 release. Several key features are introduced with this update: Client calls are thread safe. (1999 code has server side thread safe) Updated, a more modern interface. Many userland updates were done to bring the code up to par with the recent RPC API. There is an update to the pthreads library, a function pthread_main_np() was added to emulate a function of Sun's threads library. While we're at it, bring in NetBSD's lockd, it's been far too long of a wait. New rpcbind(8) replaces portmap(8) (supporting communication over an authenticated Unix-domain socket, and by default only allowing set and unset requests over that channel). It's much more secure than the old portmapper. Umount(8), mountd(8), mount_nfs(8), nfsd(8) have also been upgraded to support TI-RPC and to support IPV6. Umount(8) is also fixed to unmount pathnames longer than 80 chars, which are currently truncated by the Kernel statfs structure. Submitted by: Martin Blapp <mb@imp.ch> Manpage review: ru Secure RPC implemented by: wpaul
2001-03-19 12:50:13 +00:00
return memcmp(p1, p2, len);
}
int
namematch(struct addrinfo *ai)
{
struct addrinfo *aip;
if (nfshost == NULL || nfshost_ai == NULL)
return (1);
while (ai != NULL) {
aip = nfshost_ai;
while (aip != NULL) {
if (sacmp(ai->ai_addr, aip->ai_addr) == 0)
return (1);
Bring in a hybrid of SunSoft's transport-independent RPC (TI-RPC) and associated changes that had to happen to make this possible as well as bugs fixed along the way. Bring in required TLI library routines to support this. Since we don't support TLI we've essentially copied what NetBSD has done, adding a thin layer to emulate direct the TLI calls into BSD socket calls. This is mostly from Sun's tirpc release that was made in 1994, however some fixes were backported from the 1999 release (supposedly only made available after this porting effort was underway). The submitter has agreed to continue on and bring us up to the 1999 release. Several key features are introduced with this update: Client calls are thread safe. (1999 code has server side thread safe) Updated, a more modern interface. Many userland updates were done to bring the code up to par with the recent RPC API. There is an update to the pthreads library, a function pthread_main_np() was added to emulate a function of Sun's threads library. While we're at it, bring in NetBSD's lockd, it's been far too long of a wait. New rpcbind(8) replaces portmap(8) (supporting communication over an authenticated Unix-domain socket, and by default only allowing set and unset requests over that channel). It's much more secure than the old portmapper. Umount(8), mountd(8), mount_nfs(8), nfsd(8) have also been upgraded to support TI-RPC and to support IPV6. Umount(8) is also fixed to unmount pathnames longer than 80 chars, which are currently truncated by the Kernel statfs structure. Submitted by: Martin Blapp <mb@imp.ch> Manpage review: ru Secure RPC implemented by: wpaul
2001-03-19 12:50:13 +00:00
aip = aip->ai_next;
}
Bring in a hybrid of SunSoft's transport-independent RPC (TI-RPC) and associated changes that had to happen to make this possible as well as bugs fixed along the way. Bring in required TLI library routines to support this. Since we don't support TLI we've essentially copied what NetBSD has done, adding a thin layer to emulate direct the TLI calls into BSD socket calls. This is mostly from Sun's tirpc release that was made in 1994, however some fixes were backported from the 1999 release (supposedly only made available after this porting effort was underway). The submitter has agreed to continue on and bring us up to the 1999 release. Several key features are introduced with this update: Client calls are thread safe. (1999 code has server side thread safe) Updated, a more modern interface. Many userland updates were done to bring the code up to par with the recent RPC API. There is an update to the pthreads library, a function pthread_main_np() was added to emulate a function of Sun's threads library. While we're at it, bring in NetBSD's lockd, it's been far too long of a wait. New rpcbind(8) replaces portmap(8) (supporting communication over an authenticated Unix-domain socket, and by default only allowing set and unset requests over that channel). It's much more secure than the old portmapper. Umount(8), mountd(8), mount_nfs(8), nfsd(8) have also been upgraded to support TI-RPC and to support IPV6. Umount(8) is also fixed to unmount pathnames longer than 80 chars, which are currently truncated by the Kernel statfs structure. Submitted by: Martin Blapp <mb@imp.ch> Manpage review: ru Secure RPC implemented by: wpaul
2001-03-19 12:50:13 +00:00
ai = ai->ai_next;
}
Bring in a hybrid of SunSoft's transport-independent RPC (TI-RPC) and associated changes that had to happen to make this possible as well as bugs fixed along the way. Bring in required TLI library routines to support this. Since we don't support TLI we've essentially copied what NetBSD has done, adding a thin layer to emulate direct the TLI calls into BSD socket calls. This is mostly from Sun's tirpc release that was made in 1994, however some fixes were backported from the 1999 release (supposedly only made available after this porting effort was underway). The submitter has agreed to continue on and bring us up to the 1999 release. Several key features are introduced with this update: Client calls are thread safe. (1999 code has server side thread safe) Updated, a more modern interface. Many userland updates were done to bring the code up to par with the recent RPC API. There is an update to the pthreads library, a function pthread_main_np() was added to emulate a function of Sun's threads library. While we're at it, bring in NetBSD's lockd, it's been far too long of a wait. New rpcbind(8) replaces portmap(8) (supporting communication over an authenticated Unix-domain socket, and by default only allowing set and unset requests over that channel). It's much more secure than the old portmapper. Umount(8), mountd(8), mount_nfs(8), nfsd(8) have also been upgraded to support TI-RPC and to support IPV6. Umount(8) is also fixed to unmount pathnames longer than 80 chars, which are currently truncated by the Kernel statfs structure. Submitted by: Martin Blapp <mb@imp.ch> Manpage review: ru Secure RPC implemented by: wpaul
2001-03-19 12:50:13 +00:00
return (0);
}
struct statfs *
checkmntlist(char *mntname)
quoting << Martin_Blapp - Completly changed the internals of umount(8). We do three checks now to see if 'argv' is in the mounttable. It they all fail, we return to main and print a warning. - fixed the umount mount-order. The checks are rather complex to do this. Cause umount(8) should also be able to unmount several devices at once ('umount -a', 'umount -A', 'umount /mnt /mnt2'), the mount-order get's important. I added checks to mark and unmark already unmounted devices. - Various fixes with nfs-unmounts (no rpc-calls were done, or they were done although there was an existing mount). Since we allow overlay-mounts, we should also handle them properly. - Translate the deprecated nfs-syntax with '@' to ':' like mount_nfs does. The ':' syntax has now precedence, but '@' still works. - 'umount -v' is now fixed for all cases and doesn't print garbage like two times the mountpoint etc. - removed non documented and useless umount '-F'. - hanged nfsmounts can now unmounted 'without' any problems. I've removed stat() and realpath() checks on the mountpoint. Instead we just do a realpath() on the basedir of the mountpath and add the dirname again. Implemented this as an idea from phk. But there are still vfs-restrictions if the nfs_mount is busy. If there are unwritten metadata on a hanged nfs-mount, and we modify nfs_vfsops.c to not return EBUSY, we get a deadlock :( The problem has now moved from userland to kernel. - removed the BUGS part from the umount(8) manpage. - Converted it to ANSI C (more than 60% of the code have changed). Martin_Blapp Fixed PR's ---------- o [1999/02/03] bin/9893 NFS umount of regular file impossible s [1995/11/27] bin/841 stale nfs mounts cannot be umounted o [1999/08/01] bin/12911 alfred NFS umounts are not properly done if just the mountpoint gets umounted Only partially solved: ---------------------- The problem is now in kernel: o [1999/04/07] bin/11005 `umount -f' does not work if the NFS-server is down. PR: bin/9893 bin/841 bin/12911 bin/11005 Submitted by: Martin Blapp <mb@imp.ch>
1999-10-17 16:26:58 +00:00
{
struct statfs *sfs;
fsid_t fsid;
quoting << Martin_Blapp - Completly changed the internals of umount(8). We do three checks now to see if 'argv' is in the mounttable. It they all fail, we return to main and print a warning. - fixed the umount mount-order. The checks are rather complex to do this. Cause umount(8) should also be able to unmount several devices at once ('umount -a', 'umount -A', 'umount /mnt /mnt2'), the mount-order get's important. I added checks to mark and unmark already unmounted devices. - Various fixes with nfs-unmounts (no rpc-calls were done, or they were done although there was an existing mount). Since we allow overlay-mounts, we should also handle them properly. - Translate the deprecated nfs-syntax with '@' to ':' like mount_nfs does. The ':' syntax has now precedence, but '@' still works. - 'umount -v' is now fixed for all cases and doesn't print garbage like two times the mountpoint etc. - removed non documented and useless umount '-F'. - hanged nfsmounts can now unmounted 'without' any problems. I've removed stat() and realpath() checks on the mountpoint. Instead we just do a realpath() on the basedir of the mountpath and add the dirname again. Implemented this as an idea from phk. But there are still vfs-restrictions if the nfs_mount is busy. If there are unwritten metadata on a hanged nfs-mount, and we modify nfs_vfsops.c to not return EBUSY, we get a deadlock :( The problem has now moved from userland to kernel. - removed the BUGS part from the umount(8) manpage. - Converted it to ANSI C (more than 60% of the code have changed). Martin_Blapp Fixed PR's ---------- o [1999/02/03] bin/9893 NFS umount of regular file impossible s [1995/11/27] bin/841 stale nfs mounts cannot be umounted o [1999/08/01] bin/12911 alfred NFS umounts are not properly done if just the mountpoint gets umounted Only partially solved: ---------------------- The problem is now in kernel: o [1999/04/07] bin/11005 `umount -f' does not work if the NFS-server is down. PR: bin/9893 bin/841 bin/12911 bin/11005 Submitted by: Martin Blapp <mb@imp.ch>
1999-10-17 16:26:58 +00:00
sfs = NULL;
if (parsehexfsid(mntname, &fsid) == 0)
sfs = getmntentry(NULL, NULL, &fsid, FIND);
if (sfs == NULL)
sfs = getmntentry(NULL, mntname, NULL, FIND);
if (sfs == NULL)
sfs = getmntentry(mntname, NULL, NULL, FIND);
return (sfs);
quoting << Martin_Blapp - Completly changed the internals of umount(8). We do three checks now to see if 'argv' is in the mounttable. It they all fail, we return to main and print a warning. - fixed the umount mount-order. The checks are rather complex to do this. Cause umount(8) should also be able to unmount several devices at once ('umount -a', 'umount -A', 'umount /mnt /mnt2'), the mount-order get's important. I added checks to mark and unmark already unmounted devices. - Various fixes with nfs-unmounts (no rpc-calls were done, or they were done although there was an existing mount). Since we allow overlay-mounts, we should also handle them properly. - Translate the deprecated nfs-syntax with '@' to ':' like mount_nfs does. The ':' syntax has now precedence, but '@' still works. - 'umount -v' is now fixed for all cases and doesn't print garbage like two times the mountpoint etc. - removed non documented and useless umount '-F'. - hanged nfsmounts can now unmounted 'without' any problems. I've removed stat() and realpath() checks on the mountpoint. Instead we just do a realpath() on the basedir of the mountpath and add the dirname again. Implemented this as an idea from phk. But there are still vfs-restrictions if the nfs_mount is busy. If there are unwritten metadata on a hanged nfs-mount, and we modify nfs_vfsops.c to not return EBUSY, we get a deadlock :( The problem has now moved from userland to kernel. - removed the BUGS part from the umount(8) manpage. - Converted it to ANSI C (more than 60% of the code have changed). Martin_Blapp Fixed PR's ---------- o [1999/02/03] bin/9893 NFS umount of regular file impossible s [1995/11/27] bin/841 stale nfs mounts cannot be umounted o [1999/08/01] bin/12911 alfred NFS umounts are not properly done if just the mountpoint gets umounted Only partially solved: ---------------------- The problem is now in kernel: o [1999/04/07] bin/11005 `umount -f' does not work if the NFS-server is down. PR: bin/9893 bin/841 bin/12911 bin/11005 Submitted by: Martin Blapp <mb@imp.ch>
1999-10-17 16:26:58 +00:00
}
size_t
mntinfo(struct statfs **mntbuf)
{
static struct statfs *origbuf;
size_t bufsize;
int mntsize;
mntsize = getfsstat(NULL, 0, MNT_NOWAIT);
quoting << Martin_Blapp - Completly changed the internals of umount(8). We do three checks now to see if 'argv' is in the mounttable. It they all fail, we return to main and print a warning. - fixed the umount mount-order. The checks are rather complex to do this. Cause umount(8) should also be able to unmount several devices at once ('umount -a', 'umount -A', 'umount /mnt /mnt2'), the mount-order get's important. I added checks to mark and unmark already unmounted devices. - Various fixes with nfs-unmounts (no rpc-calls were done, or they were done although there was an existing mount). Since we allow overlay-mounts, we should also handle them properly. - Translate the deprecated nfs-syntax with '@' to ':' like mount_nfs does. The ':' syntax has now precedence, but '@' still works. - 'umount -v' is now fixed for all cases and doesn't print garbage like two times the mountpoint etc. - removed non documented and useless umount '-F'. - hanged nfsmounts can now unmounted 'without' any problems. I've removed stat() and realpath() checks on the mountpoint. Instead we just do a realpath() on the basedir of the mountpath and add the dirname again. Implemented this as an idea from phk. But there are still vfs-restrictions if the nfs_mount is busy. If there are unwritten metadata on a hanged nfs-mount, and we modify nfs_vfsops.c to not return EBUSY, we get a deadlock :( The problem has now moved from userland to kernel. - removed the BUGS part from the umount(8) manpage. - Converted it to ANSI C (more than 60% of the code have changed). Martin_Blapp Fixed PR's ---------- o [1999/02/03] bin/9893 NFS umount of regular file impossible s [1995/11/27] bin/841 stale nfs mounts cannot be umounted o [1999/08/01] bin/12911 alfred NFS umounts are not properly done if just the mountpoint gets umounted Only partially solved: ---------------------- The problem is now in kernel: o [1999/04/07] bin/11005 `umount -f' does not work if the NFS-server is down. PR: bin/9893 bin/841 bin/12911 bin/11005 Submitted by: Martin Blapp <mb@imp.ch>
1999-10-17 16:26:58 +00:00
if (mntsize <= 0)
return (0);
bufsize = (mntsize + 1) * sizeof(struct statfs);
if ((origbuf = malloc(bufsize)) == NULL)
err(1, "malloc");
mntsize = getfsstat(origbuf, (long)bufsize, MNT_NOWAIT);
*mntbuf = origbuf;
return (mntsize);
}
/*
* Convert a hexadecimal filesystem ID to an fsid_t.
* Returns 0 on success.
*/
int
parsehexfsid(const char *hex, fsid_t *fsid)
quoting << Martin_Blapp - Completly changed the internals of umount(8). We do three checks now to see if 'argv' is in the mounttable. It they all fail, we return to main and print a warning. - fixed the umount mount-order. The checks are rather complex to do this. Cause umount(8) should also be able to unmount several devices at once ('umount -a', 'umount -A', 'umount /mnt /mnt2'), the mount-order get's important. I added checks to mark and unmark already unmounted devices. - Various fixes with nfs-unmounts (no rpc-calls were done, or they were done although there was an existing mount). Since we allow overlay-mounts, we should also handle them properly. - Translate the deprecated nfs-syntax with '@' to ':' like mount_nfs does. The ':' syntax has now precedence, but '@' still works. - 'umount -v' is now fixed for all cases and doesn't print garbage like two times the mountpoint etc. - removed non documented and useless umount '-F'. - hanged nfsmounts can now unmounted 'without' any problems. I've removed stat() and realpath() checks on the mountpoint. Instead we just do a realpath() on the basedir of the mountpath and add the dirname again. Implemented this as an idea from phk. But there are still vfs-restrictions if the nfs_mount is busy. If there are unwritten metadata on a hanged nfs-mount, and we modify nfs_vfsops.c to not return EBUSY, we get a deadlock :( The problem has now moved from userland to kernel. - removed the BUGS part from the umount(8) manpage. - Converted it to ANSI C (more than 60% of the code have changed). Martin_Blapp Fixed PR's ---------- o [1999/02/03] bin/9893 NFS umount of regular file impossible s [1995/11/27] bin/841 stale nfs mounts cannot be umounted o [1999/08/01] bin/12911 alfred NFS umounts are not properly done if just the mountpoint gets umounted Only partially solved: ---------------------- The problem is now in kernel: o [1999/04/07] bin/11005 `umount -f' does not work if the NFS-server is down. PR: bin/9893 bin/841 bin/12911 bin/11005 Submitted by: Martin Blapp <mb@imp.ch>
1999-10-17 16:26:58 +00:00
{
char hexbuf[3];
int i;
if (strlen(hex) != sizeof(*fsid) * 2)
return (-1);
hexbuf[2] = '\0';
for (i = 0; i < (int)sizeof(*fsid); i++) {
hexbuf[0] = hex[i * 2];
hexbuf[1] = hex[i * 2 + 1];
if (!isxdigit(hexbuf[0]) || !isxdigit(hexbuf[1]))
return (-1);
((u_char *)fsid)[i] = strtol(hexbuf, NULL, 16);
quoting << Martin_Blapp - Completly changed the internals of umount(8). We do three checks now to see if 'argv' is in the mounttable. It they all fail, we return to main and print a warning. - fixed the umount mount-order. The checks are rather complex to do this. Cause umount(8) should also be able to unmount several devices at once ('umount -a', 'umount -A', 'umount /mnt /mnt2'), the mount-order get's important. I added checks to mark and unmark already unmounted devices. - Various fixes with nfs-unmounts (no rpc-calls were done, or they were done although there was an existing mount). Since we allow overlay-mounts, we should also handle them properly. - Translate the deprecated nfs-syntax with '@' to ':' like mount_nfs does. The ':' syntax has now precedence, but '@' still works. - 'umount -v' is now fixed for all cases and doesn't print garbage like two times the mountpoint etc. - removed non documented and useless umount '-F'. - hanged nfsmounts can now unmounted 'without' any problems. I've removed stat() and realpath() checks on the mountpoint. Instead we just do a realpath() on the basedir of the mountpath and add the dirname again. Implemented this as an idea from phk. But there are still vfs-restrictions if the nfs_mount is busy. If there are unwritten metadata on a hanged nfs-mount, and we modify nfs_vfsops.c to not return EBUSY, we get a deadlock :( The problem has now moved from userland to kernel. - removed the BUGS part from the umount(8) manpage. - Converted it to ANSI C (more than 60% of the code have changed). Martin_Blapp Fixed PR's ---------- o [1999/02/03] bin/9893 NFS umount of regular file impossible s [1995/11/27] bin/841 stale nfs mounts cannot be umounted o [1999/08/01] bin/12911 alfred NFS umounts are not properly done if just the mountpoint gets umounted Only partially solved: ---------------------- The problem is now in kernel: o [1999/04/07] bin/11005 `umount -f' does not work if the NFS-server is down. PR: bin/9893 bin/841 bin/12911 bin/11005 Submitted by: Martin Blapp <mb@imp.ch>
1999-10-17 16:26:58 +00:00
}
return (0);
quoting << Martin_Blapp - Completly changed the internals of umount(8). We do three checks now to see if 'argv' is in the mounttable. It they all fail, we return to main and print a warning. - fixed the umount mount-order. The checks are rather complex to do this. Cause umount(8) should also be able to unmount several devices at once ('umount -a', 'umount -A', 'umount /mnt /mnt2'), the mount-order get's important. I added checks to mark and unmark already unmounted devices. - Various fixes with nfs-unmounts (no rpc-calls were done, or they were done although there was an existing mount). Since we allow overlay-mounts, we should also handle them properly. - Translate the deprecated nfs-syntax with '@' to ':' like mount_nfs does. The ':' syntax has now precedence, but '@' still works. - 'umount -v' is now fixed for all cases and doesn't print garbage like two times the mountpoint etc. - removed non documented and useless umount '-F'. - hanged nfsmounts can now unmounted 'without' any problems. I've removed stat() and realpath() checks on the mountpoint. Instead we just do a realpath() on the basedir of the mountpath and add the dirname again. Implemented this as an idea from phk. But there are still vfs-restrictions if the nfs_mount is busy. If there are unwritten metadata on a hanged nfs-mount, and we modify nfs_vfsops.c to not return EBUSY, we get a deadlock :( The problem has now moved from userland to kernel. - removed the BUGS part from the umount(8) manpage. - Converted it to ANSI C (more than 60% of the code have changed). Martin_Blapp Fixed PR's ---------- o [1999/02/03] bin/9893 NFS umount of regular file impossible s [1995/11/27] bin/841 stale nfs mounts cannot be umounted o [1999/08/01] bin/12911 alfred NFS umounts are not properly done if just the mountpoint gets umounted Only partially solved: ---------------------- The problem is now in kernel: o [1999/04/07] bin/11005 `umount -f' does not work if the NFS-server is down. PR: bin/9893 bin/841 bin/12911 bin/11005 Submitted by: Martin Blapp <mb@imp.ch>
1999-10-17 16:26:58 +00:00
}
/*
* xdr routines for mount rpc's
*/
int
quoting << Martin_Blapp - Completly changed the internals of umount(8). We do three checks now to see if 'argv' is in the mounttable. It they all fail, we return to main and print a warning. - fixed the umount mount-order. The checks are rather complex to do this. Cause umount(8) should also be able to unmount several devices at once ('umount -a', 'umount -A', 'umount /mnt /mnt2'), the mount-order get's important. I added checks to mark and unmark already unmounted devices. - Various fixes with nfs-unmounts (no rpc-calls were done, or they were done although there was an existing mount). Since we allow overlay-mounts, we should also handle them properly. - Translate the deprecated nfs-syntax with '@' to ':' like mount_nfs does. The ':' syntax has now precedence, but '@' still works. - 'umount -v' is now fixed for all cases and doesn't print garbage like two times the mountpoint etc. - removed non documented and useless umount '-F'. - hanged nfsmounts can now unmounted 'without' any problems. I've removed stat() and realpath() checks on the mountpoint. Instead we just do a realpath() on the basedir of the mountpath and add the dirname again. Implemented this as an idea from phk. But there are still vfs-restrictions if the nfs_mount is busy. If there are unwritten metadata on a hanged nfs-mount, and we modify nfs_vfsops.c to not return EBUSY, we get a deadlock :( The problem has now moved from userland to kernel. - removed the BUGS part from the umount(8) manpage. - Converted it to ANSI C (more than 60% of the code have changed). Martin_Blapp Fixed PR's ---------- o [1999/02/03] bin/9893 NFS umount of regular file impossible s [1995/11/27] bin/841 stale nfs mounts cannot be umounted o [1999/08/01] bin/12911 alfred NFS umounts are not properly done if just the mountpoint gets umounted Only partially solved: ---------------------- The problem is now in kernel: o [1999/04/07] bin/11005 `umount -f' does not work if the NFS-server is down. PR: bin/9893 bin/841 bin/12911 bin/11005 Submitted by: Martin Blapp <mb@imp.ch>
1999-10-17 16:26:58 +00:00
xdr_dir(XDR *xdrsp, char *dirp)
{
quoting << Martin_Blapp - Completly changed the internals of umount(8). We do three checks now to see if 'argv' is in the mounttable. It they all fail, we return to main and print a warning. - fixed the umount mount-order. The checks are rather complex to do this. Cause umount(8) should also be able to unmount several devices at once ('umount -a', 'umount -A', 'umount /mnt /mnt2'), the mount-order get's important. I added checks to mark and unmark already unmounted devices. - Various fixes with nfs-unmounts (no rpc-calls were done, or they were done although there was an existing mount). Since we allow overlay-mounts, we should also handle them properly. - Translate the deprecated nfs-syntax with '@' to ':' like mount_nfs does. The ':' syntax has now precedence, but '@' still works. - 'umount -v' is now fixed for all cases and doesn't print garbage like two times the mountpoint etc. - removed non documented and useless umount '-F'. - hanged nfsmounts can now unmounted 'without' any problems. I've removed stat() and realpath() checks on the mountpoint. Instead we just do a realpath() on the basedir of the mountpath and add the dirname again. Implemented this as an idea from phk. But there are still vfs-restrictions if the nfs_mount is busy. If there are unwritten metadata on a hanged nfs-mount, and we modify nfs_vfsops.c to not return EBUSY, we get a deadlock :( The problem has now moved from userland to kernel. - removed the BUGS part from the umount(8) manpage. - Converted it to ANSI C (more than 60% of the code have changed). Martin_Blapp Fixed PR's ---------- o [1999/02/03] bin/9893 NFS umount of regular file impossible s [1995/11/27] bin/841 stale nfs mounts cannot be umounted o [1999/08/01] bin/12911 alfred NFS umounts are not properly done if just the mountpoint gets umounted Only partially solved: ---------------------- The problem is now in kernel: o [1999/04/07] bin/11005 `umount -f' does not work if the NFS-server is down. PR: bin/9893 bin/841 bin/12911 bin/11005 Submitted by: Martin Blapp <mb@imp.ch>
1999-10-17 16:26:58 +00:00
return (xdr_string(xdrsp, &dirp, MNTPATHLEN));
}
void
usage(void)
{
quoting << Martin_Blapp - Completly changed the internals of umount(8). We do three checks now to see if 'argv' is in the mounttable. It they all fail, we return to main and print a warning. - fixed the umount mount-order. The checks are rather complex to do this. Cause umount(8) should also be able to unmount several devices at once ('umount -a', 'umount -A', 'umount /mnt /mnt2'), the mount-order get's important. I added checks to mark and unmark already unmounted devices. - Various fixes with nfs-unmounts (no rpc-calls were done, or they were done although there was an existing mount). Since we allow overlay-mounts, we should also handle them properly. - Translate the deprecated nfs-syntax with '@' to ':' like mount_nfs does. The ':' syntax has now precedence, but '@' still works. - 'umount -v' is now fixed for all cases and doesn't print garbage like two times the mountpoint etc. - removed non documented and useless umount '-F'. - hanged nfsmounts can now unmounted 'without' any problems. I've removed stat() and realpath() checks on the mountpoint. Instead we just do a realpath() on the basedir of the mountpath and add the dirname again. Implemented this as an idea from phk. But there are still vfs-restrictions if the nfs_mount is busy. If there are unwritten metadata on a hanged nfs-mount, and we modify nfs_vfsops.c to not return EBUSY, we get a deadlock :( The problem has now moved from userland to kernel. - removed the BUGS part from the umount(8) manpage. - Converted it to ANSI C (more than 60% of the code have changed). Martin_Blapp Fixed PR's ---------- o [1999/02/03] bin/9893 NFS umount of regular file impossible s [1995/11/27] bin/841 stale nfs mounts cannot be umounted o [1999/08/01] bin/12911 alfred NFS umounts are not properly done if just the mountpoint gets umounted Only partially solved: ---------------------- The problem is now in kernel: o [1999/04/07] bin/11005 `umount -f' does not work if the NFS-server is down. PR: bin/9893 bin/841 bin/12911 bin/11005 Submitted by: Martin Blapp <mb@imp.ch>
1999-10-17 16:26:58 +00:00
(void)fprintf(stderr, "%s\n%s\n",
"usage: umount [-fv] special ... | node ... | fsid ...",
" umount -a | -A [-F fstab] [-fv] [-h host] [-t type]");
exit(1);
}