iPXE
Macros | Typedefs | Functions | Variables
posix_io.h File Reference

POSIX-like I/O. More...

#include <stdint.h>
#include <ipxe/uaccess.h>

Go to the source code of this file.

Macros

#define POSIX_FD_MIN   ( 1 )
 Minimum file descriptor that will ever be allocated. More...
 
#define POSIX_FD_MAX   ( 31 )
 Maximum file descriptor that will ever be allocated. More...
 

Typedefs

typedef uint32_t fd_set
 File descriptor set as used for select() More...
 

Functions

 FILE_LICENCE (GPL2_OR_LATER_OR_UBDL)
 
int open (const char *uri_string)
 Open file. More...
 
ssize_t read_user (int fd, userptr_t buffer, off_t offset, size_t len)
 Read data from file. More...
 
int select (fd_set *readfds, int wait)
 Check file descriptors for readiness. More...
 
ssize_t fsize (int fd)
 Determine file size. More...
 
int close (int fd)
 Close file. More...
 
static __attribute__ ((always_inline)) void FD_ZERO(fd_set *set)
 Zero a file descriptor set. More...
 
static ssize_t read (int fd, void *buf, size_t len)
 Read data from file. More...
 

Variables

static fd_setset
 

Detailed Description

POSIX-like I/O.

Definition in file posix_io.h.

Macro Definition Documentation

◆ POSIX_FD_MIN

#define POSIX_FD_MIN   ( 1 )

Minimum file descriptor that will ever be allocated.

Definition at line 16 of file posix_io.h.

◆ POSIX_FD_MAX

#define POSIX_FD_MAX   ( 31 )

Maximum file descriptor that will ever be allocated.

Definition at line 19 of file posix_io.h.

Typedef Documentation

◆ fd_set

typedef uint32_t fd_set

File descriptor set as used for select()

Definition at line 22 of file posix_io.h.

Function Documentation

◆ FILE_LICENCE()

FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL  )

◆ open()

int open ( const char *  uri_string)

Open file.

Parameters
uri_stringURI string
Return values
fdFile descriptor, or negative error number

Definition at line 176 of file posix_io.c.

176  {
177  struct posix_file *file;
178  int fd;
179  int rc;
180 
181  /* Find a free file descriptor to use */
183  if ( fd < 0 )
184  return fd;
185 
186  /* Allocate and initialise structure */
187  file = zalloc ( sizeof ( *file ) );
188  if ( ! file )
189  return -ENOMEM;
190  ref_init ( &file->refcnt, posix_file_free );
191  file->fd = fd;
192  file->rc = -EINPROGRESS;
193  intf_init ( &file->xfer, &posix_file_xfer_desc, &file->refcnt );
194  INIT_LIST_HEAD ( &file->data );
195 
196  /* Open URI on data transfer interface */
197  if ( ( rc = xfer_open_uri_string ( &file->xfer, uri_string ) ) != 0 )
198  goto err;
199 
200  /* Wait for open to succeed or fail */
201  while ( list_empty ( &file->data ) ) {
202  step();
203  if ( file->rc == 0 )
204  break;
205  if ( file->rc != -EINPROGRESS ) {
206  rc = file->rc;
207  goto err;
208  }
209  }
210 
211  /* Add to list of open files. List takes reference ownership. */
212  list_add ( &file->list, &posix_files );
213  DBG ( "POSIX opened %s as file %d\n", uri_string, fd );
214  return fd;
215 
216  err:
217  posix_file_finished ( file, rc );
218  ref_put ( &file->refcnt );
219  return rc;
220 }
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
struct list_head list
List of open files.
Definition: posix_io.c:50
struct interface xfer
Data transfer interface.
Definition: posix_io.c:59
An open file.
Definition: posix_io.c:46
#define list_add(new, head)
Add a new entry to the head of a list.
Definition: list.h:69
#define ref_init(refcnt, free)
Initialise a reference counter.
Definition: refcnt.h:64
struct refcnt refcnt
Reference count for this object.
Definition: posix_io.c:48
#define list_empty(list)
Test whether a list is empty.
Definition: list.h:136
#define ENOMEM
Not enough space.
Definition: errno.h:534
#define EINPROGRESS
Operation in progress.
Definition: errno.h:418
void * zalloc(size_t size)
Allocate cleared memory.
Definition: malloc.c:624
int fd
File descriptor.
Definition: posix_io.c:52
static void posix_file_finished(struct posix_file *file, int rc)
Terminate file data transfer.
Definition: posix_io.c:95
static void posix_file_free(struct refcnt *refcnt)
Free open file.
Definition: posix_io.c:76
static struct interface_descriptor posix_file_xfer_desc
POSIX file data transfer interface descriptor.
Definition: posix_io.c:135
#define INIT_LIST_HEAD(list)
Initialise a list head.
Definition: list.h:45
struct list_head data
Received data queue.
Definition: posix_io.c:65
void step(void)
Single-step a single process.
Definition: process.c:98
static int posix_find_free_fd(void)
Find an available file descriptor.
Definition: posix_io.c:159
#define DBG(...)
Print a debugging message.
Definition: compiler.h:498
static void intf_init(struct interface *intf, struct interface_descriptor *desc, struct refcnt *refcnt)
Initialise an object interface.
Definition: interface.h:203
int xfer_open_uri_string(struct interface *intf, const char *uri_string)
Open URI string.
Definition: open.c:115
#define ref_put(refcnt)
Drop reference to object.
Definition: refcnt.h:106
int rc
Overall status.
Definition: posix_io.c:57

