diff options
author | Jaroslav Kysela <perex@perex.cz> | 2023-01-15 18:32:20 +0100 |
---|---|---|
committer | Jaroslav Kysela <perex@perex.cz> | 2023-01-15 18:37:40 +0100 |
commit | c083417b723a3485657234a21da3264419da1411 (patch) | |
tree | 23f3c38835d06a74e0ed2bfc366a5e1577a3c16b | |
parent | 436cd5b6d01edf7aedd58c209dc0d3b9adb111c6 (diff) | |
download | alsa-lib-c083417b723a3485657234a21da3264419da1411.tar.gz |
ucm: simplify and fix the previous patch (geti)
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>
-rw-r--r-- | src/ucm/main.c | 90 |
1 files changed, 20 insertions, 70 deletions
diff --git a/src/ucm/main.c b/src/ucm/main.c index ebbbf0b5..346c5dc8 100644 --- a/src/ucm/main.c +++ b/src/ucm/main.c @@ -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 |