diff options
author | rodrigc <rodrigc@FreeBSD.org> | 2007-02-01 14:18:01 +0000 |
---|---|---|
committer | rodrigc <rodrigc@FreeBSD.org> | 2007-02-01 14:18:01 +0000 |
commit | 9795779588b3a4275fe3221f126ca00aed04ea95 (patch) | |
tree | 0aaae75a96382898a03e9f770d1fe90697ad9c50 /sbin | |
parent | 8f812418c1ae9367d5f65cdf384261133103866a (diff) | |
download | FreeBSD-src-9795779588b3a4275fe3221f126ca00aed04ea95.zip FreeBSD-src-9795779588b3a4275fe3221f126ca00aed04ea95.tar.gz |
Remove, since code has been merged into mount_nfs,
and mount_nfs Makefile builds mount_nfs and creates a mount_nfs4 link to it.
Diffstat (limited to 'sbin')
-rw-r--r-- | sbin/mount_nfs4/Makefile | 16 | ||||
-rw-r--r-- | sbin/mount_nfs4/mount_nfs4.8 | 201 | ||||
-rw-r--r-- | sbin/mount_nfs4/mount_nfs4.c | 735 |
3 files changed, 0 insertions, 952 deletions
diff --git a/sbin/mount_nfs4/Makefile b/sbin/mount_nfs4/Makefile deleted file mode 100644 index 881d119..0000000 --- a/sbin/mount_nfs4/Makefile +++ /dev/null @@ -1,16 +0,0 @@ -# ${.CURDIR}(#)Makefile 8.2 (Berkeley) 3/27/94 -# -# $FreeBSD$ - -PROG= mount_nfs4 -SRCS= mount_nfs4.c getmntopts.c mounttab.c -MAN= mount_nfs4.8 - -MOUNT= ${.CURDIR}/../mount -UMNTALL= ${.CURDIR}/../../usr.sbin/rpc.umntall -CFLAGS+= -DNFS -I${MOUNT} -I${UMNTALL} -WARNS?= 2 - -.PATH: ${MOUNT} ${UMNTALL} - -.include <bsd.prog.mk> diff --git a/sbin/mount_nfs4/mount_nfs4.8 b/sbin/mount_nfs4/mount_nfs4.8 deleted file mode 100644 index 8ef8245..0000000 --- a/sbin/mount_nfs4/mount_nfs4.8 +++ /dev/null @@ -1,201 +0,0 @@ -.\" Copyright (c) 1992, 1993, 1994, 1995 -.\" 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. -.\" -.\" @(#)mount_nfs.8 8.3 (Berkeley) 3/29/95 -.\" $FreeBSD$ -.\" -.Dd November 14, 2003 -.Dt MOUNT_NFS4 8 -.Os -.Sh NAME -.Nm mount_nfs4 -.Nd mount NFSv4 file systems -.Sh SYNOPSIS -.Nm -.Op Fl biNPsTU -.Op Fl a Ar maxreadahead -.Op Fl D Ar deadthresh -.Op Fl I Ar readdirsize -.Op Fl o Ar options -.Op Fl R Ar retrycnt -.Op Fl t Ar timeout -.Op Fl x Ar retrans -.Ar rhost : Ns Ar path node -.Sh DESCRIPTION -The -.Nm -utility calls the -.Xr mount 2 -system call to prepare and graft a remote NFSv4 file system -.Pq Ar rhost : Ns Ar path -on to the file system tree at the point -.Ar node . -This command is normally executed by -.Xr mount 8 . -It implements the NFSv4 protocol as described in RFC 3530, -.%T "NFS version 4 Protocol" . -.Pp -If the server becomes unresponsive while an NFSv4 file system is -mounted, any new or outstanding file operations on that file system -will hang uninterruptibly until the server comes back. -To modify this default behaviour, see the -.Fl i -and -.Fl s -flags. -.Pp -The options are: -.Bl -tag -width indent -.It Fl D -Set the -.Dq "dead server threshold" -to the specified number of round trip timeout intervals before a -.Dq "server not responding" -message is displayed. -.It Fl I -Set the readdir read size to the specified value. -The value should normally -be a multiple of -.Dv DIRBLKSIZ -that is \[<=] the read size for the mount. -.It Fl N -Do -.Em not -use a reserved socket port number (see below). -.It Fl P -Use a reserved socket port number. -This flag is obsolete, and only retained for compatibility reasons. -Reserved port numbers are used by default now. -(For the rare case where the client has a trusted root account -but untrustworthy users and the network cables are in secure areas this does -help, but for normal desktop clients this does not apply.) -.It Fl R -Set the mount retry count to the specified value. -The default is a retry count of zero, which means to keep retrying -forever. -There is a 60 second delay between each attempt. -.It Fl T -Use TCP transport. -This is the default. -.It Fl U -Force the mount protocol to use UDP transport. -This is not supported by the version 4 protocol and is provided only for -debugging purposes. -.It Fl a -Set the read-ahead count to the specified value. -This may be in the range of 0 - 4, and determines how many blocks -will be read ahead when a large file is being read sequentially. -Trying a value greater than 1 for this is suggested for -mounts with a large bandwidth * delay product. -.It Fl b -If an initial attempt to contact the server fails, fork off a child to keep -trying the mount in the background. -Useful for -.Xr fstab 5 , -where the file system mount is not critical to multiuser operation. -.It Fl i -Make the mount interruptible, which implies that file system calls that -are delayed due to an unresponsive server will fail with -.Er EINTR -when a -termination signal is posted for the process. -.It Fl o -Options are specified with a -.Fl o -flag followed by a comma separated string of options. -See the -.Xr mount 8 -man page for possible options and their meanings. -The following NFS specific options are also available: -.Pp -.Bl -tag -width indent -compact -.It Cm port Ns = Ns Aq Ar port_number -Use specified port number for NFSv4 requests. -The default is to use port 2049. -Set this to 0 to query the portmapper for the NFSv4 port. -.Pp -.It Cm acregmin Ns = Ns Aq Ar seconds -.It Cm acregmax Ns = Ns Aq Ar seconds -.It Cm acdirmin Ns = Ns Aq Ar seconds -.It Cm acdirmax Ns = Ns Aq Ar seconds -When attributes of files are cached, a timeout calculated to determine -whether a given cache entry has expired. -These four values determine the upper and lower bounds of the timeouts for -.Dq directory -attributes and -.Dq regular -(i.e., everything else). -The default values are 3 -> 60 seconds -for regular files, and 30 -> 60 seconds for directories. -The algorithm to calculate the timeout is based on the age of the file. -The older the file, -the longer the cache is considered valid, subject to the limits above. -.Pp -.It Cm noinet4 , noinet6 -Disables -.Dv AF_INET -or -.Dv AF_INET6 -connections. -Useful for hosts that have -both an A record and an AAAA record for the same name. -.El -.It Fl s -A soft mount, which implies that file system calls will fail -after -.Ar retrycnt -round trip timeout intervals. -.It Fl t -Set the initial retransmit timeout to the specified value. -May be useful for fine tuning UDP mounts over internetworks -with high packet loss rates or an overloaded server. -Try increasing the interval if -.Xr nfsstat 1 -shows high retransmit rates while the file system is active or reducing the -value if there is a low retransmit rate but long response delay observed. -(Normally, the -.Fl d -option should be specified when using this option to manually -tune the timeout -interval.) -.It Fl x -Set the retransmit timeout count for soft mounts to the specified value. -.El -.Sh SEE ALSO -.Xr mount 2 , -.Xr unmount 2 , -.Xr fstab 5 , -.Xr idmapd 8 , -.Xr mount 8 , -.Xr mount_nfs 8 , -.Xr nfsd 8 , -.Xr nfsiod 8 -.Sh BUGS -This version of the NFSv4 client, while functional, is a long way -from compliance with RFC 3530. -It lacks lock state, reboot recovery, -delegation, GSS, and many other mandatory items from the RFC. diff --git a/sbin/mount_nfs4/mount_nfs4.c b/sbin/mount_nfs4/mount_nfs4.c deleted file mode 100644 index 94d0d93..0000000 --- a/sbin/mount_nfs4/mount_nfs4.c +++ /dev/null @@ -1,735 +0,0 @@ -/* $Id: mount_nfs.c,v 1.5 2003/11/05 14:58:58 rees Exp $ */ - -/* - * copyright (c) 2003 - * the regents of the university of michigan - * all rights reserved - * - * permission is granted to use, copy, create derivative works and redistribute - * this software and such derivative works for any purpose, so long as the name - * of the university of michigan is not used in any advertising or publicity - * pertaining to the use or distribution of this software without specific, - * written prior authorization. if the above copyright notice or any other - * identification of the university of michigan is included in any copy of any - * portion of this software, then the disclaimer below must also be included. - * - * this software is provided as is, without representation from the university - * of michigan as to its fitness for any purpose, and without warranty by the - * university of michigan of any kind, either express or implied, including - * without limitation the implied warranties of merchantability and fitness for - * a particular purpose. the regents of the university of michigan shall not be - * liable for any damages, including special, indirect, incidental, or - * consequential damages, with respect to any claim arising out of or in - * connection with the use of the software, even if it has been or is hereafter - * advised of the possibility of such damages. - */ - -/* - * Copyright (c) 1992, 1993, 1994 - * The Regents of the University of California. All rights reserved. - * - * This code is derived from software contributed to Berkeley by - * Rick Macklem at The University of Guelph. - * - * 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. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 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. - */ - -#if 0 -#ifndef lint -static const char copyright[] = -"@(#) Copyright (c) 1992, 1993, 1994\n\ - The Regents of the University of California. All rights reserved.\n"; -#endif /* not lint */ - -#ifndef lint -static char sccsid[] = "@(#)mount_nfs.c 8.11 (Berkeley) 5/4/95"; -#endif /* not lint */ -#endif -#include <sys/cdefs.h> -__FBSDID("$FreeBSD$"); - -#include <sys/param.h> -#include <sys/mount.h> -#include <sys/socket.h> -#include <sys/stat.h> -#include <sys/syslog.h> - -#include <rpc/rpc.h> -#include <rpc/pmap_clnt.h> -#include <rpc/pmap_prot.h> - -#include <nfs/rpcv2.h> -#include <nfs/nfsproto.h> -#include <nfsclient/nfs.h> -#include <nfsclient/nfsargs.h> - -#include <arpa/inet.h> - -#include <ctype.h> -#include <err.h> -#include <errno.h> -#include <fcntl.h> -#include <netdb.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <strings.h> -#include <sysexits.h> -#include <unistd.h> - -#include "mntopts.h" -#include "mounttab.h" - -#define ALTF_BG 0x1 -#define ALTF_NOCONN 0x2 -#define ALTF_DUMBTIMR 0x4 -#define ALTF_INTR 0x8 -#define ALTF_NFSV3 0x20 -#define ALTF_RDIRPLUS 0x40 -#define ALTF_MNTUDP 0x80 -#define ALTF_RESVPORT 0x100 -#define ALTF_SEQPACKET 0x200 -#define ALTF_SOFT 0x800 -#define ALTF_TCP 0x1000 -#define ALTF_PORT 0x2000 -#define ALTF_NFSV2 0x4000 -#define ALTF_ACREGMIN 0x8000 -#define ALTF_ACREGMAX 0x10000 -#define ALTF_ACDIRMIN 0x20000 -#define ALTF_ACDIRMAX 0x40000 -#define ALTF_NOLOCKD 0x80000 -#define ALTF_NOINET4 0x100000 -#define ALTF_NOINET6 0x200000 - -struct mntopt mopts[] = { - MOPT_STDOPTS, - MOPT_FORCE, - MOPT_UPDATE, - MOPT_ASYNC, - { "bg", 0, ALTF_BG, 1 }, - { "conn", 1, ALTF_NOCONN, 1 }, - { "dumbtimer", 0, ALTF_DUMBTIMR, 1 }, - { "intr", 0, ALTF_INTR, 1 }, - { "nfsv3", 0, ALTF_NFSV3, 1 }, - { "rdirplus", 0, ALTF_RDIRPLUS, 1 }, - { "mntudp", 0, ALTF_MNTUDP, 1 }, - { "resvport", 0, ALTF_RESVPORT, 1 }, - { "soft", 0, ALTF_SOFT, 1 }, - { "tcp", 0, ALTF_TCP, 1 }, - { "port=", 0, ALTF_PORT, 1 }, - { "nfsv2", 0, ALTF_NFSV2, 1 }, - { "acregmin=", 0, ALTF_ACREGMIN, 1 }, - { "acregmax=", 0, ALTF_ACREGMAX, 1 }, - { "acdirmin=", 0, ALTF_ACDIRMIN, 1 }, - { "acdirmax=", 0, ALTF_ACDIRMAX, 1 }, - { "lockd", 1, ALTF_NOLOCKD, 1 }, - { "inet4", 1, ALTF_NOINET4, 1 }, - { "inet6", 1, ALTF_NOINET6, 1 }, - MOPT_END -}; - -struct nfs_args nfsdefargs = { - NFS_ARGSVERSION, - NULL, - sizeof (struct sockaddr_in), - SOCK_STREAM, - 0, - NULL, - 0, - NFSMNT_RESVPORT, - NFS_WSIZE, - NFS_RSIZE, - NFS_READDIRSIZE, - 10, - NFS_RETRANS, - NFS_MAXGRPS, - NFS_DEFRAHEAD, - 0, /* was: NQ_DEFLEASE */ - NFS_MAXDEADTHRESH, /* was: NQ_DEADTHRESH */ - NULL, - /* args version 4 */ - NFS_MINATTRTIMO, - NFS_MAXATTRTIMO, - NFS_MINDIRATTRTIMO, - NFS_MAXDIRATTRTIMO, -}; - -/* Table for af,sotype -> netid conversions. */ -struct nc_protos { - char *netid; - int af; - int sotype; -} nc_protos[] = { - {"udp", AF_INET, SOCK_DGRAM}, - {"tcp", AF_INET, SOCK_STREAM}, - {"udp6", AF_INET6, SOCK_DGRAM}, - {"tcp6", AF_INET6, SOCK_STREAM}, - {NULL} -}; - -struct nfhret { - u_long stat; - long vers; - long auth; - long fhsize; - u_char nfh[NFSX_V3FHMAX]; -}; -#define BGRND 1 -#define ISBGRND 2 -#define OF_NOINET4 4 -#define OF_NOINET6 8 -int retrycnt = -1; -int opflags = 0; -int nfsproto = IPPROTO_TCP; -char *portspec = "2049"; /* Server nfs port; "0" means look up via rpcbind. */ -enum mountmode { - ANY, - V2, - V3 -} mountmode = ANY; - -/* Return codes for nfs_tryproto. */ -enum tryret { - TRYRET_SUCCESS, - TRYRET_TIMEOUT, /* No response received. */ - TRYRET_REMOTEERR, /* Error received from remote server. */ - TRYRET_LOCALERR /* Local failure. */ -}; - -int getnfsargs(char *, struct nfs_args *); -/* void set_rpc_maxgrouplist(int); */ -struct netconfig *getnetconf_cached(const char *netid); -char *netidbytype(int af, int sotype); -void usage(void) __dead2; -int xdr_dir(XDR *, char *); -int xdr_fh(XDR *, struct nfhret *); -enum tryret nfs_tryproto(struct nfs_args *nfsargsp, struct addrinfo *ai, - char *hostp, char *spec, char **errstr); -enum tryret returncode(enum clnt_stat stat, struct rpc_err *rpcerr); - -/* - * Used to set mount flags with getmntopts. Call with dir=TRUE to - * initialize altflags from the current mount flags. Call with - * dir=FALSE to update mount flags with the new value of altflags after - * the call to getmntopts. - */ -static void -set_flags(int* altflags, int* nfsflags, int dir) -{ -#define F2(af, nf) \ - if (dir) { \ - if (*nfsflags & NFSMNT_##nf) \ - *altflags |= ALTF_##af; \ - else \ - *altflags &= ~ALTF_##af; \ - } else { \ - if (*altflags & ALTF_##af) \ - *nfsflags |= NFSMNT_##nf; \ - else \ - *nfsflags &= ~NFSMNT_##nf; \ - } -#define F(f) F2(f,f) - - F(NOCONN); - F(DUMBTIMR); - F2(INTR, INT); - F(RDIRPLUS); - F(RESVPORT); - F(SOFT); - F(ACREGMIN); - F(ACREGMAX); - F(ACDIRMIN); - F(ACDIRMAX); - F(NOLOCKD); - -#undef F -#undef F2 -} - -int -main(argc, argv) - int argc; - char *argv[]; -{ - int c; - struct nfs_args *nfsargsp; - struct nfs_args nfsargs; - int mntflags, altflags, num; - char *name, *p, *spec; - char mntpath[MAXPATHLEN]; - - mntflags = 0; - altflags = 0; - nfsargs = nfsdefargs; - nfsargsp = &nfsargs; - while ((c = getopt(argc, argv, - "a:bD:I:iNo:PR:sTt:x:U")) != -1) - switch (c) { - case 'a': - num = strtol(optarg, &p, 10); - if (*p || num < 0) - errx(1, "illegal -a value -- %s", optarg); - nfsargsp->readahead = num; - nfsargsp->flags |= NFSMNT_READAHEAD; - break; - case 'b': - opflags |= BGRND; - break; - case 'D': - num = strtol(optarg, &p, 10); - if (*p || num <= 0) - errx(1, "illegal -D value -- %s", optarg); - nfsargsp->deadthresh = num; - nfsargsp->flags |= NFSMNT_DEADTHRESH; - break; - case 'I': - num = strtol(optarg, &p, 10); - if (*p || num <= 0) - errx(1, "illegal -I value -- %s", optarg); - nfsargsp->readdirsize = num; - nfsargsp->flags |= NFSMNT_READDIRSIZE; - break; - case 'i': - nfsargsp->flags |= NFSMNT_INT; - break; - case 'N': - nfsargsp->flags &= ~NFSMNT_RESVPORT; - break; - case 'o': - altflags = 0; - set_flags(&altflags, &nfsargsp->flags, TRUE); - if (mountmode == V2) - altflags |= ALTF_NFSV2; - else if (mountmode == V3) - altflags |= ALTF_NFSV3; - getmntopts(optarg, mopts, &mntflags, &altflags); - set_flags(&altflags, &nfsargsp->flags, FALSE); - /* - * Handle altflags which don't map directly to - * mount flags. - */ - if (altflags & ALTF_BG) - opflags |= BGRND; - if (altflags & ALTF_NOINET4) - opflags |= OF_NOINET4; - if (altflags & ALTF_NOINET6) - opflags |= OF_NOINET6; - if (altflags & ALTF_MNTUDP) { - nfsargsp->sotype = SOCK_DGRAM; - nfsproto = IPPROTO_UDP; - } - if (altflags & ALTF_PORT) { - /* - * XXX Converting from a string to an int - * and back again is silly, and we should - * allow /etc/services names. - */ - p = strstr(optarg, "port="); - if (p) { - asprintf(&portspec, "%d", - atoi(p + 5)); - if (portspec == NULL) - err(1, "asprintf"); - } - } - mountmode = ANY; - if (altflags & ALTF_NFSV2) - mountmode = V2; - if (altflags & ALTF_NFSV3) - mountmode = V3; - if (altflags & ALTF_ACREGMIN) { - p = strstr(optarg, "acregmin="); - if (p) - nfsargsp->acregmin = atoi(p + 9); - } - if (altflags & ALTF_ACREGMAX) { - p = strstr(optarg, "acregmax="); - if (p) - nfsargsp->acregmax = atoi(p + 9); - } - if (altflags & ALTF_ACDIRMIN) { - p = strstr(optarg, "acdirmin="); - if (p) - nfsargsp->acdirmin = atoi(p + 9); - } - if (altflags & ALTF_ACDIRMAX) { - p = strstr(optarg, "acdirmax="); - if (p) - nfsargsp->acdirmax = atoi(p + 9); - } - break; - case 'P': - /* obsolete for NFSMNT_RESVPORT, now default */ - break; - case 'R': - num = strtol(optarg, &p, 10); - if (*p || num < 0) - errx(1, "illegal -R value -- %s", optarg); - retrycnt = num; - break; - case 's': - nfsargsp->flags |= NFSMNT_SOFT; - break; - case 'T': - nfsargsp->sotype = SOCK_STREAM; - nfsproto = IPPROTO_TCP; - break; - case 't': - num = strtol(optarg, &p, 10); - if (*p || num <= 0) - errx(1, "illegal -t value -- %s", optarg); - nfsargsp->timeo = num; - nfsargsp->flags |= NFSMNT_TIMEO; - break; - case 'x': - num = strtol(optarg, &p, 10); - if (*p || num <= 0) - errx(1, "illegal -x value -- %s", optarg); - nfsargsp->retrans = num; - nfsargsp->flags |= NFSMNT_RETRANS; - break; - case 'U': - nfsargsp->sotype = SOCK_DGRAM; - nfsproto = IPPROTO_UDP; - break; - default: - usage(); - break; - } - argc -= optind; - argv += optind; - - if (argc != 2) { - usage(); - /* NOTREACHED */ - } - - spec = *argv++; - name = *argv; - - if (retrycnt == -1) - /* The default is to keep retrying forever. */ - retrycnt = 0; - if (!getnfsargs(spec, nfsargsp)) - exit(1); - - /* resolve the mountpoint with realpath(3) */ - (void)checkpath(name, mntpath); - - if (mount("nfs4", mntpath, mntflags, nfsargsp)) - err(1, "%s", mntpath); - - exit(0); -} - -int -getnfsargs(spec, nfsargsp) - char *spec; - struct nfs_args *nfsargsp; -{ - struct addrinfo hints, *ai_nfs, *ai; - enum tryret ret; - int ecode, speclen, remoteerr; - char *hostp, *delimp, *errstr; - size_t len; - static char nam[MNAMELEN + 1]; - - if ((delimp = strrchr(spec, ':')) != NULL) { - hostp = spec; - spec = delimp + 1; - } else if ((delimp = strrchr(spec, '@')) != NULL) { - warnx("path@server syntax is deprecated, use server:path"); - hostp = delimp + 1; - } else { - warnx("no <host>:<dirpath> nfs-name"); - return (0); - } - *delimp = '\0'; - - /* - * If there has been a trailing slash at mounttime it seems - * that some mountd implementations fail to remove the mount - * entries from their mountlist while unmounting. - */ - for (speclen = strlen(spec); - speclen > 1 && spec[speclen - 1] == '/'; - speclen--) - spec[speclen - 1] = '\0'; - if (strlen(hostp) + strlen(spec) + 1 > MNAMELEN) { - warnx("%s:%s: %s", hostp, spec, strerror(ENAMETOOLONG)); - return (0); - } - /* Make both '@' and ':' notations equal */ - if (*hostp != '\0') { - len = strlen(hostp); - memmove(nam, hostp, len); - nam[len] = ':'; - memmove(nam + len + 1, spec, speclen); - nam[len + speclen + 1] = '\0'; - } - - /* - * Handle an internet host address. - */ - memset(&hints, 0, sizeof hints); - hints.ai_flags = AI_NUMERICHOST; - hints.ai_socktype = nfsargsp->sotype; - if (getaddrinfo(hostp, portspec, &hints, &ai_nfs) != 0) { - hints.ai_flags = 0; - if ((ecode = getaddrinfo(hostp, portspec, &hints, &ai_nfs)) - != 0) { - if (portspec == NULL) - errx(1, "%s: %s", hostp, gai_strerror(ecode)); - else - errx(1, "%s:%s: %s", hostp, portspec, - gai_strerror(ecode)); - return (0); - } - } - - ret = TRYRET_LOCALERR; - for (;;) { - /* - * Try each entry returned by getaddrinfo(). Note the - * occurence of remote errors by setting `remoteerr'. - */ - remoteerr = 0; - for (ai = ai_nfs; ai != NULL; ai = ai->ai_next) { - if ((ai->ai_family == AF_INET6) && - (opflags & OF_NOINET6)) - continue; - if ((ai->ai_family == AF_INET) && - (opflags & OF_NOINET4)) - continue; - ret = nfs_tryproto(nfsargsp, ai, hostp, spec, &errstr); - if (ret == TRYRET_SUCCESS) - break; - if (ret != TRYRET_LOCALERR) - remoteerr = 1; - if ((opflags & ISBGRND) == 0) - fprintf(stderr, "%s\n", errstr); - } - if (ret == TRYRET_SUCCESS) - break; - - /* Exit if all errors were local. */ - if (!remoteerr) - exit(1); - - /* - * If retrycnt == 0, we are to keep retrying forever. - * Otherwise decrement it, and exit if it hits zero. - */ - if (retrycnt != 0 && --retrycnt == 0) - exit(1); - - if ((opflags & (BGRND | ISBGRND)) == BGRND) { - warnx("Cannot immediately mount %s:%s, backgrounding", - hostp, spec); - opflags |= ISBGRND; - if (daemon(0, 0) != 0) - err(1, "daemon"); - } - sleep(60); - } - freeaddrinfo(ai_nfs); - nfsargsp->hostname = nam; - /* Add mounted file system to PATH_MOUNTTAB */ - if (!add_mtab(hostp, spec)) - warnx("can't update %s for %s:%s", PATH_MOUNTTAB, hostp, spec); - return (1); -} - -/* - * Try to set up the NFS arguments according to the address - * family, protocol (and possibly port) specified in `ai'. - * - * Returns TRYRET_SUCCESS if successful, or: - * TRYRET_TIMEOUT The server did not respond. - * TRYRET_REMOTEERR The server reported an error. - * TRYRET_LOCALERR Local failure. - * - * In all error cases, *errstr will be set to a statically-allocated string - * describing the error. - */ -enum tryret -nfs_tryproto(struct nfs_args *nfsargsp, struct addrinfo *ai, char *hostp, - char *spec, char **errstr) -{ - static char errbuf[256]; - struct sockaddr_storage nfs_ss; - struct netbuf nfs_nb; - struct netconfig *nconf; - char *netid; - int nfsvers; - - errbuf[0] = '\0'; - *errstr = errbuf; - - if ((netid = netidbytype(ai->ai_family, nfsargsp->sotype)) == NULL) { - snprintf(errbuf, sizeof errbuf, - "af %d sotype %d not supported", ai->ai_family, - nfsargsp->sotype); - return (TRYRET_LOCALERR); - } - if ((nconf = getnetconf_cached(netid)) == NULL) { - snprintf(errbuf, sizeof errbuf, "%s: %s", netid, nc_sperror()); - return (TRYRET_LOCALERR); - } - - nfsvers = 4; - - if (portspec != NULL && atoi(portspec) != 0) { - /* `ai' contains the complete nfsd sockaddr. */ - nfs_nb.buf = ai->ai_addr; - nfs_nb.len = nfs_nb.maxlen = ai->ai_addrlen; - } else { - /* Ask the remote rpcbind. */ - nfs_nb.buf = &nfs_ss; - nfs_nb.len = nfs_nb.maxlen = sizeof nfs_ss; - - if (!rpcb_getaddr(RPCPROG_NFS, nfsvers, nconf, &nfs_nb, - hostp)) { - snprintf(errbuf, sizeof errbuf, "[%s] %s:%s: %s", - netid, hostp, spec, - clnt_spcreateerror("RPCPROG_NFS")); - return (returncode(rpc_createerr.cf_stat, - &rpc_createerr.cf_error)); - } - } - - /* - * Store the filehandle and server address in nfsargsp, making - * sure to copy any locally allocated structures. - */ - nfsargsp->addrlen = nfs_nb.len; - nfsargsp->addr = malloc(nfsargsp->addrlen); - - if (nfsargsp->addr == NULL) - err(1, "malloc"); - bcopy(nfs_nb.buf, nfsargsp->addr, nfsargsp->addrlen); - - /* XXX hack */ - nfsargsp->flags |= (NFSMNT_NFSV3 | NFSMNT_NFSV4); - - return (TRYRET_SUCCESS); -} - - -/* - * Catagorise a RPC return status and error into an `enum tryret' - * return code. - */ -enum tryret -returncode(enum clnt_stat stat, struct rpc_err *rpcerr) -{ - switch (stat) { - case RPC_TIMEDOUT: - return (TRYRET_TIMEOUT); - case RPC_PMAPFAILURE: - case RPC_PROGNOTREGISTERED: - case RPC_PROGVERSMISMATCH: - /* XXX, these can be local or remote. */ - case RPC_CANTSEND: - case RPC_CANTRECV: - return (TRYRET_REMOTEERR); - case RPC_SYSTEMERROR: - switch (rpcerr->re_errno) { - case ETIMEDOUT: - return (TRYRET_TIMEOUT); - case ENOMEM: - break; - default: - return (TRYRET_REMOTEERR); - } - /* FALLTHROUGH */ - default: - break; - } - return (TRYRET_LOCALERR); -} - -/* - * Look up a netid based on an address family and socket type. - * `af' is the address family, and `sotype' is SOCK_DGRAM or SOCK_STREAM. - * - * XXX there should be a library function for this. - */ -char * -netidbytype(int af, int sotype) { - struct nc_protos *p; - - for (p = nc_protos; p->netid != NULL; p++) { - if (af != p->af || sotype != p->sotype) - continue; - return (p->netid); - } - return (NULL); -} - -/* - * Look up a netconfig entry based on a netid, and cache the result so - * that we don't need to remember to call freenetconfigent(). - * - * Otherwise it behaves just like getnetconfigent(), so nc_*error() - * work on failure. - */ -struct netconfig * -getnetconf_cached(const char *netid) { - static struct nc_entry { - struct netconfig *nconf; - struct nc_entry *next; - } *head; - struct nc_entry *p; - struct netconfig *nconf; - - for (p = head; p != NULL; p = p->next) - if (strcmp(netid, p->nconf->nc_netid) == 0) - return (p->nconf); - - if ((nconf = getnetconfigent(netid)) == NULL) - return (NULL); - if ((p = malloc(sizeof(*p))) == NULL) - err(1, "malloc"); - p->nconf = nconf; - p->next = head; - head = p; - - return (p->nconf); -} - -void -usage() -{ - (void)fprintf(stderr, "%s\n%s\n%s\n", -"usage: mount_nfs4 [-biNPsTU] [-a maxreadahead] [-D deadthresh] [-I readdirsize]", -" [-o options] [-R retrycnt] [-t timeout] [-x retrans]", -" rhost:path node"); - exit(1); -} |