gutils: Make g_find_program_for_path() a proper private API

It’s not meant to be exposed publicly yet (we’re not ready to stabilise
it), but it was incorrectly decorated with `GLIB_AVAILABLE_IN_2_76`.

We can’t remove the decorator and use it that way, as it’s called in
libgio, so we have to expose it using `GLIB_PRIVATE_CALL()`.

Signed-off-by: Philip Withnall <pwithnall@endlessos.org>

Fixes: #2876
This commit is contained in:
Philip Withnall 2023-02-13 16:12:07 +00:00
parent 585c7d2db6
commit 438bd5cfa1
5 changed files with 39 additions and 25 deletions

View File

@ -1914,7 +1914,7 @@ g_desktop_app_info_load_from_keyfile (GDesktopAppInfo *info,
{
char *t;
/* Use the desktop file path (if any) as working dir to search program */
t = g_find_program_for_path (try_exec, NULL, path);
t = GLIB_PRIVATE_CALL (g_find_program_for_path) (try_exec, NULL, path);
if (t == NULL)
{
g_free (path);
@ -1947,7 +1947,7 @@ g_desktop_app_info_load_from_keyfile (GDesktopAppInfo *info,
* argument, so dereferencing argv[0] should return non-NULL. */
g_assert (argc > 0);
/* Use the desktop file path (if any) as working dir to search program */
t = g_find_program_for_path (argv[0], NULL, path);
t = GLIB_PRIVATE_CALL (g_find_program_for_path) (argv[0], NULL, path);
g_strfreev (argv);
if (t == NULL)
@ -2731,8 +2731,8 @@ prepend_terminal_to_vector (int *argc,
for (i = 0, found_terminal = NULL; i < G_N_ELEMENTS (known_terminals); i++)
{
found_terminal = g_find_program_for_path (known_terminals[i].exec,
path, working_dir);
found_terminal = GLIB_PRIVATE_CALL (g_find_program_for_path) (known_terminals[i].exec,
path, working_dir);
if (found_terminal != NULL)
{
term_arg = known_terminals[i].exec_arg;
@ -2984,9 +2984,9 @@ g_desktop_app_info_launch_uris_with_spawn (GDesktopAppInfo *info,
{
const char *env_path = g_environ_getenv (envp, "PATH");
program_path = g_find_program_for_path (program,
env_path,
info->path);
program_path = GLIB_PRIVATE_CALL (g_find_program_for_path) (program,
env_path,
info->path);
}
if (program_path)

View File

@ -67,6 +67,8 @@ glib__private__ (void)
g_win32_push_empty_invalid_parameter_handler,
g_win32_pop_invalid_parameter_handler,
g_find_program_for_path,
};
return &table;

View File

@ -154,6 +154,10 @@ typedef struct _GWin32InvalidParameterHandler GWin32InvalidParameterHandler;
void g_win32_push_empty_invalid_parameter_handler (GWin32InvalidParameterHandler *items);
void g_win32_pop_invalid_parameter_handler (GWin32InvalidParameterHandler *items);
char *g_find_program_for_path (const char *program,
const char *path,
const char *working_dir);
#define GLIB_PRIVATE_CALL(symbol) (glib__private__()->symbol)
@ -213,6 +217,11 @@ typedef struct {
void (* g_win32_pop_invalid_parameter_handler) (GWin32InvalidParameterHandler *items);
/* See gutils.c */
char *(* g_find_program_for_path) (const char *program,
const char *path,
const char *working_dir);
/* Add other private functions here, initialize them in glib-private.c */
} GLibPrivateVTable;

View File

@ -32,11 +32,6 @@ GLIB_AVAILABLE_IN_2_60
void g_set_user_dirs (const gchar *first_dir_type,
...) G_GNUC_NULL_TERMINATED;
GLIB_AVAILABLE_IN_2_76
char * g_find_program_for_path (const char *program,
const char *path,
const char *working_dir);
/* Returns the smallest power of 2 greater than or equal to n,
* or 0 if such power does not fit in a gsize
*/

View File

@ -487,6 +487,14 @@ test_find_program (void)
g_assert (res == NULL);
}
static char *
find_program_for_path (const char *program,
const char *path,
const char *working_dir)
{
return GLIB_PRIVATE_CALL(g_find_program_for_path) (program, path, working_dir);
}
static void
test_find_program_for_path (void)
{
@ -517,9 +525,9 @@ test_find_program_for_path (void)
g_assert_true (g_file_test (exe_path, G_FILE_TEST_IS_EXECUTABLE));
g_assert_null (g_find_program_in_path (command_to_find));
g_assert_null (g_find_program_for_path (command_to_find, NULL, NULL));
g_assert_null (find_program_for_path (command_to_find, NULL, NULL));
found_path = g_find_program_for_path (command_to_find, path, NULL);
found_path = find_program_for_path (command_to_find, path, NULL);
#ifdef __APPLE__
g_assert_nonnull (found_path);
g_assert_true (g_str_has_suffix (found_path, exe_path));
@ -528,7 +536,7 @@ test_find_program_for_path (void)
#endif
g_clear_pointer (&found_path, g_free);
found_path = g_find_program_for_path (command_to_find, path, path);
found_path = find_program_for_path (command_to_find, path, path);
#ifdef __APPLE__
g_assert_nonnull (found_path);
g_assert_true (g_str_has_suffix (found_path, exe_path));
@ -537,7 +545,7 @@ test_find_program_for_path (void)
#endif
g_clear_pointer (&found_path, g_free);
found_path = g_find_program_for_path (command_to_find, NULL, path);
found_path = find_program_for_path (command_to_find, NULL, path);
#ifdef __APPLE__
g_assert_nonnull (found_path);
g_assert_true (g_str_has_suffix (found_path, exe_path));
@ -546,7 +554,7 @@ test_find_program_for_path (void)
#endif
g_clear_pointer (&found_path, g_free);
found_path = g_find_program_for_path (command_to_find, "::", path);
found_path = find_program_for_path (command_to_find, "::", path);
#ifdef __APPLE__
g_assert_nonnull (found_path);
g_assert_true (g_str_has_suffix (found_path, exe_path));
@ -558,7 +566,7 @@ test_find_program_for_path (void)
old_cwd = g_get_current_dir ();
g_chdir (path);
found_path =
g_find_program_for_path (command_to_find,
find_program_for_path (command_to_find,
G_SEARCHPATH_SEPARATOR_S G_SEARCHPATH_SEPARATOR_S, NULL);
g_chdir (old_cwd);
g_clear_pointer (&old_cwd, g_free);
@ -573,7 +581,7 @@ test_find_program_for_path (void)
old_cwd = g_get_current_dir ();
g_chdir (tmp);
found_path =
g_find_program_for_path (command_to_find,
find_program_for_path (command_to_find,
G_SEARCHPATH_SEPARATOR_S G_SEARCHPATH_SEPARATOR_S, "sub-path");
g_chdir (old_cwd);
g_clear_pointer (&old_cwd, g_free);
@ -586,10 +594,10 @@ test_find_program_for_path (void)
g_clear_pointer (&found_path, g_free);
g_assert_null (
g_find_program_for_path (command_to_find,
find_program_for_path (command_to_find,
G_SEARCHPATH_SEPARATOR_S G_SEARCHPATH_SEPARATOR_S, "other-sub-path"));
found_path = g_find_program_for_path (command_to_find,
found_path = find_program_for_path (command_to_find,
G_SEARCHPATH_SEPARATOR_S "sub-path" G_SEARCHPATH_SEPARATOR_S, tmp);
#ifdef __APPLE__
g_assert_nonnull (found_path);
@ -599,23 +607,23 @@ test_find_program_for_path (void)
#endif
g_clear_pointer (&found_path, g_free);
g_assert_null (g_find_program_for_path (command_to_find,
g_assert_null (find_program_for_path (command_to_find,
G_SEARCHPATH_SEPARATOR_S "other-sub-path" G_SEARCHPATH_SEPARATOR_S, tmp));
#ifdef G_OS_UNIX
found_path = g_find_program_for_path ("sh", NULL, tmp);
found_path = find_program_for_path ("sh", NULL, tmp);
g_assert_nonnull (found_path);
g_clear_pointer (&found_path, g_free);
old_cwd = g_get_current_dir ();
g_chdir ("/");
found_path = g_find_program_for_path ("sh", "sbin:bin:usr/bin:usr/sbin", NULL);
found_path = find_program_for_path ("sh", "sbin:bin:usr/bin:usr/sbin", NULL);
g_chdir (old_cwd);
g_clear_pointer (&old_cwd, g_free);
g_assert_nonnull (found_path);
g_clear_pointer (&found_path, g_free);
found_path = g_find_program_for_path ("sh", "sbin:bin:usr/bin:usr/sbin", "/");
found_path = find_program_for_path ("sh", "sbin:bin:usr/bin:usr/sbin", "/");
g_assert_nonnull (found_path);
g_clear_pointer (&found_path, g_free);
#endif /* G_OS_UNIX */