References posix_file::data, DBG, EINPROGRESS, ENOMEM, posix_file::fd, INIT_LIST_HEAD, intf_init(), posix_file::list, list_add, list_empty, posix_file_finished(), posix_file_free(), posix_file_xfer_desc, posix_find_free_fd(), posix_file::rc, rc, ref_init, ref_put, posix_file::refcnt, step(), posix_file::xfer, xfer_open_uri_string(), and zalloc().

Referenced by int22(), peerdist_discovery_reply_values(), pxenv_file_open(), vmbus_open(), and xve_update_state().

◆ read_user()

ssize_t read_user ( int  fd,
userptr_t  buffer,
off_t  offset,
size_t  max_len 
)

Read data from file.

Parameters
bufferData buffer
offsetStarting offset within data buffer
lenMaximum length to read
Return values
lenActual length read, or negative error number

This call is non-blocking; if no data is available to read then -EWOULDBLOCK will be returned.

Definition at line 265 of file posix_io.c.

265  {
266  struct posix_file *file;
267  struct io_buffer *iobuf;
268  size_t len;
269 
270  /* Identify file */
271  file = posix_fd_to_file ( fd );
272  if ( ! file )
273  return -EBADF;
274 
275  /* Try to fetch more data if none available */
276  if ( list_empty ( &file->data ) )
277  step();
278 
279  /* Dequeue at most one received I/O buffer into user buffer */
280  list_for_each_entry ( iobuf, &file->data, list ) {
281  len = iob_len ( iobuf );
282  if ( len > max_len )
283  len = max_len;
284  copy_to_user ( buffer, offset, iobuf->data, len );
285  iob_pull ( iobuf, len );
286  if ( ! iob_len ( iobuf ) ) {
287  list_del ( &iobuf->list );
288  free_iob ( iobuf );
289  }
290  file->pos += len;
291  assert ( len != 0 );
292  return len;
293  }
294 
295  /* If file has completed, return (after returning all data) */
296  if ( file->rc != -EINPROGRESS ) {
297  assert ( list_empty ( &file->data ) );
298  return file->rc;
299  }
300 
301  /* No data ready and file still in progress; return -WOULDBLOCK */
302  return -EWOULDBLOCK;
303 }
#define iob_pull(iobuf, len)
Definition: iobuf.h:102
An open file.
Definition: posix_io.c:46
uint16_t max_len
Maximum length (in bytes)
Definition: ntlm.h:18
void free_iob(struct io_buffer *iobuf)
Free I/O buffer.
Definition: iobuf.c:146
uint32_t buffer
Buffer index (or NETVSC_RNDIS_NO_BUFFER)
Definition: netvsc.h:16
#define list_empty(list)
Test whether a list is empty.
Definition: list.h:136
#define list_del(list)
Delete an entry from a list.
Definition: list.h:119
assert((readw(&hdr->flags) &(GTF_reading|GTF_writing))==0)
#define EWOULDBLOCK
Operation would block.
Definition: errno.h:679
#define list_for_each_entry(pos, head, member)
Iterate over entries in a list.
Definition: list.h:431
static userptr_t size_t offset
Offset of the first segment within the content.
Definition: deflate.h:259
#define EBADF
Bad file descriptor.
Definition: errno.h:328
#define EINPROGRESS
Operation in progress.
Definition: errno.h:418
static size_t iob_len(struct io_buffer *iobuf)
Calculate length of data in an I/O buffer.
Definition: iobuf.h:155
static __always_inline void copy_to_user(userptr_t dest, off_t dest_off, const void *src, size_t len)
Copy data to user buffer.
Definition: uaccess.h:324
static struct posix_file * posix_fd_to_file(int fd)
Identify file by file descriptor.
Definition: posix_io.c:144
struct list_head list
List of which this buffer is a member.
Definition: iobuf.h:40
uint32_t len
Length.
Definition: ena.h:14
struct list_head data
Received data queue.
Definition: posix_io.c:65
void * data
Start of data.
Definition: iobuf.h:48
void step(void)
Single-step a single process.
Definition: process.c:98
size_t pos
Current seek position.
Definition: posix_io.c:61
int rc
Overall status.
Definition: posix_io.c:57
A persistent I/O buffer.
Definition: iobuf.h:33

