#ifndef SYSVAR_COMMON_H #define SYSVAR_COMMON_H #include #include #include #ifndef extern_c # ifdef __cplusplus # define extern_c extern "C" # else # define extern_c extern # endif #endif typedef struct sysvar_namespace { const char *name; size_t first, count; } sysvar_ns_t; typedef union sysvar_value { bool v_bool; long int v_int; unsigned long int v_uint; const char *v_str; 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 (3*sizeof(unsigned int)+2) #define UINT_BUFLEN INT_BUFLEN #define IP_BUFLEN (4*4) #define MAC_BUFLEN (3*6) #define SYSVAR_BUFLEN 32 /* Conservative minimum */ extern_c sysvar_t getvar(size_t var); extern_c bool setvar(size_t var, sysvar_t val); extern_c bool unsetvar(size_t var); extern_c const char *getvar_tostr(size_t var); extern_c const char *getvar_tostr_r(size_t var, char *buf); extern_c bool setvar_fromstr(size_t var, const char *str); extern_c void sysvar_reset(void); extern_c size_t sysvar_find(size_t ns, const char *name); extern_c const struct sysvar_ops sysvar_nulltype_ops; /* 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_c const struct sysvar_ops sysvar_ ## t ## _ops SYSVAR_MKTYPE(bool, bool); SYSVAR_MKTYPE(int, long int); SYSVAR_MKTYPE(uint, unsigned long int); SYSVAR_MKTYPE(str, const char *); SYSVAR_MKTYPE(tz, const char *); SYSVAR_MKTYPE(ip, uint32_t); SYSVAR_MKTYPE(mac, const uint8_t *); #endif /* SYSVAR_COMMON_H */