iPXE
Macros | Functions
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. More...
 
#define NFS_READLINK   5
 NFS READLINK procedure. More...
 
#define NFS_READ   6
 NFS READ procedure. More...
 

Functions

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. More...
 
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. More...
 
int nfs_lookup (struct interface *intf, struct oncrpc_session *session, const struct nfs_fh *fh, const char *filename)
 Send a LOOKUP request. More...
 
int nfs_readlink (struct interface *intf, struct oncrpc_session *session, const struct nfs_fh *fh)
 Send a READLINK request. More...
 
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. More...
 
int nfs_get_lookup_reply (struct nfs_lookup_reply *lookup_reply, struct oncrpc_reply *reply)
 Parse a LOOKUP reply. More...
 
int nfs_get_readlink_reply (struct nfs_readlink_reply *readlink_reply, struct oncrpc_reply *reply)
 Parse a READLINK reply. More...
 
int nfs_get_read_reply (struct nfs_read_reply *read_reply, struct oncrpc_reply *reply)
 Parse a READ reply. More...
 

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 46 of file nfs.c.

◆ NFS_READLINK

#define NFS_READLINK   5

NFS READLINK procedure.

Definition at line 48 of file nfs.c.

◆ NFS_READ

#define NFS_READ   6

NFS READ procedure.

Definition at line 50 of file nfs.c.

Function Documentation

◆ 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 59 of file nfs.c.

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

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 78 of file nfs.c.

78  {
79  size_t s;
80 
81  s = oncrpc_iob_add_int ( io_buf, fh->size );
82  memcpy ( iob_put ( io_buf, fh->size ), &fh->fh, fh->size );
83 
84  return s + fh->size;
85 }
#define iob_put(iobuf, len)
Definition: iobuf.h:120
uint8_t fh[64]
Definition: nfs.h:75
void * memcpy(void *dest, const void *src, size_t len) __nonnull
size_t size
Definition: nfs.h:76
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 96 of file nfs.c.

97  {
98  struct oncrpc_field fields[] = {
99  ONCRPC_SUBFIELD ( array, fh->size, &fh->fh ),
100  ONCRPC_FIELD ( str, filename ),
102  };
103 
104  return oncrpc_call ( intf, session, NFS_LOOKUP, fields );
105 }
#define ONCRPC_FIELD(type, value)
Definition: oncrpc.h:28
#define NFS_LOOKUP
NFS LOOKUP procedure.
Definition: nfs.c:46
uint8_t fh[64]
Definition: nfs.h:75
int oncrpc_call(struct interface *intf, struct oncrpc_session *session, uint32_t proc_name, const struct oncrpc_field fields[])
Definition: oncrpc.c:129
size_t size
Definition: nfs.h:76
uint32_t array
Array number.
Definition: edd.h:30
struct ntlm_data session
Session key.
Definition: ntlm.h:24
#define ONCRPC_SUBFIELD(type, args...)
Definition: oncrpc.h:29
#define ONCRPC_FIELD_END
Definition: oncrpc.h:32

References array, nfs_fh::fh, NFS_LOOKUP, oncrpc_call(), ONCRPC_FIELD, ONCRPC_FIELD_END, ONCRPC_SUBFIELD, session, 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 115 of file nfs.c.

116  {
117  struct oncrpc_field fields[] = {
118  ONCRPC_SUBFIELD ( array, fh->size, &fh->fh ),
120  };
121 
122  return oncrpc_call ( intf, session, NFS_READLINK, fields );
123 }
uint8_t fh[64]
Definition: nfs.h:75
#define NFS_READLINK
NFS READLINK 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
size_t size
Definition: nfs.h:76
uint32_t array
Array number.
Definition: edd.h:30
struct ntlm_data session
Session key.
Definition: ntlm.h:24
#define ONCRPC_SUBFIELD(type, args...)
Definition: oncrpc.h:29
#define ONCRPC_FIELD_END
Definition: oncrpc.h:32

References array, nfs_fh::fh, NFS_READLINK, oncrpc_call(), ONCRPC_FIELD_END, ONCRPC_SUBFIELD, session, 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 135 of file nfs.c.

136  {
137  struct oncrpc_field fields[] = {
138  ONCRPC_SUBFIELD ( array, fh->size, &fh->fh ),
140  ONCRPC_FIELD ( int32, count ),
142  };
143 
144  return oncrpc_call ( intf, session, NFS_READ, fields );
145 }
#define ONCRPC_FIELD(type, value)
Definition: oncrpc.h:28
uint8_t fh[64]
Definition: nfs.h:75
int oncrpc_call(struct interface *intf, struct oncrpc_session *session, uint32_t proc_name, const struct oncrpc_field fields[])
Definition: oncrpc.c:129
int64_t int64
Definition: stdint.h:33
size_t size
Definition: nfs.h:76
uint32_t array
Array number.
Definition: edd.h:30
int32_t int32
Definition: stdint.h:31
struct ntlm_data session
Session key.
Definition: ntlm.h:24
static userptr_t size_t offset
Offset of the first segment within the content.
Definition: deflate.h:259
#define ONCRPC_SUBFIELD(type, args...)
Definition: oncrpc.h:29
#define ONCRPC_FIELD_END
Definition: oncrpc.h:32
uint16_t count
Number of entries.
Definition: ena.h:22
#define NFS_READ
NFS READ procedure.
Definition: nfs.c:50

