mirror of
https://gitlab.gnome.org/GNOME/glib.git
synced 2025-04-23 15:49:16 +02:00
Merge branch 'wip/pwithnall/procfs-refactor' into 'main'
tests: Factor out a function to convert FD to path See merge request GNOME/glib!4396
This commit is contained in:
commit
c64f82fa79
@ -206,15 +206,52 @@ handle_request (GFakeDesktopPortalThread *self,
|
|||||||
return G_DBUS_METHOD_INVOCATION_HANDLED;
|
return G_DBUS_METHOD_INVOCATION_HANDLED;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* This is currently private as there’s only one user of it, but it could become
|
||||||
|
* a public API in future. */
|
||||||
|
static char *
|
||||||
|
_g_fd_query_path (int fd,
|
||||||
|
GError **error)
|
||||||
|
{
|
||||||
|
#if defined(__FreeBSD__)
|
||||||
|
struct kinfo_file kf;
|
||||||
|
kf.kf_structsize = sizeof (kf);
|
||||||
|
if (fcntl (fd, F_KINFO, &kf) < 0)
|
||||||
|
{
|
||||||
|
int saved_errno = errno;
|
||||||
|
g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
|
||||||
|
"Error querying file information for FD %d: %s",
|
||||||
|
fd, g_strerror (saved_errno));
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
return g_strdup (kf.kf_path);
|
||||||
|
#elif defined(G_OS_UNIX)
|
||||||
|
char *path = NULL;
|
||||||
|
char *proc_path = g_strdup_printf ("/proc/self/fd/%d", fd);
|
||||||
|
path = g_file_read_link (proc_path, error);
|
||||||
|
g_free (proc_path);
|
||||||
|
return g_steal_pointer (&path);
|
||||||
|
#else
|
||||||
|
/* - A NetBSD implementation would probably use `fcntl()` with `F_GETPATH`:
|
||||||
|
* https://man.netbsd.org/fcntl.2
|
||||||
|
* - A Windows implementation would probably use `GetFinalPathNameByHandleW()`:
|
||||||
|
* https://learn.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-getfinalpathnamebyhandlea
|
||||||
|
* - A Hurd implementation could open("/dev/fd/%u"):
|
||||||
|
* https://gitlab.gnome.org/GNOME/glib/-/merge_requests/4396#note_2279923
|
||||||
|
*/
|
||||||
|
#error "_g_fd_query_path() not supported on this platform"
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
static char *
|
static char *
|
||||||
handle_to_uri (GVariant *handle,
|
handle_to_uri (GVariant *handle,
|
||||||
GUnixFDList *fd_list)
|
GUnixFDList *fd_list)
|
||||||
{
|
{
|
||||||
int fd = -1;
|
int fd = -1;
|
||||||
int fd_id;
|
int fd_id;
|
||||||
char *proc_path = NULL;
|
|
||||||
char *path;
|
char *path;
|
||||||
char *uri;
|
char *uri;
|
||||||
|
GError *local_error = NULL;
|
||||||
|
|
||||||
fd_id = g_variant_get_handle (handle);
|
fd_id = g_variant_get_handle (handle);
|
||||||
fd = g_unix_fd_list_get (fd_list, fd_id, NULL);
|
fd = g_unix_fd_list_get (fd_list, fd_id, NULL);
|
||||||
@ -222,21 +259,10 @@ handle_to_uri (GVariant *handle,
|
|||||||
if (fd == -1)
|
if (fd == -1)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
#ifdef __FreeBSD__
|
path = _g_fd_query_path (fd, &local_error);
|
||||||
struct kinfo_file kf;
|
g_assert_no_error (local_error);
|
||||||
kf.kf_structsize = sizeof (kf);
|
|
||||||
if (fcntl (fd, F_KINFO, &kf) == -1)
|
|
||||||
return NULL;
|
|
||||||
path = g_strdup (kf.kf_path);
|
|
||||||
|
|
||||||
#else
|
|
||||||
proc_path = g_strdup_printf ("/proc/self/fd/%d", fd);
|
|
||||||
path = g_file_read_link (proc_path, NULL);
|
|
||||||
#endif
|
|
||||||
g_assert_nonnull (path);
|
|
||||||
|
|
||||||
uri = g_filename_to_uri (path, NULL, NULL);
|
uri = g_filename_to_uri (path, NULL, NULL);
|
||||||
g_free (proc_path);
|
|
||||||
g_free (path);
|
g_free (path);
|
||||||
close (fd);
|
close (fd);
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user