Add seek()
authorMichael Brown <mcb30@etherboot.org>
Sun, 29 Apr 2007 02:03:58 +0000 (02:03 +0000)
committerMichael Brown <mcb30@etherboot.org>
Sun, 29 Apr 2007 02:03:58 +0000 (02:03 +0000)
Dehyphenate "data-transfer".

src/core/open.c
src/core/xfer.c
src/include/gpxe/open.h
src/include/gpxe/xfer.h

index ffcb4e2..fa9c858 100644 (file)
@@ -45,7 +45,7 @@ static struct socket_opener socket_openers_end[0]
 /**
  * Open URI
  *
- * @v xfer             Data-transfer interface
+ * @v xfer             Data transfer interface
  * @v uri_string       URI string (e.g. "http://etherboot.org/kernel")
  * @ret rc             Return status code
  */
@@ -74,7 +74,7 @@ int open_uri ( struct xfer_interface *xfer, const char *uri_string ) {
 /**
  * Open socket
  *
- * @v xfer             Data-transfer interface
+ * @v xfer             Data transfer interface
  * @v domain           Communication domain (e.g. PF_INET)
  * @v type             Communication semantics (e.g. SOCK_STREAM)
  */
@@ -101,7 +101,7 @@ int open_socket ( struct xfer_interface *xfer,
 /**
  * Open location
  *
- * @v xfer             Data-transfer interface
+ * @v xfer             Data transfer interface
  * @v type             Location type
  * @v args             Remaining arguments depend upon location type
  * @ret rc             Return status code
@@ -128,7 +128,7 @@ int vopen ( struct xfer_interface *xfer, int type, va_list args ) {
 /**
  * Open location
  *
- * @v xfer             Data-transfer interface
+ * @v xfer             Data transfer interface
  * @v type             Location type
  * @v ...              Remaining arguments depend upon location type
  * @ret rc             Return status code
index c399379..d348081 100644 (file)
  *
  */
 
+/**
+ * Close data transfer interface
+ *
+ * @v xfer             Data transfer interface
+ * @v rc               Reason for close
+ */
+void close ( struct xfer_interface *xfer, int rc ) {
+       struct xfer_interface *dest = xfer_dest ( xfer );
+
+       dest->op->close ( dest, rc );
+       xfer_unplug ( xfer );
+}
+
+/**
+ * Seek to position
+ *
+ * @v xfer             Data transfer interface
+ * @v pos              New position
+ * @ret rc             Return status code
+ */
+int seek ( struct xfer_interface *xfer, size_t pos ) {
+       struct xfer_interface *dest = xfer_dest ( xfer );
+
+       return dest->op->seek ( dest, pos );
+}
+
 /**
  * Send redirection event
  *
- * @v xfer             Data-transfer interface
+ * @v xfer             Data transfer interface
  * @v type             New location type
  * @v args             Remaining arguments depend upon location type
  * @ret rc             Return status code
@@ -43,7 +69,7 @@ int vredirect ( struct xfer_interface *xfer, int type, va_list args ) {
 /**
  * Send redirection event
  *
- * @v xfer             Data-transfer interface
+ * @v xfer             Data transfer interface
  * @v type             New location type
  * @v ...              Remaining arguments depend upon location type
  * @ret rc             Return status code
@@ -61,7 +87,7 @@ int redirect ( struct xfer_interface *xfer, int type, ... ) {
 /**
  * Deliver datagram
  *
- * @v xfer             Data-transfer interface
+ * @v xfer             Data transfer interface
  * @v iobuf            Datagram I/O buffer
  * @ret rc             Return status code
  */
@@ -74,7 +100,7 @@ int deliver ( struct xfer_interface *xfer, struct io_buffer *iobuf ) {
 /**
  * Deliver datagram as raw data
  *
- * @v xfer             Data-transfer interface
+ * @v xfer             Data transfer interface
  * @v iobuf            Datagram I/O buffer
  * @ret rc             Return status code
  */
@@ -93,10 +119,44 @@ int deliver_raw ( struct xfer_interface *xfer, const void *data, size_t len ) {
  *
  */
 
+/**
+ * Ignore close()
+ *
+ * @v xfer             Data transfer interface
+ * @v rc               Reason for close
+ */
+void ignore_close ( struct xfer_interface *xfer __unused, int rc __unused ) {
+       /* Nothing to do */
+}
+
+/**
+ * Ignore vredirect()
+ *
+ * @v xfer             Data transfer interface
+ * @v type             New location type
+ * @v args             Remaining arguments depend upon location type
+ * @ret rc             Return status code
+ */
+int ignore_vredirect ( struct xfer_interface *xfer __unused,
+                      int type __unused, va_list args __unused ) {
+       return 0;
+}
+
+/**
+ * Ignore seek()
+ *
+ * @v xfer             Data transfer interface
+ * @v pos              New position
+ * @ret rc             Return status code
+ */
+int ignore_seek ( struct xfer_interface *xfer __unused, size_t pos __unused ) {
+       return 0;
+}
+
 /**
  * Deliver datagram as raw data
  *
- * @v xfer             Data-transfer interface
+ * @v xfer             Data transfer interface
  * @v iobuf            Datagram I/O buffer
  * @ret rc             Return status code
  *
@@ -115,7 +175,7 @@ int deliver_as_raw ( struct xfer_interface *xfer,
 /**
  * Deliver datagram as I/O buffer
  *
- * @v xfer             Data-transfer interface
+ * @v xfer             Data transfer interface
  * @v data             Data buffer
  * @v len              Length of data buffer
  * @ret rc             Return status code
@@ -135,32 +195,29 @@ int deliver_as_iobuf ( struct xfer_interface *xfer,
        return xfer->op->deliver ( xfer, iobuf );
 }
 
-/****************************************************************************
- *
- * Null data transfer interface
- *
- */
-
 /**
- * Null deliver datagram as raw data
+ * Ignore datagram as raw data
  *
- * @v xfer             Data-transfer interface
+ * @v xfer             Data transfer interface
  * @v data             Data buffer
  * @v len              Length of data buffer
  * @ret rc             Return status code
  */
-static int null_deliver_raw ( struct xfer_interface *xfer,
-                             const void *data __unused, size_t len ) {
+int ignore_deliver_raw ( struct xfer_interface *xfer,
+                        const void *data __unused, size_t len ) {
        DBGC ( xfer, "XFER %p %zd bytes delivered %s\n", xfer, len,
               ( ( xfer == &null_xfer ) ?
                 "before connection" : "after termination" ) );
-       return -EPIPE;
+       return 0;
 }
 
 /** Null data transfer interface operations */
 struct xfer_interface_operations null_xfer_ops = {
+       .close          = ignore_close,
+       .vredirect      = ignore_vredirect,
+       .seek           = ignore_seek,
        .deliver        = deliver_as_raw,
-       .deliver_raw    = null_deliver_raw,
+       .deliver_raw    = ignore_deliver_raw,
 };
 
 /**
index 8839dc2..ad86d09 100644 (file)
@@ -41,7 +41,7 @@ struct uri_opener {
        const char *scheme;
        /** Open URI
         *
-        * @v xfer              Data-transfer interface
+        * @v xfer              Data transfer interface
         * @v uri               URI
         * @ret rc              Return status code
         *
@@ -62,7 +62,7 @@ struct socket_opener {
        int type;
        /** Open socket
         *
-        * @v xfer              Data-transfer interface
+        * @v xfer              Data transfer interface
         * @v sa                Socket address
         * @ret rc              Return status code
         */
index 0b8bf4c..dfbde89 100644 (file)
@@ -32,22 +32,29 @@ struct xfer_interface_operations {
 
        /** Close interface
         *
-        * @v xfer              Data-transfer interface
+        * @v xfer              Data transfer interface
         * @v rc                Reason for close
         */
        void ( * close ) ( struct xfer_interface *xfer, int rc );
        /** Redirect to new location
         *
-        * @v xfer              Data-transfer interface
+        * @v xfer              Data transfer interface
         * @v type              New location type
         * @v args              Remaining arguments depend upon location type
         * @ret rc              Return status code
         */
        int ( * vredirect ) ( struct xfer_interface *xfer, int type,
                              va_list args );
+       /** Seek to position
+        *
+        * @v xfer              Data transfer interface
+        * @v pos               New position
+        * @ret rc              Return status code
+        */
+       int ( * seek ) ( struct xfer_interface *xfer, size_t pos );
        /** Deliver datagram
         *
-        * @v xfer              Data-transfer interface
+        * @v xfer              Data transfer interface
         * @v iobuf             Datagram I/O buffer
         * @ret rc              Return status code
         *
@@ -59,7 +66,7 @@ struct xfer_interface_operations {
                            struct io_buffer *iobuf );
        /** Deliver datagram as raw data
         *
-        * @v xfer              Data-transfer interface
+        * @v xfer              Data transfer interface
         * @v data              Data buffer
         * @v len               Length of data buffer
         * @ret rc              Return status code
@@ -83,32 +90,67 @@ struct xfer_interface {
 extern struct xfer_interface null_xfer;
 extern struct xfer_interface_operations null_xfer_ops;
 
+extern void close ( struct xfer_interface *xfer, int rc );
+extern int seek ( struct xfer_interface *xfer, size_t pos );
 extern int vredirect ( struct xfer_interface *xfer, int type, va_list args );
 extern int redirect ( struct xfer_interface *xfer, int type, ... );
 extern int deliver ( struct xfer_interface *xfer, struct io_buffer *iobuf );
 extern int deliver_raw ( struct xfer_interface *xfer,
                         const void *data, size_t len );
 
+extern void ignore_close ( struct xfer_interface *xfer, int rc );
+extern int ignore_vredirect ( struct xfer_interface *xfer,
+                             int type, va_list args );
+extern int ignore_seek ( struct xfer_interface *xfer, size_t pos );
 extern int deliver_as_raw ( struct xfer_interface *xfer,
                            struct io_buffer *iobuf );
 extern int deliver_as_iobuf ( struct xfer_interface *xfer,
                              const void *data, size_t len );
+extern int ignore_deliver_raw ( struct xfer_interface *xfer,
+                               const void *data __unused, size_t len );
+
+/**
+ * Initialise a data transfer interface
+ *
+ * @v xfer             Data transfer interface
+ * @v op               Data transfer interface operations
+ * @v refcnt           Data transfer interface reference counting method
+ */
+static inline void xfer_init ( struct xfer_interface *xfer,
+                              struct xfer_interface_operations *op,
+                              void ( * refcnt ) ( struct interface *intf,
+                                                  int delta ) ) {
+       xfer->intf.dest = &null_xfer.intf;
+       xfer->intf.refcnt = refcnt;
+       xfer->op = op;
+}
+
+/**
+ * Get data transfer interface from generic object communication interface
+ *
+ * @v intf             Generic object communication interface
+ * @ret xfer           Data transfer interface
+ */
+static inline struct xfer_interface *
+intf_to_xfer ( struct interface *intf ) {
+       return container_of ( intf, struct xfer_interface, intf );
+}
 
 /**
- * Get destination data-transfer interface
+ * Get destination data transfer interface
  *
- * @v xfer             Data-transfer interface
+ * @v xfer             Data transfer interface
  * @ret dest           Destination interface
  */
 static inline struct xfer_interface *
 xfer_dest ( struct xfer_interface *xfer ) {
-       return container_of ( xfer->intf.dest, struct xfer_interface, intf );
+       return intf_to_xfer ( xfer->intf.dest );
 }
 
 /**
- * Plug a data-transfer interface into a new destination interface
+ * Plug a data transfer interface into a new destination interface
  *
- * @v xfer             Data-transfer interface
+ * @v xfer             Data transfer interface
  * @v dest             New destination interface
  */
 static inline void xfer_plug ( struct xfer_interface *xfer,
@@ -117,23 +159,23 @@ static inline void xfer_plug ( struct xfer_interface *xfer,
 }
 
 /**
- * Unplug a data-transfer interface
+ * Unplug a data transfer interface
  *
- * @v xfer             Data-transfer interface
+ * @v xfer             Data transfer interface
  */
 static inline void xfer_unplug ( struct xfer_interface *xfer ) {
        plug ( &xfer->intf, &null_xfer.intf );
 }
 
 /**
- * Terminate a data-transfer interface
+ * Stop using a data transfer interface
  *
- * @v xfer             Data-transfer interface
+ * @v xfer             Data transfer interface
  *
  * After calling this method, no further messages will be received via
  * the interface.
  */
-static inline void xfer_terminate ( struct xfer_interface *xfer ) {
+static inline void xfer_nullify ( struct xfer_interface *xfer ) {
        xfer->op = &null_xfer_ops;
 };