References array, count, nfs_fh::fh, NFS_READ, offset, oncrpc_call(), ONCRPC_FIELD, ONCRPC_FIELD_END, ONCRPC_SUBFIELD, session, 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 154 of file nfs.c.

155  {
156  if ( ! lookup_reply || ! reply )
157  return -EINVAL;
158 
159  lookup_reply->status = oncrpc_iob_get_int ( reply->data );
160  switch ( lookup_reply->status )
161  {
162  case NFS3_OK:
163  break;
164  case NFS3ERR_PERM:
165  return -EPERM;
166  case NFS3ERR_NOENT:
167  return -ENOENT;
168  case NFS3ERR_IO:
169  return -EIO;
170  case NFS3ERR_ACCES:
171  return -EACCES;
172  case NFS3ERR_NOTDIR:
173  return -ENOTDIR;
174  case NFS3ERR_NAMETOOLONG:
175  return -ENAMETOOLONG;
176  case NFS3ERR_STALE:
177  return -ESTALE;
178  case NFS3ERR_BADHANDLE:
179  case NFS3ERR_SERVERFAULT:
180  default:
181  return -EPROTO;
182  }
183 
184  nfs_iob_get_fh ( reply->data, &lookup_reply->fh );
185 
186  if ( oncrpc_iob_get_int ( reply->data ) == 1 )
187  lookup_reply->ent_type = oncrpc_iob_get_int ( reply->data );
188 
189  return 0;
190 }
#define NFS3ERR_NAMETOOLONG
Filename too long.
Definition: nfs.h:46
#define EINVAL
Invalid argument.
Definition: errno.h:428
uint32_t status
Reply status.
Definition: nfs.h:85
#define NFS3_OK
No error.
Definition: nfs.h:22
struct nfs_fh fh
File handle.
Definition: nfs.h:89
#define ENOENT
No such file or directory.
Definition: errno.h:514
#define EACCES
Permission denied.
Definition: errno.h:298
enum nfs_attr_type ent_type
Entity type.
Definition: nfs.h:87
#define oncrpc_iob_get_int(buf)
Get a 32 bits integer from the beginning of an I/O buffer.
Definition: oncrpc_iob.h:38
#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_PERM
Not owner.
Definition: nfs.h:24
#define ENOTDIR
Not a directory.
Definition: errno.h:574
#define EPROTO
Protocol error.
Definition: errno.h:624
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:59
#define NFS3ERR_IO
I/O error.
Definition: nfs.h:28
#define EPERM
Operation not permitted.
Definition: errno.h:614
#define NFS3ERR_NOENT
No such file or directory.
Definition: nfs.h:26
#define EIO
Input/output error.
Definition: errno.h:433
#define NFS3ERR_BADHANDLE
Illegal NFS file handle.
Definition: nfs.h:52
#define ENAMETOOLONG
Filename too long.
Definition: errno.h:473
#define NFS3ERR_STALE
Invalid file handle.
Definition: nfs.h:48
#define ESTALE
Stale file handle.
Definition: errno.h:659
#define NFS3ERR_ACCES
Permission denied.
Definition: nfs.h:32
struct io_buffer * data
Definition: oncrpc.h:68
#define NFS3ERR_NOTDIR
Not a directory.
Definition: nfs.h:40

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 198 of file nfs.c.

199  {
200  if ( ! readlink_reply || ! reply )
201  return -EINVAL;
202 
203  readlink_reply->status = oncrpc_iob_get_int ( reply->data );
204  switch ( readlink_reply->status )
205  {
206  case NFS3_OK:
207  break;
208  case NFS3ERR_IO:
209  return -EIO;
210  case NFS3ERR_ACCES:
211  return -EACCES;
212  case NFS3ERR_INVAL:
213  return -EINVAL;
214  case NFS3ERR_NOTSUPP:
215  return -ENOTSUP;
216  case NFS3ERR_STALE:
217  return -ESTALE;
218  case NFS3ERR_BADHANDLE:
219  case NFS3ERR_SERVERFAULT:
220  default:
221  return -EPROTO;
222  }
223 
224  if ( oncrpc_iob_get_int ( reply->data ) == 1 )
225  iob_pull ( reply->data, 5 * sizeof ( uint32_t ) +
226  8 * sizeof ( uint64_t ) );
227 
228  readlink_reply->path_len = oncrpc_iob_get_int ( reply->data );
229  readlink_reply->path = reply->data->data;
230 
231  return 0;
232 }
#define iob_pull(iobuf, len)
Definition: iobuf.h:102
#define EINVAL
Invalid argument.
Definition: errno.h:428
#define NFS3_OK
No error.
Definition: nfs.h:22
unsigned long long uint64_t
Definition: stdint.h:13
#define EACCES
Permission denied.
Definition: errno.h:298
#define ENOTSUP
Operation not supported.
Definition: errno.h:589
#define oncrpc_iob_get_int(buf)
Get a 32 bits integer from the beginning of an I/O buffer.
Definition: oncrpc_iob.h:38
#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 EPROTO
Protocol error.
Definition: errno.h:624
#define NFS3ERR_IO
I/O error.
Definition: nfs.h:28
#define NFS3ERR_NOTSUPP
Operation not supported.
Definition: nfs.h:56
unsigned int uint32_t
Definition: stdint.h:12
void * data
Start of data.
Definition: iobuf.h:48
#define EIO
Input/output error.
Definition: errno.h:433
#define NFS3ERR_BADHANDLE
Illegal NFS file handle.
Definition: nfs.h:52
#define NFS3ERR_STALE
Invalid file handle.
Definition: nfs.h:48
#define NFS3ERR_INVAL
Invalid argument.
Definition: nfs.h:44
#define ESTALE
Stale file handle.
Definition: errno.h:659
#define NFS3ERR_ACCES
Permission denied.
Definition: nfs.h:32
struct io_buffer * data
Definition: oncrpc.h:68

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 241 of file nfs.c.

