488 lines
13 KiB
C
488 lines
13 KiB
C
/* @(#)nfs.h 2.2 88/05/20 NFSSRC4.0 from 2.36 88/02/08 SMI */
|
|
|
|
#ifndef __NFS_HEADER__
|
|
#define __NFS_HEADER__
|
|
|
|
/*
|
|
* Programs are required to include rpc/types.h before this header file.
|
|
* All other prerequisites are assumed idempotent and included here.
|
|
*/
|
|
#include <sys/time.h>
|
|
#include <sys/errno.h>
|
|
#ifndef bool_t
|
|
#include <rpc/xdr.h>
|
|
#endif
|
|
|
|
/* Maximum size of data portion of a remote request */
|
|
#define NFS_MAXDATA 8192
|
|
#define NFS_MAXNAMLEN 255
|
|
#define NFS_MAXPATHLEN 1024
|
|
|
|
/*
|
|
* Rpc retransmission parameters
|
|
*/
|
|
#define NFS_TIMEO 11 /* initial timeout in tenths of a sec. */
|
|
#define NFS_RETRIES 5 /* times to retry request */
|
|
|
|
|
|
/*
|
|
* Error status
|
|
* Should include all possible net errors.
|
|
* For now we just cast errno into an enum nfsstat.
|
|
*/
|
|
enum nfsstat {
|
|
NFS_OK = 0, /* no error */
|
|
NFSERR_PERM=EPERM, /* Not owner */
|
|
NFSERR_NOENT=ENOENT, /* No such file or directory */
|
|
NFSERR_IO=EIO, /* I/O error */
|
|
NFSERR_NXIO=ENXIO, /* No such device or address */
|
|
NFSERR_ACCES=EACCES, /* Permission denied */
|
|
NFSERR_EXIST=EEXIST, /* File exists */
|
|
NFSERR_NODEV=ENODEV, /* No such device */
|
|
NFSERR_NOTDIR=ENOTDIR, /* Not a directory */
|
|
NFSERR_ISDIR=EISDIR, /* Is a directory */
|
|
NFSERR_FBIG=EFBIG, /* File too large */
|
|
NFSERR_NOSPC=ENOSPC, /* No space left on device */
|
|
NFSERR_ROFS=EROFS, /* Read-only file system */
|
|
/*
|
|
* Alas, these errnos differ between our <sys/errno.h> and the
|
|
* Sun/BSD version, which is part of the nfs protocol!
|
|
*/
|
|
NFSERR_NAMETOOLONG=63, /* File name too long */
|
|
NFSERR_NOTEMPTY=66, /* Directory not empty */
|
|
NFSERR_DQUOT=69, /* Disc quota exceeded */
|
|
NFSERR_STALE=70, /* Stale NFS file handle */
|
|
NFSERR_REMOTE=71, /* Too many levels of remote in path */
|
|
NFSERR_WFLUSH /* write cache flushed */
|
|
};
|
|
/*
|
|
* For SVR0, as with Sun, we just cast errno into an enum nfsstat.
|
|
* For SVR3 we translate.
|
|
*/
|
|
extern enum nfsstat nfs_statmap[];
|
|
extern short nfs_errmap[];
|
|
|
|
#define puterrno(error) \
|
|
((u_short)(error) > LASTERRNO ? NFSERR_IO : nfs_statmap[(short)error])
|
|
#define geterrno(status) \
|
|
((u_short)(status) > (u_short)NFSERR_WFLUSH ? (short) EIO \
|
|
: nfs_errmap[(short)status])
|
|
|
|
/*
|
|
* File types
|
|
*/
|
|
enum nfsftype {
|
|
NFNON = 0,
|
|
NFREG = 1, /* regular file */
|
|
NFDIR = 2, /* directory */
|
|
NFBLK = 3, /* block special */
|
|
NFCHR = 4, /* character special */
|
|
NFLNK = 5, /* symbolic link */
|
|
NFSOCK= 6 /* named socket */
|
|
};
|
|
|
|
/*
|
|
* Special kludge for fifos (named pipes) [to adhere to NFS Protocol Spec]
|
|
*
|
|
* VFIFO is not in the protocol spec (VNON will be replaced by VFIFO)
|
|
* so the over-the-wire representation is VCHR with a '-1' device number.
|
|
*
|
|
* NOTE: This kludge becomes unnecessary with the Protocol Revision,
|
|
* but it may be necessary to support it (backwards compatibility).
|
|
*/
|
|
#define NFS_FIFO_TYPE NFCHR
|
|
#define NFS_FIFO_MODE S_IFCHR
|
|
#define NFS_FIFO_DEV (~0)
|
|
|
|
/* identify fifo in nfs attributes */
|
|
#define NA_ISFIFO(NA) (((NA)->na_type == NFS_FIFO_TYPE) && \
|
|
((NA)->na_rdev == NFS_FIFO_DEV))
|
|
|
|
/* set fifo in nfs attributes */
|
|
#define NA_SETFIFO(NA) { \
|
|
(NA)->na_type = NFS_FIFO_TYPE; \
|
|
(NA)->na_rdev = NFS_FIFO_DEV; \
|
|
(NA)->na_mode = ((NA)->na_mode&~S_IFMT)|NFS_FIFO_MODE; \
|
|
}
|
|
|
|
|
|
/*
|
|
* Size of an fhandle in bytes
|
|
*/
|
|
#define NFS_FHSIZE 32
|
|
|
|
/*
|
|
* File access handle
|
|
* This structure is the Sun server representation of a file.
|
|
* It is handed out by a server for the client to use in further
|
|
* file transactions.
|
|
*/
|
|
|
|
#ifdef NFSSERVER
|
|
|
|
/*
|
|
* This struct is only used to find the size of the data field in the
|
|
* fhandle structure below.
|
|
*/
|
|
static
|
|
struct fhsize {
|
|
/*
|
|
* Member f2's offset must be 0 mod 4 for NFS_FHMAXDATA to be
|
|
* an even number, given that sizeof(fsid_t) is 2. If we institute
|
|
* a long dev_t type, then this padding must be removed.
|
|
*/
|
|
u_short f0;
|
|
fsid_t f1;
|
|
u_short f2;
|
|
char f3[4];
|
|
u_short f4;
|
|
char f5[4];
|
|
};
|
|
#define NFS_FHMAXDATA ((NFS_FHSIZE - sizeof (struct fhsize) + 8) / 2)
|
|
|
|
struct svcfh {
|
|
u_short fh_pad; /* make NFS_FHMAXDATA work */
|
|
fsid_t fh_fsid; /* filesystem id */
|
|
u_short fh_len; /* file number length */
|
|
char fh_data[NFS_FHMAXDATA]; /* and data */
|
|
u_short fh_xlen; /* export file number length */
|
|
char fh_xdata[NFS_FHMAXDATA];/* and data */
|
|
};
|
|
|
|
typedef struct svcfh fhandle_t;
|
|
#else
|
|
/*
|
|
* This is the client view of an fhandle
|
|
*/
|
|
typedef union {
|
|
char fh_data[NFS_FHSIZE]; /* opaque data */
|
|
u_long fh_hash[NFS_FHSIZE/sizeof(u_long)]; /* hash key */
|
|
} fhandle_t;
|
|
#endif
|
|
|
|
|
|
/*
|
|
* Arguments to remote write and writecache
|
|
*/
|
|
struct nfswriteargs {
|
|
fhandle_t wa_fhandle; /* handle for file */
|
|
u_long wa_begoff; /* beginning byte offset in file */
|
|
u_long wa_offset; /* current byte offset in file */
|
|
u_long wa_totcount; /* total write cnt (to this offset) */
|
|
u_long wa_count; /* size of this write */
|
|
char *wa_data; /* data to write (up to NFS_MAXDATA) */
|
|
char *wa_hook; /* hook for optimizations, not xdr'd */
|
|
};
|
|
|
|
|
|
/*
|
|
* File attributes
|
|
*/
|
|
struct nfsfattr {
|
|
enum nfsftype na_type; /* file type */
|
|
u_long na_mode; /* protection mode bits */
|
|
u_long na_nlink; /* # hard links */
|
|
u_long na_uid; /* owner user id */
|
|
u_long na_gid; /* owner group id */
|
|
u_long na_size; /* file size in bytes */
|
|
u_long na_blocksize; /* prefered block size */
|
|
u_long na_rdev; /* special device # */
|
|
u_long na_blocks; /* Kb of disk used by file */
|
|
u_long na_fsid; /* device # */
|
|
u_long na_nodeid; /* inode # */
|
|
struct timeval na_atime; /* time of last access */
|
|
struct timeval na_mtime; /* time of last modification */
|
|
struct timeval na_ctime; /* time of last change */
|
|
};
|
|
|
|
#ifdef _KERNEL
|
|
#define n2v_type(x) (NA_ISFIFO(x) ? VFIFO : ntype_to_vtype(((x)->na_type)))
|
|
|
|
extern enum nfsftype vtype_to_ntype(u_short);
|
|
extern u_short ntype_to_vtype(enum nfsftype);
|
|
#endif
|
|
#define n2v_rdev(x) (NA_ISFIFO(x) ? 0 : (x)->na_rdev)
|
|
|
|
/*
|
|
* Arguments to remote read
|
|
*/
|
|
struct nfsreadargs {
|
|
fhandle_t ra_fhandle; /* handle for file */
|
|
u_long ra_offset; /* byte offset in file */
|
|
u_long ra_count; /* immediate read count */
|
|
u_long ra_totcount; /* total read cnt (from this offset) */
|
|
};
|
|
|
|
/*
|
|
* Status OK portion of remote read reply
|
|
*/
|
|
struct nfsrrok {
|
|
struct nfsfattr rrok_attr; /* attributes, need for pagin */
|
|
u_long rrok_count; /* bytes of data */
|
|
char *rrok_data; /* data (up to NFS_MAXDATA bytes) */
|
|
struct buf *rrok_bp; /* buffer pointer for bread */
|
|
u_long rrok_bsize; /* buffer memory size */
|
|
struct vnode *rrok_vp; /* vnode assoc. with mapping */
|
|
};
|
|
|
|
/*
|
|
* Reply from remote read
|
|
*/
|
|
struct nfsrdresult {
|
|
enum nfsstat rr_status; /* status of read */
|
|
union {
|
|
struct nfsrrok rr_ok_u; /* attributes, need for pagin */
|
|
} rr_u;
|
|
};
|
|
#define rr_ok rr_u.rr_ok_u
|
|
#define rr_attr rr_u.rr_ok_u.rrok_attr
|
|
#define rr_count rr_u.rr_ok_u.rrok_count
|
|
#define rr_data rr_u.rr_ok_u.rrok_data
|
|
#define rr_bp rr_u.rr_ok_u.rrok_bp
|
|
#define rr_bsize rr_u.rr_ok_u.rrok_bsize
|
|
#define rr_vp rr_u.rr_ok_u.rrok_vp
|
|
|
|
|
|
/*
|
|
* File attributes which can be set
|
|
*/
|
|
struct nfssattr {
|
|
u_long sa_mode; /* protection mode bits */
|
|
u_long sa_uid; /* owner user id */
|
|
u_long sa_gid; /* owner group id */
|
|
u_long sa_size; /* file size in bytes */
|
|
struct timeval sa_atime; /* time of last access */
|
|
struct timeval sa_mtime; /* time of last modification */
|
|
};
|
|
|
|
|
|
/*
|
|
* Reply status with file attributes
|
|
*/
|
|
struct nfsattrstat {
|
|
enum nfsstat ns_status; /* reply status */
|
|
union {
|
|
struct nfsfattr ns_attr_u; /* NFS_OK: file attributes */
|
|
} ns_u;
|
|
};
|
|
#define ns_attr ns_u.ns_attr_u
|
|
|
|
|
|
/*
|
|
* NFS_OK part of read sym link reply union
|
|
*/
|
|
struct nfssrok {
|
|
u_long srok_count; /* size of string */
|
|
char *srok_data; /* string (up to NFS_MAXPATHLEN bytes) */
|
|
};
|
|
|
|
/*
|
|
* Result of reading symbolic link
|
|
*/
|
|
struct nfsrdlnres {
|
|
enum nfsstat rl_status; /* status of symlink read */
|
|
union {
|
|
struct nfssrok rl_srok_u; /* name of linked to */
|
|
} rl_u;
|
|
};
|
|
#define rl_srok rl_u.rl_srok_u
|
|
#define rl_count rl_u.rl_srok_u.srok_count
|
|
#define rl_data rl_u.rl_srok_u.srok_data
|
|
|
|
|
|
/*
|
|
* Arguments to readdir
|
|
*/
|
|
struct nfsrddirargs {
|
|
fhandle_t rda_fh; /* directory handle */
|
|
u_long rda_offset; /* offset in directory (opaque) */
|
|
u_long rda_count; /* number of directory bytes to read */
|
|
};
|
|
|
|
/*
|
|
* NFS_OK part of readdir result
|
|
*/
|
|
struct nfsrdok {
|
|
u_long rdok_offset; /* next offset (opaque) */
|
|
u_long rdok_size; /* size in bytes of entries */
|
|
bool_t rdok_eof; /* true if last entry is in result */
|
|
struct dirent *rdok_entries; /* variable number of entries */
|
|
struct buf *rdok_bp; /* buffer containing entries */
|
|
};
|
|
|
|
/*
|
|
* Readdir result
|
|
*/
|
|
struct nfsrddirres {
|
|
u_long rd_bufsize; /* client request size (not xdr'ed) */
|
|
enum nfsstat rd_status;
|
|
union {
|
|
struct nfsrdok rd_rdok_u;
|
|
} rd_u;
|
|
};
|
|
#define rd_rdok rd_u.rd_rdok_u
|
|
#define rd_offset rd_u.rd_rdok_u.rdok_offset
|
|
#define rd_size rd_u.rd_rdok_u.rdok_size
|
|
#define rd_eof rd_u.rd_rdok_u.rdok_eof
|
|
#define rd_entries rd_u.rd_rdok_u.rdok_entries
|
|
|
|
|
|
/*
|
|
* Arguments for directory operations
|
|
*/
|
|
struct nfsdiropargs {
|
|
fhandle_t da_fhandle; /* directory file handle */
|
|
char *da_name; /* name (up to NFS_MAXNAMLEN bytes) */
|
|
};
|
|
|
|
/*
|
|
* NFS_OK part of directory operation result
|
|
*/
|
|
struct nfsdrok {
|
|
fhandle_t drok_fhandle; /* result file handle */
|
|
struct nfsfattr drok_attr; /* result file attributes */
|
|
};
|
|
|
|
/*
|
|
* Results from directory operation
|
|
*/
|
|
struct nfsdiropres {
|
|
enum nfsstat dr_status; /* result status */
|
|
union {
|
|
struct nfsdrok dr_drok_u; /* NFS_OK result */
|
|
} dr_u;
|
|
};
|
|
#define dr_drok dr_u.dr_drok_u
|
|
#define dr_fhandle dr_u.dr_drok_u.drok_fhandle
|
|
#define dr_attr dr_u.dr_drok_u.drok_attr
|
|
|
|
/*
|
|
* arguments to setattr
|
|
*/
|
|
struct nfssaargs {
|
|
fhandle_t saa_fh; /* fhandle of file to be set */
|
|
struct nfssattr saa_sa; /* new attributes */
|
|
};
|
|
|
|
/*
|
|
* arguments to create and mkdir
|
|
*/
|
|
struct nfscreatargs {
|
|
struct nfsdiropargs ca_da; /* file name to create and parent dir */
|
|
struct nfssattr ca_sa; /* initial attributes */
|
|
};
|
|
|
|
/*
|
|
* arguments to link
|
|
*/
|
|
struct nfslinkargs {
|
|
fhandle_t la_from; /* old file */
|
|
struct nfsdiropargs la_to; /* new file and parent dir */
|
|
};
|
|
|
|
/*
|
|
* arguments to rename
|
|
*/
|
|
struct nfsrnmargs {
|
|
struct nfsdiropargs rna_from; /* old file and parent dir */
|
|
struct nfsdiropargs rna_to; /* new file and parent dir */
|
|
};
|
|
|
|
/*
|
|
* arguments to symlink
|
|
*/
|
|
struct nfsslargs {
|
|
struct nfsdiropargs sla_from; /* old file and parent dir */
|
|
char *sla_tnm; /* new name */
|
|
struct nfssattr sla_sa; /* attributes */
|
|
};
|
|
|
|
/*
|
|
* NFS_OK part of statfs operation
|
|
*/
|
|
struct nfsstatfsok {
|
|
u_long fsok_tsize; /* preferred transfer size in bytes */
|
|
u_long fsok_bsize; /* fundamental file system block size */
|
|
u_long fsok_blocks; /* total blocks in file system */
|
|
u_long fsok_bfree; /* free blocks in fs */
|
|
u_long fsok_bavail; /* free blocks avail to non-superuser */
|
|
};
|
|
|
|
/*
|
|
* Results of statfs operation
|
|
*/
|
|
struct nfsstatfs {
|
|
enum nfsstat fs_status; /* result status */
|
|
union {
|
|
struct nfsstatfsok fs_fsok_u; /* NFS_OK result */
|
|
} fs_u;
|
|
};
|
|
#define fs_fsok fs_u.fs_fsok_u
|
|
#define fs_tsize fs_u.fs_fsok_u.fsok_tsize
|
|
#define fs_bsize fs_u.fs_fsok_u.fsok_bsize
|
|
#define fs_blocks fs_u.fs_fsok_u.fsok_blocks
|
|
#define fs_bfree fs_u.fs_fsok_u.fsok_bfree
|
|
#define fs_bavail fs_u.fs_fsok_u.fsok_bavail
|
|
|
|
/*
|
|
* XDR routines for handling structures defined above
|
|
*/
|
|
#ifdef _KERNEL
|
|
extern bool_t xdr_attrstat(struct __xdr_s *, struct nfsattrstat *);
|
|
extern bool_t xdr_creatargs(struct __xdr_s *, struct nfscreatargs *);
|
|
extern bool_t xdr_diropargs(struct __xdr_s *, struct nfsdiropargs *);
|
|
extern bool_t xdr_diropres(struct __xdr_s *, struct nfsdiropres *);
|
|
extern bool_t xdr_drok(struct __xdr_s *, struct nfsdrok *);
|
|
extern bool_t xdr_fattr(struct __xdr_s *, struct nfsfattr *);
|
|
extern bool_t xdr_fhandle(struct __xdr_s *, fhandle_t *);
|
|
extern bool_t xdr_fsok(struct __xdr_s *, struct nfsstatfsok *);
|
|
extern bool_t xdr_linkargs(struct __xdr_s *, struct nfslinkargs *);
|
|
extern bool_t xdr_rddirargs(struct __xdr_s *, struct nfsrddirargs *);
|
|
extern bool_t xdr_putrddirres(struct __xdr_s *, struct nfsrddirres *);
|
|
extern bool_t xdr_getrddirres(struct __xdr_s *, struct nfsrddirres *);
|
|
extern bool_t xdr_rdlnres(struct __xdr_s *, struct nfsrdlnres *);
|
|
extern bool_t xdr_rdresult(struct __xdr_s *, struct nfsrdresult *);
|
|
extern bool_t xdr_readargs(struct __xdr_s *, struct nfsreadargs *);
|
|
extern bool_t xdr_rnmargs(struct __xdr_s *, struct nfsrnmargs *);
|
|
extern bool_t xdr_rrok(struct __xdr_s *, struct nfsrrok *);
|
|
extern bool_t xdr_saargs(struct __xdr_s *, struct nfssaargs *);
|
|
extern bool_t xdr_sattr(struct __xdr_s *, struct nfssattr *);
|
|
extern bool_t xdr_slargs(struct __xdr_s *, struct nfsslargs *);
|
|
extern bool_t xdr_srok(struct __xdr_s *, struct nfssrok *);
|
|
extern bool_t xdr_timeval(struct __xdr_s *, struct timeval *);
|
|
extern bool_t xdr_writeargs(struct __xdr_s *, struct nfswriteargs *);
|
|
extern bool_t xdr_statfs(struct __xdr_s *, struct nfsstatfs *);
|
|
#endif
|
|
|
|
/*
|
|
* Remote file service routines
|
|
*/
|
|
#define RFS_NULL 0
|
|
#define RFS_GETATTR 1
|
|
#define RFS_SETATTR 2
|
|
#define RFS_ROOT 3
|
|
#define RFS_LOOKUP 4
|
|
#define RFS_READLINK 5
|
|
#define RFS_READ 6
|
|
#define RFS_WRITECACHE 7
|
|
#define RFS_WRITE 8
|
|
#define RFS_CREATE 9
|
|
#define RFS_REMOVE 10
|
|
#define RFS_RENAME 11
|
|
#define RFS_LINK 12
|
|
#define RFS_SYMLINK 13
|
|
#define RFS_MKDIR 14
|
|
#define RFS_RMDIR 15
|
|
#define RFS_READDIR 16
|
|
#define RFS_STATFS 17
|
|
#define RFS_NPROC 18
|
|
|
|
/*
|
|
* remote file service numbers
|
|
*/
|
|
#define NFS_PROGRAM ((u_long)100003)
|
|
#define NFS_VERSION ((u_long)2)
|
|
#define NFS_PORT 2049
|
|
|
|
#endif /* !__NFS_HEADER__ */
|