return nw_config_set(config, key, *(const char**)value);
}
+// String Table
+
+int nw_config_read_string_table(nw_config* config, const char* key, void* value, void* data) {
+ const char* s = NULL;
+ int* v = (int*)value;
+
+ const nw_string_table_t* table = (nw_string_table_t*)data;
+
+ // Fetch the string
+ s = nw_config_get(config, key);
+ if (!s)
+ return -errno;
+
+ // Lookup the string in the table
+ *v = nw_string_table_lookup_id(table, s);
+
+ // If the result is negative, nothing was found
+ if (*v < 0)
+ return -EINVAL;
+
+ return 0;
+}
+
+int nw_config_write_string_table(nw_config* config,
+ const char* key, const void* value, void* data) {
+ int* v = (int*)value;
+
+ const nw_string_table_t* table = (nw_string_table_t*)data;
+
+ // Lookup the string
+ const char* s = nw_string_table_lookup_string(table, *v);
+ if (!s)
+ return -errno;
+
+ return nw_config_set(config, key, s);
+}
+
// Address
int nw_config_read_address(nw_config* config, const char* key, void* value, void* data) {
#define NW_CONFIG_OPTION(config, key, value, read_callback, write_callback, data) \
nw_config_option_add(config, key, value, read_callback, write_callback, data)
+// String
+
#define NW_CONFIG_OPTION_STRING(config, key, value) \
nw_config_option_add(config, key, value, nw_config_read_string, nw_config_write_string, NULL)
int nw_config_read_string(nw_config* config, const char* key, void* value, void* data);
int nw_config_write_string(nw_config* config, const char* key, const void* value, void* data);
+// String Table
+
+#define NW_CONFIG_OPTION_STRING_TABLE(config, key, value, table) \
+ nw_config_option_add(config, key, value, nw_config_read_string_table, nw_config_write_string_table, (void*)table)
+
+int nw_config_read_string_table(nw_config* config, const char* key, void* value, void* data);
+int nw_config_write_string_table(nw_config* config, const char* key, const void* value, void* data);
+
+// Integer
+
#define NW_CONFIG_OPTION_INT(config, key, value) \
nw_config_option_add(config, key, value, nw_config_read_int, nw_config_write_int, NULL)
int nw_config_read_int(nw_config* config, const char* key, void* value, void* data);
int nw_config_write_int(nw_config* config, const char* key, const void* value, void* data);
+// Address
+
#define NW_CONFIG_OPTION_ADDRESS(config, key, value) \
nw_config_option_add(config, key, value, nw_config_read_address, nw_config_write_address, NULL)
NW_STRING_TABLE_LOOKUP(nw_port_bonding_mode_t, nw_port_bonding_mode)
-static int nw_port_bonding_read_mode(nw_config* config,
- const char* key, void* value, void* data) {
- int* mode = (int*)value;
-
- const char* p = nw_config_get(config, key);
- if (p) {
- *mode = nw_port_bonding_mode_from_string(p);
- if (!*mode)
- return -errno;
- }
-
- return 0;
-}
-
-static int nw_port_bonding_write_mode(nw_config* config,
- const char* key, const void* value, void* data) {
- const int* mode = (int*)value;
-
- return nw_config_set(config, key, nw_port_bonding_mode_to_string(*mode));
-}
-
static int nw_port_bonding_setup(nw_port* port) {
int r;
// Mode
- r = NW_CONFIG_OPTION(port->config, "BONDING_MODE", &port->bonding.mode,
- nw_port_bonding_read_mode, nw_port_bonding_write_mode, NULL);
+ r = NW_CONFIG_OPTION_STRING_TABLE(port->config,
+ "BONDING_MODE", &port->bonding.mode, nw_port_bonding_mode);
if (r < 0)
return r;
NW_STRING_TABLE_LOOKUP(nw_port_vlan_proto_t, nw_port_vlan_proto)
-static int nw_port_vlan_read_proto(nw_config* config,
- const char* key, void* value, void* data) {
- nw_port_vlan_proto_t* proto = (nw_port_vlan_proto_t*)value;
-
- const char* p = nw_config_get(config, key);
- if (p) {
- *proto = nw_port_vlan_proto_from_string(p);
- if (!*proto)
- return -errno;
- }
-
- return 0;
-}
-
-static int nw_port_vlan_write_proto(nw_config* config,
- const char* key, const void* value, void* data) {
- const nw_port_vlan_proto_t* proto = (nw_port_vlan_proto_t*)value;
-
- return nw_config_set(config, key, nw_port_vlan_proto_to_string(*proto));
-}
-
static int nw_port_vlan_setup(nw_port* port) {
int r;
return r;
// VLAN Protocol
- r = NW_CONFIG_OPTION(port->config, "VLAN_PROTO", &port->vlan.proto,
- nw_port_vlan_read_proto, nw_port_vlan_write_proto, NULL);
+ r = NW_CONFIG_OPTION_STRING_TABLE(port->config,
+ "VLAN_PROTO", &port->vlan.proto, nw_port_vlan_proto);
if (r < 0)
return r;