iPXE
nfs.c File Reference

Network File System protocol. More...

#include <stdint.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <assert.h>
#include <errno.h>
#include <libgen.h>
#include <byteswap.h>
#include <ipxe/time.h>
#include <ipxe/iobuf.h>
#include <ipxe/open.h>
#include <ipxe/features.h>
#include <ipxe/nfs.h>
#include <ipxe/oncrpc.h>
#include <ipxe/oncrpc_iob.h>
#include <ipxe/portmap.h>
#include <ipxe/mount.h>
#include <ipxe/settings.h>

Go to the source code of this file.

Macros

#define NFS_LOOKUP   3
 NFS LOOKUP procedure.
#define NFS_READLINK   5
 NFS READLINK procedure.
#define NFS_READ   6
 NFS READ procedure.

Functions

 FILE_SECBOOT (FORBIDDEN)
size_t nfs_iob_get_fh (struct io_buffer *io_buf, struct nfs_fh *fh)
 Extract a file handle from the beginning of an I/O buffer.
size_t nfs_iob_add_fh (struct io_buffer *io_buf, const struct nfs_fh *fh)
 Add a file handle to the end of an I/O buffer.
int nfs_lookup (struct interface *intf, struct oncrpc_session *session, const struct nfs_fh *fh, const char *filename)
 Send a LOOKUP request.
int nfs_readlink (struct interface *intf, struct oncrpc_session *session, const struct nfs_fh *fh)
 Send a READLINK request.
int nfs_read (struct interface *intf, struct oncrpc_session *session, const struct nfs_fh *fh, uint64_t offset, uint32_t count)
 Send a READ request.
int nfs_get_lookup_reply (struct nfs_lookup_reply *lookup_reply, struct oncrpc_reply *reply)
 Parse a LOOKUP reply.
int nfs_get_readlink_reply (struct nfs_readlink_reply *readlink_reply, struct oncrpc_reply *reply)
 Parse a READLINK reply.
int nfs_get_read_reply (struct nfs_read_reply *read_reply, struct oncrpc_reply *reply)
 Parse a READ reply.

Detailed Description

Network File System protocol.

Definition in file nfs.c.

Macro Definition Documentation

◆ NFS_LOOKUP

#define NFS_LOOKUP   3

NFS LOOKUP procedure.

Definition at line 48 of file nfs.c.

Referenced by nfs_deliver(), nfs_lookup(), nfs_mount_deliver(), and nfs_step().

◆ NFS_READLINK

#define NFS_READLINK   5

NFS READLINK procedure.

Definition at line 50 of file nfs.c.

Referenced by nfs_deliver(), nfs_readlink(), and nfs_step().

◆ NFS_READ

#define NFS_READ   6

NFS READ procedure.

Definition at line 52 of file nfs.c.

Referenced by nfs_deliver(), nfs_read(), and nfs_step().

Function Documentation

◆ FILE_SECBOOT()

FILE_SECBOOT ( FORBIDDEN )

◆ nfs_iob_get_fh()

size_t nfs_iob_get_fh ( struct io_buffer * io_buf,
struct nfs_fh * fh )

Extract a file handle from the beginning of an I/O buffer.

Parameters
io_bufI/O buffer
fhFile handle
Return values
sizeSize of the data read

Definition at line 61 of file nfs.c.

61 {
62 fh->size = oncrpc_iob_get_int ( io_buf );
63
64 if ( fh->size > 64 )
65 return sizeof ( uint32_t );
66
67 memcpy (fh->fh, io_buf->data, fh->size );
68 iob_pull ( io_buf, fh->size );
69
70 return fh->size + sizeof ( uint32_t );
71}
unsigned int uint32_t
Definition stdint.h:12
void * memcpy(void *dest, const void *src, size_t len) __nonnull
#define iob_pull(iobuf, len)
Definition iobuf.h:107
#define oncrpc_iob_get_int(buf)
Get a 32 bits integer from the beginning of an I/O buffer.
Definition oncrpc_iob.h:38
void * data
Start of data.
Definition iobuf.h:53
uint8_t fh[64]
Definition nfs.h:75
size_t size
Definition nfs.h:76

References io_buffer::data, nfs_fh::fh, iob_pull, memcpy(), oncrpc_iob_get_int, and nfs_fh::size.

Referenced by mount_get_mnt_reply(), and nfs_get_lookup_reply().

◆ nfs_iob_add_fh()

size_t nfs_iob_add_fh ( struct io_buffer * io_buf,
const struct nfs_fh * fh )

Add a file handle to the end of an I/O buffer.

Parameters
io_bufI/O buffer
fhFile handle
Return values
sizeSize of the data written

