--- /dev/null
+From 7c558e8ef9375aea953d1e7c854b25947c967f76 Mon Sep 17 00:00:00 2001
+From: Khem Raj <raj.khem@gmail.com>
+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
+
+Upstream-Status: Backport [https://gitlab.freedesktop.org/gstreamer/gstreamer/merge_requests/7006]
+Signed-off-by: Khem Raj <raj.khem@gmail.com>
+---
+ .../gst-plugins-bad/sys/uvcgadget/configfs.c | 18 ++++++++++++------
+ 1 file changed, 12 insertions(+), 6 deletions(-)
+
+--- a/sys/uvcgadget/configfs.c
++++ b/sys/uvcgadget/configfs.c
+@@ -7,7 +7,7 @@
+ * Contact: Kieran Bingham <kieran.bingham@ideasonboard.com>
+ */
+
+-/* To provide basename and asprintf from the GNU library. */
++/* To provide asprintf from the GNU library. */
+ #define _GNU_SOURCE
+
+ #include <dirent.h>
+@@ -259,9 +259,10 @@ udc_find_video_device (const char *udc,
+ }
+
+ 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
+ {
+ 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
+ * 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, con
+ 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;
+