sysvar_common.h 2.4 KB

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