From 9c05a16c9a394dea90fcefc29eb2ef2be06dc4b5 Mon Sep 17 00:00:00 2001 From: Chris Robinson Date: Thu, 21 Jan 2016 02:08:45 -0800 Subject: Fix for systems that don't have strnlen --- Alc/backends/oss.c | 18 ++++++++++++++---- CMakeLists.txt | 3 ++- config.h.in | 3 +++ 3 files changed, 19 insertions(+), 5 deletions(-) diff --git a/Alc/backends/oss.c b/Alc/backends/oss.c index 1e286791..33d7750a 100644 --- a/Alc/backends/oss.c +++ b/Alc/backends/oss.c @@ -27,6 +27,7 @@ #include #include #include +#include #include #include #include @@ -93,15 +94,21 @@ static void ALCossListPopulate(struct oss_device *UNUSED(playback), struct oss_d #else +#ifndef HAVE_STRNLEN +static size_t strnlen(const char *str, size_t maxlen) +{ + const char *end = memchr(str, 0, maxlen); + if(!end) return maxlen; + return end - str; +} +#endif + static void ALCossListAppend(struct oss_device *list, const char *handle, size_t hlen, const char *path, size_t plen) { struct oss_device *next; struct oss_device *last; size_t i; - if(plen == 0 || path[0] == '\0') - return; - /* skip the first item "OSS Default" */ last = list; next = list->next; @@ -173,7 +180,10 @@ static void ALCossListPopulate(struct oss_device *playback, struct oss_device *c ERR("SNDCTL_AUDIOINFO (%d) failed: %s\n", i, strerror(errno)); continue; } - if(ai.handle[0]) + if(ai.devnode[0] == '\0') + continue; + + if(ai.handle[0] != '\0') { len = strnlen(ai.handle, sizeof(ai.handle)); handle = ai.handle; diff --git a/CMakeLists.txt b/CMakeLists.txt index 513bd037..e503df92 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -453,8 +453,8 @@ IF(HAVE_FLOAT_H) CHECK_SYMBOL_EXISTS(__control87_2 float.h HAVE___CONTROL87_2) ENDIF() -CHECK_FUNCTION_EXISTS(strtof HAVE_STRTOF) CHECK_FUNCTION_EXISTS(stat HAVE_STAT) +CHECK_FUNCTION_EXISTS(strtof HAVE_STRTOF) CHECK_FUNCTION_EXISTS(strcasecmp HAVE_STRCASECMP) IF(NOT HAVE_STRCASECMP) CHECK_FUNCTION_EXISTS(_stricmp HAVE__STRICMP) @@ -475,6 +475,7 @@ IF(NOT HAVE_STRNCASECMP) ADD_DEFINITIONS(-Dstrncasecmp=_strnicmp) ENDIF() +CHECK_SYMBOL_EXISTS(strnlen string.h HAVE_STRNLEN) CHECK_SYMBOL_EXISTS(snprintf stdio.h HAVE_SNPRINTF) IF(NOT HAVE_SNPRINTF) CHECK_FUNCTION_EXISTS(_snprintf HAVE__SNPRINTF) diff --git a/config.h.in b/config.h.in index e66b1fe8..3bc3eb48 100644 --- a/config.h.in +++ b/config.h.in @@ -86,6 +86,9 @@ /* Define if we have the strtof function */ #cmakedefine HAVE_STRTOF +/* Define if we have the strnlen function */ +#cmakedefine HAVE_STRNLEN + /* Define if we have the __int64 type */ #cmakedefine HAVE___INT64 -- cgit v1.2.3