Definition at line 80 of file nfs.c.

80 {
81 size_t s;
82
83 s = oncrpc_iob_add_int ( io_buf, fh->size );
84 memcpy ( iob_put ( io_buf, fh->size ), &fh->fh, fh->size );
85
86 return s + fh->size;
87}
#define iob_put(iobuf, len)
Definition iobuf.h:125
static size_t oncrpc_iob_add_int(struct io_buffer *io_buf, uint32_t val)
Add a 32 bits integer to the end of an I/O buffer.
Definition oncrpc_iob.h:83

References nfs_fh::fh, iob_put, memcpy(), oncrpc_iob_add_int(), and nfs_fh::size.

◆ nfs_lookup()

int nfs_lookup ( struct interface * intf,
struct oncrpc_session * session,
const struct nfs_fh * fh,
const char * filename )

Send a LOOKUP request.

Parameters
intfInterface to send the request on
sessionONC RPC session
fhThe file handle of the the directory
filenameThe file name
Return values
rcReturn status code

Definition at line 98 of file nfs.c.

99 {
100 struct oncrpc_field fields[] = {
101 ONCRPC_SUBFIELD ( array, fh->size, &fh->fh ),
102 ONCRPC_FIELD ( str, filename ),
104 };
105
106 return oncrpc_call ( intf, session, NFS_LOOKUP, fields );
107}
uint32_t array
Array number.
Definition edd.h:1
#define NFS_LOOKUP
NFS LOOKUP procedure.
Definition nfs.c:48
int oncrpc_call(struct interface *intf, struct oncrpc_session *session, uint32_t proc_name, const struct oncrpc_field fields[])
Definition oncrpc.c:129
#define ONCRPC_FIELD_END
Definition oncrpc.h:32
#define ONCRPC_SUBFIELD(type, args...)
Definition oncrpc.h:29
#define ONCRPC_FIELD(type, value)
Definition oncrpc.h:28

References array, nfs_fh::fh, NFS_LOOKUP, oncrpc_call(), ONCRPC_FIELD, ONCRPC_FIELD_END, ONCRPC_SUBFIELD, and nfs_fh::size.

Referenced by nfs_step().

◆ nfs_readlink()

int nfs_readlink ( struct interface * intf,
struct oncrpc_session * session,
const struct nfs_fh * fh )

Send a READLINK request.

Parameters
intfInterface to send the request on
sessionONC RPC session
fhThe symlink file handle
Return values
rcReturn status code

Definition at line 117 of file nfs.c.

118 {
119 struct oncrpc_field fields[] = {
120 ONCRPC_SUBFIELD ( array, fh->size, &fh->fh ),
122 };
123
124 return oncrpc_call ( intf, session, NFS_READLINK, fields );
125}
#define NFS_READLINK
NFS READLINK procedure.
Definition nfs.c:50

References array, nfs_fh::fh, NFS_READLINK, oncrpc_call(), ONCRPC_FIELD_END, ONCRPC_SUBFIELD, and nfs_fh::size.

Referenced by nfs_step().

◆ nfs_read()

int nfs_read ( struct interface * intf,
struct oncrpc_session * session,
const struct nfs_fh * fh,
uint64_t offset,
uint32_t count )

Send a READ request.

Parameters
intfInterface to send the request on
sessionONC RPC session
fhThe file handle
offsetOffset
countByte count
Return values
rcReturn status code

Definition at line 137 of file nfs.c.

138 {
139 struct oncrpc_field fields[] = {
140 ONCRPC_SUBFIELD ( array, fh->size, &fh->fh ),
144 };
145
146 return oncrpc_call ( intf, session, NFS_READ, fields );
147}
uint16_t offset
Offset to command line.
Definition bzimage.h:3
static unsigned int count
Number of entries.
Definition dwmac.h:220
int64_t int64
Definition stdint.h:34
int32_t int32
Definition stdint.h:32
#define NFS_READ
NFS READ procedure.
Definition nfs.c:52

References array, count, nfs_fh::fh, NFS_READ, offset, oncrpc_call(), ONCRPC_FIELD, ONCRPC_FIELD_END, ONCRPC_SUBFIELD, and nfs_fh::size.

Referenced by nfs_step().

◆ nfs_get_lookup_reply()

int nfs_get_lookup_reply ( struct nfs_lookup_reply * lookup_reply,
struct oncrpc_reply * reply )

Parse a LOOKUP reply.

Parameters
lookup_replyA structure where the data will be saved
replyThe ONC RPC reply to get data from
Return values
rcReturn status code

Definition at line 156 of file nfs.c.

