[tables] Incorporate table data type information into table definition
[people/mcb30/gpxe.git] / src / include / gpxe / open.h
1 #ifndef _GPXE_OPEN_H
2 #define _GPXE_OPEN_H
3
4 /** @file
5  *
6  * Data transfer interface opening
7  *
8  */
9
10 #include <stdarg.h>
11 #include <gpxe/tables.h>
12 #include <gpxe/socket.h>
13
14 struct xfer_interface;
15 struct uri;
16
17 /** Location types */
18 enum {
19         /** Location is a URI
20          *
21          * Parameter list for open() is:
22          *
23          * struct uri *uri;
24          */
25         LOCATION_URI = 1,
26         /** Location is a URI string
27          *
28          * Parameter list for open() is:
29          *
30          * const char *uri_string;
31          */
32         LOCATION_URI_STRING,
33         /** Location is a socket
34          *
35          * Parameter list for open() is:
36          *
37          * int semantics;
38          * struct sockaddr *peer;
39          * struct sockaddr *local;
40          */
41         LOCATION_SOCKET,
42 };
43
44 /** A URI opener */
45 struct uri_opener {
46         /** URI protocol name
47          *
48          * This is the "scheme" portion of the URI, e.g. "http" or
49          * "file".
50          */
51         const char *scheme;
52         /** Open URI
53          *
54          * @v xfer              Data transfer interface
55          * @v uri               URI
56          * @ret rc              Return status code
57          */
58         int ( * open ) ( struct xfer_interface *xfer, struct uri *uri );
59 };
60
61 /** URI opener table */
62 #define URI_OPENERS __table ( struct uri_opener, "uri_openers" )
63
64 /** Register a URI opener */
65 #define __uri_opener __table_entry ( URI_OPENERS, 01 )
66
67 /** A socket opener */
68 struct socket_opener {
69         /** Communication semantics (e.g. SOCK_STREAM) */
70         int semantics;
71         /** Address family (e.g. AF_INET) */
72         int family;
73         /** Open socket
74          *
75          * @v xfer              Data transfer interface
76          * @v peer              Peer socket address
77          * @v local             Local socket address, or NULL
78          * @ret rc              Return status code
79          */
80         int ( * open ) ( struct xfer_interface *xfer, struct sockaddr *peer,
81                          struct sockaddr *local );
82 };
83
84 /** Socket opener table */
85 #define SOCKET_OPENERS __table ( struct socket_opener, "socket_openers" )
86
87 /** Register a socket opener */
88 #define __socket_opener __table_entry ( SOCKET_OPENERS, 01 )
89
90 extern int xfer_open_uri ( struct xfer_interface *xfer, struct uri *uri );
91 extern int xfer_open_uri_string ( struct xfer_interface *xfer,
92                                   const char *uri_string );
93 extern int xfer_open_named_socket ( struct xfer_interface *xfer,
94                                     int semantics, struct sockaddr *peer,
95                                     const char *name, struct sockaddr *local );
96 extern int xfer_open_socket ( struct xfer_interface *xfer, int semantics,
97                               struct sockaddr *peer, struct sockaddr *local );
98 extern int xfer_vopen ( struct xfer_interface *xfer, int type, va_list args );
99 extern int xfer_open ( struct xfer_interface *xfer, int type, ... );
100
101 #endif /* _GPXE_OPEN_H */