References assert(), buffer, copy_to_user(), io_buffer::data, posix_file::data, EBADF, EINPROGRESS, EWOULDBLOCK, free_iob(), iob_len(), iob_pull, len, io_buffer::list, list_del, list_empty, list_for_each_entry, max_len, offset, posix_file::pos, posix_fd_to_file(), posix_file::rc, and step().

Referenced by int22(), pxenv_file_read(), and read().

◆ select()

int select ( fd_set readfds,
int  wait 
)

Check file descriptors for readiness.

Parameters
readfdsFile descriptors to check
waitWait until data is ready
Return values
nreadyNumber of ready file descriptors

Definition at line 229 of file posix_io.c.

229  {
230  struct posix_file *file;
231  int fd;
232 
233  do {
234  for ( fd = POSIX_FD_MIN ; fd <= POSIX_FD_MAX ; fd++ ) {
235  if ( ! FD_ISSET ( fd, readfds ) )
236  continue;
237  file = posix_fd_to_file ( fd );
238  if ( ! file )
239  return -EBADF;
240  if ( ( list_empty ( &file->data ) ) &&
241  ( file->rc == -EINPROGRESS ) )
242  continue;
243  /* Data is available or status has changed */
244  FD_ZERO ( readfds );
245  FD_SET ( fd, readfds );
246  return 1;
247  }
248  step();
249  } while ( wait );
250 
251  return 0;
252 }
An open file.
Definition: posix_io.c:46
#define list_empty(list)
Test whether a list is empty.
Definition: list.h:136
#define EBADF
Bad file descriptor.
Definition: errno.h:328
#define EINPROGRESS
Operation in progress.
Definition: errno.h:418
#define POSIX_FD_MAX
Maximum file descriptor that will ever be allocated.
Definition: posix_io.h:19
#define POSIX_FD_MIN
Minimum file descriptor that will ever be allocated.
Definition: posix_io.h:16
int fd
File descriptor.
Definition: posix_io.c:52
static struct posix_file * posix_fd_to_file(int fd)
Identify file by file descriptor.
Definition: posix_io.c:144
struct list_head data
Received data queue.
Definition: posix_io.c:65
void step(void)
Single-step a single process.
Definition: process.c:98
int rc
Overall status.
Definition: posix_io.c:57

References posix_file::data, EBADF, EINPROGRESS, posix_file::fd, list_empty, POSIX_FD_MAX, POSIX_FD_MIN, posix_fd_to_file(), posix_file::rc, and step().

