[Settings] Start revamping the configuration settings API.
[people/mcb30/gpxe.git] / src / include / gpxe / settings.h
1 #ifndef _GPXE_SETTINGS_H
2 #define _GPXE_SETTINGS_H
3
4 /** @file
5  *
6  * Configuration settings
7  *
8  */
9
10 #include <stdint.h>
11 #include <gpxe/tables.h>
12 #include <gpxe/list.h>
13 #include <gpxe/refcnt.h>
14
15 struct settings;
16 struct in_addr;
17
18 /** Settings block operations */
19 struct settings_operations {
20         /** Set value of setting
21          *
22          * @v settings          Settings block
23          * @v tag               Setting tag number
24          * @v data              Setting data, or NULL to clear setting
25          * @v len               Length of setting data
26          * @ret rc              Return status code
27          */
28         int ( * set ) ( struct settings *settings, unsigned int tag,
29                         const void *data, size_t len );
30         /** Get value of setting
31          *
32          * @v settings          Settings block
33          * @v tag               Setting tag number
34          * @v data              Buffer to fill with setting data
35          * @v len               Length of buffer
36          * @ret len             Length of setting data, or negative error
37          *
38          * The actual length of the setting will be returned even if
39          * the buffer was too small.
40          */
41         int ( * get ) ( struct settings *settings, unsigned int tag,
42                         void *data, size_t len );
43 };
44
45 /** A settings block */
46 struct settings {
47         /** Reference counter */
48         struct refcnt *refcnt;
49         /** Name */
50         char name[16];
51         /** List of all settings */
52         struct list_head list;
53         /** Settings block operations */
54         struct settings_operations *op;
55 };
56
57 /**
58  * A setting type
59  *
60  * This represents a type of setting (e.g. string, IPv4 address,
61  * etc.).
62  */
63 struct setting_type {
64         /** Name
65          *
66          * This is the name exposed to the user (e.g. "string").
67          */
68         const char *name;
69         /** Parse and set value of setting
70          *
71          * @v settings          Settings block
72          * @v tag               Setting tag number
73          * @v value             Formatted setting data
74          * @ret rc              Return status code
75          */
76         int ( * setf ) ( struct settings *settings, unsigned int tag,
77                          const char *value );
78         /** Get and format value of setting
79          *
80          * @v settings          Settings block, or NULL to search all blocks
81          * @v tag               Setting tag number
82          * @v buf               Buffer to contain formatted value
83          * @v len               Length of buffer
84          * @ret len             Length of formatted value, or negative error
85          */
86         int ( * getf ) ( struct settings *settings, unsigned int tag,
87                          char *buf, size_t len );
88 };
89
90 /** Declare a configuration setting type */
91 #define __setting_type \
92         __table ( struct setting_type, setting_types, 01 )
93
94 /**
95  * A named setting
96  *
97  * This represents a single setting (e.g. "hostname"), encapsulating
98  * the information about the setting's tag number and type.
99  */
100 struct named_setting {
101         /** Name
102          *
103          * This is the human-readable name for the setting.  Where
104          * possible, it should match the name used in dhcpd.conf (see
105          * dhcp-options(5)).
106          */
107         const char *name;
108         /** Description */
109         const char *description;
110         /** Setting tag number */
111         unsigned int tag;
112         /** Setting type
113          *
114          * This identifies the type of setting (e.g. string, IPv4
115          * address, etc.).
116          */
117         struct setting_type *type;
118 };
119
120 /** Declare a configuration setting */
121 #define __named_setting __table ( struct named_setting, named_settings, 01 )
122
123 extern struct settings interactive_settings;
124
125 extern int get_setting ( struct settings *settings, unsigned int tag,
126                          void *data, size_t len );
127 extern int get_setting_len ( struct settings *settings, unsigned int tag );
128 extern int get_string_setting ( struct settings *settings, unsigned int tag,
129                                 char *data, size_t len );
130 extern int get_ipv4_setting ( struct settings *settings, unsigned int tag,
131                               struct in_addr *inp );
132 extern int get_int_setting ( struct settings *settings, unsigned int tag,
133                              long *value );
134 extern int get_uint_setting ( struct settings *settings, unsigned int tag,
135                               unsigned long *value );
136 extern struct settings * find_settings ( const char *name );
137 extern int set_typed_setting ( struct settings *settings,
138                                unsigned int tag, struct setting_type *type,
139                                const char *value );
140 extern int set_named_setting ( const char *name, const char *value );
141 extern int get_named_setting ( const char *name, char *buf, size_t len );
142
143 /**
144  * Set value of setting
145  *
146  * @v settings          Settings block
147  * @v tag               Setting tag number
148  * @v data              Setting data, or NULL to clear setting
149  * @v len               Length of setting data
150  * @ret rc              Return status code
151  */
152 static inline int set_setting ( struct settings *settings, unsigned int tag,
153                                 const void *data, size_t len ) {
154         return settings->op->set ( settings, tag, data, len );
155 }
156
157 /**
158  * Delete setting
159  *
160  * @v settings          Settings block
161  * @v tag               Setting tag number
162  * @ret rc              Return status code
163  */
164 static inline int delete_setting ( struct settings *settings,
165                                    unsigned int tag ) {
166         return set_setting ( settings, tag, NULL, 0 );
167 }
168
169 /**
170  * Get and format value of setting
171  *
172  * @v settings          Settings block, or NULL to search all blocks
173  * @v tag               Setting tag number
174  * @v type              Settings type
175  * @v buf               Buffer to contain formatted value
176  * @v len               Length of buffer
177  * @ret len             Length of formatted value, or negative error
178  */
179 static inline int get_typed_setting ( struct settings *settings,
180                                       unsigned int tag,
181                                       struct setting_type *type,
182                                       char *buf, size_t len ) {
183         return type->getf ( settings, tag, buf, len );
184 }
185
186 /**
187  * Delete named setting
188  *
189  * @v name              Name of setting
190  * @ret rc              Return status code
191  */
192 static inline int delete_named_setting ( const char *name ) {
193         return set_named_setting ( name, NULL );
194 }
195
196 #endif /* _GPXE_SETTINGS_H */