From 9a3c707fd4e79848681bea816b3d37205c038e42 Mon Sep 17 00:00:00 2001 From: Khem Raj Date: Fri, 7 Jun 2024 23:09:54 -0700 Subject: [PATCH] uvcgadget: Use g_path_get_basename instead of libc basename Musl does not implement GNU basename and have fixed a bug where the prototype was leaked into string.h [1], which resullts in compile errors with GCC-14 and Clang-17+ | sys/uvcgadget/configfs.c:262:21: error: call to undeclared function 'basename' ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration] | 262 | const char *v = basename (globbuf.gl_pathv[i]); | | ^ Use glib function instead makes it portable across musl and glibc on linux [1] https://git.musl-libc.org/cgit/musl/commit/?id=725e17ed6dff4d0cd22487bb64470881e86a92e7a Part-of: --- .../gst-plugins-bad/sys/uvcgadget/configfs.c | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/subprojects/gst-plugins-bad/sys/uvcgadget/configfs.c b/subprojects/gst-plugins-bad/sys/uvcgadget/configfs.c index 51b75cd795..3f43b80f6e 100644 --- a/subprojects/gst-plugins-bad/sys/uvcgadget/configfs.c +++ b/subprojects/gst-plugins-bad/sys/uvcgadget/configfs.c @@ -7,7 +7,7 @@ * Contact: Kieran Bingham */ -/* To provide basename and asprintf from the GNU library. */ +/* To provide asprintf from the GNU library. */ #define _GNU_SOURCE #include @@ -259,9 +259,10 @@ udc_find_video_device (const char *udc, const char *function) } if (i < globbuf.gl_pathc) { - const char *v = basename (globbuf.gl_pathv[i]); + gchar *v = g_path_get_basename (globbuf.gl_pathv[i]); video = path_join ("/dev", v); + g_free (v); } globfree (&globbuf); @@ -894,6 +895,7 @@ configfs_parse_uvc_function (const char *function) { struct uvc_function_config *fc; char *fpath; + gchar *bname; int ret = 0; fc = malloc (sizeof *fc); @@ -923,11 +925,10 @@ configfs_parse_uvc_function (const char *function) * Parse the function configuration. Remove the gadget name qualifier * from the function name, if any. */ - if (function) - function = basename (function); + bname = g_path_get_basename (function); fc->udc = attribute_read_str (fpath, "../../UDC"); - fc->video = udc_find_video_device (fc->udc, function); + fc->video = udc_find_video_device (fc->udc, bname); if (!fc->video) { ret = -ENODEV; goto done; @@ -942,6 +943,7 @@ done: } free (fpath); + g_free (bname); return fc; } @@ -979,12 +981,16 @@ configfs_parse_uvc_videodev (int fd, const char *video) char *function = NULL; char rpath[PATH_MAX]; char *res; + gchar *bname; res = realpath (video, rpath); if (!res) return NULL; - function = video_find_config_name (basename (rpath)); + bname = g_path_get_basename (rpath); + function = video_find_config_name (bname); + g_free (bname); + if (!function) return NULL;