mount: remove all NFS code
Use /sbin/{u,}mount.nfs{,4} from nfs-utils! The mount command will use these to mount nfs filesystems instead of internal code. The /sbin/{u,}mount.nfs{,4} is supported from nfs-utils-1.1.0 (currently -rc1). Signed-off-by: Karel Zak <kzak@redhat.com>
This commit is contained in:
parent
e1bc6da937
commit
11d6b04773
|
@ -2,22 +2,19 @@ include $(top_srcdir)/config/include-Makefile.am
|
|||
|
||||
EXTRA_DIST = README.mount swap.configure
|
||||
|
||||
AM_CPPFLAGS += -DHAVE_NFS
|
||||
|
||||
bin_PROGRAMS = mount umount
|
||||
sbin_PROGRAMS = losetup swapon
|
||||
man_MANS = fstab.5 nfs.5 mount.8 swapoff.8 swapon.8 umount.8 losetup.8
|
||||
man_MANS = fstab.5 mount.8 swapoff.8 swapon.8 umount.8 losetup.8
|
||||
|
||||
MNTHDRS = fstab.h linux_fs.h mount_mntent.h mount_constants.h my_dev_t.h \
|
||||
mount_paths.h get_label_uuid.h lomount.h mount_blkid.h \
|
||||
mount_guess_fstype.h nfs_mount4.h realpath.h xmalloc.h \
|
||||
mount_guess_fstype.h realpath.h xmalloc.h \
|
||||
getusername.h loop.h mount_by_label.h mount_guess_rootdev.h \
|
||||
nfsmount.h sundries.h
|
||||
sundries.h
|
||||
|
||||
mount_SOURCES = mount.c fstab.c sundries.c xmalloc.c realpath.c mount_mntent.c \
|
||||
get_label_uuid.c mount_by_label.c mount_blkid.c mount_guess_fstype.c \
|
||||
getusername.c \
|
||||
nfsmount.c nfsmount_xdr.c nfsmount_clnt.c \
|
||||
lomount.c \
|
||||
$(MNTHDRS)
|
||||
|
||||
|
|
|
@ -941,7 +941,6 @@ try_mount_one (const char *spec0, const char *node0, const char *types0,
|
|||
int loop = 0;
|
||||
const char *loopdev = 0, *loopfile = 0;
|
||||
struct stat statbuf;
|
||||
int nfs_mount_version = 0; /* any version */
|
||||
|
||||
/* copies for freeing on exit */
|
||||
const char *opts1, *spec1, *node1, *types1, *extra_opts1;
|
||||
|
@ -999,19 +998,6 @@ try_mount_one (const char *spec0, const char *node0, const char *types0,
|
|||
goto out;
|
||||
}
|
||||
|
||||
/*
|
||||
* Also nfs requires a separate program, but it is built in.
|
||||
*/
|
||||
if (!fake && types && streq (types, "nfs")) {
|
||||
retry_nfs:
|
||||
mnt_err = nfsmount (spec, node, &flags, &extra_opts, &mount_opts,
|
||||
&nfs_mount_version, bg);
|
||||
if (mnt_err) {
|
||||
res = mnt_err;
|
||||
goto out;
|
||||
}
|
||||
}
|
||||
|
||||
block_signals (SIG_BLOCK);
|
||||
|
||||
if (!fake) {
|
||||
|
@ -1051,15 +1037,6 @@ retry_nfs:
|
|||
|
||||
block_signals (SIG_UNBLOCK);
|
||||
|
||||
if (mnt_err && types && streq (types, "nfs")) {
|
||||
if (nfs_mount_version == 4 && mnt_err != EBUSY && mnt_err != ENOENT) {
|
||||
if (verbose)
|
||||
printf(_("mount: failed with nfs mount version 4, trying 3..\n"));
|
||||
nfs_mount_version = 3;
|
||||
goto retry_nfs;
|
||||
}
|
||||
}
|
||||
|
||||
/* Mount failed, complain, but don't die. */
|
||||
|
||||
if (types == 0) {
|
||||
|
|
225
mount/nfs.5
225
mount/nfs.5
|
@ -1,225 +0,0 @@
|
|||
.\" nfs.5 "Rick Sladkey" <jrs@world.std.com>
|
||||
.\" Wed Feb 8 12:52:42 1995, faith@cs.unc.edu: updates for Ross Biro's
|
||||
.\" patches. "
|
||||
.TH NFS 5 "20 November 1993" "Linux 0.99" "Linux Programmer's Manual"
|
||||
.SH NAME
|
||||
nfs \- nfs fstab format and options
|
||||
.SH SYNOPSIS
|
||||
.B /etc/fstab
|
||||
.SH DESCRIPTION
|
||||
The
|
||||
.I fstab
|
||||
file contains information about which filesystems
|
||||
to mount where and with what options.
|
||||
For NFS mounts, it contains the server name and
|
||||
exported server directory to mount from,
|
||||
the local directory that is the mount point,
|
||||
and the NFS specific options that control
|
||||
the way the filesystem is mounted.
|
||||
.P
|
||||
Here is an example from an \fI/etc/fstab\fP file from an NFS mount.
|
||||
.sp
|
||||
.nf
|
||||
.ta 2.5i +0.75i +0.75i +1.0i
|
||||
server:/usr/local/pub /pub nfs rsize=8192,wsize=8192,timeo=14,intr
|
||||
.fi
|
||||
.DT
|
||||
.SS Options
|
||||
.TP 1.5i
|
||||
.I rsize=n
|
||||
The number of bytes NFS uses when reading files from an NFS server.
|
||||
The default value is dependent on the kernel, currently 1024 bytes.
|
||||
(However, throughput is improved greatly by asking for
|
||||
.IR rsize=8192 .)
|
||||
.TP 1.5i
|
||||
.I wsize=n
|
||||
The number of bytes NFS uses when writing files to an NFS server.
|
||||
The default value is dependent on the kernel, currently 1024 bytes.
|
||||
(However, throughput is improved greatly by asking for
|
||||
.IR wsize=8192 .)
|
||||
.TP 1.5i
|
||||
.I timeo=n
|
||||
The value in tenths of a second before sending the
|
||||
first retransmission after an RPC timeout.
|
||||
The default value is 7 tenths of a second. After the first timeout,
|
||||
the timeout is doubled after each successive timeout until a maximum
|
||||
timeout of 60 seconds is reached or the enough retransmissions
|
||||
have occured to cause a major timeout. Then, if the filesystem
|
||||
is hard mounted, each new timeout cascade restarts at twice the
|
||||
initial value of the previous cascade, again doubling at each
|
||||
retransmission. The maximum timeout is always 60 seconds.
|
||||
Better overall performance may be achieved by increasing the
|
||||
timeout when mounting on a busy network, to a slow server, or through
|
||||
several routers or gateways.
|
||||
.TP 1.5i
|
||||
.I retrans=n
|
||||
The number of minor timeouts and retransmissions that must occur before
|
||||
a major timeout occurs. The default is 3 timeouts. When a major timeout
|
||||
occurs, the file operation is either aborted or a "server not responding"
|
||||
message is printed on the console.
|
||||
.TP 1.5i
|
||||
.I acregmin=n
|
||||
The minimum time in seconds that attributes of a regular file should
|
||||
be cached before requesting fresh information from a server.
|
||||
The default is 3 seconds.
|
||||
.TP 1.5i
|
||||
.I acregmax=n
|
||||
The maximum time in seconds that attributes of a regular file can
|
||||
be cached before requesting fresh information from a server.
|
||||
The default is 60 seconds.
|
||||
.TP 1.5i
|
||||
.I acdirmin=n
|
||||
The minimum time in seconds that attributes of a directory should
|
||||
be cached before requesting fresh information from a server.
|
||||
The default is 30 seconds.
|
||||
.TP 1.5i
|
||||
.I acdirmax=n
|
||||
The maximum time in seconds that attributes of a directory can
|
||||
be cached before requesting fresh information from a server.
|
||||
The default is 60 seconds.
|
||||
.TP 1.5i
|
||||
.I actimeo=n
|
||||
Using actimeo sets all of
|
||||
.I acregmin,
|
||||
.I acregmax,
|
||||
.I acdirmin,
|
||||
and
|
||||
.I acdirmax
|
||||
to the same value.
|
||||
There is no default value.
|
||||
.TP 1.5i
|
||||
.I retry=n
|
||||
The number of minutes to retry an NFS mount operation
|
||||
in the foreground or background before giving up.
|
||||
The default value is 10000 minutes, which is roughly one week.
|
||||
.TP 1.5i
|
||||
.I namlen=n
|
||||
When an NFS server does not support version two of the
|
||||
RPC mount protocol, this option can be used to specify
|
||||
the maximum length of a filename that is supported on
|
||||
the remote filesystem. This is used to support the
|
||||
POSIX pathconf functions. The default is 255 characters.
|
||||
.TP 1.5i
|
||||
.I port=n
|
||||
The numeric value of the port to connect to the NFS server on.
|
||||
If the port number is 0 (the default) then query the
|
||||
remote host's portmapper for the port number to use.
|
||||
If the remote host's NFS daemon is not registered with
|
||||
its portmapper, the standard NFS port number 2049 is
|
||||
used instead.
|
||||
.TP 1.5i
|
||||
.I mountport=n
|
||||
The numeric value of the
|
||||
.B mountd
|
||||
port.
|
||||
.TP 1.5i
|
||||
.I mounthost=name
|
||||
The name of the host running
|
||||
.B mountd .
|
||||
.TP 1.5i
|
||||
.I mountprog=n
|
||||
Use an alternate RPC program number to contact the
|
||||
mount daemon on the remote host. This option is useful
|
||||
for hosts that can run multiple NFS servers.
|
||||
The default value is 100005 which is the standard RPC
|
||||
mount daemon program number.
|
||||
.TP 1.5i
|
||||
.I mountvers=n
|
||||
Use an alternate RPC version number to contact the
|
||||
mount daemon on the remote host. This option is useful
|
||||
for hosts that can run multiple NFS servers.
|
||||
The default value is version 1.
|
||||
.TP 1.5i
|
||||
.I nfsprog=n
|
||||
Use an alternate RPC program number to contact the
|
||||
NFS daemon on the remote host. This option is useful
|
||||
for hosts that can run multiple NFS servers.
|
||||
The default value is 100003 which is the standard RPC
|
||||
NFS daemon program number.
|
||||
.TP 1.5i
|
||||
.I nfsvers=n
|
||||
Use an alternate RPC version number to contact the
|
||||
NFS daemon on the remote host. This option is useful
|
||||
for hosts that can run multiple NFS servers.
|
||||
The default value is version 2.
|
||||
.TP 1.5i
|
||||
.I nolock
|
||||
Disable NFS locking. Do not start lockd.
|
||||
This has to be used with some old NFS servers
|
||||
that don't support locking.
|
||||
.TP 1.5i
|
||||
.I bg
|
||||
If the first NFS mount attempt times out, retry the mount
|
||||
in the background.
|
||||
After a mount operation is backgrounded, all subsequent mounts
|
||||
on the same NFS server will be backgrounded immediately, without
|
||||
first attempting the mount.
|
||||
A missing mount point is treated as a timeout,
|
||||
to allow for nested NFS mounts.
|
||||
.TP 1.5i
|
||||
.I fg
|
||||
If the first NFS mount attempt times out, retry the mount
|
||||
in the foreground.
|
||||
This is the complement of the
|
||||
.I bg
|
||||
option, and also the default behavior.
|
||||
.TP 1.5i
|
||||
.I soft
|
||||
If an NFS file operation has a major timeout then report an I/O error to
|
||||
the calling program.
|
||||
The default is to continue retrying NFS file operations indefinitely.
|
||||
.TP 1.5i
|
||||
.I hard
|
||||
If an NFS file operation has a major timeout then report
|
||||
"server not responding" on the console and continue retrying indefinitely.
|
||||
This is the default.
|
||||
.TP 1.5i
|
||||
.I intr
|
||||
If an NFS file operation has a major timeout and it is hard mounted,
|
||||
then allow signals to interupt the file operation and cause it to
|
||||
return EINTR to the calling program. The default is to not
|
||||
allow file operations to be interrupted.
|
||||
.TP 1.5i
|
||||
.I posix
|
||||
Mount the NFS filesystem using POSIX semantics. This allows
|
||||
an NFS filesystem to properly support the POSIX pathconf
|
||||
command by querying the mount server for the maximum length
|
||||
of a filename. To do this, the remote host must support version
|
||||
two of the RPC mount protocol. Many NFS servers support only
|
||||
version one.
|
||||
.TP 1.5i
|
||||
.I nocto
|
||||
Suppress the retrieval of new attributes when creating a file.
|
||||
.TP 1.5i
|
||||
.I noac
|
||||
Disable all forms of attribute caching entirely. This extracts a
|
||||
server performance penalty but it allows two different NFS clients
|
||||
to get reasonable good results when both clients are actively
|
||||
writing to common filesystem on the server.
|
||||
.TP 1.5i
|
||||
.I tcp
|
||||
Mount the NFS filesystem using the TCP protocol instead of the
|
||||
default UDP protocol. Many NFS servers only support UDP.
|
||||
.TP 1.5i
|
||||
.I udp
|
||||
Mount the NFS filesystem using the UDP protocol. This
|
||||
is the default.
|
||||
.P
|
||||
All of the non-value options have corresponding nooption forms.
|
||||
For example, nointr means don't allow file operations to be
|
||||
interrupted.
|
||||
.SH FILES
|
||||
.I /etc/fstab
|
||||
.SH "SEE ALSO"
|
||||
.BR fstab "(5), " mount "(8), " umount "(8), " exports (5)
|
||||
.SH AUTHOR
|
||||
"Rick Sladkey" <jrs@world.std.com>
|
||||
.SH BUGS
|
||||
The posix, and nocto options are parsed by mount
|
||||
but currently are silently ignored.
|
||||
.P
|
||||
The tcp and namlen options are implemented but are not currently
|
||||
supported by the Linux kernel.
|
||||
.P
|
||||
The umount command should notify the server
|
||||
when an NFS filesystem is unmounted.
|
|
@ -1,54 +0,0 @@
|
|||
/*
|
||||
* We want to be able to compile mount on old kernels in such a way
|
||||
* that the binary will work well on more recent kernels.
|
||||
* Thus, if necessary we teach nfsmount.c the structure of new fields
|
||||
* that will come later.
|
||||
*
|
||||
* Moreover, the new kernel includes conflict with glibc includes
|
||||
* so it is easiest to ignore the kernel altogether (at compile time).
|
||||
*/
|
||||
|
||||
#define NFS_MOUNT_VERSION 4
|
||||
|
||||
struct nfs2_fh {
|
||||
char data[32];
|
||||
};
|
||||
struct nfs3_fh {
|
||||
unsigned short size;
|
||||
unsigned char data[64];
|
||||
};
|
||||
|
||||
struct nfs_mount_data {
|
||||
int version; /* 1 */
|
||||
int fd; /* 1 */
|
||||
struct nfs2_fh old_root; /* 1 */
|
||||
int flags; /* 1 */
|
||||
int rsize; /* 1 */
|
||||
int wsize; /* 1 */
|
||||
int timeo; /* 1 */
|
||||
int retrans; /* 1 */
|
||||
int acregmin; /* 1 */
|
||||
int acregmax; /* 1 */
|
||||
int acdirmin; /* 1 */
|
||||
int acdirmax; /* 1 */
|
||||
struct sockaddr_in addr; /* 1 */
|
||||
char hostname[256]; /* 1 */
|
||||
int namlen; /* 2 */
|
||||
unsigned int bsize; /* 3 */
|
||||
struct nfs3_fh root; /* 4 */
|
||||
};
|
||||
|
||||
/* bits in the flags field */
|
||||
|
||||
#define NFS_MOUNT_SOFT 0x0001 /* 1 */
|
||||
#define NFS_MOUNT_INTR 0x0002 /* 1 */
|
||||
#define NFS_MOUNT_SECURE 0x0004 /* 1 */
|
||||
#define NFS_MOUNT_POSIX 0x0008 /* 1 */
|
||||
#define NFS_MOUNT_NOCTO 0x0010 /* 1 */
|
||||
#define NFS_MOUNT_NOAC 0x0020 /* 1 */
|
||||
#define NFS_MOUNT_TCP 0x0040 /* 2 */
|
||||
#define NFS_MOUNT_VER3 0x0080 /* 3 */
|
||||
#define NFS_MOUNT_KERBEROS 0x0100 /* 3 */
|
||||
#define NFS_MOUNT_NONLM 0x0200 /* 3 */
|
||||
#define NFS_MOUNT_BROKEN_SUID 0x0400 /* 4 */
|
||||
|
|
@ -1,71 +0,0 @@
|
|||
/*
|
||||
* We want to be able to compile mount on old kernels in such a way
|
||||
* that the binary will work well on more recent kernels.
|
||||
* Thus, if necessary we teach nfsmount.c the structure of new fields
|
||||
* that will come later.
|
||||
*/
|
||||
#include "nfs_mountversion.h"
|
||||
|
||||
#if KERNEL_NFS_MOUNT_VERSION >= 4
|
||||
|
||||
/*
|
||||
* The kernel includes are at least as good as this file.
|
||||
* Use them.
|
||||
*/
|
||||
#include <linux/nfs_mount.h>
|
||||
|
||||
#define NFS_FHSIZE 32
|
||||
#define NFS_PORT 2049
|
||||
#define NFS_VERSION 2
|
||||
|
||||
|
||||
#else /* KERNEL_NFS_MOUNT_VERSION < 4 */
|
||||
|
||||
/*
|
||||
* We know more than the kernel. Override the kernel defines.
|
||||
* Check at runtime whether the running kernel can handle the new stuff.
|
||||
*/
|
||||
#define NFS_MOUNT_VERSION 4
|
||||
|
||||
struct nfs2_fh {
|
||||
char data[32];
|
||||
};
|
||||
struct nfs3_fh {
|
||||
unsigned short size;
|
||||
unsigned char data[64];
|
||||
};
|
||||
|
||||
struct nfs_mount_data {
|
||||
int version; /* 1 */
|
||||
int fd; /* 1 */
|
||||
struct nfs2_fh old_root; /* 1 */
|
||||
int flags; /* 1 */
|
||||
int rsize; /* 1 */
|
||||
int wsize; /* 1 */
|
||||
int timeo; /* 1 */
|
||||
int retrans; /* 1 */
|
||||
int acregmin; /* 1 */
|
||||
int acregmax; /* 1 */
|
||||
int acdirmin; /* 1 */
|
||||
int acdirmax; /* 1 */
|
||||
struct sockaddr_in addr; /* 1 */
|
||||
char hostname[256]; /* 1 */
|
||||
int namlen; /* 2 */
|
||||
unsigned int bsize; /* 3 */
|
||||
struct nfs3_fh root; /* 4 */
|
||||
};
|
||||
|
||||
/* bits in the flags field */
|
||||
|
||||
#define NFS_MOUNT_SOFT 0x0001 /* 1 */
|
||||
#define NFS_MOUNT_INTR 0x0002 /* 1 */
|
||||
#define NFS_MOUNT_SECURE 0x0004 /* 1 */
|
||||
#define NFS_MOUNT_POSIX 0x0008 /* 1 */
|
||||
#define NFS_MOUNT_NOCTO 0x0010 /* 1 */
|
||||
#define NFS_MOUNT_NOAC 0x0020 /* 1 */
|
||||
#define NFS_MOUNT_TCP 0x0040 /* 2 */
|
||||
#define NFS_MOUNT_VER3 0x0080 /* 3 */
|
||||
#define NFS_MOUNT_KERBEROS 0x0100 /* 3 */
|
||||
#define NFS_MOUNT_NONLM 0x0200 /* 3 */
|
||||
|
||||
#endif
|
883
mount/nfsmount.c
883
mount/nfsmount.c
|
@ -1,883 +0,0 @@
|
|||
/*
|
||||
* nfsmount.c -- Linux NFS mount
|
||||
* Copyright (C) 1993 Rick Sladkey <jrs@world.std.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2, or (at your option)
|
||||
* any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* Wed Feb 8 12:51:48 1995, biro@yggdrasil.com (Ross Biro): allow all port
|
||||
* numbers to be specified on the command line.
|
||||
*
|
||||
* Fri, 8 Mar 1996 18:01:39, Swen Thuemmler <swen@uni-paderborn.de>:
|
||||
* Omit the call to connect() for Linux version 1.3.11 or later.
|
||||
*
|
||||
* Wed Oct 1 23:55:28 1997: Dick Streefland <dick_streefland@tasking.com>
|
||||
* Implemented the "bg", "fg" and "retry" mount options for NFS.
|
||||
*
|
||||
* 1999-02-22 Arkadiusz Mi¶kiewicz <misiek@pld.ORG.PL>
|
||||
* - added Native Language Support
|
||||
*
|
||||
* Modified by Olaf Kirch and Trond Myklebust for new NFS code,
|
||||
* plus NFSv3 stuff.
|
||||
*/
|
||||
|
||||
/*
|
||||
* nfsmount.c,v 1.1.1.1 1993/11/18 08:40:51 jrs Exp
|
||||
*/
|
||||
|
||||
#include <unistd.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <errno.h>
|
||||
#include <netdb.h>
|
||||
#include <time.h>
|
||||
#include <rpc/rpc.h>
|
||||
#include <rpc/pmap_prot.h>
|
||||
#include <rpc/pmap_clnt.h>
|
||||
#include <sys/socket.h>
|
||||
#include <sys/time.h>
|
||||
#include <sys/utsname.h>
|
||||
#include <sys/stat.h>
|
||||
#include <netinet/in.h>
|
||||
#include <arpa/inet.h>
|
||||
|
||||
#include "sundries.h"
|
||||
#include "nfsmount.h"
|
||||
|
||||
#ifdef HAVE_RPCSVC_NFS_PROT_H
|
||||
#include <rpcsvc/nfs_prot.h>
|
||||
#else
|
||||
#include <linux/nfs.h>
|
||||
#define nfsstat nfs_stat
|
||||
#endif
|
||||
|
||||
#include "mount_constants.h"
|
||||
#include "nfs_mount4.h"
|
||||
|
||||
#include "nls.h"
|
||||
|
||||
#ifndef NFS_PORT
|
||||
#define NFS_PORT 2049
|
||||
#endif
|
||||
#ifndef NFS_FHSIZE
|
||||
#define NFS_FHSIZE 32
|
||||
#endif
|
||||
|
||||
static char *nfs_strerror(int stat);
|
||||
|
||||
#define MAKE_VERSION(p,q,r) (65536*(p) + 256*(q) + (r))
|
||||
|
||||
#define MAX_NFSPROT ((nfs_mount_version >= 4) ? 3 : 2)
|
||||
|
||||
static int
|
||||
linux_version_code(void) {
|
||||
struct utsname my_utsname;
|
||||
int p, q, r;
|
||||
|
||||
if (uname(&my_utsname) == 0) {
|
||||
p = atoi(strtok(my_utsname.release, "."));
|
||||
q = atoi(strtok(NULL, "."));
|
||||
r = atoi(strtok(NULL, "."));
|
||||
return MAKE_VERSION(p,q,r);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Unfortunately, the kernel prints annoying console messages
|
||||
* in case of an unexpected nfs mount version (instead of
|
||||
* just returning some error). Therefore we'll have to try
|
||||
* and figure out what version the kernel expects.
|
||||
*
|
||||
* Variables:
|
||||
* NFS_MOUNT_VERSION: these nfsmount sources at compile time
|
||||
* nfs_mount_version: version this source and running kernel can handle
|
||||
*/
|
||||
static int
|
||||
find_kernel_nfs_mount_version(void) {
|
||||
static int kernel_version = -1;
|
||||
int nfs_mount_version = NFS_MOUNT_VERSION;
|
||||
|
||||
if (kernel_version == -1)
|
||||
kernel_version = linux_version_code();
|
||||
|
||||
if (kernel_version) {
|
||||
if (kernel_version < MAKE_VERSION(2,1,32))
|
||||
nfs_mount_version = 1;
|
||||
else if (kernel_version < MAKE_VERSION(2,2,18))
|
||||
nfs_mount_version = 3;
|
||||
else if (kernel_version < MAKE_VERSION(2,3,0))
|
||||
nfs_mount_version = 4; /* since 2.2.18pre9 */
|
||||
else if (kernel_version < MAKE_VERSION(2,3,99))
|
||||
nfs_mount_version = 3;
|
||||
else
|
||||
nfs_mount_version = 4; /* since 2.3.99pre4 */
|
||||
}
|
||||
if (nfs_mount_version > NFS_MOUNT_VERSION)
|
||||
nfs_mount_version = NFS_MOUNT_VERSION;
|
||||
return nfs_mount_version;
|
||||
}
|
||||
|
||||
static struct pmap *
|
||||
get_mountport(struct sockaddr_in *server_addr,
|
||||
long unsigned prog,
|
||||
long unsigned version,
|
||||
long unsigned proto,
|
||||
long unsigned port,
|
||||
int nfs_mount_version)
|
||||
{
|
||||
struct pmaplist *pmap;
|
||||
static struct pmap p = {0, 0, 0, 0};
|
||||
|
||||
if (version > MAX_NFSPROT)
|
||||
version = MAX_NFSPROT;
|
||||
if (!prog)
|
||||
prog = MOUNTPROG;
|
||||
p.pm_prog = prog;
|
||||
p.pm_vers = version;
|
||||
p.pm_prot = proto;
|
||||
p.pm_port = port;
|
||||
|
||||
server_addr->sin_port = PMAPPORT;
|
||||
pmap = pmap_getmaps(server_addr);
|
||||
|
||||
while (pmap) {
|
||||
if (pmap->pml_map.pm_prog != prog)
|
||||
goto next;
|
||||
if (!version && p.pm_vers > pmap->pml_map.pm_vers)
|
||||
goto next;
|
||||
if (version > 2 && pmap->pml_map.pm_vers != version)
|
||||
goto next;
|
||||
if (version && version <= 2 && pmap->pml_map.pm_vers > 2)
|
||||
goto next;
|
||||
if (pmap->pml_map.pm_vers > MAX_NFSPROT ||
|
||||
(proto && p.pm_prot && pmap->pml_map.pm_prot != proto) ||
|
||||
(port && pmap->pml_map.pm_port != port))
|
||||
goto next;
|
||||
memcpy(&p, &pmap->pml_map, sizeof(p));
|
||||
next:
|
||||
pmap = pmap->pml_next;
|
||||
}
|
||||
if (!p.pm_vers)
|
||||
p.pm_vers = MOUNTVERS;
|
||||
if (!p.pm_prot)
|
||||
p.pm_prot = IPPROTO_TCP;
|
||||
#if 0
|
||||
if (!p.pm_port) {
|
||||
p.pm_port = pmap_getport(server_addr, p.pm_prog, p.pm_vers,
|
||||
p.pm_prot);
|
||||
}
|
||||
#endif
|
||||
#if 0
|
||||
#define MOUNTPORT 635
|
||||
/* HJLu wants to remove all traces of the old default port.
|
||||
Are there still people running a mount RPC service on this
|
||||
port without having a portmapper? */
|
||||
if (!p.pm_port)
|
||||
p.pm_port = MOUNTPORT;
|
||||
#endif
|
||||
return &p;
|
||||
}
|
||||
|
||||
int nfsmount(const char *spec, const char *node, int *flags,
|
||||
char **extra_opts, char **mount_opts, int *nfs_mount_vers,
|
||||
int running_bg)
|
||||
{
|
||||
static char *prev_bg_host;
|
||||
char hostdir[1024];
|
||||
CLIENT *mclient;
|
||||
char *hostname, *dirname, *old_opts, *mounthost = NULL;
|
||||
char new_opts[1024];
|
||||
struct timeval total_timeout;
|
||||
enum clnt_stat clnt_stat;
|
||||
static struct nfs_mount_data data;
|
||||
char *opt, *opteq;
|
||||
int nfs_mount_version;
|
||||
int val;
|
||||
struct hostent *hp;
|
||||
struct sockaddr_in server_addr;
|
||||
struct sockaddr_in mount_server_addr;
|
||||
struct pmap *pm_mnt;
|
||||
int msock, fsock;
|
||||
struct timeval retry_timeout;
|
||||
union {
|
||||
struct fhstatus nfsv2;
|
||||
struct mountres3 nfsv3;
|
||||
} status;
|
||||
struct stat statbuf;
|
||||
char *s;
|
||||
int port, mountport, proto, bg, soft, intr;
|
||||
int posix, nocto, noac, nolock, broken_suid;
|
||||
int retry, tcp;
|
||||
int mountprog, mountvers, nfsprog, nfsvers;
|
||||
int retval;
|
||||
time_t t;
|
||||
time_t prevt;
|
||||
time_t timeout;
|
||||
|
||||
/* The version to try is either specified or 0
|
||||
In case it is 0 we tell the caller what we tried */
|
||||
if (!*nfs_mount_vers)
|
||||
*nfs_mount_vers = find_kernel_nfs_mount_version();
|
||||
nfs_mount_version = *nfs_mount_vers;
|
||||
|
||||
retval = EX_FAIL;
|
||||
msock = fsock = -1;
|
||||
mclient = NULL;
|
||||
if (strlen(spec) >= sizeof(hostdir)) {
|
||||
fprintf(stderr, _("mount: "
|
||||
"excessively long host:dir argument\n"));
|
||||
goto fail;
|
||||
}
|
||||
strcpy(hostdir, spec);
|
||||
if ((s = strchr(hostdir, ':'))) {
|
||||
hostname = hostdir;
|
||||
dirname = s + 1;
|
||||
*s = '\0';
|
||||
/* Ignore all but first hostname in replicated mounts
|
||||
until they can be fully supported. (mack@sgi.com) */
|
||||
if ((s = strchr(hostdir, ','))) {
|
||||
*s = '\0';
|
||||
fprintf(stderr,
|
||||
_("mount: warning: "
|
||||
"multiple hostnames not supported\n"));
|
||||
}
|
||||
} else {
|
||||
fprintf(stderr,
|
||||
_("mount: "
|
||||
"directory to mount not in host:dir format\n"));
|
||||
goto fail;
|
||||
}
|
||||
|
||||
server_addr.sin_family = AF_INET;
|
||||
#ifdef HAVE_INET_ATON
|
||||
if (!inet_aton(hostname, &server_addr.sin_addr))
|
||||
#endif
|
||||
{
|
||||
if ((hp = gethostbyname(hostname)) == NULL) {
|
||||
fprintf(stderr, _("mount: can't get address for %s\n"),
|
||||
hostname);
|
||||
goto fail;
|
||||
} else {
|
||||
if (hp->h_length > sizeof(struct in_addr)) {
|
||||
fprintf(stderr,
|
||||
_("mount: got bad hp->h_length\n"));
|
||||
hp->h_length = sizeof(struct in_addr);
|
||||
}
|
||||
memcpy(&server_addr.sin_addr,
|
||||
hp->h_addr, hp->h_length);
|
||||
}
|
||||
}
|
||||
|
||||
memcpy (&mount_server_addr, &server_addr, sizeof (mount_server_addr));
|
||||
|
||||
/* add IP address to mtab options for use when unmounting */
|
||||
|
||||
s = inet_ntoa(server_addr.sin_addr);
|
||||
old_opts = *extra_opts;
|
||||
if (!old_opts)
|
||||
old_opts = "";
|
||||
if (strlen(old_opts) + strlen(s) + 10 >= sizeof(new_opts)) {
|
||||
fprintf(stderr, _("mount: "
|
||||
"excessively long option argument\n"));
|
||||
goto fail;
|
||||
}
|
||||
sprintf(new_opts, "%s%saddr=%s",
|
||||
old_opts, *old_opts ? "," : "", s);
|
||||
*extra_opts = xstrdup(new_opts);
|
||||
|
||||
/* Set default options.
|
||||
* rsize/wsize (and bsize, for ver >= 3) are left 0 in order to
|
||||
* let the kernel decide.
|
||||
* timeo is filled in after we know whether it'll be TCP or UDP. */
|
||||
memset(&data, 0, sizeof(data));
|
||||
data.retrans = 3;
|
||||
data.acregmin = 3;
|
||||
data.acregmax = 60;
|
||||
data.acdirmin = 30;
|
||||
data.acdirmax = 60;
|
||||
#if NFS_MOUNT_VERSION >= 2
|
||||
data.namlen = NAME_MAX;
|
||||
#endif
|
||||
|
||||
bg = 0;
|
||||
soft = 0;
|
||||
intr = 0;
|
||||
posix = 0;
|
||||
nocto = 0;
|
||||
nolock = 0;
|
||||
broken_suid = 0;
|
||||
noac = 0;
|
||||
retry = 10000; /* 10000 minutes ~ 1 week */
|
||||
tcp = 0;
|
||||
|
||||
mountprog = MOUNTPROG;
|
||||
mountvers = 0;
|
||||
port = 0;
|
||||
mountport = 0;
|
||||
nfsprog = NFS_PROGRAM;
|
||||
nfsvers = 0;
|
||||
|
||||
/* parse options */
|
||||
|
||||
for (opt = strtok(old_opts, ","); opt; opt = strtok(NULL, ",")) {
|
||||
if ((opteq = strchr(opt, '='))) {
|
||||
val = atoi(opteq + 1);
|
||||
*opteq = '\0';
|
||||
if (!strcmp(opt, "rsize"))
|
||||
data.rsize = val;
|
||||
else if (!strcmp(opt, "wsize"))
|
||||
data.wsize = val;
|
||||
else if (!strcmp(opt, "timeo"))
|
||||
data.timeo = val;
|
||||
else if (!strcmp(opt, "retrans"))
|
||||
data.retrans = val;
|
||||
else if (!strcmp(opt, "acregmin"))
|
||||
data.acregmin = val;
|
||||
else if (!strcmp(opt, "acregmax"))
|
||||
data.acregmax = val;
|
||||
else if (!strcmp(opt, "acdirmin"))
|
||||
data.acdirmin = val;
|
||||
else if (!strcmp(opt, "acdirmax"))
|
||||
data.acdirmax = val;
|
||||
else if (!strcmp(opt, "actimeo")) {
|
||||
data.acregmin = val;
|
||||
data.acregmax = val;
|
||||
data.acdirmin = val;
|
||||
data.acdirmax = val;
|
||||
}
|
||||
else if (!strcmp(opt, "retry"))
|
||||
retry = val;
|
||||
else if (!strcmp(opt, "port"))
|
||||
port = val;
|
||||
else if (!strcmp(opt, "mountport"))
|
||||
mountport = val;
|
||||
else if (!strcmp(opt, "mounthost"))
|
||||
mounthost=xstrndup(opteq+1,
|
||||
strcspn(opteq+1," \t\n\r,"));
|
||||
else if (!strcmp(opt, "mountprog"))
|
||||
mountprog = val;
|
||||
else if (!strcmp(opt, "mountvers"))
|
||||
mountvers = val;
|
||||
else if (!strcmp(opt, "nfsprog"))
|
||||
nfsprog = val;
|
||||
else if (!strcmp(opt, "nfsvers") ||
|
||||
!strcmp(opt, "vers"))
|
||||
nfsvers = val;
|
||||
else if (!strcmp(opt, "proto")) {
|
||||
if (!strncmp(opteq+1, "tcp", 3))
|
||||
tcp = 1;
|
||||
else if (!strncmp(opteq+1, "udp", 3))
|
||||
tcp = 0;
|
||||
else
|
||||
printf(_("Warning: Unrecognized proto= option.\n"));
|
||||
} else if (!strcmp(opt, "namlen")) {
|
||||
#if NFS_MOUNT_VERSION >= 2
|
||||
if (nfs_mount_version >= 2)
|
||||
data.namlen = val;
|
||||
else
|
||||
#endif
|
||||
printf(_("Warning: Option namlen is not supported.\n"));
|
||||
} else if (!strcmp(opt, "addr")) {
|
||||
/* ignore */;
|
||||
} else {
|
||||
printf(_("unknown nfs mount parameter: "
|
||||
"%s=%d\n"), opt, val);
|
||||
goto fail;
|
||||
}
|
||||
} else {
|
||||
val = 1;
|
||||
if (!strncmp(opt, "no", 2)) {
|
||||
val = 0;
|
||||
opt += 2;
|
||||
}
|
||||
if (!strcmp(opt, "bg"))
|
||||
bg = val;
|
||||
else if (!strcmp(opt, "fg"))
|
||||
bg = !val;
|
||||
else if (!strcmp(opt, "soft"))
|
||||
soft = val;
|
||||
else if (!strcmp(opt, "hard"))
|
||||
soft = !val;
|
||||
else if (!strcmp(opt, "intr"))
|
||||
intr = val;
|
||||
else if (!strcmp(opt, "posix"))
|
||||
posix = val;
|
||||
else if (!strcmp(opt, "cto"))
|
||||
nocto = !val;
|
||||
else if (!strcmp(opt, "ac"))
|
||||
noac = !val;
|
||||
else if (!strcmp(opt, "tcp"))
|
||||
tcp = val;
|
||||
else if (!strcmp(opt, "udp"))
|
||||
tcp = !val;
|
||||
else if (!strcmp(opt, "lock")) {
|
||||
if (nfs_mount_version >= 3)
|
||||
nolock = !val;
|
||||
else
|
||||
printf(_("Warning: option nolock is not supported.\n"));
|
||||
} else if (!strcmp(opt, "broken_suid")) {
|
||||
broken_suid = val;
|
||||
} else {
|
||||
if (!sloppy) {
|
||||
printf(_("unknown nfs mount option: "
|
||||
"%s%s\n"), val ? "" : "no", opt);
|
||||
goto fail;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
proto = (tcp) ? IPPROTO_TCP : IPPROTO_UDP;
|
||||
|
||||
data.flags = (soft ? NFS_MOUNT_SOFT : 0)
|
||||
| (intr ? NFS_MOUNT_INTR : 0)
|
||||
| (posix ? NFS_MOUNT_POSIX : 0)
|
||||
| (nocto ? NFS_MOUNT_NOCTO : 0)
|
||||
| (noac ? NFS_MOUNT_NOAC : 0);
|
||||
#if NFS_MOUNT_VERSION >= 2
|
||||
if (nfs_mount_version >= 2)
|
||||
data.flags |= (tcp ? NFS_MOUNT_TCP : 0);
|
||||
#endif
|
||||
#if NFS_MOUNT_VERSION >= 3
|
||||
if (nfs_mount_version >= 3)
|
||||
data.flags |= (nolock ? NFS_MOUNT_NONLM : 0);
|
||||
#endif
|
||||
#if NFS_MOUNT_VERSION >= 4
|
||||
if (nfs_mount_version >= 4)
|
||||
data.flags |= (broken_suid ? NFS_MOUNT_BROKEN_SUID : 0);
|
||||
#endif
|
||||
if (nfsvers > MAX_NFSPROT) {
|
||||
fprintf(stderr, "NFSv%d not supported!\n", nfsvers);
|
||||
return 0;
|
||||
}
|
||||
if (mountvers > MAX_NFSPROT) {
|
||||
fprintf(stderr, "NFSv%d not supported!\n", nfsvers);
|
||||
return 0;
|
||||
}
|
||||
if (nfsvers && !mountvers)
|
||||
mountvers = (nfsvers < 3) ? 1 : nfsvers;
|
||||
if (nfsvers && nfsvers < mountvers)
|
||||
mountvers = nfsvers;
|
||||
|
||||
/* Adjust options if none specified */
|
||||
if (!data.timeo)
|
||||
data.timeo = tcp ? 70 : 7;
|
||||
|
||||
#ifdef NFS_MOUNT_DEBUG
|
||||
printf("rsize = %d, wsize = %d, timeo = %d, retrans = %d\n",
|
||||
data.rsize, data.wsize, data.timeo, data.retrans);
|
||||
printf("acreg (min, max) = (%d, %d), acdir (min, max) = (%d, %d)\n",
|
||||
data.acregmin, data.acregmax, data.acdirmin, data.acdirmax);
|
||||
printf("port = %d, bg = %d, retry = %d, flags = %.8x\n",
|
||||
port, bg, retry, data.flags);
|
||||
printf("mountprog = %d, mountvers = %d, nfsprog = %d, nfsvers = %d\n",
|
||||
mountprog, mountvers, nfsprog, nfsvers);
|
||||
printf("soft = %d, intr = %d, posix = %d, nocto = %d, noac = %d\n",
|
||||
(data.flags & NFS_MOUNT_SOFT) != 0,
|
||||
(data.flags & NFS_MOUNT_INTR) != 0,
|
||||
(data.flags & NFS_MOUNT_POSIX) != 0,
|
||||
(data.flags & NFS_MOUNT_NOCTO) != 0,
|
||||
(data.flags & NFS_MOUNT_NOAC) != 0);
|
||||
#if NFS_MOUNT_VERSION >= 2
|
||||
printf("tcp = %d\n",
|
||||
(data.flags & NFS_MOUNT_TCP) != 0);
|
||||
#endif
|
||||
#endif
|
||||
|
||||
data.version = nfs_mount_version;
|
||||
*mount_opts = (char *) &data;
|
||||
|
||||
if (*flags & MS_REMOUNT)
|
||||
return 0;
|
||||
|
||||
/*
|
||||
* If the previous mount operation on the same host was
|
||||
* backgrounded, and the "bg" for this mount is also set,
|
||||
* give up immediately, to avoid the initial timeout.
|
||||
*/
|
||||
if (bg && !running_bg &&
|
||||
prev_bg_host && strcmp(hostname, prev_bg_host) == 0) {
|
||||
if (retry > 0)
|
||||
retval = EX_BG;
|
||||
return retval;
|
||||
}
|
||||
|
||||
/* create mount deamon client */
|
||||
/* See if the nfs host = mount host. */
|
||||
if (mounthost) {
|
||||
if (mounthost[0] >= '0' && mounthost[0] <= '9') {
|
||||
mount_server_addr.sin_family = AF_INET;
|
||||
mount_server_addr.sin_addr.s_addr = inet_addr(hostname);
|
||||
} else {
|
||||
if ((hp = gethostbyname(mounthost)) == NULL) {
|
||||
fprintf(stderr, _("mount: can't get address for %s\n"),
|
||||
mounthost);
|
||||
goto fail;
|
||||
} else {
|
||||
if (hp->h_length > sizeof(struct in_addr)) {
|
||||
fprintf(stderr,
|
||||
_("mount: got bad hp->h_length?\n"));
|
||||
hp->h_length = sizeof(struct in_addr);
|
||||
}
|
||||
mount_server_addr.sin_family = AF_INET;
|
||||
memcpy(&mount_server_addr.sin_addr,
|
||||
hp->h_addr, hp->h_length);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* The following loop implements the mount retries. On the first
|
||||
* call, "running_bg" is 0. When the mount times out, and the
|
||||
* "bg" option is set, the exit status EX_BG will be returned.
|
||||
* For a backgrounded mount, there will be a second call by the
|
||||
* child process with "running_bg" set to 1.
|
||||
*
|
||||
* The case where the mount point is not present and the "bg"
|
||||
* option is set, is treated as a timeout. This is done to
|
||||
* support nested mounts.
|
||||
*
|
||||
* The "retry" count specified by the user is the number of
|
||||
* minutes to retry before giving up.
|
||||
*
|
||||
* Only the first error message will be displayed.
|
||||
*/
|
||||
retry_timeout.tv_sec = 3;
|
||||
retry_timeout.tv_usec = 0;
|
||||
total_timeout.tv_sec = 20;
|
||||
total_timeout.tv_usec = 0;
|
||||
timeout = time(NULL) + 60 * retry;
|
||||
prevt = 0;
|
||||
t = 30;
|
||||
val = 1;
|
||||
|
||||
for (;;) {
|
||||
if (bg && stat(node, &statbuf) == -1) {
|
||||
/* no mount point yet - sleep */
|
||||
if (running_bg) {
|
||||
sleep(val); /* 1, 2, 4, 8, 16, 30, ... */
|
||||
val *= 2;
|
||||
if (val > 30)
|
||||
val = 30;
|
||||
}
|
||||
} else {
|
||||
/* be careful not to use too many CPU cycles */
|
||||
if (t - prevt < 30)
|
||||
sleep(30);
|
||||
|
||||
pm_mnt = get_mountport(&mount_server_addr,
|
||||
mountprog,
|
||||
mountvers,
|
||||
proto,
|
||||
mountport,
|
||||
nfs_mount_version);
|
||||
|
||||
/* contact the mount daemon via TCP */
|
||||
mount_server_addr.sin_port = htons(pm_mnt->pm_port);
|
||||
msock = RPC_ANYSOCK;
|
||||
|
||||
switch (pm_mnt->pm_prot) {
|
||||
case IPPROTO_UDP:
|
||||
mclient = clntudp_create(&mount_server_addr,
|
||||
pm_mnt->pm_prog,
|
||||
pm_mnt->pm_vers,
|
||||
retry_timeout,
|
||||
&msock);
|
||||
if (mclient)
|
||||
break;
|
||||
mount_server_addr.sin_port =
|
||||
htons(pm_mnt->pm_port);
|
||||
msock = RPC_ANYSOCK;
|
||||
case IPPROTO_TCP:
|
||||
mclient = clnttcp_create(&mount_server_addr,
|
||||
pm_mnt->pm_prog,
|
||||
pm_mnt->pm_vers,
|
||||
&msock, 0, 0);
|
||||
break;
|
||||
default:
|
||||
mclient = 0;
|
||||
}
|
||||
|
||||
if (mclient) {
|
||||
/* try to mount hostname:dirname */
|
||||
mclient->cl_auth = authunix_create_default();
|
||||
|
||||
/* make pointers in xdr_mountres3 NULL so
|
||||
* that xdr_array allocates memory for us
|
||||
*/
|
||||
memset(&status, 0, sizeof(status));
|
||||
|
||||
if (pm_mnt->pm_vers == 3)
|
||||
clnt_stat = clnt_call(mclient,
|
||||
MOUNTPROC3_MNT,
|
||||
(xdrproc_t) xdr_dirpath,
|
||||
(caddr_t) &dirname,
|
||||
(xdrproc_t) xdr_mountres3,
|
||||
(caddr_t) &status,
|
||||
total_timeout);
|
||||
else
|
||||
clnt_stat = clnt_call(mclient,
|
||||
MOUNTPROC_MNT,
|
||||
(xdrproc_t) xdr_dirpath,
|
||||
(caddr_t) &dirname,
|
||||
(xdrproc_t) xdr_fhstatus,
|
||||
(caddr_t) &status,
|
||||
total_timeout);
|
||||
|
||||
if (clnt_stat == RPC_SUCCESS)
|
||||
break; /* we're done */
|
||||
#if 0
|
||||
/* errno? who sets errno? */
|
||||
/* this fragment breaks bg mounting */
|
||||
if (errno != ECONNREFUSED) {
|
||||
clnt_perror(mclient, "mount");
|
||||
goto fail; /* don't retry */
|
||||
}
|
||||
#endif
|
||||
if (!running_bg && prevt == 0)
|
||||
clnt_perror(mclient, "mount");
|
||||
auth_destroy(mclient->cl_auth);
|
||||
clnt_destroy(mclient);
|
||||
mclient = 0;
|
||||
close(msock);
|
||||
} else {
|
||||
if (!running_bg && prevt == 0)
|
||||
clnt_pcreateerror("mount");
|
||||
}
|
||||
prevt = t;
|
||||
}
|
||||
|
||||
if (!bg)
|
||||
goto fail;
|
||||
if (!running_bg) {
|
||||
prev_bg_host = xstrdup(hostname);
|
||||
if (retry > 0)
|
||||
retval = EX_BG;
|
||||
goto fail;
|
||||
}
|
||||
t = time(NULL);
|
||||
if (t >= timeout)
|
||||
goto fail;
|
||||
}
|
||||
nfsvers = (pm_mnt->pm_vers < 2) ? 2 : pm_mnt->pm_vers;
|
||||
|
||||
if (nfsvers == 2) {
|
||||
if (status.nfsv2.fhs_status != 0) {
|
||||
fprintf(stderr,
|
||||
"mount: %s:%s failed, reason given by server: %s\n",
|
||||
hostname, dirname,
|
||||
nfs_strerror(status.nfsv2.fhs_status));
|
||||
goto fail;
|
||||
}
|
||||
memcpy(data.root.data,
|
||||
(char *) status.nfsv2.fhstatus_u.fhs_fhandle,
|
||||
NFS_FHSIZE);
|
||||
#if NFS_MOUNT_VERSION >= 4
|
||||
data.root.size = NFS_FHSIZE;
|
||||
memcpy(data.old_root.data,
|
||||
(char *) status.nfsv2.fhstatus_u.fhs_fhandle,
|
||||
NFS_FHSIZE);
|
||||
#endif
|
||||
} else {
|
||||
#if NFS_MOUNT_VERSION >= 4
|
||||
fhandle3 *fhandle;
|
||||
if (status.nfsv3.fhs_status != 0) {
|
||||
fprintf(stderr,
|
||||
"mount: %s:%s failed, reason given by server: %s\n",
|
||||
hostname, dirname,
|
||||
nfs_strerror(status.nfsv3.fhs_status));
|
||||
goto fail;
|
||||
}
|
||||
fhandle = &status.nfsv3.mountres3_u.mountinfo.fhandle;
|
||||
memset(data.old_root.data, 0, NFS_FHSIZE);
|
||||
memset(&data.root, 0, sizeof(data.root));
|
||||
data.root.size = fhandle->fhandle3_len;
|
||||
memcpy(data.root.data,
|
||||
(char *) fhandle->fhandle3_val,
|
||||
fhandle->fhandle3_len);
|
||||
|
||||
data.flags |= NFS_MOUNT_VER3;
|
||||
#endif
|
||||
}
|
||||
|
||||
/* create nfs socket for kernel */
|
||||
|
||||
if (tcp) {
|
||||
if (nfs_mount_version < 3) {
|
||||
printf(_("NFS over TCP is not supported.\n"));
|
||||
goto fail;
|
||||
}
|
||||
fsock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
|
||||
} else
|
||||
fsock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
|
||||
if (fsock < 0) {
|
||||
perror(_("nfs socket"));
|
||||
goto fail;
|
||||
}
|
||||
if (bindresvport(fsock, 0) < 0) {
|
||||
perror(_("nfs bindresvport"));
|
||||
goto fail;
|
||||
}
|
||||
if (port == 0) {
|
||||
server_addr.sin_port = PMAPPORT;
|
||||
port = pmap_getport(&server_addr, nfsprog, nfsvers,
|
||||
tcp ? IPPROTO_TCP : IPPROTO_UDP);
|
||||
#if 1
|
||||
/* Here we check to see if user is mounting with the
|
||||
* tcp option. If so, and if the portmap returns a
|
||||
* '0' for port (service unavailable), we then exit,
|
||||
* notifying the user, rather than hanging up mount.
|
||||
*/
|
||||
if (port == 0 && tcp == 1) {
|
||||
perror(_("nfs server reported service unavailable"));
|
||||
goto fail;
|
||||
}
|
||||
#endif
|
||||
|
||||
if (port == 0)
|
||||
port = NFS_PORT;
|
||||
#ifdef NFS_MOUNT_DEBUG
|
||||
else
|
||||
printf(_("used portmapper to find NFS port\n"));
|
||||
#endif
|
||||
}
|
||||
#ifdef NFS_MOUNT_DEBUG
|
||||
printf(_("using port %d for nfs deamon\n"), port);
|
||||
#endif
|
||||
server_addr.sin_port = htons(port);
|
||||
/*
|
||||
* connect() the socket for kernels 1.3.10 and below only,
|
||||
* to avoid problems with multihomed hosts.
|
||||
* --Swen
|
||||
*/
|
||||
if (linux_version_code() <= 66314
|
||||
&& connect(fsock, (struct sockaddr *) &server_addr,
|
||||
sizeof (server_addr)) < 0) {
|
||||
perror(_("nfs connect"));
|
||||
goto fail;
|
||||
}
|
||||
|
||||
/* prepare data structure for kernel */
|
||||
|
||||
data.fd = fsock;
|
||||
memcpy((char *) &data.addr, (char *) &server_addr, sizeof(data.addr));
|
||||
strncpy(data.hostname, hostname, sizeof(data.hostname));
|
||||
|
||||
/* clean up */
|
||||
|
||||
auth_destroy(mclient->cl_auth);
|
||||
clnt_destroy(mclient);
|
||||
close(msock);
|
||||
return 0;
|
||||
|
||||
/* abort */
|
||||
|
||||
fail:
|
||||
if (msock != -1) {
|
||||
if (mclient) {
|
||||
auth_destroy(mclient->cl_auth);
|
||||
clnt_destroy(mclient);
|
||||
}
|
||||
close(msock);
|
||||
}
|
||||
if (fsock != -1)
|
||||
close(fsock);
|
||||
return retval;
|
||||
}
|
||||
|
||||
/*
|
||||
* We need to translate between nfs status return values and
|
||||
* the local errno values which may not be the same.
|
||||
*
|
||||
* Andreas Schwab <schwab@LS5.informatik.uni-dortmund.de>: change errno:
|
||||
* "after #include <errno.h> the symbol errno is reserved for any use,
|
||||
* it cannot even be used as a struct tag or field name".
|
||||
*/
|
||||
|
||||
#ifndef EDQUOT
|
||||
#define EDQUOT ENOSPC
|
||||
#endif
|
||||
|
||||
static struct {
|
||||
enum nfsstat stat;
|
||||
int errnum;
|
||||
} nfs_errtbl[] = {
|
||||
{ NFS_OK, 0 },
|
||||
{ NFSERR_PERM, EPERM },
|
||||
{ NFSERR_NOENT, ENOENT },
|
||||
{ NFSERR_IO, EIO },
|
||||
{ NFSERR_NXIO, ENXIO },
|
||||
{ NFSERR_ACCES, EACCES },
|
||||
{ NFSERR_EXIST, EEXIST },
|
||||
{ NFSERR_NODEV, ENODEV },
|
||||
{ NFSERR_NOTDIR, ENOTDIR },
|
||||
{ NFSERR_ISDIR, EISDIR },
|
||||
#ifdef NFSERR_INVAL
|
||||
{ NFSERR_INVAL, EINVAL }, /* that Sun forgot */
|
||||
#endif
|
||||
{ NFSERR_FBIG, EFBIG },
|
||||
{ NFSERR_NOSPC, ENOSPC },
|
||||
{ NFSERR_ROFS, EROFS },
|
||||
{ NFSERR_NAMETOOLONG, ENAMETOOLONG },
|
||||
{ NFSERR_NOTEMPTY, ENOTEMPTY },
|
||||
{ NFSERR_DQUOT, EDQUOT },
|
||||
{ NFSERR_STALE, ESTALE },
|
||||
#ifdef EWFLUSH
|
||||
{ NFSERR_WFLUSH, EWFLUSH },
|
||||
#endif
|
||||
/* Throw in some NFSv3 values for even more fun (HP returns these) */
|
||||
{ 71, EREMOTE },
|
||||
|
||||
{ -1, EIO }
|
||||
};
|
||||
|
||||
static char *nfs_strerror(int stat)
|
||||
{
|
||||
int i;
|
||||
static char buf[256];
|
||||
|
||||
for (i = 0; nfs_errtbl[i].stat != -1; i++) {
|
||||
if (nfs_errtbl[i].stat == stat)
|
||||
return strerror(nfs_errtbl[i].errnum);
|
||||
}
|
||||
sprintf(buf, _("unknown nfs status return value: %d"), stat);
|
||||
return buf;
|
||||
}
|
||||
|
||||
#if 0
|
||||
int
|
||||
my_getport(struct in_addr server, struct timeval *timeo, ...)
|
||||
{
|
||||
struct sockaddr_in sin;
|
||||
struct pmap pmap;
|
||||
CLIENT *clnt;
|
||||
int sock = RPC_ANYSOCK, port;
|
||||
|
||||
pmap.pm_prog = prog;
|
||||
pmap.pm_vers = vers;
|
||||
pmap.pm_prot = prot;
|
||||
pmap.pm_port = 0;
|
||||
sin.sin_family = AF_INET;
|
||||
sin.sin_addr = server;
|
||||
sin.sin_port = htons(111);
|
||||
clnt = clntudp_create(&sin, 100000, 2, *timeo, &sock);
|
||||
status = clnt_call(clnt, PMAP_GETPORT,
|
||||
&pmap, (xdrproc_t) xdr_pmap,
|
||||
&port, (xdrproc_t) xdr_uint);
|
||||
if (status != SUCCESS) {
|
||||
/* natter */
|
||||
port = 0;
|
||||
}
|
||||
|
||||
clnt_destroy(clnt);
|
||||
close(sock);
|
||||
return port;
|
||||
}
|
||||
#endif
|
328
mount/nfsmount.h
328
mount/nfsmount.h
|
@ -1,328 +0,0 @@
|
|||
/*
|
||||
* Please do not edit this file.
|
||||
* It was generated using rpcgen.
|
||||
*/
|
||||
|
||||
#ifndef _NFSMOUNT_H_RPCGEN
|
||||
#define _NFSMOUNT_H_RPCGEN
|
||||
|
||||
#include <rpc/rpc.h>
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Sun RPC is a product of Sun Microsystems, Inc. and is provided for
|
||||
* unrestricted use provided that this legend is included on all tape
|
||||
* media and as a part of the software program in whole or part. Users
|
||||
* may copy or modify Sun RPC without charge, but are not authorized
|
||||
* to license or distribute it to anyone else except as part of a product or
|
||||
* program developed by the user or with the express written consent of
|
||||
* Sun Microsystems, Inc.
|
||||
*
|
||||
* SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE
|
||||
* WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR
|
||||
* PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE.
|
||||
*
|
||||
* Sun RPC is provided with no support and without any obligation on the
|
||||
* part of Sun Microsystems, Inc. to assist in its use, correction,
|
||||
* modification or enhancement.
|
||||
*
|
||||
* SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE
|
||||
* INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC
|
||||
* OR ANY PART THEREOF.
|
||||
*
|
||||
* In no event will Sun Microsystems, Inc. be liable for any lost revenue
|
||||
* or profits or other special, indirect and consequential damages, even if
|
||||
* Sun has been advised of the possibility of such damages.
|
||||
*
|
||||
* Sun Microsystems, Inc.
|
||||
* 2550 Garcia Avenue
|
||||
* Mountain View, California 94043
|
||||
*/
|
||||
/*
|
||||
* Copyright (c) 1985, 1990 by Sun Microsystems, Inc.
|
||||
*/
|
||||
|
||||
/* from @(#)mount.x 1.3 91/03/11 TIRPC 1.0 */
|
||||
#ifndef _rpcsvc_mount_h
|
||||
#define _rpcsvc_mount_h
|
||||
#include <asm/types.h>
|
||||
#define MNTPATHLEN 1024
|
||||
#define MNTNAMLEN 255
|
||||
#define FHSIZE 32
|
||||
#define FHSIZE3 64
|
||||
|
||||
typedef char fhandle[FHSIZE];
|
||||
|
||||
typedef struct {
|
||||
u_int fhandle3_len;
|
||||
char *fhandle3_val;
|
||||
} fhandle3;
|
||||
|
||||
enum mountstat3 {
|
||||
MNT_OK = 0,
|
||||
MNT3ERR_PERM = 1,
|
||||
MNT3ERR_NOENT = 2,
|
||||
MNT3ERR_IO = 5,
|
||||
MNT3ERR_ACCES = 13,
|
||||
MNT3ERR_NOTDIR = 20,
|
||||
MNT3ERR_INVAL = 22,
|
||||
MNT3ERR_NAMETOOLONG = 63,
|
||||
MNT3ERR_NOTSUPP = 10004,
|
||||
MNT3ERR_SERVERFAULT = 10006,
|
||||
};
|
||||
typedef enum mountstat3 mountstat3;
|
||||
|
||||
struct fhstatus {
|
||||
u_int fhs_status;
|
||||
union {
|
||||
fhandle fhs_fhandle;
|
||||
} fhstatus_u;
|
||||
};
|
||||
typedef struct fhstatus fhstatus;
|
||||
|
||||
struct mountres3_ok {
|
||||
fhandle3 fhandle;
|
||||
struct {
|
||||
u_int auth_flavours_len;
|
||||
int *auth_flavours_val;
|
||||
} auth_flavours;
|
||||
};
|
||||
typedef struct mountres3_ok mountres3_ok;
|
||||
|
||||
struct mountres3 {
|
||||
mountstat3 fhs_status;
|
||||
union {
|
||||
mountres3_ok mountinfo;
|
||||
} mountres3_u;
|
||||
};
|
||||
typedef struct mountres3 mountres3;
|
||||
|
||||
typedef char *dirpath;
|
||||
|
||||
typedef char *name;
|
||||
|
||||
typedef struct mountbody *mountlist;
|
||||
|
||||
struct mountbody {
|
||||
name ml_hostname;
|
||||
dirpath ml_directory;
|
||||
mountlist ml_next;
|
||||
};
|
||||
typedef struct mountbody mountbody;
|
||||
|
||||
typedef struct groupnode *groups;
|
||||
|
||||
struct groupnode {
|
||||
name gr_name;
|
||||
groups gr_next;
|
||||
};
|
||||
typedef struct groupnode groupnode;
|
||||
|
||||
typedef struct exportnode *exports;
|
||||
|
||||
struct exportnode {
|
||||
dirpath ex_dir;
|
||||
groups ex_groups;
|
||||
exports ex_next;
|
||||
};
|
||||
typedef struct exportnode exportnode;
|
||||
|
||||
struct ppathcnf {
|
||||
int pc_link_max;
|
||||
short pc_max_canon;
|
||||
short pc_max_input;
|
||||
short pc_name_max;
|
||||
short pc_path_max;
|
||||
short pc_pipe_buf;
|
||||
u_char pc_vdisable;
|
||||
char pc_xxx;
|
||||
short pc_mask[2];
|
||||
};
|
||||
typedef struct ppathcnf ppathcnf;
|
||||
#endif /*!_rpcsvc_mount_h*/
|
||||
|
||||
#define MOUNTPROG 100005
|
||||
#define MOUNTVERS 1
|
||||
|
||||
#if defined(__STDC__) || defined(__cplusplus)
|
||||
#define MOUNTPROC_NULL 0
|
||||
extern void * mountproc_null_1(void *, CLIENT *);
|
||||
extern void * mountproc_null_1_svc(void *, struct svc_req *);
|
||||
#define MOUNTPROC_MNT 1
|
||||
extern fhstatus * mountproc_mnt_1(dirpath *, CLIENT *);
|
||||
extern fhstatus * mountproc_mnt_1_svc(dirpath *, struct svc_req *);
|
||||
#define MOUNTPROC_DUMP 2
|
||||
extern mountlist * mountproc_dump_1(void *, CLIENT *);
|
||||
extern mountlist * mountproc_dump_1_svc(void *, struct svc_req *);
|
||||
#define MOUNTPROC_UMNT 3
|
||||
extern void * mountproc_umnt_1(dirpath *, CLIENT *);
|
||||
extern void * mountproc_umnt_1_svc(dirpath *, struct svc_req *);
|
||||
#define MOUNTPROC_UMNTALL 4
|
||||
extern void * mountproc_umntall_1(void *, CLIENT *);
|
||||
extern void * mountproc_umntall_1_svc(void *, struct svc_req *);
|
||||
#define MOUNTPROC_EXPORT 5
|
||||
extern exports * mountproc_export_1(void *, CLIENT *);
|
||||
extern exports * mountproc_export_1_svc(void *, struct svc_req *);
|
||||
#define MOUNTPROC_EXPORTALL 6
|
||||
extern exports * mountproc_exportall_1(void *, CLIENT *);
|
||||
extern exports * mountproc_exportall_1_svc(void *, struct svc_req *);
|
||||
extern int mountprog_1_freeresult (SVCXPRT *, xdrproc_t, caddr_t);
|
||||
|
||||
#else /* K&R C */
|
||||
#define MOUNTPROC_NULL 0
|
||||
extern void * mountproc_null_1();
|
||||
extern void * mountproc_null_1_svc();
|
||||
#define MOUNTPROC_MNT 1
|
||||
extern fhstatus * mountproc_mnt_1();
|
||||
extern fhstatus * mountproc_mnt_1_svc();
|
||||
#define MOUNTPROC_DUMP 2
|
||||
extern mountlist * mountproc_dump_1();
|
||||
extern mountlist * mountproc_dump_1_svc();
|
||||
#define MOUNTPROC_UMNT 3
|
||||
extern void * mountproc_umnt_1();
|
||||
extern void * mountproc_umnt_1_svc();
|
||||
#define MOUNTPROC_UMNTALL 4
|
||||
extern void * mountproc_umntall_1();
|
||||
extern void * mountproc_umntall_1_svc();
|
||||
#define MOUNTPROC_EXPORT 5
|
||||
extern exports * mountproc_export_1();
|
||||
extern exports * mountproc_export_1_svc();
|
||||
#define MOUNTPROC_EXPORTALL 6
|
||||
extern exports * mountproc_exportall_1();
|
||||
extern exports * mountproc_exportall_1_svc();
|
||||
extern int mountprog_1_freeresult ();
|
||||
#endif /* K&R C */
|
||||
#define MOUNTVERS_POSIX 2
|
||||
|
||||
#if defined(__STDC__) || defined(__cplusplus)
|
||||
extern void * mountproc_null_2(void *, CLIENT *);
|
||||
extern void * mountproc_null_2_svc(void *, struct svc_req *);
|
||||
extern fhstatus * mountproc_mnt_2(dirpath *, CLIENT *);
|
||||
extern fhstatus * mountproc_mnt_2_svc(dirpath *, struct svc_req *);
|
||||
extern mountlist * mountproc_dump_2(void *, CLIENT *);
|
||||
extern mountlist * mountproc_dump_2_svc(void *, struct svc_req *);
|
||||
extern void * mountproc_umnt_2(dirpath *, CLIENT *);
|
||||
extern void * mountproc_umnt_2_svc(dirpath *, struct svc_req *);
|
||||
extern void * mountproc_umntall_2(void *, CLIENT *);
|
||||
extern void * mountproc_umntall_2_svc(void *, struct svc_req *);
|
||||
extern exports * mountproc_export_2(void *, CLIENT *);
|
||||
extern exports * mountproc_export_2_svc(void *, struct svc_req *);
|
||||
extern exports * mountproc_exportall_2(void *, CLIENT *);
|
||||
extern exports * mountproc_exportall_2_svc(void *, struct svc_req *);
|
||||
#define MOUNTPROC_PATHCONF 7
|
||||
extern ppathcnf * mountproc_pathconf_2(dirpath *, CLIENT *);
|
||||
extern ppathcnf * mountproc_pathconf_2_svc(dirpath *, struct svc_req *);
|
||||
extern int mountprog_2_freeresult (SVCXPRT *, xdrproc_t, caddr_t);
|
||||
|
||||
#else /* K&R C */
|
||||
extern void * mountproc_null_2();
|
||||
extern void * mountproc_null_2_svc();
|
||||
extern fhstatus * mountproc_mnt_2();
|
||||
extern fhstatus * mountproc_mnt_2_svc();
|
||||
extern mountlist * mountproc_dump_2();
|
||||
extern mountlist * mountproc_dump_2_svc();
|
||||
extern void * mountproc_umnt_2();
|
||||
extern void * mountproc_umnt_2_svc();
|
||||
extern void * mountproc_umntall_2();
|
||||
extern void * mountproc_umntall_2_svc();
|
||||
extern exports * mountproc_export_2();
|
||||
extern exports * mountproc_export_2_svc();
|
||||
extern exports * mountproc_exportall_2();
|
||||
extern exports * mountproc_exportall_2_svc();
|
||||
#define MOUNTPROC_PATHCONF 7
|
||||
extern ppathcnf * mountproc_pathconf_2();
|
||||
extern ppathcnf * mountproc_pathconf_2_svc();
|
||||
extern int mountprog_2_freeresult ();
|
||||
#endif /* K&R C */
|
||||
#define MOUNT_V3 3
|
||||
|
||||
#if defined(__STDC__) || defined(__cplusplus)
|
||||
#define MOUNTPROC3_NULL 0
|
||||
extern void * mountproc3_null_3(void *, CLIENT *);
|
||||
extern void * mountproc3_null_3_svc(void *, struct svc_req *);
|
||||
#define MOUNTPROC3_MNT 1
|
||||
extern mountres3 * mountproc3_mnt_3(dirpath *, CLIENT *);
|
||||
extern mountres3 * mountproc3_mnt_3_svc(dirpath *, struct svc_req *);
|
||||
#define MOUNTPROC3_DUMP 2
|
||||
extern mountlist * mountproc3_dump_3(void *, CLIENT *);
|
||||
extern mountlist * mountproc3_dump_3_svc(void *, struct svc_req *);
|
||||
#define MOUNTPROC3_UMNT 3
|
||||
extern void * mountproc3_umnt_3(dirpath *, CLIENT *);
|
||||
extern void * mountproc3_umnt_3_svc(dirpath *, struct svc_req *);
|
||||
#define MOUNTPROC3_UMNTALL 4
|
||||
extern void * mountproc3_umntall_3(void *, CLIENT *);
|
||||
extern void * mountproc3_umntall_3_svc(void *, struct svc_req *);
|
||||
#define MOUNTPROC3_EXPORT 5
|
||||
extern exports * mountproc3_export_3(void *, CLIENT *);
|
||||
extern exports * mountproc3_export_3_svc(void *, struct svc_req *);
|
||||
extern int mountprog_3_freeresult (SVCXPRT *, xdrproc_t, caddr_t);
|
||||
|
||||
#else /* K&R C */
|
||||
#define MOUNTPROC3_NULL 0
|
||||
extern void * mountproc3_null_3();
|
||||
extern void * mountproc3_null_3_svc();
|
||||
#define MOUNTPROC3_MNT 1
|
||||
extern mountres3 * mountproc3_mnt_3();
|
||||
extern mountres3 * mountproc3_mnt_3_svc();
|
||||
#define MOUNTPROC3_DUMP 2
|
||||
extern mountlist * mountproc3_dump_3();
|
||||
extern mountlist * mountproc3_dump_3_svc();
|
||||
#define MOUNTPROC3_UMNT 3
|
||||
extern void * mountproc3_umnt_3();
|
||||
extern void * mountproc3_umnt_3_svc();
|
||||
#define MOUNTPROC3_UMNTALL 4
|
||||
extern void * mountproc3_umntall_3();
|
||||
extern void * mountproc3_umntall_3_svc();
|
||||
#define MOUNTPROC3_EXPORT 5
|
||||
extern exports * mountproc3_export_3();
|
||||
extern exports * mountproc3_export_3_svc();
|
||||
extern int mountprog_3_freeresult ();
|
||||
#endif /* K&R C */
|
||||
|
||||
/* the xdr functions */
|
||||
|
||||
#if defined(__STDC__) || defined(__cplusplus)
|
||||
extern bool_t xdr_fhandle (XDR *, fhandle);
|
||||
extern bool_t xdr_fhandle3 (XDR *, fhandle3*);
|
||||
extern bool_t xdr_mountstat3 (XDR *, mountstat3*);
|
||||
extern bool_t xdr_fhstatus (XDR *, fhstatus*);
|
||||
extern bool_t xdr_mountres3_ok (XDR *, mountres3_ok*);
|
||||
extern bool_t xdr_mountres3 (XDR *, mountres3*);
|
||||
extern bool_t xdr_dirpath (XDR *, dirpath*);
|
||||
extern bool_t xdr_name (XDR *, name*);
|
||||
extern bool_t xdr_mountlist (XDR *, mountlist*);
|
||||
extern bool_t xdr_mountbody (XDR *, mountbody*);
|
||||
extern bool_t xdr_groups (XDR *, groups*);
|
||||
extern bool_t xdr_groupnode (XDR *, groupnode*);
|
||||
extern bool_t xdr_exports (XDR *, exports*);
|
||||
extern bool_t xdr_exportnode (XDR *, exportnode*);
|
||||
extern bool_t xdr_ppathcnf (XDR *, ppathcnf*);
|
||||
|
||||
#else /* K&R C */
|
||||
extern bool_t xdr_fhandle ();
|
||||
extern bool_t xdr_fhandle3 ();
|
||||
extern bool_t xdr_mountstat3 ();
|
||||
extern bool_t xdr_fhstatus ();
|
||||
extern bool_t xdr_mountres3_ok ();
|
||||
extern bool_t xdr_mountres3 ();
|
||||
extern bool_t xdr_dirpath ();
|
||||
extern bool_t xdr_name ();
|
||||
extern bool_t xdr_mountlist ();
|
||||
extern bool_t xdr_mountbody ();
|
||||
extern bool_t xdr_groups ();
|
||||
extern bool_t xdr_groupnode ();
|
||||
extern bool_t xdr_exports ();
|
||||
extern bool_t xdr_exportnode ();
|
||||
extern bool_t xdr_ppathcnf ();
|
||||
|
||||
#endif /* K&R C */
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* !_NFSMOUNT_H_RPCGEN */
|
336
mount/nfsmount.x
336
mount/nfsmount.x
|
@ -1,336 +0,0 @@
|
|||
%/*
|
||||
% * Sun RPC is a product of Sun Microsystems, Inc. and is provided for
|
||||
% * unrestricted use provided that this legend is included on all tape
|
||||
% * media and as a part of the software program in whole or part. Users
|
||||
% * may copy or modify Sun RPC without charge, but are not authorized
|
||||
% * to license or distribute it to anyone else except as part of a product or
|
||||
% * program developed by the user or with the express written consent of
|
||||
% * Sun Microsystems, Inc.
|
||||
% *
|
||||
% * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE
|
||||
% * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR
|
||||
% * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE.
|
||||
% *
|
||||
% * Sun RPC is provided with no support and without any obligation on the
|
||||
% * part of Sun Microsystems, Inc. to assist in its use, correction,
|
||||
% * modification or enhancement.
|
||||
% *
|
||||
% * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE
|
||||
% * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC
|
||||
% * OR ANY PART THEREOF.
|
||||
% *
|
||||
% * In no event will Sun Microsystems, Inc. be liable for any lost revenue
|
||||
% * or profits or other special, indirect and consequential damages, even if
|
||||
% * Sun has been advised of the possibility of such damages.
|
||||
% *
|
||||
% * Sun Microsystems, Inc.
|
||||
% * 2550 Garcia Avenue
|
||||
% * Mountain View, California 94043
|
||||
% */
|
||||
|
||||
%/*
|
||||
% * Copyright (c) 1985, 1990 by Sun Microsystems, Inc.
|
||||
% */
|
||||
%
|
||||
%/* from @(#)mount.x 1.3 91/03/11 TIRPC 1.0 */
|
||||
|
||||
/*
|
||||
* Protocol description for the mount program
|
||||
*/
|
||||
|
||||
#ifdef RPC_HDR
|
||||
%#ifndef _rpcsvc_mount_h
|
||||
%#define _rpcsvc_mount_h
|
||||
#endif
|
||||
|
||||
#ifdef RPC_CLNT
|
||||
%#include <string.h> /* for memset() */
|
||||
#endif
|
||||
%#include <asm/types.h>
|
||||
|
||||
const MNTPATHLEN = 1024; /* maximum bytes in a pathname argument */
|
||||
const MNTNAMLEN = 255; /* maximum bytes in a name argument */
|
||||
const FHSIZE = 32; /* size in bytes of a file handle */
|
||||
const FHSIZE3 = 64; /* size in bytes of a file handle */
|
||||
|
||||
/*
|
||||
* The fhandle is the file handle that the server passes to the client.
|
||||
* All file operations are done using the file handles to refer to a file
|
||||
* or a directory. The file handle can contain whatever information the
|
||||
* server needs to distinguish an individual file.
|
||||
*/
|
||||
typedef opaque fhandle[FHSIZE];
|
||||
typedef opaque fhandle3<FHSIZE3>;
|
||||
|
||||
enum mountstat3 {
|
||||
MNT_OK = 0, /* no error */
|
||||
MNT3ERR_PERM = 1, /* not owner */
|
||||
MNT3ERR_NOENT = 2, /* No such file or directory */
|
||||
MNT3ERR_IO = 5, /* I/O error */
|
||||
MNT3ERR_ACCES = 13, /* Permission denied */
|
||||
MNT3ERR_NOTDIR = 20, /* Not a directory */
|
||||
MNT3ERR_INVAL = 22, /* Invalid argument */
|
||||
MNT3ERR_NAMETOOLONG = 63, /* File name too long */
|
||||
MNT3ERR_NOTSUPP = 10004, /* Operation not supported */
|
||||
MNT3ERR_SERVERFAULT = 10006 /* A failure on the server */
|
||||
};
|
||||
|
||||
/*
|
||||
* If a status of zero is returned, the call completed successfully, and
|
||||
* a file handle for the directory follows. A non-zero status indicates
|
||||
* some sort of error. The status corresponds with UNIX error numbers.
|
||||
*/
|
||||
union fhstatus switch (unsigned fhs_status) {
|
||||
case 0:
|
||||
fhandle fhs_fhandle;
|
||||
default:
|
||||
void;
|
||||
};
|
||||
|
||||
struct mountres3_ok {
|
||||
fhandle3 fhandle;
|
||||
int auth_flavours<>;
|
||||
};
|
||||
|
||||
union mountres3 switch (mountstat3 fhs_status) {
|
||||
case MNT_OK:
|
||||
mountres3_ok mountinfo;
|
||||
default:
|
||||
void;
|
||||
};
|
||||
|
||||
/*
|
||||
* The type dirpath is the pathname of a directory
|
||||
*/
|
||||
typedef string dirpath<MNTPATHLEN>;
|
||||
|
||||
/*
|
||||
* The type name is used for arbitrary names (hostnames, groupnames)
|
||||
*/
|
||||
typedef string name<MNTNAMLEN>;
|
||||
|
||||
/*
|
||||
* A list of who has what mounted
|
||||
*/
|
||||
typedef struct mountbody *mountlist;
|
||||
struct mountbody {
|
||||
name ml_hostname;
|
||||
dirpath ml_directory;
|
||||
mountlist ml_next;
|
||||
};
|
||||
|
||||
/*
|
||||
* A list of netgroups
|
||||
*/
|
||||
typedef struct groupnode *groups;
|
||||
struct groupnode {
|
||||
name gr_name;
|
||||
groups gr_next;
|
||||
};
|
||||
|
||||
/*
|
||||
* A list of what is exported and to whom
|
||||
*/
|
||||
typedef struct exportnode *exports;
|
||||
struct exportnode {
|
||||
dirpath ex_dir;
|
||||
groups ex_groups;
|
||||
exports ex_next;
|
||||
};
|
||||
|
||||
/*
|
||||
* POSIX pathconf information
|
||||
*/
|
||||
struct ppathcnf {
|
||||
int pc_link_max; /* max links allowed */
|
||||
short pc_max_canon; /* max line len for a tty */
|
||||
short pc_max_input; /* input a tty can eat all at once */
|
||||
short pc_name_max; /* max file name length (dir entry) */
|
||||
short pc_path_max; /* max path name length (/x/y/x/.. ) */
|
||||
short pc_pipe_buf; /* size of a pipe (bytes) */
|
||||
u_char pc_vdisable; /* safe char to turn off c_cc[i] */
|
||||
char pc_xxx; /* alignment padding; cc_t == char */
|
||||
short pc_mask[2]; /* validity and boolean bits */
|
||||
};
|
||||
|
||||
program MOUNTPROG {
|
||||
/*
|
||||
* Version one of the mount protocol communicates with version two
|
||||
* of the NFS protocol. The only connecting point is the fhandle
|
||||
* structure, which is the same for both protocols.
|
||||
*/
|
||||
version MOUNTVERS {
|
||||
/*
|
||||
* Does no work. It is made available in all RPC services
|
||||
* to allow server reponse testing and timing
|
||||
*/
|
||||
void
|
||||
MOUNTPROC_NULL(void) = 0;
|
||||
|
||||
/*
|
||||
* If fhs_status is 0, then fhs_fhandle contains the
|
||||
* file handle for the directory. This file handle may
|
||||
* be used in the NFS protocol. This procedure also adds
|
||||
* a new entry to the mount list for this client mounting
|
||||
* the directory.
|
||||
* Unix authentication required.
|
||||
*/
|
||||
fhstatus
|
||||
MOUNTPROC_MNT(dirpath) = 1;
|
||||
|
||||
/*
|
||||
* Returns the list of remotely mounted filesystems. The
|
||||
* mountlist contains one entry for each hostname and
|
||||
* directory pair.
|
||||
*/
|
||||
mountlist
|
||||
MOUNTPROC_DUMP(void) = 2;
|
||||
|
||||
/*
|
||||
* Removes the mount list entry for the directory
|
||||
* Unix authentication required.
|
||||
*/
|
||||
void
|
||||
MOUNTPROC_UMNT(dirpath) = 3;
|
||||
|
||||
/*
|
||||
* Removes all of the mount list entries for this client
|
||||
* Unix authentication required.
|
||||
*/
|
||||
void
|
||||
MOUNTPROC_UMNTALL(void) = 4;
|
||||
|
||||
/*
|
||||
* Returns a list of all the exported filesystems, and which
|
||||
* machines are allowed to import it.
|
||||
*/
|
||||
exports
|
||||
MOUNTPROC_EXPORT(void) = 5;
|
||||
|
||||
/*
|
||||
* Identical to MOUNTPROC_EXPORT above
|
||||
*/
|
||||
exports
|
||||
MOUNTPROC_EXPORTALL(void) = 6;
|
||||
} = 1;
|
||||
|
||||
/*
|
||||
* Version two of the mount protocol communicates with version two
|
||||
* of the NFS protocol.
|
||||
* The only difference from version one is the addition of a POSIX
|
||||
* pathconf call.
|
||||
*/
|
||||
version MOUNTVERS_POSIX {
|
||||
/*
|
||||
* Does no work. It is made available in all RPC services
|
||||
* to allow server reponse testing and timing
|
||||
*/
|
||||
void
|
||||
MOUNTPROC_NULL(void) = 0;
|
||||
|
||||
/*
|
||||
* If fhs_status is 0, then fhs_fhandle contains the
|
||||
* file handle for the directory. This file handle may
|
||||
* be used in the NFS protocol. This procedure also adds
|
||||
* a new entry to the mount list for this client mounting
|
||||
* the directory.
|
||||
* Unix authentication required.
|
||||
*/
|
||||
fhstatus
|
||||
MOUNTPROC_MNT(dirpath) = 1;
|
||||
|
||||
/*
|
||||
* Returns the list of remotely mounted filesystems. The
|
||||
* mountlist contains one entry for each hostname and
|
||||
* directory pair.
|
||||
*/
|
||||
mountlist
|
||||
MOUNTPROC_DUMP(void) = 2;
|
||||
|
||||
/*
|
||||
* Removes the mount list entry for the directory
|
||||
* Unix authentication required.
|
||||
*/
|
||||
void
|
||||
MOUNTPROC_UMNT(dirpath) = 3;
|
||||
|
||||
/*
|
||||
* Removes all of the mount list entries for this client
|
||||
* Unix authentication required.
|
||||
*/
|
||||
void
|
||||
MOUNTPROC_UMNTALL(void) = 4;
|
||||
|
||||
/*
|
||||
* Returns a list of all the exported filesystems, and which
|
||||
* machines are allowed to import it.
|
||||
*/
|
||||
exports
|
||||
MOUNTPROC_EXPORT(void) = 5;
|
||||
|
||||
/*
|
||||
* Identical to MOUNTPROC_EXPORT above
|
||||
*/
|
||||
exports
|
||||
MOUNTPROC_EXPORTALL(void) = 6;
|
||||
|
||||
/*
|
||||
* POSIX pathconf info (Sun hack)
|
||||
*/
|
||||
ppathcnf
|
||||
MOUNTPROC_PATHCONF(dirpath) = 7;
|
||||
} = 2;
|
||||
version MOUNT_V3 {
|
||||
/*
|
||||
* Does no work. It is made available in all RPC services
|
||||
* to allow server reponse testing and timing
|
||||
*/
|
||||
void
|
||||
MOUNTPROC3_NULL(void) = 0;
|
||||
|
||||
/*
|
||||
* If fhs_status is 0, then fhs_fhandle contains the
|
||||
* file handle for the directory. This file handle may
|
||||
* be used in the NFS protocol. This procedure also adds
|
||||
* a new entry to the mount list for this client mounting
|
||||
* the directory.
|
||||
* Unix authentication required.
|
||||
*/
|
||||
mountres3
|
||||
MOUNTPROC3_MNT(dirpath) = 1;
|
||||
|
||||
/*
|
||||
* Returns the list of remotely mounted filesystems. The
|
||||
* mountlist contains one entry for each hostname and
|
||||
* directory pair.
|
||||
*/
|
||||
mountlist
|
||||
MOUNTPROC3_DUMP(void) = 2;
|
||||
|
||||
/*
|
||||
* Removes the mount list entry for the directory
|
||||
* Unix authentication required.
|
||||
*/
|
||||
void
|
||||
MOUNTPROC3_UMNT(dirpath) = 3;
|
||||
|
||||
/*
|
||||
* Removes all of the mount list entries for this client
|
||||
* Unix authentication required.
|
||||
*/
|
||||
void
|
||||
MOUNTPROC3_UMNTALL(void) = 4;
|
||||
|
||||
/*
|
||||
* Returns a list of all the exported filesystems, and which
|
||||
* machines are allowed to import it.
|
||||
*/
|
||||
exports
|
||||
MOUNTPROC3_EXPORT(void) = 5;
|
||||
|
||||
} = 3;
|
||||
} = 100005;
|
||||
|
||||
#ifdef RPC_HDR
|
||||
%#endif /*!_rpcsvc_mount_h*/
|
||||
#endif
|
|
@ -1,361 +0,0 @@
|
|||
/*
|
||||
* Please do not edit this file.
|
||||
* It was generated using rpcgen.
|
||||
*/
|
||||
|
||||
#include <memory.h> /* for memset */
|
||||
#include "nfsmount.h"
|
||||
/*
|
||||
* Sun RPC is a product of Sun Microsystems, Inc. and is provided for
|
||||
* unrestricted use provided that this legend is included on all tape
|
||||
* media and as a part of the software program in whole or part. Users
|
||||
* may copy or modify Sun RPC without charge, but are not authorized
|
||||
* to license or distribute it to anyone else except as part of a product or
|
||||
* program developed by the user or with the express written consent of
|
||||
* Sun Microsystems, Inc.
|
||||
*
|
||||
* SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE
|
||||
* WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR
|
||||
* PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE.
|
||||
*
|
||||
* Sun RPC is provided with no support and without any obligation on the
|
||||
* part of Sun Microsystems, Inc. to assist in its use, correction,
|
||||
* modification or enhancement.
|
||||
*
|
||||
* SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE
|
||||
* INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC
|
||||
* OR ANY PART THEREOF.
|
||||
*
|
||||
* In no event will Sun Microsystems, Inc. be liable for any lost revenue
|
||||
* or profits or other special, indirect and consequential damages, even if
|
||||
* Sun has been advised of the possibility of such damages.
|
||||
*
|
||||
* Sun Microsystems, Inc.
|
||||
* 2550 Garcia Avenue
|
||||
* Mountain View, California 94043
|
||||
*/
|
||||
/*
|
||||
* Copyright (c) 1985, 1990 by Sun Microsystems, Inc.
|
||||
*/
|
||||
|
||||
/* from @(#)mount.x 1.3 91/03/11 TIRPC 1.0 */
|
||||
#include <string.h> /* for memset() */
|
||||
#include <asm/types.h>
|
||||
|
||||
/* Default timeout can be changed using clnt_control() */
|
||||
static struct timeval TIMEOUT = { 25, 0 };
|
||||
|
||||
void *
|
||||
mountproc_null_1(void *argp, CLIENT *clnt)
|
||||
{
|
||||
static char clnt_res;
|
||||
|
||||
memset((char *)&clnt_res, 0, sizeof(clnt_res));
|
||||
if (clnt_call (clnt, MOUNTPROC_NULL,
|
||||
(xdrproc_t) xdr_void, (caddr_t) argp,
|
||||
(xdrproc_t) xdr_void, (caddr_t) &clnt_res,
|
||||
TIMEOUT) != RPC_SUCCESS) {
|
||||
return (NULL);
|
||||
}
|
||||
return ((void *)&clnt_res);
|
||||
}
|
||||
|
||||
fhstatus *
|
||||
mountproc_mnt_1(dirpath *argp, CLIENT *clnt)
|
||||
{
|
||||
static fhstatus clnt_res;
|
||||
|
||||
memset((char *)&clnt_res, 0, sizeof(clnt_res));
|
||||
if (clnt_call (clnt, MOUNTPROC_MNT,
|
||||
(xdrproc_t) xdr_dirpath, (caddr_t) argp,
|
||||
(xdrproc_t) xdr_fhstatus, (caddr_t) &clnt_res,
|
||||
TIMEOUT) != RPC_SUCCESS) {
|
||||
return (NULL);
|
||||
}
|
||||
return (&clnt_res);
|
||||
}
|
||||
|
||||
mountlist *
|
||||
mountproc_dump_1(void *argp, CLIENT *clnt)
|
||||
{
|
||||
static mountlist clnt_res;
|
||||
|
||||
memset((char *)&clnt_res, 0, sizeof(clnt_res));
|
||||
if (clnt_call (clnt, MOUNTPROC_DUMP,
|
||||
(xdrproc_t) xdr_void, (caddr_t) argp,
|
||||
(xdrproc_t) xdr_mountlist, (caddr_t) &clnt_res,
|
||||
TIMEOUT) != RPC_SUCCESS) {
|
||||
return (NULL);
|
||||
}
|
||||
return (&clnt_res);
|
||||
}
|
||||
|
||||
void *
|
||||
mountproc_umnt_1(dirpath *argp, CLIENT *clnt)
|
||||
{
|
||||
static char clnt_res;
|
||||
|
||||
memset((char *)&clnt_res, 0, sizeof(clnt_res));
|
||||
if (clnt_call (clnt, MOUNTPROC_UMNT,
|
||||
(xdrproc_t) xdr_dirpath, (caddr_t) argp,
|
||||
(xdrproc_t) xdr_void, (caddr_t) &clnt_res,
|
||||
TIMEOUT) != RPC_SUCCESS) {
|
||||
return (NULL);
|
||||
}
|
||||
return ((void *)&clnt_res);
|
||||
}
|
||||
|
||||
void *
|
||||
mountproc_umntall_1(void *argp, CLIENT *clnt)
|
||||
{
|
||||
static char clnt_res;
|
||||
|
||||
memset((char *)&clnt_res, 0, sizeof(clnt_res));
|
||||
if (clnt_call (clnt, MOUNTPROC_UMNTALL,
|
||||
(xdrproc_t) xdr_void, (caddr_t) argp,
|
||||
(xdrproc_t) xdr_void, (caddr_t) &clnt_res,
|
||||
TIMEOUT) != RPC_SUCCESS) {
|
||||
return (NULL);
|
||||
}
|
||||
return ((void *)&clnt_res);
|
||||
}
|
||||
|
||||
exports *
|
||||
mountproc_export_1(void *argp, CLIENT *clnt)
|
||||
{
|
||||
static exports clnt_res;
|
||||
|
||||
memset((char *)&clnt_res, 0, sizeof(clnt_res));
|
||||
if (clnt_call (clnt, MOUNTPROC_EXPORT,
|
||||
(xdrproc_t) xdr_void, (caddr_t) argp,
|
||||
(xdrproc_t) xdr_exports, (caddr_t) &clnt_res,
|
||||
TIMEOUT) != RPC_SUCCESS) {
|
||||
return (NULL);
|
||||
}
|
||||
return (&clnt_res);
|
||||
}
|
||||
|
||||
exports *
|
||||
mountproc_exportall_1(void *argp, CLIENT *clnt)
|
||||
{
|
||||
static exports clnt_res;
|
||||
|
||||
memset((char *)&clnt_res, 0, sizeof(clnt_res));
|
||||
if (clnt_call (clnt, MOUNTPROC_EXPORTALL,
|
||||
(xdrproc_t) xdr_void, (caddr_t) argp,
|
||||
(xdrproc_t) xdr_exports, (caddr_t) &clnt_res,
|
||||
TIMEOUT) != RPC_SUCCESS) {
|
||||
return (NULL);
|
||||
}
|
||||
return (&clnt_res);
|
||||
}
|
||||
|
||||
void *
|
||||
mountproc_null_2(void *argp, CLIENT *clnt)
|
||||
{
|
||||
static char clnt_res;
|
||||
|
||||
memset((char *)&clnt_res, 0, sizeof(clnt_res));
|
||||
if (clnt_call (clnt, MOUNTPROC_NULL,
|
||||
(xdrproc_t) xdr_void, (caddr_t) argp,
|
||||
(xdrproc_t) xdr_void, (caddr_t) &clnt_res,
|
||||
TIMEOUT) != RPC_SUCCESS) {
|
||||
return (NULL);
|
||||
}
|
||||
return ((void *)&clnt_res);
|
||||
}
|
||||
|
||||
fhstatus *
|
||||
mountproc_mnt_2(dirpath *argp, CLIENT *clnt)
|
||||
{
|
||||
static fhstatus clnt_res;
|
||||
|
||||
memset((char *)&clnt_res, 0, sizeof(clnt_res));
|
||||
if (clnt_call (clnt, MOUNTPROC_MNT,
|
||||
(xdrproc_t) xdr_dirpath, (caddr_t) argp,
|
||||
(xdrproc_t) xdr_fhstatus, (caddr_t) &clnt_res,
|
||||
TIMEOUT) != RPC_SUCCESS) {
|
||||
return (NULL);
|
||||
}
|
||||
return (&clnt_res);
|
||||
}
|
||||
|
||||
mountlist *
|
||||
mountproc_dump_2(void *argp, CLIENT *clnt)
|
||||
{
|
||||
static mountlist clnt_res;
|
||||
|
||||
memset((char *)&clnt_res, 0, sizeof(clnt_res));
|
||||
if (clnt_call (clnt, MOUNTPROC_DUMP,
|
||||
(xdrproc_t) xdr_void, (caddr_t) argp,
|
||||
(xdrproc_t) xdr_mountlist, (caddr_t) &clnt_res,
|
||||
TIMEOUT) != RPC_SUCCESS) {
|
||||
return (NULL);
|
||||
}
|
||||
return (&clnt_res);
|
||||
}
|
||||
|
||||
void *
|
||||
mountproc_umnt_2(dirpath *argp, CLIENT *clnt)
|
||||
{
|
||||
static char clnt_res;
|
||||
|
||||
memset((char *)&clnt_res, 0, sizeof(clnt_res));
|
||||
if (clnt_call (clnt, MOUNTPROC_UMNT,
|
||||
(xdrproc_t) xdr_dirpath, (caddr_t) argp,
|
||||
(xdrproc_t) xdr_void, (caddr_t) &clnt_res,
|
||||
TIMEOUT) != RPC_SUCCESS) {
|
||||
return (NULL);
|
||||
}
|
||||
return ((void *)&clnt_res);
|
||||
}
|
||||
|
||||
void *
|
||||
mountproc_umntall_2(void *argp, CLIENT *clnt)
|
||||
{
|
||||
static char clnt_res;
|
||||
|
||||
memset((char *)&clnt_res, 0, sizeof(clnt_res));
|
||||
if (clnt_call (clnt, MOUNTPROC_UMNTALL,
|
||||
(xdrproc_t) xdr_void, (caddr_t) argp,
|
||||
(xdrproc_t) xdr_void, (caddr_t) &clnt_res,
|
||||
TIMEOUT) != RPC_SUCCESS) {
|
||||
return (NULL);
|
||||
}
|
||||
return ((void *)&clnt_res);
|
||||
}
|
||||
|
||||
exports *
|
||||
mountproc_export_2(void *argp, CLIENT *clnt)
|
||||
{
|
||||
static exports clnt_res;
|
||||
|
||||
memset((char *)&clnt_res, 0, sizeof(clnt_res));
|
||||
if (clnt_call (clnt, MOUNTPROC_EXPORT,
|
||||
(xdrproc_t) xdr_void, (caddr_t) argp,
|
||||
(xdrproc_t) xdr_exports, (caddr_t) &clnt_res,
|
||||
TIMEOUT) != RPC_SUCCESS) {
|
||||
return (NULL);
|
||||
}
|
||||
return (&clnt_res);
|
||||
}
|
||||
|
||||
exports *
|
||||
mountproc_exportall_2(void *argp, CLIENT *clnt)
|
||||
{
|
||||
static exports clnt_res;
|
||||
|
||||
memset((char *)&clnt_res, 0, sizeof(clnt_res));
|
||||
if (clnt_call (clnt, MOUNTPROC_EXPORTALL,
|
||||
(xdrproc_t) xdr_void, (caddr_t) argp,
|
||||
(xdrproc_t) xdr_exports, (caddr_t) &clnt_res,
|
||||
TIMEOUT) != RPC_SUCCESS) {
|
||||
return (NULL);
|
||||
}
|
||||
return (&clnt_res);
|
||||
}
|
||||
|
||||
ppathcnf *
|
||||
mountproc_pathconf_2(dirpath *argp, CLIENT *clnt)
|
||||
{
|
||||
static ppathcnf clnt_res;
|
||||
|
||||
memset((char *)&clnt_res, 0, sizeof(clnt_res));
|
||||
if (clnt_call (clnt, MOUNTPROC_PATHCONF,
|
||||
(xdrproc_t) xdr_dirpath, (caddr_t) argp,
|
||||
(xdrproc_t) xdr_ppathcnf, (caddr_t) &clnt_res,
|
||||
TIMEOUT) != RPC_SUCCESS) {
|
||||
return (NULL);
|
||||
}
|
||||
return (&clnt_res);
|
||||
}
|
||||
|
||||
void *
|
||||
mountproc3_null_3(void *argp, CLIENT *clnt)
|
||||
{
|
||||
static char clnt_res;
|
||||
|
||||
memset((char *)&clnt_res, 0, sizeof(clnt_res));
|
||||
if (clnt_call (clnt, MOUNTPROC3_NULL,
|
||||
(xdrproc_t) xdr_void, (caddr_t) argp,
|
||||
(xdrproc_t) xdr_void, (caddr_t) &clnt_res,
|
||||
TIMEOUT) != RPC_SUCCESS) {
|
||||
return (NULL);
|
||||
}
|
||||
return ((void *)&clnt_res);
|
||||
}
|
||||
|
||||
mountres3 *
|
||||
mountproc3_mnt_3(dirpath *argp, CLIENT *clnt)
|
||||
{
|
||||
static mountres3 clnt_res;
|
||||
|
||||
memset((char *)&clnt_res, 0, sizeof(clnt_res));
|
||||
if (clnt_call (clnt, MOUNTPROC3_MNT,
|
||||
(xdrproc_t) xdr_dirpath, (caddr_t) argp,
|
||||
(xdrproc_t) xdr_mountres3, (caddr_t) &clnt_res,
|
||||
TIMEOUT) != RPC_SUCCESS) {
|
||||
return (NULL);
|
||||
}
|
||||
return (&clnt_res);
|
||||
}
|
||||
|
||||
mountlist *
|
||||
mountproc3_dump_3(void *argp, CLIENT *clnt)
|
||||
{
|
||||
static mountlist clnt_res;
|
||||
|
||||
memset((char *)&clnt_res, 0, sizeof(clnt_res));
|
||||
if (clnt_call (clnt, MOUNTPROC3_DUMP,
|
||||
(xdrproc_t) xdr_void, (caddr_t) argp,
|
||||
(xdrproc_t) xdr_mountlist, (caddr_t) &clnt_res,
|
||||
TIMEOUT) != RPC_SUCCESS) {
|
||||
return (NULL);
|
||||
}
|
||||
return (&clnt_res);
|
||||
}
|
||||
|
||||
void *
|
||||
mountproc3_umnt_3(dirpath *argp, CLIENT *clnt)
|
||||
{
|
||||
static char clnt_res;
|
||||
|
||||
memset((char *)&clnt_res, 0, sizeof(clnt_res));
|
||||
if (clnt_call (clnt, MOUNTPROC3_UMNT,
|
||||
(xdrproc_t) xdr_dirpath, (caddr_t) argp,
|
||||
(xdrproc_t) xdr_void, (caddr_t) &clnt_res,
|
||||
TIMEOUT) != RPC_SUCCESS) {
|
||||
return (NULL);
|
||||
}
|
||||
return ((void *)&clnt_res);
|
||||
}
|
||||
|
||||
void *
|
||||
mountproc3_umntall_3(void *argp, CLIENT *clnt)
|
||||
{
|
||||
static char clnt_res;
|
||||
|
||||
memset((char *)&clnt_res, 0, sizeof(clnt_res));
|
||||
if (clnt_call (clnt, MOUNTPROC3_UMNTALL,
|
||||
(xdrproc_t) xdr_void, (caddr_t) argp,
|
||||
(xdrproc_t) xdr_void, (caddr_t) &clnt_res,
|
||||
TIMEOUT) != RPC_SUCCESS) {
|
||||
return (NULL);
|
||||
}
|
||||
return ((void *)&clnt_res);
|
||||
}
|
||||
|
||||
exports *
|
||||
mountproc3_export_3(void *argp, CLIENT *clnt)
|
||||
{
|
||||
static exports clnt_res;
|
||||
|
||||
memset((char *)&clnt_res, 0, sizeof(clnt_res));
|
||||
if (clnt_call (clnt, MOUNTPROC3_EXPORT,
|
||||
(xdrproc_t) xdr_void, (caddr_t) argp,
|
||||
(xdrproc_t) xdr_exports, (caddr_t) &clnt_res,
|
||||
TIMEOUT) != RPC_SUCCESS) {
|
||||
return (NULL);
|
||||
}
|
||||
return (&clnt_res);
|
||||
}
|
|
@ -1,329 +0,0 @@
|
|||
/*
|
||||
* Please do not edit this file.
|
||||
* It was generated using rpcgen.
|
||||
*/
|
||||
|
||||
#include "nfsmount.h"
|
||||
/*
|
||||
* Sun RPC is a product of Sun Microsystems, Inc. and is provided for
|
||||
* unrestricted use provided that this legend is included on all tape
|
||||
* media and as a part of the software program in whole or part. Users
|
||||
* may copy or modify Sun RPC without charge, but are not authorized
|
||||
* to license or distribute it to anyone else except as part of a product or
|
||||
* program developed by the user or with the express written consent of
|
||||
* Sun Microsystems, Inc.
|
||||
*
|
||||
* SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE
|
||||
* WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR
|
||||
* PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE.
|
||||
*
|
||||
* Sun RPC is provided with no support and without any obligation on the
|
||||
* part of Sun Microsystems, Inc. to assist in its use, correction,
|
||||
* modification or enhancement.
|
||||
*
|
||||
* SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE
|
||||
* INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC
|
||||
* OR ANY PART THEREOF.
|
||||
*
|
||||
* In no event will Sun Microsystems, Inc. be liable for any lost revenue
|
||||
* or profits or other special, indirect and consequential damages, even if
|
||||
* Sun has been advised of the possibility of such damages.
|
||||
*
|
||||
* Sun Microsystems, Inc.
|
||||
* 2550 Garcia Avenue
|
||||
* Mountain View, California 94043
|
||||
*/
|
||||
/*
|
||||
* Copyright (c) 1985, 1990 by Sun Microsystems, Inc.
|
||||
*/
|
||||
|
||||
/* from @(#)mount.x 1.3 91/03/11 TIRPC 1.0 */
|
||||
#include <asm/types.h>
|
||||
|
||||
bool_t
|
||||
xdr_fhandle (XDR *xdrs, fhandle objp)
|
||||
{
|
||||
register int32_t *buf;
|
||||
|
||||
if (!xdr_opaque (xdrs, objp, FHSIZE))
|
||||
return FALSE;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
bool_t
|
||||
xdr_fhandle3 (XDR *xdrs, fhandle3 *objp)
|
||||
{
|
||||
register int32_t *buf;
|
||||
|
||||
if (!xdr_bytes (xdrs, (char **)&objp->fhandle3_val, (u_int *) &objp->fhandle3_len, FHSIZE3))
|
||||
return FALSE;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
bool_t
|
||||
xdr_mountstat3 (XDR *xdrs, mountstat3 *objp)
|
||||
{
|
||||
register int32_t *buf;
|
||||
|
||||
if (!xdr_enum (xdrs, (enum_t *) objp))
|
||||
return FALSE;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
bool_t
|
||||
xdr_fhstatus (XDR *xdrs, fhstatus *objp)
|
||||
{
|
||||
register int32_t *buf;
|
||||
|
||||
if (!xdr_u_int (xdrs, &objp->fhs_status))
|
||||
return FALSE;
|
||||
switch (objp->fhs_status) {
|
||||
case 0:
|
||||
if (!xdr_fhandle (xdrs, objp->fhstatus_u.fhs_fhandle))
|
||||
return FALSE;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
bool_t
|
||||
xdr_mountres3_ok (XDR *xdrs, mountres3_ok *objp)
|
||||
{
|
||||
register int32_t *buf;
|
||||
|
||||
if (!xdr_fhandle3 (xdrs, &objp->fhandle))
|
||||
return FALSE;
|
||||
if (!xdr_array (xdrs, (char **)&objp->auth_flavours.auth_flavours_val, (u_int *) &objp->auth_flavours.auth_flavours_len, ~0,
|
||||
sizeof (int), (xdrproc_t) xdr_int))
|
||||
return FALSE;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
bool_t
|
||||
xdr_mountres3 (XDR *xdrs, mountres3 *objp)
|
||||
{
|
||||
register int32_t *buf;
|
||||
|
||||
if (!xdr_mountstat3 (xdrs, &objp->fhs_status))
|
||||
return FALSE;
|
||||
switch (objp->fhs_status) {
|
||||
case MNT_OK:
|
||||
if (!xdr_mountres3_ok (xdrs, &objp->mountres3_u.mountinfo))
|
||||
return FALSE;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
bool_t
|
||||
xdr_dirpath (XDR *xdrs, dirpath *objp)
|
||||
{
|
||||
register int32_t *buf;
|
||||
|
||||
if (!xdr_string (xdrs, objp, MNTPATHLEN))
|
||||
return FALSE;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
bool_t
|
||||
xdr_name (XDR *xdrs, name *objp)
|
||||
{
|
||||
register int32_t *buf;
|
||||
|
||||
if (!xdr_string (xdrs, objp, MNTNAMLEN))
|
||||
return FALSE;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
bool_t
|
||||
xdr_mountlist (XDR *xdrs, mountlist *objp)
|
||||
{
|
||||
register int32_t *buf;
|
||||
|
||||
if (!xdr_pointer (xdrs, (char **)objp, sizeof (struct mountbody), (xdrproc_t) xdr_mountbody))
|
||||
return FALSE;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
bool_t
|
||||
xdr_mountbody (XDR *xdrs, mountbody *objp)
|
||||
{
|
||||
register int32_t *buf;
|
||||
|
||||
if (!xdr_name (xdrs, &objp->ml_hostname))
|
||||
return FALSE;
|
||||
if (!xdr_dirpath (xdrs, &objp->ml_directory))
|
||||
return FALSE;
|
||||
if (!xdr_mountlist (xdrs, &objp->ml_next))
|
||||
return FALSE;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
bool_t
|
||||
xdr_groups (XDR *xdrs, groups *objp)
|
||||
{
|
||||
register int32_t *buf;
|
||||
|
||||
if (!xdr_pointer (xdrs, (char **)objp, sizeof (struct groupnode), (xdrproc_t) xdr_groupnode))
|
||||
return FALSE;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
bool_t
|
||||
xdr_groupnode (XDR *xdrs, groupnode *objp)
|
||||
{
|
||||
register int32_t *buf;
|
||||
|
||||
if (!xdr_name (xdrs, &objp->gr_name))
|
||||
return FALSE;
|
||||
if (!xdr_groups (xdrs, &objp->gr_next))
|
||||
return FALSE;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
bool_t
|
||||
xdr_exports (XDR *xdrs, exports *objp)
|
||||
{
|
||||
register int32_t *buf;
|
||||
|
||||
if (!xdr_pointer (xdrs, (char **)objp, sizeof (struct exportnode), (xdrproc_t) xdr_exportnode))
|
||||
return FALSE;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
bool_t
|
||||
xdr_exportnode (XDR *xdrs, exportnode *objp)
|
||||
{
|
||||
register int32_t *buf;
|
||||
|
||||
if (!xdr_dirpath (xdrs, &objp->ex_dir))
|
||||
return FALSE;
|
||||
if (!xdr_groups (xdrs, &objp->ex_groups))
|
||||
return FALSE;
|
||||
if (!xdr_exports (xdrs, &objp->ex_next))
|
||||
return FALSE;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
bool_t
|
||||
xdr_ppathcnf (XDR *xdrs, ppathcnf *objp)
|
||||
{
|
||||
register int32_t *buf;
|
||||
|
||||
int i;
|
||||
|
||||
if (xdrs->x_op == XDR_ENCODE) {
|
||||
buf = XDR_INLINE (xdrs, 6 * BYTES_PER_XDR_UNIT);
|
||||
if (buf == NULL) {
|
||||
if (!xdr_int (xdrs, &objp->pc_link_max))
|
||||
return FALSE;
|
||||
if (!xdr_short (xdrs, &objp->pc_max_canon))
|
||||
return FALSE;
|
||||
if (!xdr_short (xdrs, &objp->pc_max_input))
|
||||
return FALSE;
|
||||
if (!xdr_short (xdrs, &objp->pc_name_max))
|
||||
return FALSE;
|
||||
if (!xdr_short (xdrs, &objp->pc_path_max))
|
||||
return FALSE;
|
||||
if (!xdr_short (xdrs, &objp->pc_pipe_buf))
|
||||
return FALSE;
|
||||
|
||||
} else {
|
||||
IXDR_PUT_LONG(buf, objp->pc_link_max);
|
||||
IXDR_PUT_SHORT(buf, objp->pc_max_canon);
|
||||
IXDR_PUT_SHORT(buf, objp->pc_max_input);
|
||||
IXDR_PUT_SHORT(buf, objp->pc_name_max);
|
||||
IXDR_PUT_SHORT(buf, objp->pc_path_max);
|
||||
IXDR_PUT_SHORT(buf, objp->pc_pipe_buf);
|
||||
}
|
||||
if (!xdr_u_char (xdrs, &objp->pc_vdisable))
|
||||
return FALSE;
|
||||
if (!xdr_char (xdrs, &objp->pc_xxx))
|
||||
return FALSE;
|
||||
buf = XDR_INLINE (xdrs, ( 2 ) * BYTES_PER_XDR_UNIT);
|
||||
if (buf == NULL) {
|
||||
if (!xdr_vector (xdrs, (char *)objp->pc_mask, 2,
|
||||
sizeof (short), (xdrproc_t) xdr_short))
|
||||
return FALSE;
|
||||
} else {
|
||||
{
|
||||
register short *genp;
|
||||
|
||||
for (i = 0, genp = objp->pc_mask;
|
||||
i < 2; ++i) {
|
||||
IXDR_PUT_SHORT(buf, *genp++);
|
||||
}
|
||||
}
|
||||
}
|
||||
return TRUE;
|
||||
} else if (xdrs->x_op == XDR_DECODE) {
|
||||
buf = XDR_INLINE (xdrs, 6 * BYTES_PER_XDR_UNIT);
|
||||
if (buf == NULL) {
|
||||
if (!xdr_int (xdrs, &objp->pc_link_max))
|
||||
return FALSE;
|
||||
if (!xdr_short (xdrs, &objp->pc_max_canon))
|
||||
return FALSE;
|
||||
if (!xdr_short (xdrs, &objp->pc_max_input))
|
||||
return FALSE;
|
||||
if (!xdr_short (xdrs, &objp->pc_name_max))
|
||||
return FALSE;
|
||||
if (!xdr_short (xdrs, &objp->pc_path_max))
|
||||
return FALSE;
|
||||
if (!xdr_short (xdrs, &objp->pc_pipe_buf))
|
||||
return FALSE;
|
||||
|
||||
} else {
|
||||
objp->pc_link_max = IXDR_GET_LONG(buf);
|
||||
objp->pc_max_canon = IXDR_GET_SHORT(buf);
|
||||
objp->pc_max_input = IXDR_GET_SHORT(buf);
|
||||
objp->pc_name_max = IXDR_GET_SHORT(buf);
|
||||
objp->pc_path_max = IXDR_GET_SHORT(buf);
|
||||
objp->pc_pipe_buf = IXDR_GET_SHORT(buf);
|
||||
}
|
||||
if (!xdr_u_char (xdrs, &objp->pc_vdisable))
|
||||
return FALSE;
|
||||
if (!xdr_char (xdrs, &objp->pc_xxx))
|
||||
return FALSE;
|
||||
buf = XDR_INLINE (xdrs, ( 2 ) * BYTES_PER_XDR_UNIT);
|
||||
if (buf == NULL) {
|
||||
if (!xdr_vector (xdrs, (char *)objp->pc_mask, 2,
|
||||
sizeof (short), (xdrproc_t) xdr_short))
|
||||
return FALSE;
|
||||
} else {
|
||||
{
|
||||
register short *genp;
|
||||
|
||||
for (i = 0, genp = objp->pc_mask;
|
||||
i < 2; ++i) {
|
||||
*genp++ = IXDR_GET_SHORT(buf);
|
||||
}
|
||||
}
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
if (!xdr_int (xdrs, &objp->pc_link_max))
|
||||
return FALSE;
|
||||
if (!xdr_short (xdrs, &objp->pc_max_canon))
|
||||
return FALSE;
|
||||
if (!xdr_short (xdrs, &objp->pc_max_input))
|
||||
return FALSE;
|
||||
if (!xdr_short (xdrs, &objp->pc_name_max))
|
||||
return FALSE;
|
||||
if (!xdr_short (xdrs, &objp->pc_path_max))
|
||||
return FALSE;
|
||||
if (!xdr_short (xdrs, &objp->pc_pipe_buf))
|
||||
return FALSE;
|
||||
if (!xdr_u_char (xdrs, &objp->pc_vdisable))
|
||||
return FALSE;
|
||||
if (!xdr_char (xdrs, &objp->pc_xxx))
|
||||
return FALSE;
|
||||
if (!xdr_vector (xdrs, (char *)objp->pc_mask, 2,
|
||||
sizeof (short), (xdrproc_t) xdr_short))
|
||||
return FALSE;
|
||||
return TRUE;
|
||||
}
|
|
@ -1,328 +0,0 @@
|
|||
/*
|
||||
* Please do not edit this file.
|
||||
* It was generated using rpcgen.
|
||||
*/
|
||||
|
||||
#ifndef _NFSMOUNT_H_RPCGEN
|
||||
#define _NFSMOUNT_H_RPCGEN
|
||||
|
||||
#include <rpc/rpc.h>
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Sun RPC is a product of Sun Microsystems, Inc. and is provided for
|
||||
* unrestricted use provided that this legend is included on all tape
|
||||
* media and as a part of the software program in whole or part. Users
|
||||
* may copy or modify Sun RPC without charge, but are not authorized
|
||||
* to license or distribute it to anyone else except as part of a product or
|
||||
* program developed by the user or with the express written consent of
|
||||
* Sun Microsystems, Inc.
|
||||
*
|
||||
* SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE
|
||||
* WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR
|
||||
* PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE.
|
||||
*
|
||||
* Sun RPC is provided with no support and without any obligation on the
|
||||
* part of Sun Microsystems, Inc. to assist in its use, correction,
|
||||
* modification or enhancement.
|
||||
*
|
||||
* SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE
|
||||
* INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC
|
||||
* OR ANY PART THEREOF.
|
||||
*
|
||||
* In no event will Sun Microsystems, Inc. be liable for any lost revenue
|
||||
* or profits or other special, indirect and consequential damages, even if
|
||||
* Sun has been advised of the possibility of such damages.
|
||||
*
|
||||
* Sun Microsystems, Inc.
|
||||
* 2550 Garcia Avenue
|
||||
* Mountain View, California 94043
|
||||
*/
|
||||
/*
|
||||
* Copyright (c) 1985, 1990 by Sun Microsystems, Inc.
|
||||
*/
|
||||
|
||||
/* from @(#)mount.x 1.3 91/03/11 TIRPC 1.0 */
|
||||
#ifndef _rpcsvc_mount_h
|
||||
#define _rpcsvc_mount_h
|
||||
#include <asm/types.h>
|
||||
#define MNTPATHLEN 1024
|
||||
#define MNTNAMLEN 255
|
||||
#define FHSIZE 32
|
||||
#define FHSIZE3 64
|
||||
|
||||
typedef char fhandle[FHSIZE];
|
||||
|
||||
typedef struct {
|
||||
u_int fhandle3_len;
|
||||
char *fhandle3_val;
|
||||
} fhandle3;
|
||||
|
||||
enum mountstat3 {
|
||||
MNT_OK = 0,
|
||||
MNT3ERR_PERM = 1,
|
||||
MNT3ERR_NOENT = 2,
|
||||
MNT3ERR_IO = 5,
|
||||
MNT3ERR_ACCES = 13,
|
||||
MNT3ERR_NOTDIR = 20,
|
||||
MNT3ERR_INVAL = 22,
|
||||
MNT3ERR_NAMETOOLONG = 63,
|
||||
MNT3ERR_NOTSUPP = 10004,
|
||||
MNT3ERR_SERVERFAULT = 10006,
|
||||
};
|
||||
typedef enum mountstat3 mountstat3;
|
||||
|
||||
struct fhstatus {
|
||||
u_int fhs_status;
|
||||
union {
|
||||
fhandle fhs_fhandle;
|
||||
} fhstatus_u;
|
||||
};
|
||||
typedef struct fhstatus fhstatus;
|
||||
|
||||
struct mountres3_ok {
|
||||
fhandle3 fhandle;
|
||||
struct {
|
||||
u_int auth_flavours_len;
|
||||
int *auth_flavours_val;
|
||||
} auth_flavours;
|
||||
};
|
||||
typedef struct mountres3_ok mountres3_ok;
|
||||
|
||||
struct mountres3 {
|
||||
mountstat3 fhs_status;
|
||||
union {
|
||||
mountres3_ok mountinfo;
|
||||
} mountres3_u;
|
||||
};
|
||||
typedef struct mountres3 mountres3;
|
||||
|
||||
typedef char *dirpath;
|
||||
|
||||
typedef char *name;
|
||||
|
||||
typedef struct mountbody *mountlist;
|
||||
|
||||
struct mountbody {
|
||||
name ml_hostname;
|
||||
dirpath ml_directory;
|
||||
mountlist ml_next;
|
||||
};
|
||||
typedef struct mountbody mountbody;
|
||||
|
||||
typedef struct groupnode *groups;
|
||||
|
||||
struct groupnode {
|
||||
name gr_name;
|
||||
groups gr_next;
|
||||
};
|
||||
typedef struct groupnode groupnode;
|
||||
|
||||
typedef struct exportnode *exports;
|
||||
|
||||
struct exportnode {
|
||||
dirpath ex_dir;
|
||||
groups ex_groups;
|
||||
exports ex_next;
|
||||
};
|
||||
typedef struct exportnode exportnode;
|
||||
|
||||
struct ppathcnf {
|
||||
int pc_link_max;
|
||||
short pc_max_canon;
|
||||
short pc_max_input;
|
||||
short pc_name_max;
|
||||
short pc_path_max;
|
||||
short pc_pipe_buf;
|
||||
u_char pc_vdisable;
|
||||
char pc_xxx;
|
||||
short pc_mask[2];
|
||||
};
|
||||
typedef struct ppathcnf ppathcnf;
|
||||
#endif /*!_rpcsvc_mount_h*/
|
||||
|
||||
#define MOUNTPROG 100005
|
||||
#define MOUNTVERS 1
|
||||
|
||||
#if defined(__STDC__) || defined(__cplusplus)
|
||||
#define MOUNTPROC_NULL 0
|
||||
extern void * mountproc_null_1(void *, CLIENT *);
|
||||
extern void * mountproc_null_1_svc(void *, struct svc_req *);
|
||||
#define MOUNTPROC_MNT 1
|
||||
extern fhstatus * mountproc_mnt_1(dirpath *, CLIENT *);
|
||||
extern fhstatus * mountproc_mnt_1_svc(dirpath *, struct svc_req *);
|
||||
#define MOUNTPROC_DUMP 2
|
||||
extern mountlist * mountproc_dump_1(void *, CLIENT *);
|
||||
extern mountlist * mountproc_dump_1_svc(void *, struct svc_req *);
|
||||
#define MOUNTPROC_UMNT 3
|
||||
extern void * mountproc_umnt_1(dirpath *, CLIENT *);
|
||||
extern void * mountproc_umnt_1_svc(dirpath *, struct svc_req *);
|
||||
#define MOUNTPROC_UMNTALL 4
|
||||
extern void * mountproc_umntall_1(void *, CLIENT *);
|
||||
extern void * mountproc_umntall_1_svc(void *, struct svc_req *);
|
||||
#define MOUNTPROC_EXPORT 5
|
||||
extern exports * mountproc_export_1(void *, CLIENT *);
|
||||
extern exports * mountproc_export_1_svc(void *, struct svc_req *);
|
||||
#define MOUNTPROC_EXPORTALL 6
|
||||
extern exports * mountproc_exportall_1(void *, CLIENT *);
|
||||
extern exports * mountproc_exportall_1_svc(void *, struct svc_req *);
|
||||
extern int mountprog_1_freeresult (SVCXPRT *, xdrproc_t, caddr_t);
|
||||
|
||||
#else /* K&R C */
|
||||
#define MOUNTPROC_NULL 0
|
||||
extern void * mountproc_null_1();
|
||||
extern void * mountproc_null_1_svc();
|
||||
#define MOUNTPROC_MNT 1
|
||||
extern fhstatus * mountproc_mnt_1();
|
||||
extern fhstatus * mountproc_mnt_1_svc();
|
||||
#define MOUNTPROC_DUMP 2
|
||||
extern mountlist * mountproc_dump_1();
|
||||
extern mountlist * mountproc_dump_1_svc();
|
||||
#define MOUNTPROC_UMNT 3
|
||||
extern void * mountproc_umnt_1();
|
||||
extern void * mountproc_umnt_1_svc();
|
||||
#define MOUNTPROC_UMNTALL 4
|
||||
extern void * mountproc_umntall_1();
|
||||
extern void * mountproc_umntall_1_svc();
|
||||
#define MOUNTPROC_EXPORT 5
|
||||
extern exports * mountproc_export_1();
|
||||
extern exports * mountproc_export_1_svc();
|
||||
#define MOUNTPROC_EXPORTALL 6
|
||||
extern exports * mountproc_exportall_1();
|
||||
extern exports * mountproc_exportall_1_svc();
|
||||
extern int mountprog_1_freeresult ();
|
||||
#endif /* K&R C */
|
||||
#define MOUNTVERS_POSIX 2
|
||||
|
||||
#if defined(__STDC__) || defined(__cplusplus)
|
||||
extern void * mountproc_null_2(void *, CLIENT *);
|
||||
extern void * mountproc_null_2_svc(void *, struct svc_req *);
|
||||
extern fhstatus * mountproc_mnt_2(dirpath *, CLIENT *);
|
||||
extern fhstatus * mountproc_mnt_2_svc(dirpath *, struct svc_req *);
|
||||
extern mountlist * mountproc_dump_2(void *, CLIENT *);
|
||||
extern mountlist * mountproc_dump_2_svc(void *, struct svc_req *);
|
||||
extern void * mountproc_umnt_2(dirpath *, CLIENT *);
|
||||
extern void * mountproc_umnt_2_svc(dirpath *, struct svc_req *);
|
||||
extern void * mountproc_umntall_2(void *, CLIENT *);
|
||||
extern void * mountproc_umntall_2_svc(void *, struct svc_req *);
|
||||
extern exports * mountproc_export_2(void *, CLIENT *);
|
||||
extern exports * mountproc_export_2_svc(void *, struct svc_req *);
|
||||
extern exports * mountproc_exportall_2(void *, CLIENT *);
|
||||
extern exports * mountproc_exportall_2_svc(void *, struct svc_req *);
|
||||
#define MOUNTPROC_PATHCONF 7
|
||||
extern ppathcnf * mountproc_pathconf_2(dirpath *, CLIENT *);
|
||||
extern ppathcnf * mountproc_pathconf_2_svc(dirpath *, struct svc_req *);
|
||||
extern int mountprog_2_freeresult (SVCXPRT *, xdrproc_t, caddr_t);
|
||||
|
||||
#else /* K&R C */
|
||||
extern void * mountproc_null_2();
|
||||
extern void * mountproc_null_2_svc();
|
||||
extern fhstatus * mountproc_mnt_2();
|
||||
extern fhstatus * mountproc_mnt_2_svc();
|
||||
extern mountlist * mountproc_dump_2();
|
||||
extern mountlist * mountproc_dump_2_svc();
|
||||
extern void * mountproc_umnt_2();
|
||||
extern void * mountproc_umnt_2_svc();
|
||||
extern void * mountproc_umntall_2();
|
||||
extern void * mountproc_umntall_2_svc();
|
||||
extern exports * mountproc_export_2();
|
||||
extern exports * mountproc_export_2_svc();
|
||||
extern exports * mountproc_exportall_2();
|
||||
extern exports * mountproc_exportall_2_svc();
|
||||
#define MOUNTPROC_PATHCONF 7
|
||||
extern ppathcnf * mountproc_pathconf_2();
|
||||
extern ppathcnf * mountproc_pathconf_2_svc();
|
||||
extern int mountprog_2_freeresult ();
|
||||
#endif /* K&R C */
|
||||
#define MOUNT_V3 3
|
||||
|
||||
#if defined(__STDC__) || defined(__cplusplus)
|
||||
#define MOUNTPROC3_NULL 0
|
||||
extern void * mountproc3_null_3(void *, CLIENT *);
|
||||
extern void * mountproc3_null_3_svc(void *, struct svc_req *);
|
||||
#define MOUNTPROC3_MNT 1
|
||||
extern mountres3 * mountproc3_mnt_3(dirpath *, CLIENT *);
|
||||
extern mountres3 * mountproc3_mnt_3_svc(dirpath *, struct svc_req *);
|
||||
#define MOUNTPROC3_DUMP 2
|
||||
extern mountlist * mountproc3_dump_3(void *, CLIENT *);
|
||||
extern mountlist * mountproc3_dump_3_svc(void *, struct svc_req *);
|
||||
#define MOUNTPROC3_UMNT 3
|
||||
extern void * mountproc3_umnt_3(dirpath *, CLIENT *);
|
||||
extern void * mountproc3_umnt_3_svc(dirpath *, struct svc_req *);
|
||||
#define MOUNTPROC3_UMNTALL 4
|
||||
extern void * mountproc3_umntall_3(void *, CLIENT *);
|
||||
extern void * mountproc3_umntall_3_svc(void *, struct svc_req *);
|
||||
#define MOUNTPROC3_EXPORT 5
|
||||
extern exports * mountproc3_export_3(void *, CLIENT *);
|
||||
extern exports * mountproc3_export_3_svc(void *, struct svc_req *);
|
||||
extern int mountprog_3_freeresult (SVCXPRT *, xdrproc_t, caddr_t);
|
||||
|
||||
#else /* K&R C */
|
||||
#define MOUNTPROC3_NULL 0
|
||||
extern void * mountproc3_null_3();
|
||||
extern void * mountproc3_null_3_svc();
|
||||
#define MOUNTPROC3_MNT 1
|
||||
extern mountres3 * mountproc3_mnt_3();
|
||||
extern mountres3 * mountproc3_mnt_3_svc();
|
||||
#define MOUNTPROC3_DUMP 2
|
||||
extern mountlist * mountproc3_dump_3();
|
||||
extern mountlist * mountproc3_dump_3_svc();
|
||||
#define MOUNTPROC3_UMNT 3
|
||||
extern void * mountproc3_umnt_3();
|
||||
extern void * mountproc3_umnt_3_svc();
|
||||
#define MOUNTPROC3_UMNTALL 4
|
||||
extern void * mountproc3_umntall_3();
|
||||
extern void * mountproc3_umntall_3_svc();
|
||||
#define MOUNTPROC3_EXPORT 5
|
||||
extern exports * mountproc3_export_3();
|
||||
extern exports * mountproc3_export_3_svc();
|
||||
extern int mountprog_3_freeresult ();
|
||||
#endif /* K&R C */
|
||||
|
||||
/* the xdr functions */
|
||||
|
||||
#if defined(__STDC__) || defined(__cplusplus)
|
||||
extern bool_t xdr_fhandle (XDR *, fhandle);
|
||||
extern bool_t xdr_fhandle3 (XDR *, fhandle3*);
|
||||
extern bool_t xdr_mountstat3 (XDR *, mountstat3*);
|
||||
extern bool_t xdr_fhstatus (XDR *, fhstatus*);
|
||||
extern bool_t xdr_mountres3_ok (XDR *, mountres3_ok*);
|
||||
extern bool_t xdr_mountres3 (XDR *, mountres3*);
|
||||
extern bool_t xdr_dirpath (XDR *, dirpath*);
|
||||
extern bool_t xdr_name (XDR *, name*);
|
||||
extern bool_t xdr_mountlist (XDR *, mountlist*);
|
||||
extern bool_t xdr_mountbody (XDR *, mountbody*);
|
||||
extern bool_t xdr_groups (XDR *, groups*);
|
||||
extern bool_t xdr_groupnode (XDR *, groupnode*);
|
||||
extern bool_t xdr_exports (XDR *, exports*);
|
||||
extern bool_t xdr_exportnode (XDR *, exportnode*);
|
||||
extern bool_t xdr_ppathcnf (XDR *, ppathcnf*);
|
||||
|
||||
#else /* K&R C */
|
||||
extern bool_t xdr_fhandle ();
|
||||
extern bool_t xdr_fhandle3 ();
|
||||
extern bool_t xdr_mountstat3 ();
|
||||
extern bool_t xdr_fhstatus ();
|
||||
extern bool_t xdr_mountres3_ok ();
|
||||
extern bool_t xdr_mountres3 ();
|
||||
extern bool_t xdr_dirpath ();
|
||||
extern bool_t xdr_name ();
|
||||
extern bool_t xdr_mountlist ();
|
||||
extern bool_t xdr_mountbody ();
|
||||
extern bool_t xdr_groups ();
|
||||
extern bool_t xdr_groupnode ();
|
||||
extern bool_t xdr_exports ();
|
||||
extern bool_t xdr_exportnode ();
|
||||
extern bool_t xdr_ppathcnf ();
|
||||
|
||||
#endif /* K&R C */
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* !_NFSMOUNT_H_RPCGEN */
|
|
@ -1,336 +0,0 @@
|
|||
%/*
|
||||
% * Sun RPC is a product of Sun Microsystems, Inc. and is provided for
|
||||
% * unrestricted use provided that this legend is included on all tape
|
||||
% * media and as a part of the software program in whole or part. Users
|
||||
% * may copy or modify Sun RPC without charge, but are not authorized
|
||||
% * to license or distribute it to anyone else except as part of a product or
|
||||
% * program developed by the user or with the express written consent of
|
||||
% * Sun Microsystems, Inc.
|
||||
% *
|
||||
% * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE
|
||||
% * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR
|
||||
% * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE.
|
||||
% *
|
||||
% * Sun RPC is provided with no support and without any obligation on the
|
||||
% * part of Sun Microsystems, Inc. to assist in its use, correction,
|
||||
% * modification or enhancement.
|
||||
% *
|
||||
% * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE
|
||||
% * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC
|
||||
% * OR ANY PART THEREOF.
|
||||
% *
|
||||
% * In no event will Sun Microsystems, Inc. be liable for any lost revenue
|
||||
% * or profits or other special, indirect and consequential damages, even if
|
||||
% * Sun has been advised of the possibility of such damages.
|
||||
% *
|
||||
% * Sun Microsystems, Inc.
|
||||
% * 2550 Garcia Avenue
|
||||
% * Mountain View, California 94043
|
||||
% */
|
||||
|
||||
%/*
|
||||
% * Copyright (c) 1985, 1990 by Sun Microsystems, Inc.
|
||||
% */
|
||||
%
|
||||
%/* from @(#)mount.x 1.3 91/03/11 TIRPC 1.0 */
|
||||
|
||||
/*
|
||||
* Protocol description for the mount program
|
||||
*/
|
||||
|
||||
#ifdef RPC_HDR
|
||||
%#ifndef _rpcsvc_mount_h
|
||||
%#define _rpcsvc_mount_h
|
||||
#endif
|
||||
|
||||
#ifdef RPC_CLNT
|
||||
%#include <string.h> /* for memset() */
|
||||
#endif
|
||||
%#include <asm/types.h>
|
||||
|
||||
const MNTPATHLEN = 1024; /* maximum bytes in a pathname argument */
|
||||
const MNTNAMLEN = 255; /* maximum bytes in a name argument */
|
||||
const FHSIZE = 32; /* size in bytes of a file handle */
|
||||
const FHSIZE3 = 64; /* size in bytes of a file handle */
|
||||
|
||||
/*
|
||||
* The fhandle is the file handle that the server passes to the client.
|
||||
* All file operations are done using the file handles to refer to a file
|
||||
* or a directory. The file handle can contain whatever information the
|
||||
* server needs to distinguish an individual file.
|
||||
*/
|
||||
typedef opaque fhandle[FHSIZE];
|
||||
typedef opaque fhandle3<FHSIZE3>;
|
||||
|
||||
enum mountstat3 {
|
||||
MNT_OK = 0, /* no error */
|
||||
MNT3ERR_PERM = 1, /* not owner */
|
||||
MNT3ERR_NOENT = 2, /* No such file or directory */
|
||||
MNT3ERR_IO = 5, /* I/O error */
|
||||
MNT3ERR_ACCES = 13, /* Permission denied */
|
||||
MNT3ERR_NOTDIR = 20, /* Not a directory */
|
||||
MNT3ERR_INVAL = 22, /* Invalid argument */
|
||||
MNT3ERR_NAMETOOLONG = 63, /* File name too long */
|
||||
MNT3ERR_NOTSUPP = 10004, /* Operation not supported */
|
||||
MNT3ERR_SERVERFAULT = 10006 /* A failure on the server */
|
||||
};
|
||||
|
||||
/*
|
||||
* If a status of zero is returned, the call completed successfully, and
|
||||
* a file handle for the directory follows. A non-zero status indicates
|
||||
* some sort of error. The status corresponds with UNIX error numbers.
|
||||
*/
|
||||
union fhstatus switch (unsigned fhs_status) {
|
||||
case 0:
|
||||
fhandle fhs_fhandle;
|
||||
default:
|
||||
void;
|
||||
};
|
||||
|
||||
struct mountres3_ok {
|
||||
fhandle3 fhandle;
|
||||
int auth_flavours<>;
|
||||
};
|
||||
|
||||
union mountres3 switch (mountstat3 fhs_status) {
|
||||
case MNT_OK:
|
||||
mountres3_ok mountinfo;
|
||||
default:
|
||||
void;
|
||||
};
|
||||
|
||||
/*
|
||||
* The type dirpath is the pathname of a directory
|
||||
*/
|
||||
typedef string dirpath<MNTPATHLEN>;
|
||||
|
||||
/*
|
||||
* The type name is used for arbitrary names (hostnames, groupnames)
|
||||
*/
|
||||
typedef string name<MNTNAMLEN>;
|
||||
|
||||
/*
|
||||
* A list of who has what mounted
|
||||
*/
|
||||
typedef struct mountbody *mountlist;
|
||||
struct mountbody {
|
||||
name ml_hostname;
|
||||
dirpath ml_directory;
|
||||
mountlist ml_next;
|
||||
};
|
||||
|
||||
/*
|
||||
* A list of netgroups
|
||||
*/
|
||||
typedef struct groupnode *groups;
|
||||
struct groupnode {
|
||||
name gr_name;
|
||||
groups gr_next;
|
||||
};
|
||||
|
||||
/*
|
||||
* A list of what is exported and to whom
|
||||
*/
|
||||
typedef struct exportnode *exports;
|
||||
struct exportnode {
|
||||
dirpath ex_dir;
|
||||
groups ex_groups;
|
||||
exports ex_next;
|
||||
};
|
||||
|
||||
/*
|
||||
* POSIX pathconf information
|
||||
*/
|
||||
struct ppathcnf {
|
||||
int pc_link_max; /* max links allowed */
|
||||
short pc_max_canon; /* max line len for a tty */
|
||||
short pc_max_input; /* input a tty can eat all at once */
|
||||
short pc_name_max; /* max file name length (dir entry) */
|
||||
short pc_path_max; /* max path name length (/x/y/x/.. ) */
|
||||
short pc_pipe_buf; /* size of a pipe (bytes) */
|
||||
u_char pc_vdisable; /* safe char to turn off c_cc[i] */
|
||||
char pc_xxx; /* alignment padding; cc_t == char */
|
||||
short pc_mask[2]; /* validity and boolean bits */
|
||||
};
|
||||
|
||||
program MOUNTPROG {
|
||||
/*
|
||||
* Version one of the mount protocol communicates with version two
|
||||
* of the NFS protocol. The only connecting point is the fhandle
|
||||
* structure, which is the same for both protocols.
|
||||
*/
|
||||
version MOUNTVERS {
|
||||
/*
|
||||
* Does no work. It is made available in all RPC services
|
||||
* to allow server reponse testing and timing
|
||||
*/
|
||||
void
|
||||
MOUNTPROC_NULL(void) = 0;
|
||||
|
||||
/*
|
||||
* If fhs_status is 0, then fhs_fhandle contains the
|
||||
* file handle for the directory. This file handle may
|
||||
* be used in the NFS protocol. This procedure also adds
|
||||
* a new entry to the mount list for this client mounting
|
||||
* the directory.
|
||||
* Unix authentication required.
|
||||
*/
|
||||
fhstatus
|
||||
MOUNTPROC_MNT(dirpath) = 1;
|
||||
|
||||
/*
|
||||
* Returns the list of remotely mounted filesystems. The
|
||||
* mountlist contains one entry for each hostname and
|
||||
* directory pair.
|
||||
*/
|
||||
mountlist
|
||||
MOUNTPROC_DUMP(void) = 2;
|
||||
|
||||
/*
|
||||
* Removes the mount list entry for the directory
|
||||
* Unix authentication required.
|
||||
*/
|
||||
void
|
||||
MOUNTPROC_UMNT(dirpath) = 3;
|
||||
|
||||
/*
|
||||
* Removes all of the mount list entries for this client
|
||||
* Unix authentication required.
|
||||
*/
|
||||
void
|
||||
MOUNTPROC_UMNTALL(void) = 4;
|
||||
|
||||
/*
|
||||
* Returns a list of all the exported filesystems, and which
|
||||
* machines are allowed to import it.
|
||||
*/
|
||||
exports
|
||||
MOUNTPROC_EXPORT(void) = 5;
|
||||
|
||||
/*
|
||||
* Identical to MOUNTPROC_EXPORT above
|
||||
*/
|
||||
exports
|
||||
MOUNTPROC_EXPORTALL(void) = 6;
|
||||
} = 1;
|
||||
|
||||
/*
|
||||
* Version two of the mount protocol communicates with version two
|
||||
* of the NFS protocol.
|
||||
* The only difference from version one is the addition of a POSIX
|
||||
* pathconf call.
|
||||
*/
|
||||
version MOUNTVERS_POSIX {
|
||||
/*
|
||||
* Does no work. It is made available in all RPC services
|
||||
* to allow server reponse testing and timing
|
||||
*/
|
||||
void
|
||||
MOUNTPROC_NULL(void) = 0;
|
||||
|
||||
/*
|
||||
* If fhs_status is 0, then fhs_fhandle contains the
|
||||
* file handle for the directory. This file handle may
|
||||
* be used in the NFS protocol. This procedure also adds
|
||||
* a new entry to the mount list for this client mounting
|
||||
* the directory.
|
||||
* Unix authentication required.
|
||||
*/
|
||||
fhstatus
|
||||
MOUNTPROC_MNT(dirpath) = 1;
|
||||
|
||||
/*
|
||||
* Returns the list of remotely mounted filesystems. The
|
||||
* mountlist contains one entry for each hostname and
|
||||
* directory pair.
|
||||
*/
|
||||
mountlist
|
||||
MOUNTPROC_DUMP(void) = 2;
|
||||
|
||||
/*
|
||||
* Removes the mount list entry for the directory
|
||||
* Unix authentication required.
|
||||
*/
|
||||
void
|
||||
MOUNTPROC_UMNT(dirpath) = 3;
|
||||
|
||||
/*
|
||||
* Removes all of the mount list entries for this client
|
||||
* Unix authentication required.
|
||||
*/
|
||||
void
|
||||
MOUNTPROC_UMNTALL(void) = 4;
|
||||
|
||||
/*
|
||||
* Returns a list of all the exported filesystems, and which
|
||||
* machines are allowed to import it.
|
||||
*/
|
||||
exports
|
||||
MOUNTPROC_EXPORT(void) = 5;
|
||||
|
||||
/*
|
||||
* Identical to MOUNTPROC_EXPORT above
|
||||
*/
|
||||
exports
|
||||
MOUNTPROC_EXPORTALL(void) = 6;
|
||||
|
||||
/*
|
||||
* POSIX pathconf info (Sun hack)
|
||||
*/
|
||||
ppathcnf
|
||||
MOUNTPROC_PATHCONF(dirpath) = 7;
|
||||
} = 2;
|
||||
version MOUNT_V3 {
|
||||
/*
|
||||
* Does no work. It is made available in all RPC services
|
||||
* to allow server reponse testing and timing
|
||||
*/
|
||||
void
|
||||
MOUNTPROC3_NULL(void) = 0;
|
||||
|
||||
/*
|
||||
* If fhs_status is 0, then fhs_fhandle contains the
|
||||
* file handle for the directory. This file handle may
|
||||
* be used in the NFS protocol. This procedure also adds
|
||||
* a new entry to the mount list for this client mounting
|
||||
* the directory.
|
||||
* Unix authentication required.
|
||||
*/
|
||||
mountres3
|
||||
MOUNTPROC3_MNT(dirpath) = 1;
|
||||
|
||||
/*
|
||||
* Returns the list of remotely mounted filesystems. The
|
||||
* mountlist contains one entry for each hostname and
|
||||
* directory pair.
|
||||
*/
|
||||
mountlist
|
||||
MOUNTPROC3_DUMP(void) = 2;
|
||||
|
||||
/*
|
||||
* Removes the mount list entry for the directory
|
||||
* Unix authentication required.
|
||||
*/
|
||||
void
|
||||
MOUNTPROC3_UMNT(dirpath) = 3;
|
||||
|
||||
/*
|
||||
* Removes all of the mount list entries for this client
|
||||
* Unix authentication required.
|
||||
*/
|
||||
void
|
||||
MOUNTPROC3_UMNTALL(void) = 4;
|
||||
|
||||
/*
|
||||
* Returns a list of all the exported filesystems, and which
|
||||
* machines are allowed to import it.
|
||||
*/
|
||||
exports
|
||||
MOUNTPROC3_EXPORT(void) = 5;
|
||||
|
||||
} = 3;
|
||||
} = 100005;
|
||||
|
||||
#ifdef RPC_HDR
|
||||
%#endif /*!_rpcsvc_mount_h*/
|
||||
#endif
|
|
@ -1,361 +0,0 @@
|
|||
/*
|
||||
* Please do not edit this file.
|
||||
* It was generated using rpcgen.
|
||||
*/
|
||||
|
||||
#include <memory.h> /* for memset */
|
||||
#include "nfsmount.h"
|
||||
/*
|
||||
* Sun RPC is a product of Sun Microsystems, Inc. and is provided for
|
||||
* unrestricted use provided that this legend is included on all tape
|
||||
* media and as a part of the software program in whole or part. Users
|
||||
* may copy or modify Sun RPC without charge, but are not authorized
|
||||
* to license or distribute it to anyone else except as part of a product or
|
||||
* program developed by the user or with the express written consent of
|
||||
* Sun Microsystems, Inc.
|
||||
*
|
||||
* SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE
|
||||
* WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR
|
||||
* PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE.
|
||||
*
|
||||
* Sun RPC is provided with no support and without any obligation on the
|
||||
* part of Sun Microsystems, Inc. to assist in its use, correction,
|
||||
* modification or enhancement.
|
||||
*
|
||||
* SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE
|
||||
* INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC
|
||||
* OR ANY PART THEREOF.
|
||||
*
|
||||
* In no event will Sun Microsystems, Inc. be liable for any lost revenue
|
||||
* or profits or other special, indirect and consequential damages, even if
|
||||
* Sun has been advised of the possibility of such damages.
|
||||
*
|
||||
* Sun Microsystems, Inc.
|
||||
* 2550 Garcia Avenue
|
||||
* Mountain View, California 94043
|
||||
*/
|
||||
/*
|
||||
* Copyright (c) 1985, 1990 by Sun Microsystems, Inc.
|
||||
*/
|
||||
|
||||
/* from @(#)mount.x 1.3 91/03/11 TIRPC 1.0 */
|
||||
#include <string.h> /* for memset() */
|
||||
#include <asm/types.h>
|
||||
|
||||
/* Default timeout can be changed using clnt_control() */
|
||||
static struct timeval TIMEOUT = { 25, 0 };
|
||||
|
||||
void *
|
||||
mountproc_null_1(void *argp, CLIENT *clnt)
|
||||
{
|
||||
static char clnt_res;
|
||||
|
||||
memset((char *)&clnt_res, 0, sizeof(clnt_res));
|
||||
if (clnt_call (clnt, MOUNTPROC_NULL,
|
||||
(xdrproc_t) xdr_void, (caddr_t) argp,
|
||||
(xdrproc_t) xdr_void, (caddr_t) &clnt_res,
|
||||
TIMEOUT) != RPC_SUCCESS) {
|
||||
return (NULL);
|
||||
}
|
||||
return ((void *)&clnt_res);
|
||||
}
|
||||
|
||||
fhstatus *
|
||||
mountproc_mnt_1(dirpath *argp, CLIENT *clnt)
|
||||
{
|
||||
static fhstatus clnt_res;
|
||||
|
||||
memset((char *)&clnt_res, 0, sizeof(clnt_res));
|
||||
if (clnt_call (clnt, MOUNTPROC_MNT,
|
||||
(xdrproc_t) xdr_dirpath, (caddr_t) argp,
|
||||
(xdrproc_t) xdr_fhstatus, (caddr_t) &clnt_res,
|
||||
TIMEOUT) != RPC_SUCCESS) {
|
||||
return (NULL);
|
||||
}
|
||||
return (&clnt_res);
|
||||
}
|
||||
|
||||
mountlist *
|
||||
mountproc_dump_1(void *argp, CLIENT *clnt)
|
||||
{
|
||||
static mountlist clnt_res;
|
||||
|
||||
memset((char *)&clnt_res, 0, sizeof(clnt_res));
|
||||
if (clnt_call (clnt, MOUNTPROC_DUMP,
|
||||
(xdrproc_t) xdr_void, (caddr_t) argp,
|
||||
(xdrproc_t) xdr_mountlist, (caddr_t) &clnt_res,
|
||||
TIMEOUT) != RPC_SUCCESS) {
|
||||
return (NULL);
|
||||
}
|
||||
return (&clnt_res);
|
||||
}
|
||||
|
||||
void *
|
||||
mountproc_umnt_1(dirpath *argp, CLIENT *clnt)
|
||||
{
|
||||
static char clnt_res;
|
||||
|
||||
memset((char *)&clnt_res, 0, sizeof(clnt_res));
|
||||
if (clnt_call (clnt, MOUNTPROC_UMNT,
|
||||
(xdrproc_t) xdr_dirpath, (caddr_t) argp,
|
||||
(xdrproc_t) xdr_void, (caddr_t) &clnt_res,
|
||||
TIMEOUT) != RPC_SUCCESS) {
|
||||
return (NULL);
|
||||
}
|
||||
return ((void *)&clnt_res);
|
||||
}
|
||||
|
||||
void *
|
||||
mountproc_umntall_1(void *argp, CLIENT *clnt)
|
||||
{
|
||||
static char clnt_res;
|
||||
|
||||
memset((char *)&clnt_res, 0, sizeof(clnt_res));
|
||||
if (clnt_call (clnt, MOUNTPROC_UMNTALL,
|
||||
(xdrproc_t) xdr_void, (caddr_t) argp,
|
||||
(xdrproc_t) xdr_void, (caddr_t) &clnt_res,
|
||||
TIMEOUT) != RPC_SUCCESS) {
|
||||
return (NULL);
|
||||
}
|
||||
return ((void *)&clnt_res);
|
||||
}
|
||||
|
||||
exports *
|
||||
mountproc_export_1(void *argp, CLIENT *clnt)
|
||||
{
|
||||
static exports clnt_res;
|
||||
|
||||
memset((char *)&clnt_res, 0, sizeof(clnt_res));
|
||||
if (clnt_call (clnt, MOUNTPROC_EXPORT,
|
||||
(xdrproc_t) xdr_void, (caddr_t) argp,
|
||||
(xdrproc_t) xdr_exports, (caddr_t) &clnt_res,
|
||||
TIMEOUT) != RPC_SUCCESS) {
|
||||
return (NULL);
|
||||
}
|
||||
return (&clnt_res);
|
||||
}
|
||||
|
||||
exports *
|
||||
mountproc_exportall_1(void *argp, CLIENT *clnt)
|
||||
{
|
||||
static exports clnt_res;
|
||||
|
||||
memset((char *)&clnt_res, 0, sizeof(clnt_res));
|
||||
if (clnt_call (clnt, MOUNTPROC_EXPORTALL,
|
||||
(xdrproc_t) xdr_void, (caddr_t) argp,
|
||||
(xdrproc_t) xdr_exports, (caddr_t) &clnt_res,
|
||||
TIMEOUT) != RPC_SUCCESS) {
|
||||
return (NULL);
|
||||
}
|
||||
return (&clnt_res);
|
||||
}
|
||||
|
||||
void *
|
||||
mountproc_null_2(void *argp, CLIENT *clnt)
|
||||
{
|
||||
static char clnt_res;
|
||||
|
||||
memset((char *)&clnt_res, 0, sizeof(clnt_res));
|
||||
if (clnt_call (clnt, MOUNTPROC_NULL,
|
||||
(xdrproc_t) xdr_void, (caddr_t) argp,
|
||||
(xdrproc_t) xdr_void, (caddr_t) &clnt_res,
|
||||
TIMEOUT) != RPC_SUCCESS) {
|
||||
return (NULL);
|
||||
}
|
||||
return ((void *)&clnt_res);
|
||||
}
|
||||
|
||||
fhstatus *
|
||||
mountproc_mnt_2(dirpath *argp, CLIENT *clnt)
|
||||
{
|
||||
static fhstatus clnt_res;
|
||||
|
||||
memset((char *)&clnt_res, 0, sizeof(clnt_res));
|
||||
if (clnt_call (clnt, MOUNTPROC_MNT,
|
||||
(xdrproc_t) xdr_dirpath, (caddr_t) argp,
|
||||
(xdrproc_t) xdr_fhstatus, (caddr_t) &clnt_res,
|
||||
TIMEOUT) != RPC_SUCCESS) {
|
||||
return (NULL);
|
||||
}
|
||||
return (&clnt_res);
|
||||
}
|
||||
|
||||
mountlist *
|
||||
mountproc_dump_2(void *argp, CLIENT *clnt)
|
||||
{
|
||||
static mountlist clnt_res;
|
||||
|
||||
memset((char *)&clnt_res, 0, sizeof(clnt_res));
|
||||
if (clnt_call (clnt, MOUNTPROC_DUMP,
|
||||
(xdrproc_t) xdr_void, (caddr_t) argp,
|
||||
(xdrproc_t) xdr_mountlist, (caddr_t) &clnt_res,
|
||||
TIMEOUT) != RPC_SUCCESS) {
|
||||
return (NULL);
|
||||
}
|
||||
return (&clnt_res);
|
||||
}
|
||||
|
||||
void *
|
||||
mountproc_umnt_2(dirpath *argp, CLIENT *clnt)
|
||||
{
|
||||
static char clnt_res;
|
||||
|
||||
memset((char *)&clnt_res, 0, sizeof(clnt_res));
|
||||
if (clnt_call (clnt, MOUNTPROC_UMNT,
|
||||
(xdrproc_t) xdr_dirpath, (caddr_t) argp,
|
||||
(xdrproc_t) xdr_void, (caddr_t) &clnt_res,
|
||||
TIMEOUT) != RPC_SUCCESS) {
|
||||
return (NULL);
|
||||
}
|
||||
return ((void *)&clnt_res);
|
||||
}
|
||||
|
||||
void *
|
||||
mountproc_umntall_2(void *argp, CLIENT *clnt)
|
||||
{
|
||||
static char clnt_res;
|
||||
|
||||
memset((char *)&clnt_res, 0, sizeof(clnt_res));
|
||||
if (clnt_call (clnt, MOUNTPROC_UMNTALL,
|
||||
(xdrproc_t) xdr_void, (caddr_t) argp,
|
||||
(xdrproc_t) xdr_void, (caddr_t) &clnt_res,
|
||||
TIMEOUT) != RPC_SUCCESS) {
|
||||
return (NULL);
|
||||
}
|
||||
return ((void *)&clnt_res);
|
||||
}
|
||||
|
||||
exports *
|
||||
mountproc_export_2(void *argp, CLIENT *clnt)
|
||||
{
|
||||
static exports clnt_res;
|
||||
|
||||
memset((char *)&clnt_res, 0, sizeof(clnt_res));
|
||||
if (clnt_call (clnt, MOUNTPROC_EXPORT,
|
||||
(xdrproc_t) xdr_void, (caddr_t) argp,
|
||||
(xdrproc_t) xdr_exports, (caddr_t) &clnt_res,
|
||||
TIMEOUT) != RPC_SUCCESS) {
|
||||
return (NULL);
|
||||
}
|
||||
return (&clnt_res);
|
||||
}
|
||||
|
||||
exports *
|
||||
mountproc_exportall_2(void *argp, CLIENT *clnt)
|
||||
{
|
||||
static exports clnt_res;
|
||||
|
||||
memset((char *)&clnt_res, 0, sizeof(clnt_res));
|
||||
if (clnt_call (clnt, MOUNTPROC_EXPORTALL,
|
||||
(xdrproc_t) xdr_void, (caddr_t) argp,
|
||||
(xdrproc_t) xdr_exports, (caddr_t) &clnt_res,
|
||||
TIMEOUT) != RPC_SUCCESS) {
|
||||
return (NULL);
|
||||
}
|
||||
return (&clnt_res);
|
||||
}
|
||||
|
||||
ppathcnf *
|
||||
mountproc_pathconf_2(dirpath *argp, CLIENT *clnt)
|
||||
{
|
||||
static ppathcnf clnt_res;
|
||||
|
||||
memset((char *)&clnt_res, 0, sizeof(clnt_res));
|
||||
if (clnt_call (clnt, MOUNTPROC_PATHCONF,
|
||||
(xdrproc_t) xdr_dirpath, (caddr_t) argp,
|
||||
(xdrproc_t) xdr_ppathcnf, (caddr_t) &clnt_res,
|
||||
TIMEOUT) != RPC_SUCCESS) {
|
||||
return (NULL);
|
||||
}
|
||||
return (&clnt_res);
|
||||
}
|
||||
|
||||
void *
|
||||
mountproc3_null_3(void *argp, CLIENT *clnt)
|
||||
{
|
||||
static char clnt_res;
|
||||
|
||||
memset((char *)&clnt_res, 0, sizeof(clnt_res));
|
||||
if (clnt_call (clnt, MOUNTPROC3_NULL,
|
||||
(xdrproc_t) xdr_void, (caddr_t) argp,
|
||||
(xdrproc_t) xdr_void, (caddr_t) &clnt_res,
|
||||
TIMEOUT) != RPC_SUCCESS) {
|
||||
return (NULL);
|
||||
}
|
||||
return ((void *)&clnt_res);
|
||||
}
|
||||
|
||||
mountres3 *
|
||||
mountproc3_mnt_3(dirpath *argp, CLIENT *clnt)
|
||||
{
|
||||
static mountres3 clnt_res;
|
||||
|
||||
memset((char *)&clnt_res, 0, sizeof(clnt_res));
|
||||
if (clnt_call (clnt, MOUNTPROC3_MNT,
|
||||
(xdrproc_t) xdr_dirpath, (caddr_t) argp,
|
||||
(xdrproc_t) xdr_mountres3, (caddr_t) &clnt_res,
|
||||
TIMEOUT) != RPC_SUCCESS) {
|
||||
return (NULL);
|
||||
}
|
||||
return (&clnt_res);
|
||||
}
|
||||
|
||||
mountlist *
|
||||
mountproc3_dump_3(void *argp, CLIENT *clnt)
|
||||
{
|
||||
static mountlist clnt_res;
|
||||
|
||||
memset((char *)&clnt_res, 0, sizeof(clnt_res));
|
||||
if (clnt_call (clnt, MOUNTPROC3_DUMP,
|
||||
(xdrproc_t) xdr_void, (caddr_t) argp,
|
||||
(xdrproc_t) xdr_mountlist, (caddr_t) &clnt_res,
|
||||
TIMEOUT) != RPC_SUCCESS) {
|
||||
return (NULL);
|
||||
}
|
||||
return (&clnt_res);
|
||||
}
|
||||
|
||||
void *
|
||||
mountproc3_umnt_3(dirpath *argp, CLIENT *clnt)
|
||||
{
|
||||
static char clnt_res;
|
||||
|
||||
memset((char *)&clnt_res, 0, sizeof(clnt_res));
|
||||
if (clnt_call (clnt, MOUNTPROC3_UMNT,
|
||||
(xdrproc_t) xdr_dirpath, (caddr_t) argp,
|
||||
(xdrproc_t) xdr_void, (caddr_t) &clnt_res,
|
||||
TIMEOUT) != RPC_SUCCESS) {
|
||||
return (NULL);
|
||||
}
|
||||
return ((void *)&clnt_res);
|
||||
}
|
||||
|
||||
void *
|
||||
mountproc3_umntall_3(void *argp, CLIENT *clnt)
|
||||
{
|
||||
static char clnt_res;
|
||||
|
||||
memset((char *)&clnt_res, 0, sizeof(clnt_res));
|
||||
if (clnt_call (clnt, MOUNTPROC3_UMNTALL,
|
||||
(xdrproc_t) xdr_void, (caddr_t) argp,
|
||||
(xdrproc_t) xdr_void, (caddr_t) &clnt_res,
|
||||
TIMEOUT) != RPC_SUCCESS) {
|
||||
return (NULL);
|
||||
}
|
||||
return ((void *)&clnt_res);
|
||||
}
|
||||
|
||||
exports *
|
||||
mountproc3_export_3(void *argp, CLIENT *clnt)
|
||||
{
|
||||
static exports clnt_res;
|
||||
|
||||
memset((char *)&clnt_res, 0, sizeof(clnt_res));
|
||||
if (clnt_call (clnt, MOUNTPROC3_EXPORT,
|
||||
(xdrproc_t) xdr_void, (caddr_t) argp,
|
||||
(xdrproc_t) xdr_exports, (caddr_t) &clnt_res,
|
||||
TIMEOUT) != RPC_SUCCESS) {
|
||||
return (NULL);
|
||||
}
|
||||
return (&clnt_res);
|
||||
}
|
|
@ -1,329 +0,0 @@
|
|||
/*
|
||||
* Please do not edit this file.
|
||||
* It was generated using rpcgen.
|
||||
*/
|
||||
|
||||
#include "nfsmount.h"
|
||||
/*
|
||||
* Sun RPC is a product of Sun Microsystems, Inc. and is provided for
|
||||
* unrestricted use provided that this legend is included on all tape
|
||||
* media and as a part of the software program in whole or part. Users
|
||||
* may copy or modify Sun RPC without charge, but are not authorized
|
||||
* to license or distribute it to anyone else except as part of a product or
|
||||
* program developed by the user or with the express written consent of
|
||||
* Sun Microsystems, Inc.
|
||||
*
|
||||
* SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE
|
||||
* WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR
|
||||
* PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE.
|
||||
*
|
||||
* Sun RPC is provided with no support and without any obligation on the
|
||||
* part of Sun Microsystems, Inc. to assist in its use, correction,
|
||||
* modification or enhancement.
|
||||
*
|
||||
* SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE
|
||||
* INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC
|
||||
* OR ANY PART THEREOF.
|
||||
*
|
||||
* In no event will Sun Microsystems, Inc. be liable for any lost revenue
|
||||
* or profits or other special, indirect and consequential damages, even if
|
||||
* Sun has been advised of the possibility of such damages.
|
||||
*
|
||||
* Sun Microsystems, Inc.
|
||||
* 2550 Garcia Avenue
|
||||
* Mountain View, California 94043
|
||||
*/
|
||||
/*
|
||||
* Copyright (c) 1985, 1990 by Sun Microsystems, Inc.
|
||||
*/
|
||||
|
||||
/* from @(#)mount.x 1.3 91/03/11 TIRPC 1.0 */
|
||||
#include <asm/types.h>
|
||||
|
||||
bool_t
|
||||
xdr_fhandle (XDR *xdrs, fhandle objp)
|
||||
{
|
||||
register int32_t *buf;
|
||||
|
||||
if (!xdr_opaque (xdrs, objp, FHSIZE))
|
||||
return FALSE;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
bool_t
|
||||
xdr_fhandle3 (XDR *xdrs, fhandle3 *objp)
|
||||
{
|
||||
register int32_t *buf;
|
||||
|
||||
if (!xdr_bytes (xdrs, (char **)&objp->fhandle3_val, (u_int *) &objp->fhandle3_len, FHSIZE3))
|
||||
return FALSE;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
bool_t
|
||||
xdr_mountstat3 (XDR *xdrs, mountstat3 *objp)
|
||||
{
|
||||
register int32_t *buf;
|
||||
|
||||
if (!xdr_enum (xdrs, (enum_t *) objp))
|
||||
return FALSE;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
bool_t
|
||||
xdr_fhstatus (XDR *xdrs, fhstatus *objp)
|
||||
{
|
||||
register int32_t *buf;
|
||||
|
||||
if (!xdr_u_int (xdrs, &objp->fhs_status))
|
||||
return FALSE;
|
||||
switch (objp->fhs_status) {
|
||||
case 0:
|
||||
if (!xdr_fhandle (xdrs, objp->fhstatus_u.fhs_fhandle))
|
||||
return FALSE;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
bool_t
|
||||
xdr_mountres3_ok (XDR *xdrs, mountres3_ok *objp)
|
||||
{
|
||||
register int32_t *buf;
|
||||
|
||||
if (!xdr_fhandle3 (xdrs, &objp->fhandle))
|
||||
return FALSE;
|
||||
if (!xdr_array (xdrs, (char **)&objp->auth_flavours.auth_flavours_val, (u_int *) &objp->auth_flavours.auth_flavours_len, ~0,
|
||||
sizeof (int), (xdrproc_t) xdr_int))
|
||||
return FALSE;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
bool_t
|
||||
xdr_mountres3 (XDR *xdrs, mountres3 *objp)
|
||||
{
|
||||
register int32_t *buf;
|
||||
|
||||
if (!xdr_mountstat3 (xdrs, &objp->fhs_status))
|
||||
return FALSE;
|
||||
switch (objp->fhs_status) {
|
||||
case MNT_OK:
|
||||
if (!xdr_mountres3_ok (xdrs, &objp->mountres3_u.mountinfo))
|
||||
return FALSE;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
bool_t
|
||||
xdr_dirpath (XDR *xdrs, dirpath *objp)
|
||||
{
|
||||
register int32_t *buf;
|
||||
|
||||
if (!xdr_string (xdrs, objp, MNTPATHLEN))
|
||||
return FALSE;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
bool_t
|
||||
xdr_name (XDR *xdrs, name *objp)
|
||||
{
|
||||
register int32_t *buf;
|
||||
|
||||
if (!xdr_string (xdrs, objp, MNTNAMLEN))
|
||||
return FALSE;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
bool_t
|
||||
xdr_mountlist (XDR *xdrs, mountlist *objp)
|
||||
{
|
||||
register int32_t *buf;
|
||||
|
||||
if (!xdr_pointer (xdrs, (char **)objp, sizeof (struct mountbody), (xdrproc_t) xdr_mountbody))
|
||||
return FALSE;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
bool_t
|
||||
xdr_mountbody (XDR *xdrs, mountbody *objp)
|
||||
{
|
||||
register int32_t *buf;
|
||||
|
||||
if (!xdr_name (xdrs, &objp->ml_hostname))
|
||||
return FALSE;
|
||||
if (!xdr_dirpath (xdrs, &objp->ml_directory))
|
||||
return FALSE;
|
||||
if (!xdr_mountlist (xdrs, &objp->ml_next))
|
||||
return FALSE;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
bool_t
|
||||
xdr_groups (XDR *xdrs, groups *objp)
|
||||
{
|
||||
register int32_t *buf;
|
||||
|
||||
if (!xdr_pointer (xdrs, (char **)objp, sizeof (struct groupnode), (xdrproc_t) xdr_groupnode))
|
||||
return FALSE;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
bool_t
|
||||
xdr_groupnode (XDR *xdrs, groupnode *objp)
|
||||
{
|
||||
register int32_t *buf;
|
||||
|
||||
if (!xdr_name (xdrs, &objp->gr_name))
|
||||
return FALSE;
|
||||
if (!xdr_groups (xdrs, &objp->gr_next))
|
||||
return FALSE;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
bool_t
|
||||
xdr_exports (XDR *xdrs, exports *objp)
|
||||
{
|
||||
register int32_t *buf;
|
||||
|
||||
if (!xdr_pointer (xdrs, (char **)objp, sizeof (struct exportnode), (xdrproc_t) xdr_exportnode))
|
||||
return FALSE;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
bool_t
|
||||
xdr_exportnode (XDR *xdrs, exportnode *objp)
|
||||
{
|
||||
register int32_t *buf;
|
||||
|
||||
if (!xdr_dirpath (xdrs, &objp->ex_dir))
|
||||
return FALSE;
|
||||
if (!xdr_groups (xdrs, &objp->ex_groups))
|
||||
return FALSE;
|
||||
if (!xdr_exports (xdrs, &objp->ex_next))
|
||||
return FALSE;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
bool_t
|
||||
xdr_ppathcnf (XDR *xdrs, ppathcnf *objp)
|
||||
{
|
||||
register int32_t *buf;
|
||||
|
||||
int i;
|
||||
|
||||
if (xdrs->x_op == XDR_ENCODE) {
|
||||
buf = XDR_INLINE (xdrs, 6 * BYTES_PER_XDR_UNIT);
|
||||
if (buf == NULL) {
|
||||
if (!xdr_int (xdrs, &objp->pc_link_max))
|
||||
return FALSE;
|
||||
if (!xdr_short (xdrs, &objp->pc_max_canon))
|
||||
return FALSE;
|
||||
if (!xdr_short (xdrs, &objp->pc_max_input))
|
||||
return FALSE;
|
||||
if (!xdr_short (xdrs, &objp->pc_name_max))
|
||||
return FALSE;
|
||||
if (!xdr_short (xdrs, &objp->pc_path_max))
|
||||
return FALSE;
|
||||
if (!xdr_short (xdrs, &objp->pc_pipe_buf))
|
||||
return FALSE;
|
||||
|
||||
} else {
|
||||
IXDR_PUT_LONG(buf, objp->pc_link_max);
|
||||
IXDR_PUT_SHORT(buf, objp->pc_max_canon);
|
||||
IXDR_PUT_SHORT(buf, objp->pc_max_input);
|
||||
IXDR_PUT_SHORT(buf, objp->pc_name_max);
|
||||
IXDR_PUT_SHORT(buf, objp->pc_path_max);
|
||||
IXDR_PUT_SHORT(buf, objp->pc_pipe_buf);
|
||||
}
|
||||
if (!xdr_u_char (xdrs, &objp->pc_vdisable))
|
||||
return FALSE;
|
||||
if (!xdr_char (xdrs, &objp->pc_xxx))
|
||||
return FALSE;
|
||||
buf = XDR_INLINE (xdrs, ( 2 ) * BYTES_PER_XDR_UNIT);
|
||||
if (buf == NULL) {
|
||||
if (!xdr_vector (xdrs, (char *)objp->pc_mask, 2,
|
||||
sizeof (short), (xdrproc_t) xdr_short))
|
||||
return FALSE;
|
||||
} else {
|
||||
{
|
||||
register short *genp;
|
||||
|
||||
for (i = 0, genp = objp->pc_mask;
|
||||
i < 2; ++i) {
|
||||
IXDR_PUT_SHORT(buf, *genp++);
|
||||
}
|
||||
}
|
||||
}
|
||||
return TRUE;
|
||||
} else if (xdrs->x_op == XDR_DECODE) {
|
||||
buf = XDR_INLINE (xdrs, 6 * BYTES_PER_XDR_UNIT);
|
||||
if (buf == NULL) {
|
||||
if (!xdr_int (xdrs, &objp->pc_link_max))
|
||||
return FALSE;
|
||||
if (!xdr_short (xdrs, &objp->pc_max_canon))
|
||||
return FALSE;
|
||||
if (!xdr_short (xdrs, &objp->pc_max_input))
|
||||
return FALSE;
|
||||
if (!xdr_short (xdrs, &objp->pc_name_max))
|
||||
return FALSE;
|
||||
if (!xdr_short (xdrs, &objp->pc_path_max))
|
||||
return FALSE;
|
||||
if (!xdr_short (xdrs, &objp->pc_pipe_buf))
|
||||
return FALSE;
|
||||
|
||||
} else {
|
||||
objp->pc_link_max = IXDR_GET_LONG(buf);
|
||||
objp->pc_max_canon = IXDR_GET_SHORT(buf);
|
||||
objp->pc_max_input = IXDR_GET_SHORT(buf);
|
||||
objp->pc_name_max = IXDR_GET_SHORT(buf);
|
||||
objp->pc_path_max = IXDR_GET_SHORT(buf);
|
||||
objp->pc_pipe_buf = IXDR_GET_SHORT(buf);
|
||||
}
|
||||
if (!xdr_u_char (xdrs, &objp->pc_vdisable))
|
||||
return FALSE;
|
||||
if (!xdr_char (xdrs, &objp->pc_xxx))
|
||||
return FALSE;
|
||||
buf = XDR_INLINE (xdrs, ( 2 ) * BYTES_PER_XDR_UNIT);
|
||||
if (buf == NULL) {
|
||||
if (!xdr_vector (xdrs, (char *)objp->pc_mask, 2,
|
||||
sizeof (short), (xdrproc_t) xdr_short))
|
||||
return FALSE;
|
||||
} else {
|
||||
{
|
||||
register short *genp;
|
||||
|
||||
for (i = 0, genp = objp->pc_mask;
|
||||
i < 2; ++i) {
|
||||
*genp++ = IXDR_GET_SHORT(buf);
|
||||
}
|
||||
}
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
if (!xdr_int (xdrs, &objp->pc_link_max))
|
||||
return FALSE;
|
||||
if (!xdr_short (xdrs, &objp->pc_max_canon))
|
||||
return FALSE;
|
||||
if (!xdr_short (xdrs, &objp->pc_max_input))
|
||||
return FALSE;
|
||||
if (!xdr_short (xdrs, &objp->pc_name_max))
|
||||
return FALSE;
|
||||
if (!xdr_short (xdrs, &objp->pc_path_max))
|
||||
return FALSE;
|
||||
if (!xdr_short (xdrs, &objp->pc_pipe_buf))
|
||||
return FALSE;
|
||||
if (!xdr_u_char (xdrs, &objp->pc_vdisable))
|
||||
return FALSE;
|
||||
if (!xdr_char (xdrs, &objp->pc_xxx))
|
||||
return FALSE;
|
||||
if (!xdr_vector (xdrs, (char *)objp->pc_mask, 2,
|
||||
sizeof (short), (xdrproc_t) xdr_short))
|
||||
return FALSE;
|
||||
return TRUE;
|
||||
}
|
|
@ -16,7 +16,6 @@
|
|||
#include "sundries.h"
|
||||
#include "realpath.h"
|
||||
#include "xmalloc.h"
|
||||
#include "nfsmount.h"
|
||||
#include "nls.h"
|
||||
|
||||
char *
|
||||
|
|
106
mount/umount.c
106
mount/umount.c
|
@ -20,15 +20,6 @@
|
|||
#include "env.h"
|
||||
#include "nls.h"
|
||||
|
||||
#include <sys/socket.h>
|
||||
#include <sys/time.h>
|
||||
#include <netdb.h>
|
||||
#include <rpc/rpc.h>
|
||||
#include <rpc/pmap_clnt.h>
|
||||
#include <rpc/pmap_prot.h>
|
||||
#include "nfsmount.h"
|
||||
#include <arpa/inet.h>
|
||||
|
||||
#if defined(MNT_FORCE)
|
||||
/* Interesting ... it seems libc knows about MNT_FORCE and presumably
|
||||
about umount2 as well -- need not do anything */
|
||||
|
@ -144,98 +135,6 @@ check_special_umountprog(const char *spec, const char *node,
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int xdr_dir(XDR *xdrsp, char *dirp)
|
||||
{
|
||||
return (xdr_string(xdrsp, &dirp, MNTPATHLEN));
|
||||
}
|
||||
|
||||
static int
|
||||
nfs_umount_rpc_call(const char *spec, const char *opts)
|
||||
{
|
||||
register CLIENT *clp;
|
||||
struct sockaddr_in saddr;
|
||||
struct timeval pertry, try;
|
||||
enum clnt_stat clnt_stat;
|
||||
int port = 0;
|
||||
int so = RPC_ANYSOCK;
|
||||
struct hostent *hostp;
|
||||
char *hostname;
|
||||
char *dirname;
|
||||
char *p;
|
||||
|
||||
if (spec == NULL || (p = strchr(spec,':')) == NULL)
|
||||
return 0;
|
||||
hostname = xstrndup(spec, p-spec);
|
||||
dirname = xstrdup(p+1);
|
||||
#ifdef DEBUG
|
||||
printf(_("host: %s, directory: %s\n"), hostname, dirname);
|
||||
#endif
|
||||
|
||||
if (opts && (p = strstr(opts, "addr="))) {
|
||||
char *q;
|
||||
|
||||
free(hostname);
|
||||
p += 5;
|
||||
q = p;
|
||||
while (*q && *q != ',') q++;
|
||||
hostname = xstrndup(p,q-p);
|
||||
}
|
||||
|
||||
if (opts && (p = strstr(opts, "mountport=")) && isdigit(*(p+10)))
|
||||
port = atoi(p+10);
|
||||
|
||||
if (hostname[0] >= '0' && hostname[0] <= '9')
|
||||
saddr.sin_addr.s_addr = inet_addr(hostname);
|
||||
else {
|
||||
if ((hostp = gethostbyname(hostname)) == NULL) {
|
||||
fprintf(stderr, _("umount: can't get address for %s\n"),
|
||||
hostname);
|
||||
return 1;
|
||||
}
|
||||
if (hostp->h_length > sizeof(struct in_addr)) {
|
||||
fprintf(stderr, _("umount: got bad hostp->h_length\n"));
|
||||
hostp->h_length = sizeof(struct in_addr);
|
||||
}
|
||||
memcpy(&saddr.sin_addr, hostp->h_addr, hostp->h_length);
|
||||
}
|
||||
|
||||
saddr.sin_family = AF_INET;
|
||||
saddr.sin_port = htons(port);
|
||||
pertry.tv_sec = 3;
|
||||
pertry.tv_usec = 0;
|
||||
if (opts && (p = strstr(opts, "tcp"))) {
|
||||
/* possibly: make sure option is not "notcp"
|
||||
possibly: try udp if tcp fails */
|
||||
if ((clp = clnttcp_create(&saddr, MOUNTPROG, MOUNTVERS,
|
||||
&so, 0, 0)) == NULL) {
|
||||
clnt_pcreateerror("Cannot MOUNTPROG RPC (tcp)");
|
||||
return 1;
|
||||
}
|
||||
} else {
|
||||
if ((clp = clntudp_create(&saddr, MOUNTPROG, MOUNTVERS,
|
||||
pertry, &so)) == NULL) {
|
||||
clnt_pcreateerror("Cannot MOUNTPROG RPC");
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
clp->cl_auth = authunix_create_default();
|
||||
try.tv_sec = 20;
|
||||
try.tv_usec = 0;
|
||||
clnt_stat = clnt_call(clp, MOUNTPROC_UMNT,
|
||||
(xdrproc_t) xdr_dir, dirname,
|
||||
(xdrproc_t) xdr_void, (caddr_t) 0,
|
||||
try);
|
||||
|
||||
if (clnt_stat != RPC_SUCCESS) {
|
||||
clnt_perror(clp, "Bad UMNT RPC");
|
||||
return 1;
|
||||
}
|
||||
auth_destroy(clp->cl_auth);
|
||||
clnt_destroy(clp);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* complain about a failed umount */
|
||||
static void complain(int err, const char *dev) {
|
||||
switch (err) {
|
||||
|
@ -289,11 +188,6 @@ umount_one (const char *spec, const char *node, const char *type,
|
|||
if (check_special_umountprog(spec, node, type, &status))
|
||||
return status;
|
||||
|
||||
/* Ignore any RPC errors, so that you can umount the filesystem
|
||||
if the server is down. */
|
||||
if (strcasecmp(type, "nfs") == 0)
|
||||
nfs_umount_rpc_call(spec, opts);
|
||||
|
||||
umnt_err = umnt_err2 = 0;
|
||||
if (lazy) {
|
||||
res = umount2 (node, MNT_DETACH);
|
||||
|
|
Loading…
Reference in New Issue