Referenced by int22(), pxenv_file_select(), and show_menu().

◆ fsize()

ssize_t fsize ( int  fd)

Determine file size.

Parameters
fdFile descriptor
Return values
sizeFile size, or negative error number

Definition at line 311 of file posix_io.c.

311  {
312  struct posix_file *file;
313 
314  /* Identify file */
315  file = posix_fd_to_file ( fd );
316  if ( ! file )
317  return -EBADF;
318 
319  return file->filesize;
320 }
An open file.
Definition: posix_io.c:46
#define EBADF
Bad file descriptor.
Definition: errno.h:328
int fd
File descriptor.
Definition: posix_io.c:52
static struct posix_file * posix_fd_to_file(int fd)
Identify file by file descriptor.
Definition: posix_io.c:144
size_t filesize
File size.
Definition: posix_io.c:63

References EBADF, posix_file::fd, posix_file::filesize, and posix_fd_to_file().

Referenced by int22(), and pxenv_get_file_size().

◆ close()

int close ( int  fd)

Close file.

Parameters
fdFile descriptor
Return values
rcReturn status code

Definition at line 328 of file posix_io.c.

328  {
329  struct posix_file *file;
330 
331  /* Identify file */
332  file = posix_fd_to_file ( fd );
333  if ( ! file )
334  return -EBADF;
335 
336  /* Terminate data transfer */
337  posix_file_finished ( file, 0 );
338 
339  /* Remove from list of open files and drop reference */
340  list_del ( &file->list );
341  ref_put ( &file->refcnt );
342  return 0;
343 }
struct list_head list
List of open files.
Definition: posix_io.c:50
An open file.
Definition: posix_io.c:46
struct refcnt refcnt
Reference count for this object.
Definition: posix_io.c:48
#define list_del(list)
Delete an entry from a list.
Definition: list.h:119
#define EBADF
Bad file descriptor.
Definition: errno.h:328
int fd
File descriptor.
Definition: posix_io.c:52
static void posix_file_finished(struct posix_file *file, int rc)
Terminate file data transfer.
Definition: posix_io.c:95
static struct posix_file * posix_fd_to_file(int fd)
Identify file by file descriptor.
Definition: posix_io.c:144
#define ref_put(refcnt)
Drop reference to object.
Definition: refcnt.h:106

References EBADF, posix_file::fd, posix_file::list, list_del, posix_fd_to_file(), posix_file_finished(), ref_put, and posix_file::refcnt.

◆ __attribute__()

static __attribute__ ( (always_inline)  )
inlinestatic

Zero a file descriptor set.

Test a bit within a file descriptor set.

Clear a bit within a file descriptor set.

Set a bit within a file descriptor set.

Parameters
setFile descriptor set
fdFile descriptor
setFile descriptor set
fdFile descriptor
setFile descriptor set
Return values
is_setCorresponding bit is set

Definition at line 36 of file posix_io.h.

37  {
38  *set = 0;
39 }
static fd_set * set
Definition: posix_io.h:48

References set.

◆ read()

static ssize_t read ( int  fd,
void *  buf,
size_t  len 
)
inlinestatic

Read data from file.

Parameters
fdFile descriptor
bufData buffer
lenMaximum length to read
Return values
lenActual length read, or negative error number

Definition at line 83 of file posix_io.h.

83  {
84  return read_user ( fd, virt_to_user ( buf ), 0, len );
85 }
int fd
File descriptor.
Definition: posix_io.c:52
ssize_t read_user(int fd, userptr_t buffer, off_t offset, size_t len)
Read data from file.
Definition: posix_io.c:265
uint32_t len
Length.
Definition: ena.h:14
userptr_t virt_to_user(volatile const void *addr)
Convert virtual address to user pointer.

References len, read_user(), and virt_to_user().

Variable Documentation

◆ set

fd_set* set
Initial value:
{
*set |= ( 1 << fd )
static fd_set * set
Definition: posix_io.h:48
int fd
File descriptor.
Definition: posix_io.c:52

Definition at line 48 of file posix_io.h.

Referenced by __attribute__().