diff options
author | Keith Packard <keithp@keithp.com> | 2014-07-15 17:31:58 -0700 |
---|---|---|
committer | Keith Packard <keithp@keithp.com> | 2014-07-17 17:10:48 -0700 |
commit | 60c05ce1ab5d9dc7c034b6b3723f43a42ea637d8 (patch) | |
tree | 0b688aa26d7d635a4d52086db766948b484a3740 /config | |
parent | 55f5bfb578e934319d1308cbb56c900c5ac7cfa7 (diff) |
config: Replace OdevAttributes linked list with struct
OdevAttributes are a fixed set of values with known types; instead of
storing them in a linked list and requiring accessor/settor functions,
replace the list header, struct OdevAttributes, with a struct that
directly contains the values. This provides for compile-time
typechecking of the values, eliminates a significant amount of code
and generally simplifies using this datatype.
Signed-off-by: Keith Packard <keithp@keithp.com>
Reviewed-by: Hans de Goede <hdegoede@redhat.com>
Diffstat (limited to 'config')
-rw-r--r-- | config/config.c | 161 | ||||
-rw-r--r-- | config/udev.c | 10 |
2 files changed, 16 insertions, 155 deletions
diff --git a/config/config.c b/config/config.c index a26d835e1..b5d634b87 100644 --- a/config/config.c +++ b/config/config.c @@ -128,160 +128,21 @@ device_is_duplicate(const char *config_info) } struct OdevAttributes * -config_odev_allocate_attribute_list(void) +config_odev_allocate_attributes(void) { - struct OdevAttributes *attriblist; - - attriblist = XNFalloc(sizeof(struct OdevAttributes)); - xorg_list_init(&attriblist->list); - return attriblist; -} - -void -config_odev_free_attribute_list(struct OdevAttributes *attribs) -{ - config_odev_free_attributes(attribs); - free(attribs); -} - -static struct OdevAttribute * -config_odev_find_attribute(struct OdevAttributes *attribs, int attrib_id) -{ - struct OdevAttribute *oa; - - xorg_list_for_each_entry(oa, &attribs->list, member) { - if (oa->attrib_id == attrib_id) - return oa; - } - return NULL; -} - -static struct OdevAttribute * -config_odev_find_or_add_attribute(struct OdevAttributes *attribs, int attrib) -{ - struct OdevAttribute *oa; - - oa = config_odev_find_attribute(attribs, attrib); - if (oa) - return oa; - - oa = XNFcalloc(sizeof(struct OdevAttribute)); - oa->attrib_id = attrib; - xorg_list_append(&oa->member, &attribs->list); - - return oa; -} - -static int config_odev_get_attribute_type(int attrib) -{ - switch (attrib) { - case ODEV_ATTRIB_PATH: - case ODEV_ATTRIB_SYSPATH: - case ODEV_ATTRIB_BUSID: - return ODEV_ATTRIB_STRING; - case ODEV_ATTRIB_FD: - case ODEV_ATTRIB_MAJOR: - case ODEV_ATTRIB_MINOR: - return ODEV_ATTRIB_INT; - case ODEV_ATTRIB_DRIVER: - return ODEV_ATTRIB_STRING; - default: - LogMessage(X_ERROR, "Error %s called for unknown attribute %d\n", - __func__, attrib); - return ODEV_ATTRIB_UNKNOWN; - } -} - -Bool -config_odev_add_attribute(struct OdevAttributes *attribs, int attrib, - const char *attrib_name) -{ - struct OdevAttribute *oa; - - if (config_odev_get_attribute_type(attrib) != ODEV_ATTRIB_STRING) { - LogMessage(X_ERROR, "Error %s called for non string attrib %d\n", - __func__, attrib); - return FALSE; - } - - oa = config_odev_find_or_add_attribute(attribs, attrib); - free(oa->attrib_name); - oa->attrib_name = XNFstrdup(attrib_name); - oa->attrib_type = ODEV_ATTRIB_STRING; - return TRUE; -} - -Bool -config_odev_add_int_attribute(struct OdevAttributes *attribs, int attrib, - int attrib_value) -{ - struct OdevAttribute *oa; - - if (config_odev_get_attribute_type(attrib) != ODEV_ATTRIB_INT) { - LogMessage(X_ERROR, "Error %s called for non integer attrib %d\n", - __func__, attrib); - return FALSE; - } - - oa = config_odev_find_or_add_attribute(attribs, attrib); - oa->attrib_value = attrib_value; - oa->attrib_type = ODEV_ATTRIB_INT; - return TRUE; -} - -char * -config_odev_get_attribute(struct OdevAttributes *attribs, int attrib_id) -{ - struct OdevAttribute *oa; - - oa = config_odev_find_attribute(attribs, attrib_id); - if (!oa) - return NULL; - - if (oa->attrib_type != ODEV_ATTRIB_STRING) { - LogMessage(X_ERROR, "Error %s called for non string attrib %d\n", - __func__, attrib_id); - return NULL; - } - return oa->attrib_name; -} - -int -config_odev_get_int_attribute(struct OdevAttributes *attribs, int attrib_id, int def) -{ - struct OdevAttribute *oa; - - oa = config_odev_find_attribute(attribs, attrib_id); - if (!oa) - return def; - - if (oa->attrib_type != ODEV_ATTRIB_INT) { - LogMessage(X_ERROR, "Error %s called for non integer attrib %d\n", - __func__, attrib_id); - return def; - } - - return oa->attrib_value; + struct OdevAttributes *attribs = XNFcalloc(sizeof (struct OdevAttributes)); + attribs->fd = -1; + return attribs; } void config_odev_free_attributes(struct OdevAttributes *attribs) { - struct OdevAttribute *iter, *safe; - int major = 0, minor = 0, fd = -1; - - xorg_list_for_each_entry_safe(iter, safe, &attribs->list, member) { - switch (iter->attrib_id) { - case ODEV_ATTRIB_MAJOR: major = iter->attrib_value; break; - case ODEV_ATTRIB_MINOR: minor = iter->attrib_value; break; - case ODEV_ATTRIB_FD: fd = iter->attrib_value; break; - } - xorg_list_del(&iter->member); - if (iter->attrib_type == ODEV_ATTRIB_STRING) - free(iter->attrib_name); - free(iter); - } - - if (fd != -1) - systemd_logind_release_fd(major, minor, fd); + if (attribs->fd != -1) + systemd_logind_release_fd(attribs->major, attribs->minor, attribs->fd); + free(attribs->path); + free(attribs->syspath); + free(attribs->busid); + free(attribs->driver); + free(attribs); } diff --git a/config/udev.c b/config/udev.c index a1b72c13b..1e4a9d7a6 100644 --- a/config/udev.c +++ b/config/udev.c @@ -462,12 +462,12 @@ config_udev_odev_setup_attribs(const char *path, const char *syspath, int major, int minor, config_odev_probe_proc_ptr probe_callback) { - struct OdevAttributes *attribs = config_odev_allocate_attribute_list(); + struct OdevAttributes *attribs = config_odev_allocate_attributes(); - config_odev_add_attribute(attribs, ODEV_ATTRIB_PATH, path); - config_odev_add_attribute(attribs, ODEV_ATTRIB_SYSPATH, syspath); - config_odev_add_int_attribute(attribs, ODEV_ATTRIB_MAJOR, major); - config_odev_add_int_attribute(attribs, ODEV_ATTRIB_MINOR, minor); + attribs->path = XNFstrdup(path); + attribs->syspath = XNFstrdup(syspath); + attribs->major = major; + attribs->minor = minor; /* ownership of attribs is passed to probe layer */ probe_callback(attribs); |