157 {
158 if ( ! lookup_reply || ! reply )
159 return -EINVAL;
160
161 lookup_reply->status = oncrpc_iob_get_int ( reply->data );
162 switch ( lookup_reply->status )
163 {
164 case NFS3_OK:
165 break;
166 case NFS3ERR_PERM:
167 return -EPERM;
168 case NFS3ERR_NOENT:
169 return -ENOENT;
170 case NFS3ERR_IO:
171 return -EIO;
172 case NFS3ERR_ACCES:
173 return -EACCES;
174 case NFS3ERR_NOTDIR:
175 return -ENOTDIR;
177 return -ENAMETOOLONG;
178 case NFS3ERR_STALE:
179 return -ESTALE;
182 default:
183 return -EPROTO;
184 }
185
186 nfs_iob_get_fh ( reply->data, &lookup_reply->fh );
187
188 if ( oncrpc_iob_get_int ( reply->data ) == 1 )
189 lookup_reply->ent_type = oncrpc_iob_get_int ( reply->data );
190
191 return 0;
192}
#define ENOENT
No such file or directory.
Definition errno.h:515
#define ESTALE
Stale file handle.
Definition errno.h:660
#define EINVAL
Invalid argument.
Definition errno.h:429
#define ENAMETOOLONG
Filename too long.
Definition errno.h:474
#define EPROTO
Protocol error.
Definition errno.h:625
#define EIO
Input/output error.
Definition errno.h:434
#define ENOTDIR
Not a directory.
Definition errno.h:575
#define EACCES
Permission denied.
Definition errno.h:299
#define EPERM
Operation not permitted.
Definition errno.h:615
size_t nfs_iob_get_fh(struct io_buffer *io_buf, struct nfs_fh *fh)
Extract a file handle from the beginning of an I/O buffer.
Definition nfs.c:61
#define NFS3ERR_PERM
Not owner.
Definition nfs.h:24
#define NFS3ERR_SERVERFAULT
An error occurred on the server which does not map to any of the legal NFS version 3 protocol error v...
Definition nfs.h:61
#define NFS3ERR_NOTDIR
Not a directory.
Definition nfs.h:40
#define NFS3ERR_BADHANDLE
Illegal NFS file handle.
Definition nfs.h:52
#define NFS3ERR_NOENT
No such file or directory.
Definition nfs.h:26
#define NFS3ERR_ACCES
Permission denied.
Definition nfs.h:32
#define NFS3ERR_STALE
Invalid file handle.
Definition nfs.h:48
#define NFS3ERR_IO
I/O error.
Definition nfs.h:28
#define NFS3ERR_NAMETOOLONG
Filename too long.
Definition nfs.h:46
#define NFS3_OK
No error.
Definition nfs.h:22
enum nfs_attr_type ent_type
Entity type.
Definition nfs.h:87
struct nfs_fh fh
File handle.
Definition nfs.h:89
uint32_t status
Reply status.
Definition nfs.h:85
struct io_buffer * data
Definition oncrpc.h:68

References oncrpc_reply::data, EACCES, EINVAL, EIO, ENAMETOOLONG, ENOENT, ENOTDIR, nfs_lookup_reply::ent_type, EPERM, EPROTO, ESTALE, nfs_lookup_reply::fh, NFS3_OK, NFS3ERR_ACCES, NFS3ERR_BADHANDLE, NFS3ERR_IO, NFS3ERR_NAMETOOLONG, NFS3ERR_NOENT, NFS3ERR_NOTDIR, NFS3ERR_PERM, NFS3ERR_SERVERFAULT, NFS3ERR_STALE, nfs_iob_get_fh(), oncrpc_iob_get_int, and nfs_lookup_reply::status.

Referenced by nfs_deliver().

◆ nfs_get_readlink_reply()

int nfs_get_readlink_reply ( struct nfs_readlink_reply * readlink_reply,
struct oncrpc_reply * reply )

Parse a READLINK reply.

Parameters
readlink_replyA structure where the data will be saved
replyThe ONC RPC reply to get data from
Return values
rcReturn status code

Definition at line 200 of file nfs.c.