242  {
243  if ( ! read_reply || ! reply )
244  return -EINVAL;
245 
246  read_reply->status = oncrpc_iob_get_int ( reply->data );
247  switch ( read_reply->status )
248  {
249  case NFS3_OK:
250  break;
251  case NFS3ERR_PERM:
252  return -EPERM;
253  case NFS3ERR_NOENT:
254  return -ENOENT;
255  case NFS3ERR_IO:
256  return -EIO;
257  case NFS3ERR_NXIO:
258  return -ENXIO;
259  case NFS3ERR_ACCES:
260  return -EACCES;
261  case NFS3ERR_INVAL:
262  return -EINVAL;
263  case NFS3ERR_STALE:
264  return -ESTALE;
265  case NFS3ERR_BADHANDLE:
266  case NFS3ERR_SERVERFAULT:
267  default:
268  return -EPROTO;
269  }
270 
271  if ( oncrpc_iob_get_int ( reply->data ) == 1 )
272  {
273  iob_pull ( reply->data, 5 * sizeof ( uint32_t ) );
274  read_reply->filesize = oncrpc_iob_get_int64 ( reply->data );
275  iob_pull ( reply->data, 7 * sizeof ( uint64_t ) );
276  }
277 
278  read_reply->count = oncrpc_iob_get_int ( reply->data );
279  read_reply->eof = oncrpc_iob_get_int ( reply->data );
280  read_reply->data_len = oncrpc_iob_get_int ( reply->data );
281  read_reply->data = reply->data->data;
282 
283  if ( read_reply->count != read_reply->data_len )
284  return -EPROTO;
285 
286  return 0;
287 }
#define iob_pull(iobuf, len)
Definition: iobuf.h:102
#define EINVAL
Invalid argument.
Definition: errno.h:428
uint32_t status
Reply status.
Definition: nfs.h:112
uint32_t count
Bytes read.
Definition: nfs.h:116
#define oncrpc_iob_get_int64(buf)
Get a 64 bits integer from the beginning of an I/O buffer.
Definition: oncrpc_iob.h:52
#define NFS3_OK
No error.
Definition: nfs.h:22
#define ENOENT
No such file or directory.
Definition: errno.h:514
unsigned long long uint64_t
Definition: stdint.h:13
#define EACCES
Permission denied.
Definition: errno.h:298
uint32_t eof
End-of-File indicator.
Definition: nfs.h:118
#define oncrpc_iob_get_int(buf)
Get a 32 bits integer from the beginning of an I/O buffer.
Definition: oncrpc_iob.h:38
#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_PERM
Not owner.
Definition: nfs.h:24
#define EPROTO
Protocol error.
Definition: errno.h:624
#define NFS3ERR_NXIO
No such device or address.
Definition: nfs.h:30
uint32_t data_len
Data length.
Definition: nfs.h:120
#define NFS3ERR_IO
I/O error.
Definition: nfs.h:28
unsigned int uint32_t
Definition: stdint.h:12
#define EPERM
Operation not permitted.
Definition: errno.h:614
#define ENXIO
No such device or address.
Definition: errno.h:599
#define NFS3ERR_NOENT
No such file or directory.
Definition: nfs.h:26
void * data
Start of data.
Definition: iobuf.h:48
#define EIO
Input/output error.
Definition: errno.h:433
#define NFS3ERR_BADHANDLE
Illegal NFS file handle.
Definition: nfs.h:52
#define NFS3ERR_STALE
Invalid file handle.
Definition: nfs.h:48
void * data
Data read.
Definition: nfs.h:122
#define NFS3ERR_INVAL
Invalid argument.
Definition: nfs.h:44
#define ESTALE
Stale file handle.
Definition: errno.h:659
#define NFS3ERR_ACCES
Permission denied.
Definition: nfs.h:32
struct io_buffer * data
Definition: oncrpc.h:68
uint64_t filesize
File size.
Definition: nfs.h:114

References nfs_read_reply::count, io_buffer::data, oncrpc_reply::data, nfs_read_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().