From ff1222a8d3b9e0196eefb17ddde21dc7bc5be43a Mon Sep 17 00:00:00 2001 From: Michael Brown Date: Sat, 28 Apr 2007 20:56:24 +0000 Subject: Preliminary support for opening data-transfer interfaces --- src/include/gpxe/open.h | 81 +++++++++++++++++++++++++++++++++++++++++++++++++ src/include/gpxe/xfer.h | 42 +++++++++++++++++++++---- 2 files changed, 117 insertions(+), 6 deletions(-) create mode 100644 src/include/gpxe/open.h (limited to 'src/include/gpxe') 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 + +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 +#include #include #include @@ -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 ); /** -- cgit v1.2.3-55-g7522