1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374 |
- #ifndef SYSVAR_COMMON_H
- #define SYSVAR_COMMON_H
- #include <stddef.h>
- #include <stdbool.h>
- #include <inttypes.h>
- 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 */
|