b8c7e098a724fc7c3a6b3780741d01279bd6440e
[people/dverkamp/gpxe.git] / src / include / gpxe / uri.h
1 #ifndef _GPXE_URI_H
2 #define _GPXE_URI_H
3
4 /** @file
5  *
6  * Uniform Resource Identifiers
7  *
8  */
9
10 #include <stdlib.h>
11
12 /** A Uniform Resource Identifier
13  *
14  * Terminology for this data structure is as per uri(7), except that
15  * "path" is defined to include the leading '/' for an absolute path.
16  *
17  * Note that all fields within a URI are optional and may be NULL.
18  *
19  * Some examples are probably helpful:
20  *
21  *   http://www.etherboot.org/wiki :
22  *
23  *   scheme = "http", host = "www.etherboot.org", path = "/wiki"
24  *
25  *   /var/lib/tftpboot :
26  *
27  *   path = "/var/lib/tftpboot"
28  *
29  *   mailto:bob@nowhere.com :
30  *
31  *   scheme = "mailto", opaque = "bob@nowhere.com"
32  *
33  *   ftp://joe:secret@insecure.org:8081/hidden/path/to?what=is#this
34  *
35  *   scheme = "ftp", user = "joe", password = "secret",
36  *   host = "insecure.org", port = "8081", path = "/hidden/path/to",
37  *   query = "what=is", fragment = "this"
38  */
39 struct uri {
40         /** Scheme */
41         const char *scheme;
42         /** Opaque part */
43         const char *opaque;
44         /** User name */
45         const char *user;
46         /** Password */
47         const char *password;
48         /** Host name */
49         const char *host;
50         /** Port number */
51         const char *port;
52         /** Path */
53         const char *path;
54         /** Query */
55         const char *query;
56         /** Fragment */
57         const char *fragment;
58 };
59
60 /**
61  * URI is an absolute URI
62  *
63  * @v uri                       URI
64  * @ret is_absolute             URI is absolute
65  *
66  * An absolute URI begins with a scheme, e.g. "http:" or "mailto:".
67  * Note that this is a separate concept from a URI with an absolute
68  * path.
69  */
70 static inline int uri_is_absolute ( struct uri *uri ) {
71         return ( uri->scheme != NULL );
72 }
73
74 /**
75  * URI has an absolute path
76  *
77  * @v uri                       URI
78  * @ret has_absolute_path       URI has an absolute path
79  *
80  * An absolute path begins with a '/'.  Note that this is a separate
81  * concept from an absolute URI.  Note also that a URI may not have a
82  * path at all.
83  */
84 static inline int uri_has_absolute_path ( struct uri *uri ) {
85         return ( uri->path && ( uri->path[0] == '/' ) );
86 }
87
88 /**
89  * URI has a relative path
90  *
91  * @v uri                       URI
92  * @ret has_relative_path       URI has a relative path
93  *
94  * An relative path begins with something other than a '/'.  Note that
95  * this is a separate concept from a relative URI.  Note also that a
96  * URI may not have a path at all.
97  */
98 static inline int uri_has_relative_path ( struct uri *uri ) {
99         return ( uri->path && ( uri->path[0] != '/' ) );
100 }
101
102 /**
103  * Free URI structure
104  *
105  * @v uri               URI
106  *
107  * Frees all the dynamically-allocated storage used by the URI
108  * structure.
109  */
110 static inline void free_uri ( struct uri *uri ) {
111         free ( uri );
112 }
113
114 extern struct uri * parse_uri ( const char *uri_string );
115 unsigned int uri_port ( struct uri *uri, unsigned int default_port );
116
117 #endif /* _GPXE_URI_H */