201 {
202 if ( ! readlink_reply || ! reply )
203 return -EINVAL;
204
205 readlink_reply->status = oncrpc_iob_get_int ( reply->data );
206 switch ( readlink_reply->status )
207 {
208 case NFS3_OK:
209 break;
210 case NFS3ERR_IO:
211 return -EIO;
212 case NFS3ERR_ACCES:
213 return -EACCES;
214 case NFS3ERR_INVAL:
215 return -EINVAL;
216 case NFS3ERR_NOTSUPP:
217 return -ENOTSUP;
218 case NFS3ERR_STALE:
219 return -ESTALE;
222 default:
223 return -EPROTO;
224 }
225
226 if ( oncrpc_iob_get_int ( reply->data ) == 1 )
227 iob_pull ( reply->data, 5 * sizeof ( uint32_t ) +
228 8 * sizeof ( uint64_t ) );
229
230 readlink_reply->path_len = oncrpc_iob_get_int ( reply->data );
231 readlink_reply->path = reply->data->data;
232
233 return 0;
234}
unsigned long long uint64_t
Definition stdint.h:13
#define ENOTSUP
Operation not supported.
Definition errno.h:590
#define NFS3ERR_INVAL
Invalid argument.
Definition nfs.h:44
#define NFS3ERR_NOTSUPP
Operation not supported.
Definition nfs.h:56

References io_buffer::data, oncrpc_reply::data, EACCES, EINVAL, EIO, ENOTSUP, EPROTO, ESTALE, iob_pull, NFS3_OK, NFS3ERR_ACCES, NFS3ERR_BADHANDLE, NFS3ERR_INVAL, NFS3ERR_IO, NFS3ERR_NOTSUPP, NFS3ERR_SERVERFAULT, NFS3ERR_STALE, oncrpc_iob_get_int, nfs_readlink_reply::path, nfs_readlink_reply::path_len, and nfs_readlink_reply::status.

Referenced by nfs_deliver().

◆ nfs_get_read_reply()

int nfs_get_read_reply ( struct nfs_read_reply * read_reply,
struct oncrpc_reply * reply )

Parse a READ reply.

Parameters
read_replyA structure where the data will be saved
replyThe ONC RPC reply to get data from
Return values
rcReturn status code

Definition at line 243 of file nfs.c.

244 {
245 if ( ! read_reply || ! reply )
246 return -EINVAL;
247
248 read_reply->status = oncrpc_iob_get_int ( reply->data );
249 switch ( read_reply->status )
250 {
251 case NFS3_OK:
252 break;
253 case NFS3ERR_PERM:
254 return -EPERM;
255 case NFS3ERR_NOENT:
256 return -ENOENT;
257 case NFS3ERR_IO:
258 return -EIO;
259 case NFS3ERR_NXIO:
260 return -ENXIO;
261 case NFS3ERR_ACCES:
262 return -EACCES;
263 case NFS3ERR_INVAL:
264 return -EINVAL;
265 case NFS3ERR_STALE:
266 return -ESTALE;
269 default:
270 return -EPROTO;
271 }
272
273 if ( oncrpc_iob_get_int ( reply->data ) == 1 )
274 {
275 iob_pull ( reply->data, 5 * sizeof ( uint32_t ) );
276 read_reply->filesize = oncrpc_iob_get_int64 ( reply->data );
277 iob_pull ( reply->data, 7 * sizeof ( uint64_t ) );
278 }
279
280 read_reply->count = oncrpc_iob_get_int ( reply->data );
281 read_reply->eof = oncrpc_iob_get_int ( reply->data );
282 read_reply->data_len = oncrpc_iob_get_int ( reply->data );
283 read_reply->data = reply->data->data;
284
285 if ( read_reply->count != read_reply->data_len )
286 return -EPROTO;
287
288 return 0;
289}
#define ENXIO
No such device or address.
Definition errno.h:600
#define NFS3ERR_NXIO
No such device or address.
Definition nfs.h:30
#define oncrpc_iob_get_int64(buf)
Get a 64 bits integer from the beginning of an I/O buffer.
Definition oncrpc_iob.h:52
uint32_t count
Bytes read.
Definition nfs.h:116
uint32_t status
Reply status.
Definition nfs.h:112
uint32_t data_len
Data length.
Definition nfs.h:120
void * data
Data read.
Definition nfs.h:122
uint32_t eof
End-of-File indicator.
Definition nfs.h:118
uint64_t filesize
File size.
Definition nfs.h:114

References nfs_read_reply::count, io_buffer::data, nfs_read_reply::data, oncrpc_reply::data, nfs_read_reply::data_len, EACCES, EINVAL, EIO, ENOENT, ENXIO, nfs_read_reply::eof, EPERM, EPROTO, ESTALE, nfs_read_reply::filesize, iob_pull, NFS3_OK, NFS3ERR_ACCES, NFS3ERR_BADHANDLE, NFS3ERR_INVAL, NFS3ERR_IO, NFS3ERR_NOENT, NFS3ERR_NXIO, NFS3ERR_PERM, NFS3ERR_SERVERFAULT, NFS3ERR_STALE, oncrpc_iob_get_int, oncrpc_iob_get_int64, and nfs_read_reply::status.

Referenced by nfs_deliver().