Skip to content

Commit

Permalink
addrconf: split addrconf update flag parsing utility
Browse files Browse the repository at this point in the history
  • Loading branch information
mtomaschewski committed Jun 9, 2017
1 parent bf7548e commit a2284dd
Show file tree
Hide file tree
Showing 2 changed files with 54 additions and 19 deletions.
1 change: 1 addition & 0 deletions include/wicked/addrconf.h
Expand Up @@ -245,6 +245,7 @@ extern const char * ni_addrconf_flags_format(ni_stringbuf_t *, unsigned int, con
extern const char * ni_addrconf_update_flag_to_name(unsigned int);
extern ni_bool_t ni_addrconf_update_name_to_flag(const char *, unsigned int *);
extern void ni_addrconf_update_set(unsigned int *, unsigned int, ni_bool_t);
extern ni_bool_t ni_addrconf_update_flags_parse_names(unsigned int *, const ni_string_array_t *);
extern ni_bool_t ni_addrconf_update_flags_parse(unsigned int *, const char *, const char *);
extern const char * ni_addrconf_update_flags_format(ni_stringbuf_t *, unsigned int, const char *);

Expand Down
72 changes: 53 additions & 19 deletions src/names.c
Expand Up @@ -292,33 +292,67 @@ ni_addrconf_update_set(unsigned int *mask, unsigned int flag, ni_bool_t enable)
}

ni_bool_t
ni_addrconf_update_flags_parse(unsigned int *flags, const char *value, const char *sep)
ni_addrconf_update_flags_parse_names(unsigned int *flags, const ni_string_array_t *names)
{
ni_string_array_t list = NI_STRING_ARRAY_INIT;
unsigned int mask = __NI_ADDRCONF_UPDATE_NONE;
unsigned int flag, i;
ni_bool_t ret = TRUE;
const char *name;

if (!flags || !value || ni_string_empty(sep))
if (!flags || !names)
return FALSE;

if (ni_string_empty(value) || ni_string_eq(value, "none")) {
*flags = __NI_ADDRCONF_UPDATE_NONE;
return TRUE;
}
if (ni_string_eq(value, "all")) {
*flags = -1U;
return TRUE;
for (i = 0; i < names->count; ++i) {
if (!(name = names->data[i]))
continue;

if (ni_string_eq(name, "all")) {
mask = -1U; /* ~none */
} else
if (ni_string_eq(name, "none")) {
mask = __NI_ADDRCONF_UPDATE_NONE;
} else
if (ni_string_eq(name, "default")) {
mask = *flags;
} else {
ni_bool_t set = TRUE;

if (ni_string_startswith(name, "no-")) {
set = FALSE;
name += 3;
} else
if (ni_string_startswith(name, "-")) {
set = FALSE;
name += 1;
}

if (ni_addrconf_update_name_to_flag(name, &flag)) {
ni_addrconf_update_set(&mask, flag, set);
} else {
ni_debug_readwrite("unknown addrconf update flag \"%s\"",
names->data[i]);
ret = FALSE;
}
}
}

*flags = __NI_ADDRCONF_UPDATE_NONE;
ni_string_split(&list, value, sep, 0);
for (i = 0; ret && i < list.count; ++i) {
if (ni_addrconf_update_name_to_flag(list.data[i], &flag))
ni_addrconf_update_set(flags, flag, TRUE);
else
ret = FALSE;
}
ni_string_array_destroy(&list);
*flags = mask;
return ret;
}

ni_bool_t
ni_addrconf_update_flags_parse(unsigned int *flags, const char *value, const char *sep)
{
ni_string_array_t names = NI_STRING_ARRAY_INIT;
ni_bool_t ret = FALSE;

if (!flags || !value || ni_string_empty(sep))
return FALSE;

if (ni_string_split(&names, value, sep, 0))
ret = ni_addrconf_update_flags_parse_names(flags, &names);
ni_string_array_destroy(&names);

return ret;
}

Expand Down

0 comments on commit a2284dd

Please sign in to comment.