mirror of https://github.com/ipxe/ipxe.git
158 lines
4.1 KiB
C
158 lines
4.1 KiB
C
#ifndef _IPXE_NFS_H
|
|
#define _IPXE_NFS_H
|
|
|
|
#include <stdint.h>
|
|
#include <ipxe/oncrpc.h>
|
|
|
|
/** @file
|
|
*
|
|
* Network File System protocol.
|
|
*
|
|
*/
|
|
|
|
FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
|
|
|
|
/** NFS protocol number */
|
|
#define ONCRPC_NFS 100003
|
|
|
|
/** NFS protocol version */
|
|
#define NFS_VERS 3
|
|
|
|
/** No error*/
|
|
#define NFS3_OK 0
|
|
/** Not owner */
|
|
#define NFS3ERR_PERM 1
|
|
/** No such file or directory */
|
|
#define NFS3ERR_NOENT 2
|
|
/** I/O error */
|
|
#define NFS3ERR_IO 5
|
|
/** No such device or address */
|
|
#define NFS3ERR_NXIO 6
|
|
/** Permission denied */
|
|
#define NFS3ERR_ACCES 13
|
|
/** The file specified already exists */
|
|
#define NFS3ERR_EXIST 17
|
|
/** Attempt to do a cross-device hard link */
|
|
#define NFS3ERR_XDEV 18
|
|
/** No such device */
|
|
#define NFS3ERR_NODEV 19
|
|
/** Not a directory */
|
|
#define NFS3ERR_NOTDIR 20
|
|
/**Is a directory */
|
|
#define NFS3ERR_ISDIR 21
|
|
/** Invalid argument */
|
|
#define NFS3ERR_INVAL 22
|
|
/** Filename too long */
|
|
#define NFS3ERR_NAMETOOLONG 63
|
|
/** Invalid file handle */
|
|
#define NFS3ERR_STALE 70
|
|
/** Too many levels of remote in path */
|
|
#define NFS3ERR_REMOTE 71
|
|
/** Illegal NFS file handle */
|
|
#define NFS3ERR_BADHANDLE 10001
|
|
/** READDIR or READDIRPLUS cookie is stale */
|
|
#define NFS3ERR_BAD_COOKIE 10003
|
|
/** Operation not supported */
|
|
#define NFS3ERR_NOTSUPP 10004
|
|
/** Buffer or request is too small */
|
|
#define NFS3ERR_TOOSMALL 10005
|
|
/** An error occurred on the server which does not map to any of the legal NFS
|
|
* version 3 protocol error values */
|
|
#define NFS3ERR_SERVERFAULT 10006
|
|
/** The server initiated the request, but was not able to complete it in a
|
|
* timely fashion */
|
|
#define NFS3ERR_JUKEBOX 10008
|
|
|
|
enum nfs_attr_type {
|
|
NFS_ATTR_SYMLINK = 5,
|
|
};
|
|
|
|
/**
|
|
* A NFS file handle
|
|
*
|
|
*/
|
|
struct nfs_fh {
|
|
uint8_t fh[64];
|
|
size_t size;
|
|
};
|
|
|
|
/**
|
|
* A NFS LOOKUP reply
|
|
*
|
|
*/
|
|
struct nfs_lookup_reply {
|
|
/** Reply status */
|
|
uint32_t status;
|
|
/** Entity type */
|
|
enum nfs_attr_type ent_type;
|
|
/** File handle */
|
|
struct nfs_fh fh;
|
|
};
|
|
|
|
/**
|
|
* A NFS READLINK reply
|
|
*
|
|
*/
|
|
struct nfs_readlink_reply {
|
|
/** Reply status */
|
|
uint32_t status;
|
|
/** File path length */
|
|
uint32_t path_len;
|
|
/** File path */
|
|
char *path;
|
|
};
|
|
|
|
|
|
/**
|
|
* A NFS READ reply
|
|
*
|
|
*/
|
|
struct nfs_read_reply {
|
|
/** Reply status */
|
|
uint32_t status;
|
|
/** File size */
|
|
uint64_t filesize;
|
|
/** Bytes read */
|
|
uint32_t count;
|
|
/** End-of-File indicator */
|
|
uint32_t eof;
|
|
/** Data length */
|
|
uint32_t data_len;
|
|
/** Data read */
|
|
void *data;
|
|
};
|
|
|
|
size_t nfs_iob_get_fh ( struct io_buffer *io_buf, struct nfs_fh *fh );
|
|
size_t nfs_iob_add_fh ( struct io_buffer *io_buf, const struct nfs_fh *fh );
|
|
|
|
/**
|
|
* Prepare an ONC RPC session to be used as a NFS session
|
|
*
|
|
* @v session ONC RPC session
|
|
* @v credential ONC RPC credential
|
|
*
|
|
* The credential parameter must not be NULL, use 'oncrpc_auth_none' if you
|
|
* don't want a particular scheme to be used.
|
|
*/
|
|
static inline void nfs_init_session ( struct oncrpc_session *session,
|
|
struct oncrpc_cred *credential ) {
|
|
oncrpc_init_session ( session, credential, &oncrpc_auth_none,
|
|
ONCRPC_NFS, NFS_VERS );
|
|
}
|
|
|
|
int nfs_lookup ( struct interface *intf, struct oncrpc_session *session,
|
|
const struct nfs_fh *fh, const char *filename );
|
|
int nfs_readlink ( struct interface *intf, struct oncrpc_session *session,
|
|
const struct nfs_fh *fh );
|
|
int nfs_read ( struct interface *intf, struct oncrpc_session *session,
|
|
const struct nfs_fh *fh, uint64_t offset, uint32_t count );
|
|
|
|
int nfs_get_lookup_reply ( struct nfs_lookup_reply *lookup_reply,
|
|
struct oncrpc_reply *reply );
|
|
int nfs_get_readlink_reply ( struct nfs_readlink_reply *readlink_reply,
|
|
struct oncrpc_reply *reply );
|
|
int nfs_get_read_reply ( struct nfs_read_reply *read_reply,
|
|
struct oncrpc_reply *reply );
|
|
|
|
#endif /* _IPXE_NFS_H */
|