176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#ifndef _GPXE_OPEN_H 276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define _GPXE_OPEN_H 376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** @file 576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * Data transfer interface opening 776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */ 976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 1076d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanFILE_LICENCE ( GPL2_OR_LATER ); 1176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 1276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include <stdarg.h> 1376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include <gpxe/tables.h> 1476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include <gpxe/socket.h> 1576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 1676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstruct xfer_interface; 1776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstruct uri; 1876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 1976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Location types */ 2076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanenum { 2176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /** Location is a URI 2276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 2376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * Parameter list for open() is: 2476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 2576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * struct uri *uri; 2676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */ 2776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman LOCATION_URI = 1, 2876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /** Location is a URI string 2976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 3076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * Parameter list for open() is: 3176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 3276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * const char *uri_string; 3376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */ 3476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman LOCATION_URI_STRING, 3576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /** Location is a socket 3676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 3776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * Parameter list for open() is: 3876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 3976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * int semantics; 4076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * struct sockaddr *peer; 4176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * struct sockaddr *local; 4276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */ 4376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman LOCATION_SOCKET, 4476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman}; 4576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 4676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** A URI opener */ 4776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstruct uri_opener { 4876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /** URI protocol name 4976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 5076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * This is the "scheme" portion of the URI, e.g. "http" or 5176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * "file". 5276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */ 5376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman const char *scheme; 5476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /** Open URI 5576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 5676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * @v xfer Data transfer interface 5776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * @v uri URI 5876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * @ret rc Return status code 5976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */ 6076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman int ( * open ) ( struct xfer_interface *xfer, struct uri *uri ); 6176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman}; 6276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 6376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** URI opener table */ 6476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define URI_OPENERS __table ( struct uri_opener, "uri_openers" ) 6576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 6676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Register a URI opener */ 6776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define __uri_opener __table_entry ( URI_OPENERS, 01 ) 6876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 6976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** A socket opener */ 7076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstruct socket_opener { 7176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /** Communication semantics (e.g. SOCK_STREAM) */ 7276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman int semantics; 7376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /** Address family (e.g. AF_INET) */ 7476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman int family; 7576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /** Open socket 7676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 7776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * @v xfer Data transfer interface 7876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * @v peer Peer socket address 7976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * @v local Local socket address, or NULL 8076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * @ret rc Return status code 8176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */ 8276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman int ( * open ) ( struct xfer_interface *xfer, struct sockaddr *peer, 8376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman struct sockaddr *local ); 8476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman}; 8576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 8676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Socket opener table */ 8776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define SOCKET_OPENERS __table ( struct socket_opener, "socket_openers" ) 8876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 8976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Register a socket opener */ 9076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define __socket_opener __table_entry ( SOCKET_OPENERS, 01 ) 9176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 9276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanextern int xfer_open_uri ( struct xfer_interface *xfer, struct uri *uri ); 9376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanextern int xfer_open_uri_string ( struct xfer_interface *xfer, 9476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman const char *uri_string ); 9576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanextern int xfer_open_named_socket ( struct xfer_interface *xfer, 9676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman int semantics, struct sockaddr *peer, 9776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman const char *name, struct sockaddr *local ); 9876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanextern int xfer_open_socket ( struct xfer_interface *xfer, int semantics, 9976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman struct sockaddr *peer, struct sockaddr *local ); 10076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanextern int xfer_vopen ( struct xfer_interface *xfer, int type, va_list args ); 10176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanextern int xfer_open ( struct xfer_interface *xfer, int type, ... ); 10276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanextern int xfer_vreopen ( struct xfer_interface *xfer, int type, 10376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman va_list args ); 10476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 10576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#endif /* _GPXE_OPEN_H */ 106