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