iPXE
posix_io.h File Reference

POSIX-like I/O. More...

#include <stdint.h>

Go to the source code of this file.

Macros

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

Typedefs

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

Functions

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

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 15 of file posix_io.h.

Referenced by posix_find_free_fd(), and select().

◆ POSIX_FD_MAX

#define POSIX_FD_MAX   ( 31 )

Maximum file descriptor that will ever be allocated.

Definition at line 18 of file posix_io.h.

Referenced by posix_find_free_fd(), and select().

Typedef Documentation

◆ fd_set

typedef uint32_t fd_set

File descriptor set as used for select()

Definition at line 21 of file posix_io.h.

Function Documentation

◆ FILE_LICENCE()

FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL )

◆ open()

int open ( const char * uri_string)
extern

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:3
#define DBG(...)
Print a debugging message.
Definition compiler.h:498
#define ENOMEM
Not enough space.
Definition errno.h:535
#define EINPROGRESS
Operation in progress.
Definition errno.h:419
static void intf_init(struct interface *intf, struct interface_descriptor *desc, struct refcnt *refcnt)
Initialise an object interface.
Definition interface.h:204
#define INIT_LIST_HEAD(list)
Initialise a list head.
Definition list.h:46
#define list_empty(list)
Test whether a list is empty.
Definition list.h:137
#define list_add(new, head)
Add a new entry to the head of a list.
Definition list.h:70
void * zalloc(size_t size)
Allocate cleared memory.
Definition malloc.c:662
int xfer_open_uri_string(struct interface *intf, const char *uri_string)
Open URI string.
Definition open.c:116
static int posix_find_free_fd(void)
Find an available file descriptor.
Definition posix_io.c:159
static struct interface_descriptor posix_file_xfer_desc
POSIX file data transfer interface descriptor.
Definition posix_io.c:135
static void posix_file_free(struct refcnt *refcnt)
Free open file.
Definition posix_io.c:76
static void posix_file_finished(struct posix_file *file, int rc)
Terminate file data transfer.
Definition posix_io.c:95
void step(void)
Single-step a single process.
Definition process.c:99
#define ref_put(refcnt)
Drop reference to object.
Definition refcnt.h:107
#define ref_init(refcnt, free)
Initialise a reference counter.
Definition refcnt.h:65
An open file.
Definition posix_io.c:46
struct interface xfer
Data transfer interface.
Definition posix_io.c:59
struct refcnt refcnt
Reference count for this object.
Definition posix_io.c:48
int fd
File descriptor.
Definition posix_io.c:52
struct list_head data
Received data queue.
Definition posix_io.c:65
struct list_head list
List of open files.
Definition posix_io.c:50
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()

ssize_t read ( int fd,
void * buf,
size_t max_len )
extern

Read data from file.

Parameters
bufData buffer
max_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 264 of file posix_io.c.

264 {
265 struct posix_file *file;
266 struct io_buffer *iobuf;
267 size_t len;
268
269 /* Identify file */
270 file = posix_fd_to_file ( fd );
271 if ( ! file )
272 return -EBADF;
273
274 /* Try to fetch more data if none available */
275 if ( list_empty ( &file->data ) )
276 step();
277
278 /* Dequeue at most one received I/O buffer into user buffer */
279 list_for_each_entry ( iobuf, &file->data, list ) {
280 len = iob_len ( iobuf );
281 if ( len > max_len )
282 len = max_len;
283 memcpy ( buf, iobuf->data, len );
284 iob_pull ( iobuf, len );
285 if ( ! iob_len ( iobuf ) ) {
286 list_del ( &iobuf->list );
287 free_iob ( iobuf );
288 }
289 file->pos += len;
290 assert ( len != 0 );
291 return len;
292 }
293
294 /* If file has completed, return (after returning all data) */
295 if ( file->rc != -EINPROGRESS ) {
296 assert ( list_empty ( &file->data ) );
297 return file->rc;
298 }
299
300 /* No data ready and file still in progress; return -WOULDBLOCK */
301 return -EWOULDBLOCK;
302}
#define assert(condition)
Assert a condition at run-time.
Definition assert.h:50
ring len
Length.
Definition dwmac.h:226
#define EWOULDBLOCK
Operation would block.
Definition errno.h:680
#define EBADF
Bad file descriptor.
Definition errno.h:329
void * memcpy(void *dest, const void *src, size_t len) __nonnull
void free_iob(struct io_buffer *iobuf)
Free I/O buffer.
Definition iobuf.c:153
static size_t iob_len(struct io_buffer *iobuf)
Calculate length of data in an I/O buffer.
Definition iobuf.h:160
#define iob_pull(iobuf, len)
Definition iobuf.h:107
#define list_for_each_entry(pos, head, member)
Iterate over entries in a list.
Definition list.h:432
#define list_del(list)
Delete an entry from a list.
Definition list.h:120
static struct posix_file * posix_fd_to_file(int fd)
Identify file by file descriptor.
Definition posix_io.c:144
A persistent I/O buffer.
Definition iobuf.h:38
void * data
Start of data.
Definition iobuf.h:53
struct list_head list
List of which this buffer is a member.
Definition iobuf.h:45
size_t pos
Current seek position.
Definition posix_io.c:61

References assert, 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, memcpy(), posix_file::pos, posix_fd_to_file(), posix_file::rc, and step().

◆ select()

int select ( fd_set * readfds,
int wait )
extern

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}
#define POSIX_FD_MAX
Maximum file descriptor that will ever be allocated.
Definition posix_io.h:18
#define POSIX_FD_MIN
Minimum file descriptor that will ever be allocated.
Definition posix_io.h:15

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)
extern

Determine file size.

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

Definition at line 310 of file posix_io.c.

310 {
311 struct posix_file *file;
312
313 /* Identify file */
314 file = posix_fd_to_file ( fd );
315 if ( ! file )
316 return -EBADF;
317
318 return file->filesize;
319}
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)
extern

Close file.

Parameters
fdFile descriptor
Return values
rcReturn status code

Definition at line 327 of file posix_io.c.

327 {
328 struct posix_file *file;
329
330 /* Identify file */
331 file = posix_fd_to_file ( fd );
332 if ( ! file )
333 return -EBADF;
334
335 /* Terminate data transfer */
336 posix_file_finished ( file, 0 );
337
338 /* Remove from list of open files and drop reference */
339 list_del ( &file->list );
340 ref_put ( &file->refcnt );
341 return 0;
342}

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

◆ __attribute__()

__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 34 of file posix_io.h.

35 {
36 *set = 0;
37}
struct option_descriptor set[0]
Definition nvo_cmd.c:112

References set.

Variable Documentation

◆ set

fd_set* set
Initial value:
{
*set |= ( 1 << fd )

Definition at line 46 of file posix_io.h.