aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorMichael Brown <mcb30@ipxe.org>2010-07-02 12:12:16 +0100
committerMichael Brown <mcb30@ipxe.org>2010-09-03 21:21:14 +0100
commit364b92521ad19051083db605de3b8a058374e096 (patch)
tree14d3d80d6f7563fc12be91826e03534818ce0cd2 /src
parentb0eacbd42166982e675e3467393a2e63fdb99111 (diff)
downloadipxe-364b92521ad19051083db605de3b8a058374e096.tar.gz
[xfer] Generalise metadata "whence" field to "flags" field
iPXE has never supported SEEK_END; the usage of "whence" offers only the options of SEEK_SET and SEEK_CUR and so is effectively a boolean flag. Further flags will be required to support additional metadata required by the Fibre Channel network model, so repurpose the "whence" field as a generic "flags" field. xfer_seek() has always been used with SEEK_SET, so remove the "whence" field altogether from its argument list. Signed-off-by: Michael Brown <mcb30@ipxe.org>
Diffstat (limited to 'src')
-rw-r--r--src/arch/i386/interface/pxe/pxe_tftp.c2
-rw-r--r--src/core/downloader.c2
-rw-r--r--src/core/posix_io.c2
-rw-r--r--src/core/xfer.c9
-rw-r--r--src/include/ipxe/xfer.h41
-rw-r--r--src/net/tcp/http.c4
-rw-r--r--src/net/udp/slam.c4
-rw-r--r--src/net/udp/tftp.c6
8 files changed, 30 insertions, 40 deletions
diff --git a/src/arch/i386/interface/pxe/pxe_tftp.c b/src/arch/i386/interface/pxe/pxe_tftp.c
index 7eaa63e54..7f0af7a61 100644
--- a/src/arch/i386/interface/pxe/pxe_tftp.c
+++ b/src/arch/i386/interface/pxe/pxe_tftp.c
@@ -85,7 +85,7 @@ static int pxe_tftp_xfer_deliver ( struct pxe_tftp_connection *pxe_tftp,
int rc = 0;
/* Calculate new buffer position */
- if ( meta->whence != SEEK_CUR )
+ if ( meta->flags & XFER_FL_ABS_OFFSET )
pxe_tftp->offset = 0;
pxe_tftp->offset += meta->offset;
diff --git a/src/core/downloader.c b/src/core/downloader.c
index 488c86d9c..3e21ee9a3 100644
--- a/src/core/downloader.c
+++ b/src/core/downloader.c
@@ -160,7 +160,7 @@ static int downloader_xfer_deliver ( struct downloader *downloader,
int rc;
/* Calculate new buffer position */
- if ( meta->whence != SEEK_CUR )
+ if ( meta->flags & XFER_FL_ABS_OFFSET )
downloader->pos = 0;
downloader->pos += meta->offset;
diff --git a/src/core/posix_io.c b/src/core/posix_io.c
index f7ca3f0db..38bd727b0 100644
--- a/src/core/posix_io.c
+++ b/src/core/posix_io.c
@@ -105,7 +105,7 @@ static int posix_file_xfer_deliver ( struct posix_file *file,
struct xfer_metadata *meta ) {
/* Keep track of file position solely for the filesize */
- if ( meta->whence != SEEK_CUR )
+ if ( meta->flags & XFER_FL_ABS_OFFSET )
file->pos = 0;
file->pos += meta->offset;
if ( file->filesize < file->pos )
diff --git a/src/core/xfer.c b/src/core/xfer.c
index dce245f9c..112adfcba 100644
--- a/src/core/xfer.c
+++ b/src/core/xfer.c
@@ -276,18 +276,17 @@ int xfer_printf ( struct interface *intf, const char *format, ... ) {
*
* @v intf Data transfer interface
* @v offset Offset to new position
- * @v whence Basis for new position
* @ret rc Return status code
*/
-int xfer_seek ( struct interface *intf, off_t offset, int whence ) {
+int xfer_seek ( struct interface *intf, off_t offset ) {
struct io_buffer *iobuf;
struct xfer_metadata meta = {
+ .flags = XFER_FL_ABS_OFFSET,
.offset = offset,
- .whence = whence,
};
- DBGC ( INTF_COL ( intf ), "INTF " INTF_FMT " seek %s+%ld\n",
- INTF_DBG ( intf ), whence_text ( whence ), offset );
+ DBGC ( INTF_COL ( intf ), "INTF " INTF_FMT " seek to %ld\n",
+ INTF_DBG ( intf ), offset );
/* Allocate and send a zero-length data buffer */
iobuf = xfer_alloc_iob ( intf, 0 );
diff --git a/src/include/ipxe/xfer.h b/src/include/ipxe/xfer.h
index 67da15f16..21614284b 100644
--- a/src/include/ipxe/xfer.h
+++ b/src/include/ipxe/xfer.h
@@ -18,21 +18,23 @@ struct io_buffer;
struct sockaddr;
struct net_device;
-/** Basis positions for seek() events */
-enum seek_whence {
- SEEK_CUR = 0,
- SEEK_SET,
-};
-
/** Data transfer metadata */
struct xfer_metadata {
- /** Position of data within stream */
- off_t offset;
- /** Basis for data position
+ /** Flags
+ *
+ * This is the bitwise OR of zero or more @c XFER_FL_XXX
+ * constants.
+ */
+ unsigned int flags;
+ /** Offset of data within stream
*
- * Must be one of @c SEEK_CUR or @c SEEK_SET.
+ * This is an absolute offset if the @c XFER_FL_ABS_OFFSET
+ * flag is set, otherwise a relative offset. (A freshly
+ * zeroed @c xfer_metadata structure therefore represents a
+ * relative offset of zero, i.e. no offset from the current
+ * position.)
*/
- int whence;
+ off_t offset;
/** Source socket address, or NULL */
struct sockaddr *src;
/** Destination socket address, or NULL */
@@ -41,19 +43,8 @@ struct xfer_metadata {
struct net_device *netdev;
};
-/**
- * Describe seek basis
- *
- * @v whence Basis for new position
- */
-static inline __attribute__ (( always_inline )) const char *
-whence_text ( int whence ) {
- switch ( whence ) {
- case SEEK_CUR: return "CUR";
- case SEEK_SET: return "SET";
- default: return "INVALID";
- }
-}
+/** Offset is absolute */
+#define XFER_FL_ABS_OFFSET 0x0001
/* Data transfer interface operations */
@@ -89,6 +80,6 @@ extern int xfer_vprintf ( struct interface *intf,
const char *format, va_list args );
extern int __attribute__ (( format ( printf, 2, 3 ) ))
xfer_printf ( struct interface *intf, const char *format, ... );
-extern int xfer_seek ( struct interface *intf, off_t offset, int whence );
+extern int xfer_seek ( struct interface *intf, off_t offset );
#endif /* _IPXE_XFER_H */
diff --git a/src/net/tcp/http.c b/src/net/tcp/http.c
index 3b59ed9f2..20f14e680 100644
--- a/src/net/tcp/http.c
+++ b/src/net/tcp/http.c
@@ -223,8 +223,8 @@ static int http_rx_content_length ( struct http_request *http,
}
/* Use seek() to notify recipient of filesize */
- xfer_seek ( &http->xfer, http->content_length, SEEK_SET );
- xfer_seek ( &http->xfer, 0, SEEK_SET );
+ xfer_seek ( &http->xfer, http->content_length );
+ xfer_seek ( &http->xfer, 0 );
return 0;
}
diff --git a/src/net/udp/slam.c b/src/net/udp/slam.c
index 84bb9cba3..026bc1797 100644
--- a/src/net/udp/slam.c
+++ b/src/net/udp/slam.c
@@ -462,7 +462,7 @@ static int slam_pull_header ( struct slam_request *slam,
}
/* Notify recipient of file size */
- xfer_seek ( &slam->xfer, slam->total_bytes, SEEK_SET );
+ xfer_seek ( &slam->xfer, slam->total_bytes );
return 0;
}
@@ -526,7 +526,7 @@ static int slam_mc_socket_deliver ( struct slam_request *slam,
/* Pass to recipient */
memset ( &meta, 0, sizeof ( meta ) );
- meta.whence = SEEK_SET;
+ meta.flags = XFER_FL_ABS_OFFSET;
meta.offset = ( packet * slam->block_size );
if ( ( rc = xfer_deliver ( &slam->xfer, iobuf, &meta ) ) != 0 )
goto err;
diff --git a/src/net/udp/tftp.c b/src/net/udp/tftp.c
index 3bcd0a258..e8223c99c 100644
--- a/src/net/udp/tftp.c
+++ b/src/net/udp/tftp.c
@@ -269,8 +269,8 @@ static int tftp_presize ( struct tftp_request *tftp, size_t filesize ) {
tftp->filesize = filesize;
/* Notify recipient of file size */
- xfer_seek ( &tftp->xfer, filesize, SEEK_SET );
- xfer_seek ( &tftp->xfer, 0, SEEK_SET );
+ xfer_seek ( &tftp->xfer, filesize );
+ xfer_seek ( &tftp->xfer, 0 );
/* Calculate expected number of blocks. Note that files whose
* length is an exact multiple of the blocksize will have a
@@ -854,7 +854,7 @@ static int tftp_rx_data ( struct tftp_request *tftp,
/* Deliver data */
memset ( &meta, 0, sizeof ( meta ) );
- meta.whence = SEEK_SET;
+ meta.flags = XFER_FL_ABS_OFFSET;
meta.offset = offset;
if ( ( rc = xfer_deliver ( &tftp->xfer, iob_disown ( iobuf ),
&meta ) ) != 0 ) {