]> git.alsa-project.org Git - alsa-lib.git/commitdiff
ucm: simplify and fix the previous patch (geti)
authorJaroslav Kysela <perex@perex.cz>
Sun, 15 Jan 2023 17:32:20 +0000 (18:32 +0100)
committerJaroslav Kysela <perex@perex.cz>
Sun, 15 Jan 2023 17:37:40 +0000 (18:37 +0100)
Use macro to maintain only one code. The status may be 0 or 1 - handle
both values correctly.

Also, fix the possible memory leak in snd_use_case_geti() - string
str should be freed even when the error is returned.

Fixes: 436cd5b6 ("ucm: add existence checks to geti calls")
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
src/ucm/main.c

index ebbbf0b58ec397d393d279f83d479bebc00d69df..346c5dc8dd8bb9cb5e24b5d110876d3052b52f5d 100644 (file)
@@ -2415,67 +2415,23 @@ int snd_use_case_get(snd_use_case_mgr_t *uc_mgr,
        return err;
 }
 
-/**
- * \brief check device status and existance
- * \param uc_mgr Use case manager
- * \param str device identifier
- * \param value Value pointer
- * \return Zero if success, otherwise a negative error code
- */
-static long check_device(snd_use_case_mgr_t *uc_mgr,
-                     const char *str,
-                     long *value)
-{
-       struct use_case_device *dev;
-       int err;
-
-       if (!str) {
-               return -EINVAL;
-       }
-       err = device_status(uc_mgr, str);
-       if (err > 0) {
-               *value = err;
-               err = 0;
-       } else if (err < 0) {
-               return err;
-       }
-       dev = find_device(uc_mgr, uc_mgr->active_verb, str, 0);
-       if (!dev) {
-               return -ENOENT;
-       }
-       return 0;
-}
-
-/**
- * \brief check modifier status and existance
- * \param uc_mgr Use case manager
- * \param str modifier identifier
- * \param value Value pointer
- * \return Zero if success, otherwise a negative error code
+/*
+ * a helper macro to obtain status and existence
  */
-static long check_modifier(snd_use_case_mgr_t *uc_mgr,
-                     const char *str,
-                     long *value)
-{
-       struct use_case_modifier *mod;
-       long err;
-
-       if (!str) {
-               return -EINVAL;
-       }
-       err = modifier_status(uc_mgr, str);
-       if (err > 0) {
-               *value = err;
-               return 0;
-       } else if (err < 0) {
-               return err;
-       }
-       mod = find_modifier(uc_mgr, uc_mgr->active_verb, str, 0);
-       if (!mod) {
-               return -ENOENT;
-       }
-       return 0;
-}
+#define geti(uc_mgr, status, ifind, str, value) ({ \
+       long val = -EINVAL; \
+       if (str) { \
+               val = (status)((uc_mgr), (str)); \
+               if (val >= 0) { \
+                       if ((ifind)((uc_mgr), (uc_mgr)->active_verb, (str), 0)) { \
+                               *(value) = val; \
+                       } else { \
+                               val = -ENOENT; \
+                       } \
+               } \
+       } \
+       ; val; /* return value */ \
+})
 
 /**
  * \brief Get current - integer
@@ -2488,7 +2444,7 @@ int snd_use_case_geti(snd_use_case_mgr_t *uc_mgr,
                      long *value)
 {
        char *str, *str1;
-       long err;
+       int err;
 
        pthread_mutex_lock(&uc_mgr->mutex);
        if (0) {
@@ -2505,21 +2461,15 @@ int snd_use_case_geti(snd_use_case_mgr_t *uc_mgr,
                        str = NULL;
                }
                if (check_identifier(identifier, "_devstatus")) {
-                       err = check_device(uc_mgr, str, value);
-                       if (err < 0) {
-                               goto __end;
-                       }
+                       err = geti(uc_mgr, device_status, find_device, str, value);
                } else if (check_identifier(identifier, "_modstatus")) {
-                       err = check_modifier(uc_mgr, str, value);
-                       if (err < 0) {
-                               goto __end;
-                       }
+                       err = geti(uc_mgr, modifier_status, find_modifier, str, value);
 #if 0
                /*
                 * enable this block if the else clause below is expanded to query
                 * user-supplied values
                 */
-               } else if (identifier[0] == '_')
+               } else if (identifier[0] == '_') {
                        err = -ENOENT;
 #endif
                } else