StateFS
 All Classes Files Functions Variables Typedefs Enumerations Groups Pages
provider.h
Go to the documentation of this file.
1 #ifndef _STATEFS_PROVIDER_H_
2 #define _STATEFS_PROVIDER_H_
3 
10 #include <sys/types.h>
11 #include <stdbool.h>
12 #include <stdint.h>
13 #include <stddef.h>
14 
15 #ifdef __cplusplus
16 #define EXTERN_C_BEGIN extern "C" {
17 #define EXTERN_C_END }
18 #define EXTERN_C extern "C"
19 #else
20 #define EXTERN_C_BEGIN
21 #define EXTERN_C_END
22 #define EXTERN_C
23 #endif
24 
25 EXTERN_C_BEGIN
26 
35 typedef unsigned long statefs_size_t;
36 typedef long statefs_ssize_t;
37 typedef unsigned long statefs_off_t;
38 typedef intptr_t statefs_handle_t;
39 
40 typedef enum
41 {
42  statefs_variant_int,
43  statefs_variant_uint,
44  statefs_variant_bool,
45  statefs_variant_real,
46  statefs_variant_cstr,
47 
48  statefs_variant_tags_end
49 } statefs_variant_tag;
50 
52 {
53  statefs_variant_tag tag;
54  union
55  {
56  long i;
57  unsigned long u;
58  bool b;
59  double r;
60  char const *s;
61  };
62 };
63 
64 #define STATEFS_INT(v) { .tag = statefs_variant_int, .i = (v) }
65 #define STATEFS_UINT(v) { .tag = statefs_variant_uint, .i = (v) }
66 #define STATEFS_REAL(v) { .tag = statefs_variant_real, .r = (v) }
67 #define STATEFS_BOOL(v) { .tag = statefs_variant_bool, .b = (v) }
68 #define STATEFS_CSTR(v) { .tag = statefs_variant_cstr, .s = (v) }
69 
74 {
75  char const *name;
77 };
78 
82 typedef enum
83 {
84  statefs_node_prop = 1,
85  statefs_node_ns = 2,
86  statefs_node_root = statefs_node_ns | 4
88 
93 {
99  char const *name;
101  void (*release)(struct statefs_node*);
103  struct statefs_meta const* info;
104 };
105 
110 {
112  struct statefs_node * (*find)(struct statefs_branch const*, char const *);
114  statefs_handle_t (*first)(struct statefs_branch const*);
116  void (*next)(struct statefs_branch const*, statefs_handle_t *);
118  struct statefs_node * (*get)(struct statefs_branch const*, statefs_handle_t);
120  bool (*release)(struct statefs_branch const*, statefs_handle_t);
121 };
122 
123 struct statefs_property;
124 
127 {
133  void (*on_changed)(struct statefs_slot *,
134  struct statefs_property *);
135 };
136 
146 {
147  struct statefs_node node;
153 };
154 
156 #define STATEFS_ATTR_READ (1)
157 
158 #define STATEFS_ATTR_WRITE (1 << 1)
159 
160 #define STATEFS_ATTR_DISCRETE (1 << 2)
161 
168 {
174  int (*getattr)(struct statefs_property const *);
175 
180  statefs_ssize_t (*size)(struct statefs_property const *);
181 
187  statefs_handle_t (*open)(struct statefs_property *self, int flags);
188 
192  int (*read)(statefs_handle_t h, char *dst, statefs_size_t len, statefs_off_t off);
193 
197  int (*write)(statefs_handle_t, char const*, statefs_size_t, statefs_off_t);
198 
200  void (*close)(statefs_handle_t);
201 
210  bool (*connect)(struct statefs_property *, struct statefs_slot *);
212  void (*disconnect)(struct statefs_property *);
213 };
214 
219 {
220  struct statefs_node node;
221  struct statefs_branch branch;
222 };
223 
228 {
233  unsigned version;
234 
235  struct statefs_namespace root;
236 
240  struct statefs_io io;
241 };
242 
243 
244 typedef enum {
245  statefs_event_reload,
246 
247  // add new events above
248  statefs_events_end
249 } statefs_event;
250 
252 {
253  void (*event)(struct statefs_server*
254  , struct statefs_provider*
255  , statefs_event);
256 };
257 
262 typedef struct statefs_provider * (*statefs_provider_fn)
263  (struct statefs_server*);
264 
269 
270 static inline char const *statefs_provider_accessor()
271 {
272  return "statefs_provider_get";
273 }
274 
275 #define STATEFS_MK_VERSION(major, minor) \
276  (((unsigned)major << (sizeof(unsigned) * 4)) | ((unsigned)minor))
277 
278 #define STATEFS_GET_VERSION(version, major, minor) \
279  do { \
280  major = (version) >> (sizeof(unsigned) * 4); \
281  minor = (version) & ((unsigned)-1 >> (sizeof(unsigned) * 4)); \
282  } while (0)
283 
284 /* increase minor version for backward compatible providers, major -
285  * if provider logic is changed and it can't be used with previous
286  * versions of consumer safely
287  */
288 #define STATEFS_CURRENT_VERSION STATEFS_MK_VERSION(3, 0)
289 
290 static inline bool statefs_is_version_compatible
291 (unsigned own_version, unsigned lib_ver)
292 {
293  unsigned short maj, min;
294  unsigned short prov_maj, prov_min;
295  STATEFS_GET_VERSION(lib_ver, prov_maj, prov_min);
296  STATEFS_GET_VERSION(own_version, maj, min);
297  return (prov_maj == maj) && (prov_min <= min);
298 }
299 
303 static inline bool statefs_is_compatible
304 (unsigned own_version, struct statefs_provider *provider)
305 {
306  return statefs_is_version_compatible(own_version, provider->version);
307 }
308 
313 EXTERN_C_END
314 
315 #endif // _STATEFS_PROVIDER_H_