#ifndef SYSVAR_COMMON_H #define SYSVAR_COMMON_H #include #include #include typedef union sysvar_value { bool v_bool; int32_t v_int; uint32_t v_uint; const char *v_string; const char *v_tz; /* Timezone */ uint32_t v_ip; /* IPv4 address */ const uint8_t *v_mac; /* MAC address */ void *v_ptr; } sysvar_t; struct sysvar_ops { bool (*set)(sysvar_t *, sysvar_t); /* bool (*unset)(sysvar_t *); - not used */ const char * (*tostr)(sysvar_t, char *); bool (*fromstr)(sysvar_t *, const char *); void (*update)(sysvar_t, bool); /* Called after set or fromstr; bool = isset */ size_t buflen; /* Minimal buffer size for string if needed */ bool is_ptr; /* Type is an allocated pointer */ }; typedef const struct sysvar_ops *sysvar_type_t; #define SYSVAR_TYPE(x) (&sysvar_ ## x ## _ops) /* Buffer size needed to represent some data types */ #define BOOL_BUFLEN 2 #define INT_BUFLEN 12 /* 10 digits + sign + null */ #define UINT_BUFLEN INT_BUFLEN #define IP_BUFLEN (4*4) #define MAC_BUFLEN (3*6) #define SYSVAR_BUFLEN (3*6) /* Maximum */ sysvar_t getvar(size_t var); bool setvar(size_t var, sysvar_t val); bool unsetvar(size_t var); const char *getvar_tostr(size_t var); const char *getvar_tostr_r(size_t var, char *buf); bool setvar_fromstr(size_t var, const char *str); void sysvar_reset(void); /* Type-specific definitions/getters/setters */ #define SYSVAR_MKTYPE(t,c_type) \ static inline c_type getvar_ ## t (size_t var) \ { \ return getvar(var).v_ ## t ; \ } \ static inline bool setvar_ ## t (size_t var, c_type v) \ { \ sysvar_t vv; \ vv.v_ ## t = v; \ return setvar(var, vv); \ } \ extern const struct sysvar_ops sysvar_ ## t ## _ops extern const struct sysvar_ops sysvar_nulltype_ops; SYSVAR_MKTYPE(bool, bool); SYSVAR_MKTYPE(int, int32_t); SYSVAR_MKTYPE(uint, uint32_t); SYSVAR_MKTYPE(string, const char *); SYSVAR_MKTYPE(tz, const char *); SYSVAR_MKTYPE(ip, uint32_t); SYSVAR_MKTYPE(mac, const uint8_t *); #endif /* SYSVAR_COMMON_H */