summaryrefslogtreecommitdiffstats
path: root/src/include
diff options
context:
space:
mode:
authorMichael Brown2007-08-04 02:22:52 +0200
committerMichael Brown2007-08-04 02:22:52 +0200
commit07f84566d5c24f3f52f19fa17505392dec5c869d (patch)
tree87234e6916c880c2535650645d717a02f1d65736 /src/include
parentDisplay name and status of each file as it is downloaded. (diff)
downloadipxe-07f84566d5c24f3f52f19fa17505392dec5c869d.tar.gz
ipxe-07f84566d5c24f3f52f19fa17505392dec5c869d.tar.xz
ipxe-07f84566d5c24f3f52f19fa17505392dec5c869d.zip
Make read_user() non-blocking, and add select() call.
Diffstat (limited to 'src/include')
-rw-r--r--src/include/gpxe/posix_io.h54
1 files changed, 54 insertions, 0 deletions
diff --git a/src/include/gpxe/posix_io.h b/src/include/gpxe/posix_io.h
index a5cf0c753..9984db005 100644
--- a/src/include/gpxe/posix_io.h
+++ b/src/include/gpxe/posix_io.h
@@ -10,13 +10,67 @@
#include <stdint.h>
#include <gpxe/uaccess.h>
+/** Minimum file descriptor that will ever be allocated */
+#define POSIX_FD_MIN ( 1 )
+
+/** Maximum file descriptor that will ever be allocated */
+#define POSIX_FD_MAX ( 31 )
+
+/** File descriptor set as used for select() */
+typedef uint32_t fd_set;
+
extern int open ( const char *uri_string );
extern ssize_t read_user ( int fd, userptr_t buffer,
off_t offset, size_t len );
+extern int select ( fd_set *readfds, int wait );
extern ssize_t fsize ( int fd );
extern int close ( int fd );
/**
+ * Zero a file descriptor set
+ *
+ * @v set File descriptor set
+ */
+static inline __attribute__ (( always_inline )) void
+FD_ZERO ( fd_set *set ) {
+ *set = 0;
+}
+
+/**
+ * Set a bit within a file descriptor set
+ *
+ * @v fd File descriptor
+ * @v set File descriptor set
+ */
+static inline __attribute__ (( always_inline )) void
+FD_SET ( int fd, fd_set *set ) {
+ *set |= ( 1 << fd );
+}
+
+/**
+ * Clear a bit within a file descriptor set
+ *
+ * @v fd File descriptor
+ * @v set File descriptor set
+ */
+static inline __attribute__ (( always_inline )) void
+FD_CLR ( int fd, fd_set *set ) {
+ *set &= ~( 1 << fd );
+}
+
+/**
+ * Test a bit within a file descriptor set
+ *
+ * @v fd File descriptor
+ * @v set File descriptor set
+ * @ret is_set Corresponding bit is set
+ */
+static inline __attribute__ (( always_inline )) int
+FD_ISSET ( int fd, fd_set *set ) {
+ return ( *set & ( 1 << fd ) );
+}
+
+/**
* Read data from file
*
* @v fd File descriptor