sysvar_common.h 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. #ifndef SYSVAR_COMMON_H
  2. #define SYSVAR_COMMON_H
  3. #include <stddef.h>
  4. #include <stdbool.h>
  5. #include <inttypes.h>
  6. typedef union sysvar_value {
  7. bool v_bool;
  8. int32_t v_int;
  9. uint32_t v_uint;
  10. const char *v_string;
  11. const char *v_tz; /* Timezone */
  12. uint32_t v_ip; /* IPv4 address */
  13. const uint8_t *v_mac; /* MAC address */
  14. void *v_ptr;
  15. } sysvar_t;
  16. struct sysvar_ops {
  17. bool (*set)(sysvar_t *, sysvar_t);
  18. /* bool (*unset)(sysvar_t *); - not used */
  19. const char * (*tostr)(sysvar_t, char *);
  20. bool (*fromstr)(sysvar_t *, const char *);
  21. void (*update)(sysvar_t, bool); /* Called after set or fromstr; bool = isset */
  22. size_t buflen; /* Minimal buffer size for string if needed */
  23. bool is_ptr; /* Type is an allocated pointer */
  24. };
  25. typedef const struct sysvar_ops *sysvar_type_t;
  26. #define SYSVAR_TYPE(x) (&sysvar_ ## x ## _ops)
  27. /* Buffer size needed to represent some data types */
  28. #define BOOL_BUFLEN 2
  29. #define INT_BUFLEN 12 /* 10 digits + sign + null */
  30. #define UINT_BUFLEN INT_BUFLEN
  31. #define IP_BUFLEN (4*4)
  32. #define MAC_BUFLEN (3*6)
  33. #define SYSVAR_BUFLEN (3*6) /* Maximum */
  34. sysvar_t getvar(size_t var);
  35. bool setvar(size_t var, sysvar_t val);
  36. bool unsetvar(size_t var);
  37. const char *getvar_tostr(size_t var);
  38. const char *getvar_tostr_r(size_t var, char *buf);
  39. bool setvar_fromstr(size_t var, const char *str);
  40. void sysvar_reset(void);
  41. /* Type-specific definitions/getters/setters */
  42. #define SYSVAR_MKTYPE(t,c_type) \
  43. static inline c_type getvar_ ## t (size_t var) \
  44. { \
  45. return getvar(var).v_ ## t ; \
  46. } \
  47. static inline bool setvar_ ## t (size_t var, c_type v) \
  48. { \
  49. sysvar_t vv; \
  50. vv.v_ ## t = v; \
  51. return setvar(var, vv); \
  52. } \
  53. extern const struct sysvar_ops sysvar_ ## t ## _ops
  54. extern const struct sysvar_ops sysvar_nulltype_ops;
  55. SYSVAR_MKTYPE(bool, bool);
  56. SYSVAR_MKTYPE(int, int32_t);
  57. SYSVAR_MKTYPE(uint, uint32_t);
  58. SYSVAR_MKTYPE(string, const char *);
  59. SYSVAR_MKTYPE(tz, const char *);
  60. SYSVAR_MKTYPE(ip, uint32_t);
  61. SYSVAR_MKTYPE(mac, const uint8_t *);
  62. #endif /* SYSVAR_COMMON_H */