conf: introduce safe_strtol_base()

It is useful to parse hexadecimal strings, too.

Signed-off-by: Jaroslav Kysela <perex@perex.cz>
This commit is contained in:
Jaroslav Kysela 2021-11-02 10:41:07 +01:00
parent 0e2b167e93
commit f547b2e35f
3 changed files with 5 additions and 9 deletions

View file

@ -232,7 +232,8 @@ size_t page_align(size_t size);
size_t page_size(void); size_t page_size(void);
size_t page_ptr(size_t object_offset, size_t object_size, size_t *offset, size_t *mmap_offset); size_t page_ptr(size_t object_offset, size_t object_size, size_t *offset, size_t *mmap_offset);
int safe_strtol(const char *str, long *val); int safe_strtol_base(const char *str, long *val, int base);
static inline int safe_strtol(const char *str, long *val) { return safe_strtol_base(str, val, 0); }
int snd_send_fd(int sock, void *data, size_t len, int fd); int snd_send_fd(int sock, void *data, size_t len, int fd);
int snd_receive_fd(int sock, void *data, size_t len, int *fd); int snd_receive_fd(int sock, void *data, size_t len, int *fd);

View file

@ -668,14 +668,14 @@ static int safe_strtoll(const char *str, long long *val)
return 0; return 0;
} }
int safe_strtol(const char *str, long *val) int safe_strtol_base(const char *str, long *val, int base)
{ {
char *end; char *end;
long v; long v;
if (!*str) if (!*str)
return -EINVAL; return -EINVAL;
errno = 0; errno = 0;
v = strtol(str, &end, 0); v = strtol(str, &end, base);
if (errno) if (errno)
return -errno; return -errno;
if (*end) if (*end)

View file

@ -811,7 +811,6 @@ void uc_mgr_card_close(snd_use_case_mgr_t *uc_mgr)
*/ */
const char *uc_mgr_alibcfg_by_device(snd_config_t **top, const char *name) const char *uc_mgr_alibcfg_by_device(snd_config_t **top, const char *name)
{ {
char buf[7];
long card_num; long card_num;
snd_config_t *config; snd_config_t *config;
snd_use_case_mgr_t *uc_mgr; snd_use_case_mgr_t *uc_mgr;
@ -819,11 +818,7 @@ const char *uc_mgr_alibcfg_by_device(snd_config_t **top, const char *name)
if (strncmp(name, "_ucm", 4) || strlen(name) < 12 || name[8] != '.') if (strncmp(name, "_ucm", 4) || strlen(name) < 12 || name[8] != '.')
return NULL; return NULL;
buf[0] = '0'; err = safe_strtol_base(name, &card_num, 16);
buf[1] = 'x';
strncpy(buf + 2, name + 4, 4);
buf[6] = '\0';
err = safe_strtol(buf, &card_num);
if (err < 0 || card_num < 0 || card_num > 0xffff) if (err < 0 || card_num < 0 || card_num > 0xffff)
return NULL; return NULL;
config = NULL; config = NULL;