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