summaryrefslogtreecommitdiffstats
path: root/src/include
diff options
context:
space:
mode:
Diffstat (limited to 'src/include')
-rw-r--r--src/include/gpxe/open.h81
-rw-r--r--src/include/gpxe/xfer.h42
2 files changed, 117 insertions, 6 deletions
diff --git a/src/include/gpxe/open.h b/src/include/gpxe/open.h
new file mode 100644
index 000000000..8839dc28a
--- /dev/null
+++ b/src/include/gpxe/open.h
@@ -0,0 +1,81 @@
+#ifndef _GPXE_OPEN_H
+#define _GPXE_OPEN_H
+
+/** @file
+ *
+ * Data transfer interface opening
+ *
+ */
+
+#include <gpxe/tables.h>
+
+struct xfer_interface;
+struct uri;
+struct sockaddr;
+
+/** Location types */
+enum {
+ /** Location is a URI string
+ *
+ * Parameter list for open() is:
+ *
+ * const char *uri_string;
+ */
+ LOCATION_URI = 1,
+ /** Location is a socket
+ *
+ * Parameter list for open() is:
+ *
+ *
+ */
+ LOCATION_SOCKET,
+};
+
+/** A URI opener */
+struct uri_opener {
+ /** URI protocol name
+ *
+ * This is the "scheme" portion of the URI, e.g. "http" or
+ * "file".
+ */
+ const char *scheme;
+ /** Open URI
+ *
+ * @v xfer Data-transfer interface
+ * @v uri URI
+ * @ret rc Return status code
+ *
+ * This method takes ownership of the URI structure, and is
+ * responsible for eventually calling free_uri().
+ */
+ int ( * open ) ( struct xfer_interface *xfer, struct uri *uri );
+};
+
+/** Register a URI opener */
+#define __uri_opener __table ( struct uri_opener, uri_openers, 01 )
+
+/** A socket opener */
+struct socket_opener {
+ /** Communication domain (e.g. PF_INET) */
+ int domain;
+ /** Communication semantics (e.g. SOCK_STREAM) */
+ int type;
+ /** Open socket
+ *
+ * @v xfer Data-transfer interface
+ * @v sa Socket address
+ * @ret rc Return status code
+ */
+ int ( * open ) ( struct xfer_interface *xfer, struct sockaddr *sa );
+};
+
+/** Register a socket opener */
+#define __socket_opener __table ( struct socket_opener, socket_openers, 01 )
+
+extern int open_uri ( struct xfer_interface *xfer, const char *uri_string );
+extern int open_socket ( struct xfer_interface *xfer,
+ int domain, int type, struct sockaddr *sa );
+extern int vopen ( struct xfer_interface *xfer, int type, va_list args );
+extern int open ( struct xfer_interface *xfer, int type, ... );
+
+#endif /* _GPXE_OPEN_H */
diff --git a/src/include/gpxe/xfer.h b/src/include/gpxe/xfer.h
index 7a10b860b..0b8bf4ce5 100644
--- a/src/include/gpxe/xfer.h
+++ b/src/include/gpxe/xfer.h
@@ -8,6 +8,7 @@
*/
#include <stddef.h>
+#include <stdarg.h>
#include <gpxe/interface.h>
#include <gpxe/iobuf.h>
@@ -15,10 +16,38 @@ struct xfer_interface;
/** Data transfer interface operations */
struct xfer_interface_operations {
+
+ /* Missing features:
+ *
+ * notification of non-close status - e.g. connected/opened, ...
+ *
+ * seek
+ *
+ * prompt for data delivery
+ *
+ * I/O buffer preparation
+ *
+ */
+
+
+ /** Close 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 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 );
/** Deliver datagram
*
* @v xfer Data-transfer interface
- * @v src Source interface
* @v iobuf Datagram I/O buffer
* @ret rc Return status code
*
@@ -27,12 +56,10 @@ struct xfer_interface_operations {
* deliver_as_raw().
*/
int ( * deliver ) ( struct xfer_interface *xfer,
- struct xfer_interface *src,
struct io_buffer *iobuf );
/** Deliver datagram as raw data
*
* @v xfer Data-transfer interface
- * @v src Source interface
* @v data Data buffer
* @v len Length of data buffer
* @ret rc Return status code
@@ -42,7 +69,6 @@ struct xfer_interface_operations {
* deliver_as_iobuf().
*/
int ( * deliver_raw ) ( struct xfer_interface *xfer,
- struct xfer_interface *src,
const void *data, size_t len );
};
@@ -57,11 +83,15 @@ struct xfer_interface {
extern struct xfer_interface null_xfer;
extern struct xfer_interface_operations null_xfer_ops;
+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 int deliver_as_raw ( struct xfer_interface *xfer,
- struct xfer_interface *src,
struct io_buffer *iobuf );
extern int deliver_as_iobuf ( struct xfer_interface *xfer,
- struct xfer_interface *src,
const void *data, size_t len );
/**