Split out the path helpers to a new source file

This commit is contained in:
Richard Hughes 2022-06-06 19:10:11 +01:00 committed by Mario Limonciello
parent 2822d724b2
commit 067d7d8088
62 changed files with 770 additions and 701 deletions

View File

@ -103,6 +103,14 @@ if __name__ == "__main__":
"fu_common_dump_full": "fu_dump_full",
"fu_common_dump_bytes": "fu_dump_bytes",
"fu_common_error_array_get_best": "fu_engine_error_array_get_best",
"fu_common_get_path": "fu_path_from_kind",
"fu_common_filename_glob": "fu_path_glob",
"fu_common_fnmatch": "fu_path_fnmatch",
"fu_common_rmtree": "fu_path_rmtree",
"fu_common_get_files_recursive": "fu_path_get_files",
"fu_common_mkdir": "fu_path_mkdir",
"fu_common_mkdir_parent": "fu_path_mkdir_parent",
"fu_common_find_program_in_path": "fu_path_find_program",
}.items():
if buf.find(old) == -1:
continue

View File

@ -20,7 +20,7 @@ fu_common_get_block_devices(GError **error)
}
gboolean
fu_common_fnmatch_impl(const gchar *pattern, const gchar *str)
fu_path_fnmatch_impl(const gchar *pattern, const gchar *str)
{
return fnmatch(pattern, str, FNM_NOESCAPE) == 0;
}

View File

@ -16,6 +16,7 @@
#endif
#include "fu-common-private.h"
#include "fu-path-private.h"
/* bsdisks doesn't provide Manager object */
#define UDISKS_DBUS_PATH "/org/freedesktop/UDisks2"
@ -110,7 +111,7 @@ fu_common_get_block_devices(GError **error)
}
gboolean
fu_common_fnmatch_impl(const gchar *pattern, const gchar *str)
fu_path_fnmatch_impl(const gchar *pattern, const gchar *str)
{
#ifdef HAVE_FNMATCH_H
return fnmatch(pattern, str, FNM_NOESCAPE) == 0;

View File

@ -15,6 +15,7 @@
#endif
#include "fu-common-private.h"
#include "fu-path-private.h"
#define UDISKS_DBUS_PATH "/org/freedesktop/UDisks2/Manager"
#define UDISKS_DBUS_MANAGER_INTERFACE "org.freedesktop.UDisks2.Manager"
@ -88,7 +89,7 @@ fu_common_get_block_devices(GError **error)
}
gboolean
fu_common_fnmatch_impl(const gchar *pattern, const gchar *str)
fu_path_fnmatch_impl(const gchar *pattern, const gchar *str)
{
#ifdef HAVE_FNMATCH_H
return fnmatch(pattern, str, FNM_NOESCAPE) == 0;

View File

@ -15,8 +15,6 @@
GPtrArray *
fu_common_get_block_devices(GError **error);
gboolean
fu_common_fnmatch_impl(const gchar *pattern, const gchar *str);
guint64
fu_common_get_memory_size_impl(void);

View File

@ -12,6 +12,7 @@
#include <sysinfoapi.h>
#include "fu-common-private.h"
#include "fu-path-private.h"
GPtrArray *
fu_common_get_block_devices(GError **error)
@ -21,7 +22,7 @@ fu_common_get_block_devices(GError **error)
}
gboolean
fu_common_fnmatch_impl(const gchar *pattern, const gchar *str)
fu_path_fnmatch_impl(const gchar *pattern, const gchar *str)
{
g_return_val_if_fail(pattern != NULL, FALSE);
g_return_val_if_fail(str != NULL, FALSE);

View File

@ -32,494 +32,6 @@
#include "fu-string.h"
#include "fu-volume-private.h"
/**
* fu_common_rmtree:
* @directory: a directory name
* @error: (nullable): optional return location for an error
*
* Recursively removes a directory.
*
* Returns: %TRUE for success, %FALSE otherwise
*
* Since: 0.9.7
**/
gboolean
fu_common_rmtree(const gchar *directory, GError **error)
{
const gchar *filename;
g_autoptr(GDir) dir = NULL;
g_return_val_if_fail(directory != NULL, FALSE);
g_return_val_if_fail(error == NULL || *error == NULL, FALSE);
/* try to open */
g_debug("removing %s", directory);
dir = g_dir_open(directory, 0, error);
if (dir == NULL)
return FALSE;
/* find each */
while ((filename = g_dir_read_name(dir))) {
g_autofree gchar *src = NULL;
src = g_build_filename(directory, filename, NULL);
if (g_file_test(src, G_FILE_TEST_IS_DIR)) {
if (!fu_common_rmtree(src, error))
return FALSE;
} else {
if (g_unlink(src) != 0) {
g_set_error(error,
FWUPD_ERROR,
FWUPD_ERROR_INTERNAL,
"Failed to delete: %s",
src);
return FALSE;
}
}
}
if (g_remove(directory) != 0) {
g_set_error(error,
FWUPD_ERROR,
FWUPD_ERROR_INTERNAL,
"Failed to delete: %s",
directory);
return FALSE;
}
return TRUE;
}
static gboolean
fu_common_get_file_list_internal(GPtrArray *files, const gchar *directory, GError **error)
{
const gchar *filename;
g_autoptr(GDir) dir = NULL;
/* try to open */
dir = g_dir_open(directory, 0, error);
if (dir == NULL)
return FALSE;
/* find each */
while ((filename = g_dir_read_name(dir))) {
g_autofree gchar *src = g_build_filename(directory, filename, NULL);
if (g_file_test(src, G_FILE_TEST_IS_DIR)) {
if (!fu_common_get_file_list_internal(files, src, error))
return FALSE;
} else {
g_ptr_array_add(files, g_steal_pointer(&src));
}
}
return TRUE;
}
/**
* fu_common_get_files_recursive:
* @path: a directory name
* @error: (nullable): optional return location for an error
*
* Returns every file found under @directory, and any subdirectory.
* If any path under @directory cannot be accessed due to permissions an error
* will be returned.
*
* Returns: (transfer container) (element-type utf8): array of files, or %NULL for error
*
* Since: 1.0.6
**/
GPtrArray *
fu_common_get_files_recursive(const gchar *path, GError **error)
{
g_autoptr(GPtrArray) files = g_ptr_array_new_with_free_func(g_free);
g_return_val_if_fail(path != NULL, NULL);
g_return_val_if_fail(error == NULL || *error == NULL, NULL);
if (!fu_common_get_file_list_internal(files, path, error))
return NULL;
return g_steal_pointer(&files);
}
/**
* fu_common_mkdir:
* @dirname: a directory name
* @error: (nullable): optional return location for an error
*
* Creates any required directories, including any parent directories.
*
* Returns: %TRUE for success
*
* Since: 1.7.1
**/
gboolean
fu_common_mkdir(const gchar *dirname, GError **error)
{
g_return_val_if_fail(dirname != NULL, FALSE);
g_return_val_if_fail(error == NULL || *error == NULL, FALSE);
if (!g_file_test(dirname, G_FILE_TEST_IS_DIR))
g_debug("creating path %s", dirname);
if (g_mkdir_with_parents(dirname, 0755) == -1) {
g_set_error(error,
FWUPD_ERROR,
FWUPD_ERROR_INTERNAL,
"Failed to create '%s': %s",
dirname,
g_strerror(errno));
return FALSE;
}
return TRUE;
}
/**
* fu_common_mkdir_parent:
* @filename: a full pathname
* @error: (nullable): optional return location for an error
*
* Creates any required directories, including any parent directories.
*
* Returns: %TRUE for success
*
* Since: 0.9.7
**/
gboolean
fu_common_mkdir_parent(const gchar *filename, GError **error)
{
g_autofree gchar *parent = NULL;
g_return_val_if_fail(filename != NULL, FALSE);
g_return_val_if_fail(error == NULL || *error == NULL, FALSE);
parent = g_path_get_dirname(filename);
return fu_common_mkdir(parent, error);
}
/**
* fu_common_find_program_in_path:
* @basename: the program to search
* @error: (nullable): optional return location for an error
*
* Looks for a program in the PATH variable
*
* Returns: a new #gchar, or %NULL for error
*
* Since: 1.1.2
**/
gchar *
fu_common_find_program_in_path(const gchar *basename, GError **error)
{
gchar *fn = g_find_program_in_path(basename);
if (fn == NULL) {
g_set_error(error,
FWUPD_ERROR,
FWUPD_ERROR_NOT_SUPPORTED,
"missing executable %s in PATH",
basename);
return NULL;
}
return fn;
}
/**
* fu_common_get_win32_basedir:
*
* Gets the base directory that fwupd has been launched from on Windows.
* This is the directory containing all subdirectories (IE 'C:\Program Files (x86)\fwupd\')
*
* Returns: The system path, or %NULL if invalid
*
* Since: 1.7.4
**/
static gchar *
fu_common_get_win32_basedir(void)
{
#ifdef _WIN32
char drive_buf[_MAX_DRIVE];
char dir_buf[_MAX_DIR];
_splitpath(_pgmptr, drive_buf, dir_buf, NULL, NULL);
return g_build_filename(drive_buf, dir_buf, "..", NULL);
#endif
return NULL;
}
/**
* fu_common_get_path:
* @path_kind: a #FuPathKind e.g. %FU_PATH_KIND_DATADIR_PKG
*
* Gets a fwupd-specific system path. These can be overridden with various
* environment variables, for instance %FWUPD_DATADIR.
*
* Returns: a system path, or %NULL if invalid
*
* Since: 1.0.8
**/
gchar *
fu_common_get_path(FuPathKind path_kind)
{
const gchar *tmp;
g_autofree gchar *basedir = NULL;
switch (path_kind) {
/* /var */
case FU_PATH_KIND_LOCALSTATEDIR:
tmp = g_getenv("FWUPD_LOCALSTATEDIR");
if (tmp != NULL)
return g_strdup(tmp);
#ifdef _WIN32
return g_build_filename(g_getenv("USERPROFILE"),
PACKAGE_NAME,
FWUPD_LOCALSTATEDIR,
NULL);
#else
tmp = g_getenv("SNAP_USER_DATA");
if (tmp != NULL)
return g_build_filename(tmp, FWUPD_LOCALSTATEDIR, NULL);
return g_build_filename(FWUPD_LOCALSTATEDIR, NULL);
#endif
/* /proc */
case FU_PATH_KIND_PROCFS:
tmp = g_getenv("FWUPD_PROCFS");
if (tmp != NULL)
return g_strdup(tmp);
return g_strdup("/proc");
/* /sys/firmware */
case FU_PATH_KIND_SYSFSDIR_FW:
tmp = g_getenv("FWUPD_SYSFSFWDIR");
if (tmp != NULL)
return g_strdup(tmp);
return g_strdup("/sys/firmware");
/* /sys/class/tpm */
case FU_PATH_KIND_SYSFSDIR_TPM:
tmp = g_getenv("FWUPD_SYSFSTPMDIR");
if (tmp != NULL)
return g_strdup(tmp);
return g_strdup("/sys/class/tpm");
/* /sys/bus/platform/drivers */
case FU_PATH_KIND_SYSFSDIR_DRIVERS:
tmp = g_getenv("FWUPD_SYSFSDRIVERDIR");
if (tmp != NULL)
return g_strdup(tmp);
return g_strdup("/sys/bus/platform/drivers");
/* /sys/kernel/security */
case FU_PATH_KIND_SYSFSDIR_SECURITY:
tmp = g_getenv("FWUPD_SYSFSSECURITYDIR");
if (tmp != NULL)
return g_strdup(tmp);
return g_strdup("/sys/kernel/security");
/* /sys/firmware/acpi/tables */
case FU_PATH_KIND_ACPI_TABLES:
tmp = g_getenv("FWUPD_ACPITABLESDIR");
if (tmp != NULL)
return g_strdup(tmp);
return g_strdup("/sys/firmware/acpi/tables");
/* /sys/module/firmware_class/parameters/path */
case FU_PATH_KIND_FIRMWARE_SEARCH:
tmp = g_getenv("FWUPD_FIRMWARESEARCH");
if (tmp != NULL)
return g_strdup(tmp);
return g_strdup("/sys/module/firmware_class/parameters/path");
/* /etc */
case FU_PATH_KIND_SYSCONFDIR:
tmp = g_getenv("FWUPD_SYSCONFDIR");
if (tmp != NULL)
return g_strdup(tmp);
tmp = g_getenv("SNAP_USER_DATA");
if (tmp != NULL)
return g_build_filename(tmp, FWUPD_SYSCONFDIR, NULL);
basedir = fu_common_get_win32_basedir();
if (basedir != NULL)
return g_build_filename(basedir, FWUPD_SYSCONFDIR, NULL);
return g_strdup(FWUPD_SYSCONFDIR);
/* /usr/lib/<triplet>/fwupd-plugins-3 */
case FU_PATH_KIND_PLUGINDIR_PKG:
tmp = g_getenv("FWUPD_PLUGINDIR");
if (tmp != NULL)
return g_strdup(tmp);
tmp = g_getenv("SNAP");
if (tmp != NULL)
return g_build_filename(tmp, FWUPD_PLUGINDIR, NULL);
basedir = fu_common_get_win32_basedir();
if (basedir != NULL)
return g_build_filename(basedir, FWUPD_PLUGINDIR, NULL);
return g_build_filename(FWUPD_PLUGINDIR, NULL);
/* /usr/share/fwupd */
case FU_PATH_KIND_DATADIR_PKG:
tmp = g_getenv("FWUPD_DATADIR");
if (tmp != NULL)
return g_strdup(tmp);
tmp = g_getenv("SNAP");
if (tmp != NULL)
return g_build_filename(tmp, FWUPD_DATADIR, PACKAGE_NAME, NULL);
basedir = fu_common_get_win32_basedir();
if (basedir != NULL)
return g_build_filename(basedir, FWUPD_DATADIR, PACKAGE_NAME, NULL);
return g_build_filename(FWUPD_DATADIR, PACKAGE_NAME, NULL);
/* /usr/share/fwupd/quirks.d */
case FU_PATH_KIND_DATADIR_QUIRKS:
tmp = g_getenv("FWUPD_DATADIR_QUIRKS");
if (tmp != NULL)
return g_strdup(tmp);
basedir = fu_common_get_path(FU_PATH_KIND_DATADIR_PKG);
return g_build_filename(basedir, "quirks.d", NULL);
/* /usr/libexec/fwupd/efi */
case FU_PATH_KIND_EFIAPPDIR:
tmp = g_getenv("FWUPD_EFIAPPDIR");
if (tmp != NULL)
return g_strdup(tmp);
#ifdef EFI_APP_LOCATION
tmp = g_getenv("SNAP");
if (tmp != NULL)
return g_build_filename(tmp, EFI_APP_LOCATION, NULL);
return g_strdup(EFI_APP_LOCATION);
#else
return NULL;
#endif
/* /etc/fwupd */
case FU_PATH_KIND_SYSCONFDIR_PKG:
tmp = g_getenv("CONFIGURATION_DIRECTORY");
if (tmp != NULL && g_file_test(tmp, G_FILE_TEST_EXISTS))
return g_build_filename(tmp, NULL);
basedir = fu_common_get_path(FU_PATH_KIND_SYSCONFDIR);
return g_build_filename(basedir, PACKAGE_NAME, NULL);
/* /var/lib/fwupd */
case FU_PATH_KIND_LOCALSTATEDIR_PKG:
tmp = g_getenv("STATE_DIRECTORY");
if (tmp != NULL && g_file_test(tmp, G_FILE_TEST_EXISTS))
return g_build_filename(tmp, NULL);
basedir = fu_common_get_path(FU_PATH_KIND_LOCALSTATEDIR);
return g_build_filename(basedir, "lib", PACKAGE_NAME, NULL);
/* /var/lib/fwupd/quirks.d */
case FU_PATH_KIND_LOCALSTATEDIR_QUIRKS:
tmp = g_getenv("FWUPD_LOCALSTATEDIR_QUIRKS");
if (tmp != NULL)
return g_build_filename(tmp, NULL);
basedir = fu_common_get_path(FU_PATH_KIND_LOCALSTATEDIR_PKG);
return g_build_filename(basedir, "quirks.d", NULL);
/* /var/lib/fwupd/metadata */
case FU_PATH_KIND_LOCALSTATEDIR_METADATA:
tmp = g_getenv("FWUPD_LOCALSTATEDIR_METADATA");
if (tmp != NULL)
return g_build_filename(tmp, NULL);
basedir = fu_common_get_path(FU_PATH_KIND_LOCALSTATEDIR_PKG);
return g_build_filename(basedir, "metadata", NULL);
/* /var/lib/fwupd/remotes.d */
case FU_PATH_KIND_LOCALSTATEDIR_REMOTES:
tmp = g_getenv("FWUPD_LOCALSTATEDIR_REMOTES");
if (tmp != NULL)
return g_build_filename(tmp, NULL);
basedir = fu_common_get_path(FU_PATH_KIND_LOCALSTATEDIR_PKG);
return g_build_filename(basedir, "remotes.d", NULL);
/* /var/cache/fwupd */
case FU_PATH_KIND_CACHEDIR_PKG:
tmp = g_getenv("CACHE_DIRECTORY");
if (tmp != NULL && g_file_test(tmp, G_FILE_TEST_EXISTS))
return g_build_filename(tmp, NULL);
basedir = fu_common_get_path(FU_PATH_KIND_LOCALSTATEDIR);
return g_build_filename(basedir, "cache", PACKAGE_NAME, NULL);
/* /var/etc/fwupd */
case FU_PATH_KIND_LOCALCONFDIR_PKG:
tmp = g_getenv("LOCALCONF_DIRECTORY");
if (tmp != NULL && g_file_test(tmp, G_FILE_TEST_EXISTS))
return g_build_filename(tmp, NULL);
basedir = fu_common_get_path(FU_PATH_KIND_LOCALSTATEDIR);
return g_build_filename(basedir, "etc", PACKAGE_NAME, NULL);
/* /run/lock */
case FU_PATH_KIND_LOCKDIR:
return g_strdup("/run/lock");
/* /sys/class/firmware-attributes */
case FU_PATH_KIND_SYSFSDIR_FW_ATTRIB:
tmp = g_getenv("FWUPD_SYSFSFWATTRIBDIR");
if (tmp != NULL)
return g_strdup(tmp);
return g_strdup("/sys/class/firmware-attributes");
case FU_PATH_KIND_OFFLINE_TRIGGER:
tmp = g_getenv("FWUPD_OFFLINE_TRIGGER");
if (tmp != NULL)
return g_strdup(tmp);
return g_strdup("/system-update");
case FU_PATH_KIND_POLKIT_ACTIONS:
#ifdef POLKIT_ACTIONDIR
return g_strdup(POLKIT_ACTIONDIR);
#else
return NULL;
#endif
/* C:\Program Files (x86)\fwupd\ */
case FU_PATH_KIND_WIN32_BASEDIR:
return fu_common_get_win32_basedir();
/* this shouldn't happen */
default:
g_warning("cannot build path for unknown kind %u", path_kind);
}
return NULL;
}
/**
* fu_common_fnmatch:
* @pattern: a glob pattern, e.g. `*foo*`
* @str: a string to match against the pattern, e.g. `bazfoobar`
*
* Matches a string against a glob pattern.
*
* Returns: %TRUE if the string matched
*
* Since: 1.3.5
**/
gboolean
fu_common_fnmatch(const gchar *pattern, const gchar *str)
{
g_return_val_if_fail(pattern != NULL, FALSE);
g_return_val_if_fail(str != NULL, FALSE);
return fu_common_fnmatch_impl(pattern, str);
}
static gint
fu_common_filename_glob_sort_cb(gconstpointer a, gconstpointer b)
{
return g_strcmp0(*(const gchar **)a, *(const gchar **)b);
}
/**
* fu_common_filename_glob:
* @directory: a directory path
* @pattern: a glob pattern, e.g. `*foo*`
* @error: (nullable): optional return location for an error
*
* Returns all the filenames that match a specific glob pattern.
* Any results are sorted. No matching files will set @error.
*
* Returns: (element-type utf8) (transfer container): matching files, or %NULL
*
* Since: 1.5.0
**/
GPtrArray *
fu_common_filename_glob(const gchar *directory, const gchar *pattern, GError **error)
{
const gchar *basename;
g_autoptr(GDir) dir = NULL;
g_autoptr(GPtrArray) files = g_ptr_array_new_with_free_func(g_free);
g_return_val_if_fail(directory != NULL, NULL);
g_return_val_if_fail(pattern != NULL, NULL);
g_return_val_if_fail(error == NULL || *error == NULL, NULL);
dir = g_dir_open(directory, 0, error);
if (dir == NULL)
return NULL;
while ((basename = g_dir_read_name(dir)) != NULL) {
if (!fu_common_fnmatch(pattern, basename))
continue;
g_ptr_array_add(files, g_build_filename(directory, basename, NULL));
}
if (files->len == 0) {
g_set_error_literal(error,
G_IO_ERROR,
G_IO_ERROR_NOT_FOUND,
"no files matched pattern");
return NULL;
}
g_ptr_array_sort(files, fu_common_filename_glob_sort_cb);
return g_steal_pointer(&files);
}
/**
* fu_common_cpuid:
* @leaf: the CPUID level, now called the 'leaf' by Intel

View File

@ -18,75 +18,6 @@
**/
typedef guint FuEndianType;
/**
* FuPathKind:
* @FU_PATH_KIND_CACHEDIR_PKG: The cache directory (IE /var/cache/fwupd)
* @FU_PATH_KIND_DATADIR_PKG: The non-volatile data store (IE /usr/share/fwupd)
* @FU_PATH_KIND_EFIAPPDIR: The location to store EFI apps before install (IE
* /usr/libexec/fwupd/efi)
* @FU_PATH_KIND_LOCALSTATEDIR: The local state directory (IE /var)
* @FU_PATH_KIND_LOCALSTATEDIR_PKG: The local state directory for the package (IE
* /var/lib/fwupd)
* @FU_PATH_KIND_PLUGINDIR_PKG: The location to look for plugins for package (IE
* /usr/lib/[triplet]/fwupd-plugins-3)
* @FU_PATH_KIND_SYSCONFDIR: The configuration location (IE /etc)
* @FU_PATH_KIND_SYSCONFDIR_PKG: The package configuration location (IE /etc/fwupd)
* @FU_PATH_KIND_SYSFSDIR_FW: The sysfs firmware location (IE /sys/firmware)
* @FU_PATH_KIND_SYSFSDIR_DRIVERS: The platform sysfs directory (IE /sys/bus/platform/drivers)
* @FU_PATH_KIND_SYSFSDIR_TPM: The TPM sysfs directory (IE /sys/class/tpm)
* @FU_PATH_KIND_PROCFS: The procfs location (IE /proc)
* @FU_PATH_KIND_POLKIT_ACTIONS: The directory for policy kit actions (IE
* /usr/share/polkit-1/actions/)
* @FU_PATH_KIND_OFFLINE_TRIGGER: The file for the offline trigger (IE /system-update)
* @FU_PATH_KIND_SYSFSDIR_SECURITY: The sysfs security location (IE /sys/kernel/security)
* @FU_PATH_KIND_ACPI_TABLES: The location of the ACPI tables
* @FU_PATH_KIND_LOCKDIR: The lock directory (IE /run/lock)
* @FU_PATH_KIND_SYSFSDIR_FW_ATTRIB The firmware attributes directory (IE
* /sys/class/firmware-attributes)
* @FU_PATH_KIND_FIRMWARE_SEARCH: The path to configure the kernel policy for runtime loading
*other than /lib/firmware (IE /sys/module/firmware_class/parameters/path)
* @FU_PATH_KIND_DATADIR_QUIRKS: The quirks data store (IE /usr/share/fwupd/quirks.d)
* @FU_PATH_KIND_LOCALSTATEDIR_QUIRKS: The local state directory for quirks (IE
* /var/lib/fwupd/quirks.d)
* @FU_PATH_KIND_LOCALSTATEDIR_METADATA: The local state directory for metadata (IE
* /var/lib/fwupd/metadata)
* @FU_PATH_KIND_LOCALSTATEDIR_REMOTES: The local state directory for remotes (IE
* /var/lib/fwupd/remotes.d)
* @FU_PATH_KIND_WIN32_BASEDIR: The root of the install directory on Windows
* @FU_PATH_KIND_LOCALCONFDIR_PKG: The package configuration override (IE /var/etc/fwupd)
*
* Path types to use when dynamically determining a path at runtime
**/
typedef enum {
FU_PATH_KIND_CACHEDIR_PKG,
FU_PATH_KIND_DATADIR_PKG,
FU_PATH_KIND_EFIAPPDIR,
FU_PATH_KIND_LOCALSTATEDIR,
FU_PATH_KIND_LOCALSTATEDIR_PKG,
FU_PATH_KIND_PLUGINDIR_PKG,
FU_PATH_KIND_SYSCONFDIR,
FU_PATH_KIND_SYSCONFDIR_PKG,
FU_PATH_KIND_SYSFSDIR_FW,
FU_PATH_KIND_SYSFSDIR_DRIVERS,
FU_PATH_KIND_SYSFSDIR_TPM,
FU_PATH_KIND_PROCFS,
FU_PATH_KIND_POLKIT_ACTIONS,
FU_PATH_KIND_OFFLINE_TRIGGER,
FU_PATH_KIND_SYSFSDIR_SECURITY,
FU_PATH_KIND_ACPI_TABLES,
FU_PATH_KIND_LOCKDIR,
FU_PATH_KIND_SYSFSDIR_FW_ATTRIB,
FU_PATH_KIND_FIRMWARE_SEARCH,
FU_PATH_KIND_DATADIR_QUIRKS,
FU_PATH_KIND_LOCALSTATEDIR_QUIRKS,
FU_PATH_KIND_LOCALSTATEDIR_METADATA,
FU_PATH_KIND_LOCALSTATEDIR_REMOTES,
FU_PATH_KIND_WIN32_BASEDIR,
FU_PATH_KIND_LOCALCONFDIR_PKG,
/*< private >*/
FU_PATH_KIND_LAST
} FuPathKind;
/**
* FuCpuVendor:
* @FU_CPU_VENDOR_UNKNOWN: Unknown
@ -139,24 +70,6 @@ typedef enum {
FU_LID_STATE_LAST
} FuLidState;
gchar *
fu_common_get_path(FuPathKind path_kind);
GPtrArray *
fu_common_filename_glob(const gchar *directory,
const gchar *pattern,
GError **error) G_GNUC_WARN_UNUSED_RESULT;
gboolean
fu_common_fnmatch(const gchar *pattern, const gchar *str);
gboolean
fu_common_rmtree(const gchar *directory, GError **error) G_GNUC_WARN_UNUSED_RESULT;
GPtrArray *
fu_common_get_files_recursive(const gchar *path, GError **error) G_GNUC_WARN_UNUSED_RESULT;
gboolean
fu_common_mkdir(const gchar *dirname, GError **error) G_GNUC_WARN_UNUSED_RESULT;
gboolean
fu_common_mkdir_parent(const gchar *filename, GError **error) G_GNUC_WARN_UNUSED_RESULT;
gchar *
fu_common_find_program_in_path(const gchar *basename, GError **error) G_GNUC_WARN_UNUSED_RESULT;
gboolean
fu_common_cpuid(guint32 leaf,
guint32 *eax,

View File

@ -15,6 +15,7 @@
#include "fu-common.h"
#include "fu-efivar-impl.h"
#include "fu-path.h"
gboolean
fu_efivar_supported_impl(GError **error)
@ -55,7 +56,7 @@ fu_efivar_delete_with_glob_impl(const gchar *guid, const gchar *name_glob, GErro
while (efi_get_next_variable_name(&guidt, &name)) {
if (memcmp(&guid_to_delete, guidt, sizeof(guid_to_delete)) != 0)
continue;
if (!fu_common_fnmatch(name, name_glob))
if (!fu_path_fnmatch(name, name_glob))
continue;
rv = fu_efivar_delete(guid, name, error);
if (!rv)

View File

@ -19,11 +19,12 @@
#include "fu-common.h"
#include "fu-efivar-impl.h"
#include "fu-path.h"
static gchar *
fu_efivar_get_path(void)
{
g_autofree gchar *sysfsfwdir = fu_common_get_path(FU_PATH_KIND_SYSFSDIR_FW);
g_autofree gchar *sysfsfwdir = fu_path_from_kind(FU_PATH_KIND_SYSFSDIR_FW);
return g_build_filename(sysfsfwdir, "efi", "efivars", NULL);
}
@ -159,7 +160,7 @@ fu_efivar_delete_with_glob_impl(const gchar *guid, const gchar *name_glob, GErro
return FALSE;
nameguid_glob = g_strdup_printf("%s-%s", name_glob, guid);
while ((fn = g_dir_read_name(dir)) != NULL) {
if (fu_common_fnmatch(nameguid_glob, fn)) {
if (fu_path_fnmatch(nameguid_glob, fn)) {
g_autofree gchar *keyfn = g_build_filename(efivardir, fn, NULL);
g_autoptr(GFile) file = g_file_new_for_path(keyfn);
if (!fu_efivar_set_immutable(keyfn, FALSE, NULL, error)) {

View File

@ -17,6 +17,7 @@
#include "fu-common.h"
#include "fu-hwids.h"
#include "fu-path.h"
#include "fu-string.h"
/**
@ -355,8 +356,8 @@ fu_hwids_convert_integer_cb(FuSmbios *smbios, guint8 type, guint8 offset, GError
static gboolean
fu_hwids_setup_overrides(FuHwids *self, GError **error)
{
g_autofree gchar *localstatedir = fu_common_get_path(FU_PATH_KIND_LOCALSTATEDIR_PKG);
g_autofree gchar *sysconfigdir = fu_common_get_path(FU_PATH_KIND_SYSCONFDIR_PKG);
g_autofree gchar *localstatedir = fu_path_from_kind(FU_PATH_KIND_LOCALSTATEDIR_PKG);
g_autofree gchar *sysconfigdir = fu_path_from_kind(FU_PATH_KIND_SYSCONFDIR_PKG);
g_autoptr(GKeyFile) kf = g_key_file_new();
g_autoptr(GPtrArray) fns = g_ptr_array_new_with_free_func(g_free);
g_autoptr(GPtrArray) keys = fu_hwids_get_keys(self);

View File

@ -17,6 +17,7 @@
#include "fu-common-version.h"
#include "fu-common.h"
#include "fu-kernel.h"
#include "fu-path.h"
/**
* fu_kernel_locked_down:
@ -30,7 +31,7 @@ fu_kernel_locked_down(void)
{
#ifdef __linux__
gsize len = 0;
g_autofree gchar *dir = fu_common_get_path(FU_PATH_KIND_SYSFSDIR_SECURITY);
g_autofree gchar *dir = fu_path_from_kind(FU_PATH_KIND_SYSFSDIR_SECURITY);
g_autofree gchar *fname = g_build_filename(dir, "lockdown", NULL);
g_autofree gchar *data = NULL;
g_auto(GStrv) options = NULL;
@ -117,7 +118,7 @@ fu_kernel_get_firmware_search_path(GError **error)
g_autofree gchar *sys_fw_search_path = NULL;
g_autofree gchar *contents = NULL;
sys_fw_search_path = fu_common_get_path(FU_PATH_KIND_FIRMWARE_SEARCH);
sys_fw_search_path = fu_path_from_kind(FU_PATH_KIND_FIRMWARE_SEARCH);
if (!g_file_get_contents(sys_fw_search_path, &contents, &sz, error))
return NULL;
@ -150,7 +151,7 @@ fu_kernel_set_firmware_search_path(const gchar *path, GError **error)
g_return_val_if_fail(path != NULL, FALSE);
g_return_val_if_fail(strlen(path) < PATH_MAX, FALSE);
sys_fw_search_path_prm = fu_common_get_path(FU_PATH_KIND_FIRMWARE_SEARCH);
sys_fw_search_path_prm = fu_path_from_kind(FU_PATH_KIND_FIRMWARE_SEARCH);
g_debug("writing firmware search path (%" G_GSIZE_FORMAT "): %s", strlen(path), path);
@ -168,7 +169,7 @@ fu_kernel_set_firmware_search_path(const gchar *path, GError **error)
g_return_val_if_fail(path != NULL, FALSE);
g_return_val_if_fail(strlen(path) < PATH_MAX, FALSE);
sys_fw_search_path_prm = fu_common_get_path(FU_PATH_KIND_FIRMWARE_SEARCH);
sys_fw_search_path_prm = fu_path_from_kind(FU_PATH_KIND_FIRMWARE_SEARCH);
/* g_file_set_contents will try to create backup files in sysfs, so use fopen here */
fd = fopen(sys_fw_search_path_prm, "w");
if (fd == NULL) {

View File

@ -0,0 +1,12 @@
/*
* Copyright (C) 2021 Richard Hughes <richard@hughsie.com>
*
* SPDX-License-Identifier: LGPL-2.1+
*/
#pragma once
#include "fu-path.h"
gboolean
fu_path_fnmatch_impl(const gchar *pattern, const gchar *str);

508
libfwupdplugin/fu-path.c Normal file
View File

@ -0,0 +1,508 @@
/*
* Copyright (C) 2017 Richard Hughes <richard@hughsie.com>
*
* SPDX-License-Identifier: LGPL-2.1+
*/
#define G_LOG_DOMAIN "FuCommon"
#include "config.h"
#include <errno.h>
#include <glib/gstdio.h>
#ifdef _WIN32
#include <stdlib.h>
#endif
#include "fwupd-error.h"
#include "fu-path-private.h"
/**
* fu_path_rmtree:
* @directory: a directory name
* @error: (nullable): optional return location for an error
*
* Recursively removes a directory.
*
* Returns: %TRUE for success, %FALSE otherwise
*
* Since: 1.8.2
**/
gboolean
fu_path_rmtree(const gchar *directory, GError **error)
{
const gchar *filename;
g_autoptr(GDir) dir = NULL;
g_return_val_if_fail(directory != NULL, FALSE);
g_return_val_if_fail(error == NULL || *error == NULL, FALSE);
/* try to open */
g_debug("removing %s", directory);
dir = g_dir_open(directory, 0, error);
if (dir == NULL)
return FALSE;
/* find each */
while ((filename = g_dir_read_name(dir))) {
g_autofree gchar *src = NULL;
src = g_build_filename(directory, filename, NULL);
if (g_file_test(src, G_FILE_TEST_IS_DIR)) {
if (!fu_path_rmtree(src, error))
return FALSE;
} else {
if (g_unlink(src) != 0) {
g_set_error(error,
FWUPD_ERROR,
FWUPD_ERROR_INTERNAL,
"Failed to delete: %s",
src);
return FALSE;
}
}
}
if (g_remove(directory) != 0) {
g_set_error(error,
FWUPD_ERROR,
FWUPD_ERROR_INTERNAL,
"Failed to delete: %s",
directory);
return FALSE;
}
return TRUE;
}
static gboolean
fu_path_get_file_list_internal(GPtrArray *files, const gchar *directory, GError **error)
{
const gchar *filename;
g_autoptr(GDir) dir = NULL;
/* try to open */
dir = g_dir_open(directory, 0, error);
if (dir == NULL)
return FALSE;
/* find each */
while ((filename = g_dir_read_name(dir))) {
g_autofree gchar *src = g_build_filename(directory, filename, NULL);
if (g_file_test(src, G_FILE_TEST_IS_DIR)) {
if (!fu_path_get_file_list_internal(files, src, error))
return FALSE;
} else {
g_ptr_array_add(files, g_steal_pointer(&src));
}
}
return TRUE;
}
/**
* fu_path_get_files:
* @path: a directory name
* @error: (nullable): optional return location for an error
*
* Returns every file found under @directory, and any subdirectory.
* If any path under @directory cannot be accessed due to permissions an error
* will be returned.
*
* Returns: (transfer container) (element-type utf8): array of files, or %NULL for error
*
* Since: 1.8.2
**/
GPtrArray *
fu_path_get_files(const gchar *path, GError **error)
{
g_autoptr(GPtrArray) files = g_ptr_array_new_with_free_func(g_free);
g_return_val_if_fail(path != NULL, NULL);
g_return_val_if_fail(error == NULL || *error == NULL, NULL);
if (!fu_path_get_file_list_internal(files, path, error))
return NULL;
return g_steal_pointer(&files);
}
/**
* fu_path_mkdir:
* @dirname: a directory name
* @error: (nullable): optional return location for an error
*
* Creates any required directories, including any parent directories.
*
* Returns: %TRUE for success
*
* Since: 1.8.2
**/
gboolean
fu_path_mkdir(const gchar *dirname, GError **error)
{
g_return_val_if_fail(dirname != NULL, FALSE);
g_return_val_if_fail(error == NULL || *error == NULL, FALSE);
if (!g_file_test(dirname, G_FILE_TEST_IS_DIR))
g_debug("creating path %s", dirname);
if (g_mkdir_with_parents(dirname, 0755) == -1) {
g_set_error(error,
FWUPD_ERROR,
FWUPD_ERROR_INTERNAL,
"Failed to create '%s': %s",
dirname,
g_strerror(errno));
return FALSE;
}
return TRUE;
}
/**
* fu_path_mkdir_parent:
* @filename: a full pathname
* @error: (nullable): optional return location for an error
*
* Creates any required directories, including any parent directories.
*
* Returns: %TRUE for success
*
* Since: 1.8.2
**/
gboolean
fu_path_mkdir_parent(const gchar *filename, GError **error)
{
g_autofree gchar *parent = NULL;
g_return_val_if_fail(filename != NULL, FALSE);
g_return_val_if_fail(error == NULL || *error == NULL, FALSE);
parent = g_path_get_dirname(filename);
return fu_path_mkdir(parent, error);
}
/**
* fu_path_find_program:
* @basename: the program to search
* @error: (nullable): optional return location for an error
*
* Looks for a program in the PATH variable
*
* Returns: a new #gchar, or %NULL for error
*
* Since: 1.8.2
**/
gchar *
fu_path_find_program(const gchar *basename, GError **error)
{
gchar *fn = g_find_program_in_path(basename);
if (fn == NULL) {
g_set_error(error,
FWUPD_ERROR,
FWUPD_ERROR_NOT_SUPPORTED,
"missing executable %s in PATH",
basename);
return NULL;
}
return fn;
}
/**
* fu_path_get_win32_basedir:
*
* Gets the base directory that fwupd has been launched from on Windows.
* This is the directory containing all subdirectories (IE 'C:\Program Files (x86)\fwupd\')
*
* Returns: The system path, or %NULL if invalid
*
* Since: 1.8.2
**/
static gchar *
fu_path_get_win32_basedir(void)
{
#ifdef _WIN32
char drive_buf[_MAX_DRIVE];
char dir_buf[_MAX_DIR];
_splitpath(_pgmptr, drive_buf, dir_buf, NULL, NULL);
return g_build_filename(drive_buf, dir_buf, "..", NULL);
#endif
return NULL;
}
/**
* fu_path_from_kind:
* @path_kind: a #FuPathKind e.g. %FU_PATH_KIND_DATADIR_PKG
*
* Gets a fwupd-specific system path. These can be overridden with various
* environment variables, for instance %FWUPD_DATADIR.
*
* Returns: a system path, or %NULL if invalid
*
* Since: 1.8.2
**/
gchar *
fu_path_from_kind(FuPathKind path_kind)
{
const gchar *tmp;
g_autofree gchar *basedir = NULL;
switch (path_kind) {
/* /var */
case FU_PATH_KIND_LOCALSTATEDIR:
tmp = g_getenv("FWUPD_LOCALSTATEDIR");
if (tmp != NULL)
return g_strdup(tmp);
#ifdef _WIN32
return g_build_filename(g_getenv("USERPROFILE"),
PACKAGE_NAME,
FWUPD_LOCALSTATEDIR,
NULL);
#else
tmp = g_getenv("SNAP_USER_DATA");
if (tmp != NULL)
return g_build_filename(tmp, FWUPD_LOCALSTATEDIR, NULL);
return g_build_filename(FWUPD_LOCALSTATEDIR, NULL);
#endif
/* /proc */
case FU_PATH_KIND_PROCFS:
tmp = g_getenv("FWUPD_PROCFS");
if (tmp != NULL)
return g_strdup(tmp);
return g_strdup("/proc");
/* /sys/firmware */
case FU_PATH_KIND_SYSFSDIR_FW:
tmp = g_getenv("FWUPD_SYSFSFWDIR");
if (tmp != NULL)
return g_strdup(tmp);
return g_strdup("/sys/firmware");
/* /sys/class/tpm */
case FU_PATH_KIND_SYSFSDIR_TPM:
tmp = g_getenv("FWUPD_SYSFSTPMDIR");
if (tmp != NULL)
return g_strdup(tmp);
return g_strdup("/sys/class/tpm");
/* /sys/bus/platform/drivers */
case FU_PATH_KIND_SYSFSDIR_DRIVERS:
tmp = g_getenv("FWUPD_SYSFSDRIVERDIR");
if (tmp != NULL)
return g_strdup(tmp);
return g_strdup("/sys/bus/platform/drivers");
/* /sys/kernel/security */
case FU_PATH_KIND_SYSFSDIR_SECURITY:
tmp = g_getenv("FWUPD_SYSFSSECURITYDIR");
if (tmp != NULL)
return g_strdup(tmp);
return g_strdup("/sys/kernel/security");
/* /sys/firmware/acpi/tables */
case FU_PATH_KIND_ACPI_TABLES:
tmp = g_getenv("FWUPD_ACPITABLESDIR");
if (tmp != NULL)
return g_strdup(tmp);
return g_strdup("/sys/firmware/acpi/tables");
/* /sys/module/firmware_class/parameters/path */
case FU_PATH_KIND_FIRMWARE_SEARCH:
tmp = g_getenv("FWUPD_FIRMWARESEARCH");
if (tmp != NULL)
return g_strdup(tmp);
return g_strdup("/sys/module/firmware_class/parameters/path");
/* /etc */
case FU_PATH_KIND_SYSCONFDIR:
tmp = g_getenv("FWUPD_SYSCONFDIR");
if (tmp != NULL)
return g_strdup(tmp);
tmp = g_getenv("SNAP_USER_DATA");
if (tmp != NULL)
return g_build_filename(tmp, FWUPD_SYSCONFDIR, NULL);
basedir = fu_path_get_win32_basedir();
if (basedir != NULL)
return g_build_filename(basedir, FWUPD_SYSCONFDIR, NULL);
return g_strdup(FWUPD_SYSCONFDIR);
/* /usr/lib/<triplet>/fwupd-plugins-3 */
case FU_PATH_KIND_PLUGINDIR_PKG:
tmp = g_getenv("FWUPD_PLUGINDIR");
if (tmp != NULL)
return g_strdup(tmp);
tmp = g_getenv("SNAP");
if (tmp != NULL)
return g_build_filename(tmp, FWUPD_PLUGINDIR, NULL);
basedir = fu_path_get_win32_basedir();
if (basedir != NULL)
return g_build_filename(basedir, FWUPD_PLUGINDIR, NULL);
return g_build_filename(FWUPD_PLUGINDIR, NULL);
/* /usr/share/fwupd */
case FU_PATH_KIND_DATADIR_PKG:
tmp = g_getenv("FWUPD_DATADIR");
if (tmp != NULL)
return g_strdup(tmp);
tmp = g_getenv("SNAP");
if (tmp != NULL)
return g_build_filename(tmp, FWUPD_DATADIR, PACKAGE_NAME, NULL);
basedir = fu_path_get_win32_basedir();
if (basedir != NULL)
return g_build_filename(basedir, FWUPD_DATADIR, PACKAGE_NAME, NULL);
return g_build_filename(FWUPD_DATADIR, PACKAGE_NAME, NULL);
/* /usr/share/fwupd/quirks.d */
case FU_PATH_KIND_DATADIR_QUIRKS:
tmp = g_getenv("FWUPD_DATADIR_QUIRKS");
if (tmp != NULL)
return g_strdup(tmp);
basedir = fu_path_from_kind(FU_PATH_KIND_DATADIR_PKG);
return g_build_filename(basedir, "quirks.d", NULL);
/* /usr/libexec/fwupd/efi */
case FU_PATH_KIND_EFIAPPDIR:
tmp = g_getenv("FWUPD_EFIAPPDIR");
if (tmp != NULL)
return g_strdup(tmp);
#ifdef EFI_APP_LOCATION
tmp = g_getenv("SNAP");
if (tmp != NULL)
return g_build_filename(tmp, EFI_APP_LOCATION, NULL);
return g_strdup(EFI_APP_LOCATION);
#else
return NULL;
#endif
/* /etc/fwupd */
case FU_PATH_KIND_SYSCONFDIR_PKG:
tmp = g_getenv("CONFIGURATION_DIRECTORY");
if (tmp != NULL && g_file_test(tmp, G_FILE_TEST_EXISTS))
return g_build_filename(tmp, NULL);
basedir = fu_path_from_kind(FU_PATH_KIND_SYSCONFDIR);
return g_build_filename(basedir, PACKAGE_NAME, NULL);
/* /var/lib/fwupd */
case FU_PATH_KIND_LOCALSTATEDIR_PKG:
tmp = g_getenv("STATE_DIRECTORY");
if (tmp != NULL && g_file_test(tmp, G_FILE_TEST_EXISTS))
return g_build_filename(tmp, NULL);
basedir = fu_path_from_kind(FU_PATH_KIND_LOCALSTATEDIR);
return g_build_filename(basedir, "lib", PACKAGE_NAME, NULL);
/* /var/lib/fwupd/quirks.d */
case FU_PATH_KIND_LOCALSTATEDIR_QUIRKS:
tmp = g_getenv("FWUPD_LOCALSTATEDIR_QUIRKS");
if (tmp != NULL)
return g_build_filename(tmp, NULL);
basedir = fu_path_from_kind(FU_PATH_KIND_LOCALSTATEDIR_PKG);
return g_build_filename(basedir, "quirks.d", NULL);
/* /var/lib/fwupd/metadata */
case FU_PATH_KIND_LOCALSTATEDIR_METADATA:
tmp = g_getenv("FWUPD_LOCALSTATEDIR_METADATA");
if (tmp != NULL)
return g_build_filename(tmp, NULL);
basedir = fu_path_from_kind(FU_PATH_KIND_LOCALSTATEDIR_PKG);
return g_build_filename(basedir, "metadata", NULL);
/* /var/lib/fwupd/remotes.d */
case FU_PATH_KIND_LOCALSTATEDIR_REMOTES:
tmp = g_getenv("FWUPD_LOCALSTATEDIR_REMOTES");
if (tmp != NULL)
return g_build_filename(tmp, NULL);
basedir = fu_path_from_kind(FU_PATH_KIND_LOCALSTATEDIR_PKG);
return g_build_filename(basedir, "remotes.d", NULL);
/* /var/cache/fwupd */
case FU_PATH_KIND_CACHEDIR_PKG:
tmp = g_getenv("CACHE_DIRECTORY");
if (tmp != NULL && g_file_test(tmp, G_FILE_TEST_EXISTS))
return g_build_filename(tmp, NULL);
basedir = fu_path_from_kind(FU_PATH_KIND_LOCALSTATEDIR);
return g_build_filename(basedir, "cache", PACKAGE_NAME, NULL);
/* /var/etc/fwupd */
case FU_PATH_KIND_LOCALCONFDIR_PKG:
tmp = g_getenv("LOCALCONF_DIRECTORY");
if (tmp != NULL && g_file_test(tmp, G_FILE_TEST_EXISTS))
return g_build_filename(tmp, NULL);
basedir = fu_path_from_kind(FU_PATH_KIND_LOCALSTATEDIR);
return g_build_filename(basedir, "etc", PACKAGE_NAME, NULL);
/* /run/lock */
case FU_PATH_KIND_LOCKDIR:
return g_strdup("/run/lock");
/* /sys/class/firmware-attributes */
case FU_PATH_KIND_SYSFSDIR_FW_ATTRIB:
tmp = g_getenv("FWUPD_SYSFSFWATTRIBDIR");
if (tmp != NULL)
return g_strdup(tmp);
return g_strdup("/sys/class/firmware-attributes");
case FU_PATH_KIND_OFFLINE_TRIGGER:
tmp = g_getenv("FWUPD_OFFLINE_TRIGGER");
if (tmp != NULL)
return g_strdup(tmp);
return g_strdup("/system-update");
case FU_PATH_KIND_POLKIT_ACTIONS:
#ifdef POLKIT_ACTIONDIR
return g_strdup(POLKIT_ACTIONDIR);
#else
return NULL;
#endif
/* C:\Program Files (x86)\fwupd\ */
case FU_PATH_KIND_WIN32_BASEDIR:
return fu_path_get_win32_basedir();
/* this shouldn't happen */
default:
g_warning("cannot build path for unknown kind %u", path_kind);
}
return NULL;
}
/**
* fu_path_fnmatch:
* @pattern: a glob pattern, e.g. `*foo*`
* @str: a string to match against the pattern, e.g. `bazfoobar`
*
* Matches a string against a glob pattern.
*
* Returns: %TRUE if the string matched
*
* Since: 1.8.2
**/
gboolean
fu_path_fnmatch(const gchar *pattern, const gchar *str)
{
g_return_val_if_fail(pattern != NULL, FALSE);
g_return_val_if_fail(str != NULL, FALSE);
return fu_path_fnmatch_impl(pattern, str);
}
static gint
fu_path_glob_sort_cb(gconstpointer a, gconstpointer b)
{
return g_strcmp0(*(const gchar **)a, *(const gchar **)b);
}
/**
* fu_path_glob:
* @directory: a directory path
* @pattern: a glob pattern, e.g. `*foo*`
* @error: (nullable): optional return location for an error
*
* Returns all the filenames that match a specific glob pattern.
* Any results are sorted. No matching files will set @error.
*
* Returns: (element-type utf8) (transfer container): matching files, or %NULL
*
* Since: 1.8.2
**/
GPtrArray *
fu_path_glob(const gchar *directory, const gchar *pattern, GError **error)
{
const gchar *basename;
g_autoptr(GDir) dir = NULL;
g_autoptr(GPtrArray) files = g_ptr_array_new_with_free_func(g_free);
g_return_val_if_fail(directory != NULL, NULL);
g_return_val_if_fail(pattern != NULL, NULL);
g_return_val_if_fail(error == NULL || *error == NULL, NULL);
dir = g_dir_open(directory, 0, error);
if (dir == NULL)
return NULL;
while ((basename = g_dir_read_name(dir)) != NULL) {
if (!fu_path_fnmatch(pattern, basename))
continue;
g_ptr_array_add(files, g_build_filename(directory, basename, NULL));
}
if (files->len == 0) {
g_set_error_literal(error,
G_IO_ERROR,
G_IO_ERROR_NOT_FOUND,
"no files matched pattern");
return NULL;
}
g_ptr_array_sort(files, fu_path_glob_sort_cb);
return g_steal_pointer(&files);
}

97
libfwupdplugin/fu-path.h Normal file
View File

@ -0,0 +1,97 @@
/*
* Copyright (C) 2017 Richard Hughes <richard@hughsie.com>
*
* SPDX-License-Identifier: LGPL-2.1+
*/
#pragma once
#include <gio/gio.h>
/**
* FuPathKind:
* @FU_PATH_KIND_CACHEDIR_PKG: The cache directory (IE /var/cache/fwupd)
* @FU_PATH_KIND_DATADIR_PKG: The non-volatile data store (IE /usr/share/fwupd)
* @FU_PATH_KIND_EFIAPPDIR: The location to store EFI apps before install (IE
* /usr/libexec/fwupd/efi)
* @FU_PATH_KIND_LOCALSTATEDIR: The local state directory (IE /var)
* @FU_PATH_KIND_LOCALSTATEDIR_PKG: The local state directory for the package (IE
* /var/lib/fwupd)
* @FU_PATH_KIND_PLUGINDIR_PKG: The location to look for plugins for package (IE
* /usr/lib/[triplet]/fwupd-plugins-3)
* @FU_PATH_KIND_SYSCONFDIR: The configuration location (IE /etc)
* @FU_PATH_KIND_SYSCONFDIR_PKG: The package configuration location (IE /etc/fwupd)
* @FU_PATH_KIND_SYSFSDIR_FW: The sysfs firmware location (IE /sys/firmware)
* @FU_PATH_KIND_SYSFSDIR_DRIVERS: The platform sysfs directory (IE /sys/bus/platform/drivers)
* @FU_PATH_KIND_SYSFSDIR_TPM: The TPM sysfs directory (IE /sys/class/tpm)
* @FU_PATH_KIND_PROCFS: The procfs location (IE /proc)
* @FU_PATH_KIND_POLKIT_ACTIONS: The directory for policy kit actions (IE
* /usr/share/polkit-1/actions/)
* @FU_PATH_KIND_OFFLINE_TRIGGER: The file for the offline trigger (IE /system-update)
* @FU_PATH_KIND_SYSFSDIR_SECURITY: The sysfs security location (IE /sys/kernel/security)
* @FU_PATH_KIND_ACPI_TABLES: The location of the ACPI tables
* @FU_PATH_KIND_LOCKDIR: The lock directory (IE /run/lock)
* @FU_PATH_KIND_SYSFSDIR_FW_ATTRIB The firmware attributes directory (IE
* /sys/class/firmware-attributes)
* @FU_PATH_KIND_FIRMWARE_SEARCH: The path to configure the kernel policy for runtime loading
*other than /lib/firmware (IE /sys/module/firmware_class/parameters/path)
* @FU_PATH_KIND_DATADIR_QUIRKS: The quirks data store (IE /usr/share/fwupd/quirks.d)
* @FU_PATH_KIND_LOCALSTATEDIR_QUIRKS: The local state directory for quirks (IE
* /var/lib/fwupd/quirks.d)
* @FU_PATH_KIND_LOCALSTATEDIR_METADATA: The local state directory for metadata (IE
* /var/lib/fwupd/metadata)
* @FU_PATH_KIND_LOCALSTATEDIR_REMOTES: The local state directory for remotes (IE
* /var/lib/fwupd/remotes.d)
* @FU_PATH_KIND_WIN32_BASEDIR: The root of the install directory on Windows
* @FU_PATH_KIND_LOCALCONFDIR_PKG: The package configuration override (IE /var/etc/fwupd)
*
* Path types to use when dynamically determining a path at runtime
**/
typedef enum {
FU_PATH_KIND_CACHEDIR_PKG,
FU_PATH_KIND_DATADIR_PKG,
FU_PATH_KIND_EFIAPPDIR,
FU_PATH_KIND_LOCALSTATEDIR,
FU_PATH_KIND_LOCALSTATEDIR_PKG,
FU_PATH_KIND_PLUGINDIR_PKG,
FU_PATH_KIND_SYSCONFDIR,
FU_PATH_KIND_SYSCONFDIR_PKG,
FU_PATH_KIND_SYSFSDIR_FW,
FU_PATH_KIND_SYSFSDIR_DRIVERS,
FU_PATH_KIND_SYSFSDIR_TPM,
FU_PATH_KIND_PROCFS,
FU_PATH_KIND_POLKIT_ACTIONS,
FU_PATH_KIND_OFFLINE_TRIGGER,
FU_PATH_KIND_SYSFSDIR_SECURITY,
FU_PATH_KIND_ACPI_TABLES,
FU_PATH_KIND_LOCKDIR,
FU_PATH_KIND_SYSFSDIR_FW_ATTRIB,
FU_PATH_KIND_FIRMWARE_SEARCH,
FU_PATH_KIND_DATADIR_QUIRKS,
FU_PATH_KIND_LOCALSTATEDIR_QUIRKS,
FU_PATH_KIND_LOCALSTATEDIR_METADATA,
FU_PATH_KIND_LOCALSTATEDIR_REMOTES,
FU_PATH_KIND_WIN32_BASEDIR,
FU_PATH_KIND_LOCALCONFDIR_PKG,
/*< private >*/
FU_PATH_KIND_LAST
} FuPathKind;
gchar *
fu_path_from_kind(FuPathKind path_kind);
GPtrArray *
fu_path_glob(const gchar *directory,
const gchar *pattern,
GError **error) G_GNUC_WARN_UNUSED_RESULT;
gboolean
fu_path_fnmatch(const gchar *pattern, const gchar *str);
gboolean
fu_path_rmtree(const gchar *directory, GError **error) G_GNUC_WARN_UNUSED_RESULT;
GPtrArray *
fu_path_get_files(const gchar *path, GError **error) G_GNUC_WARN_UNUSED_RESULT;
gboolean
fu_path_mkdir(const gchar *dirname, GError **error) G_GNUC_WARN_UNUSED_RESULT;
gboolean
fu_path_mkdir_parent(const gchar *filename, GError **error) G_GNUC_WARN_UNUSED_RESULT;
gchar *
fu_path_find_program(const gchar *basename, GError **error) G_GNUC_WARN_UNUSED_RESULT;

View File

@ -20,6 +20,7 @@
#include "fu-device-private.h"
#include "fu-kernel.h"
#include "fu-mutex.h"
#include "fu-path.h"
#include "fu-plugin-private.h"
#include "fu-string.h"
@ -428,7 +429,7 @@ fu_plugin_config_monitor_changed_cb(GFileMonitor *monitor,
static gchar *
fu_plugin_get_config_filename(FuPlugin *self)
{
g_autofree gchar *conf_dir = fu_common_get_path(FU_PATH_KIND_SYSCONFDIR_PKG);
g_autofree gchar *conf_dir = fu_path_from_kind(FU_PATH_KIND_SYSCONFDIR_PKG);
g_autofree gchar *conf_file = g_strdup_printf("%s.conf", fu_plugin_get_name(self));
return g_build_filename(conf_dir, conf_file, NULL);
}
@ -682,7 +683,7 @@ fu_plugin_device_write_firmware(FuPlugin *self,
g_prefix_error(error, "failed to backup old firmware: ");
return FALSE;
}
localstatedir = fu_common_get_path(FU_PATH_KIND_LOCALSTATEDIR_PKG);
localstatedir = fu_path_from_kind(FU_PATH_KIND_LOCALSTATEDIR_PKG);
fn = g_strdup_printf("%s.bin", fu_device_get_version(device));
path = g_build_filename(
localstatedir,

View File

@ -19,6 +19,7 @@
#include "fu-common.h"
#include "fu-mutex.h"
#include "fu-path.h"
#include "fu-quirks.h"
#include "fu-string.h"
@ -302,12 +303,12 @@ fu_quirks_check_silo(FuQuirks *self, GError **error)
/* system datadir */
builder = xb_builder_new();
datadir = fu_common_get_path(FU_PATH_KIND_DATADIR_QUIRKS);
datadir = fu_path_from_kind(FU_PATH_KIND_DATADIR_QUIRKS);
if (!fu_quirks_add_quirks_for_path(self, builder, datadir, error))
return FALSE;
/* something we can write when using Ostree */
localstatedir = fu_common_get_path(FU_PATH_KIND_LOCALSTATEDIR_QUIRKS);
localstatedir = fu_path_from_kind(FU_PATH_KIND_LOCALSTATEDIR_QUIRKS);
if (!fu_quirks_add_quirks_for_path(self, builder, localstatedir, error))
return FALSE;
@ -318,7 +319,7 @@ fu_quirks_check_silo(FuQuirks *self, GError **error)
if (file == NULL)
return FALSE;
} else {
g_autofree gchar *cachedirpkg = fu_common_get_path(FU_PATH_KIND_CACHEDIR_PKG);
g_autofree gchar *cachedirpkg = fu_path_from_kind(FU_PATH_KIND_CACHEDIR_PKG);
g_autofree gchar *xmlbfn = g_build_filename(cachedirpkg, "quirks.xmlb", NULL);
file = g_file_new_for_path(xmlbfn);
}

View File

@ -22,6 +22,7 @@
#include "fu-common.h"
#include "fu-kenv.h"
#include "fu-mem.h"
#include "fu-path.h"
#include "fu-smbios-private.h"
#include "fu-string.h"
@ -857,7 +858,7 @@ fu_smbios_setup(FuSmbios *self, GError **error)
g_return_val_if_fail(FU_IS_SMBIOS(self), FALSE);
g_return_val_if_fail(error == NULL || *error == NULL, FALSE);
sysfsfwdir = fu_common_get_path(FU_PATH_KIND_SYSFSDIR_FW);
sysfsfwdir = fu_path_from_kind(FU_PATH_KIND_SYSFSDIR_FW);
/* DMI */
path = g_build_filename(sysfsfwdir, "dmi", "tables", NULL);

View File

@ -45,6 +45,7 @@
#include <libfwupdplugin/fu-io-channel.h>
#include <libfwupdplugin/fu-kernel.h>
#include <libfwupdplugin/fu-mem.h>
#include <libfwupdplugin/fu-path.h>
#include <libfwupdplugin/fu-plugin-vfuncs.h>
#include <libfwupdplugin/fu-plugin.h>
#include <libfwupdplugin/fu-progress.h>

View File

@ -70,8 +70,6 @@ LIBFWUPDPLUGIN_0.9.3 {
LIBFWUPDPLUGIN_0.9.7 {
global:
fu_common_mkdir_parent;
fu_common_rmtree;
fu_device_get_metadata_boolean;
fu_device_get_metadata_integer;
fu_device_set_metadata_boolean;
@ -150,14 +148,12 @@ LIBFWUPDPLUGIN_1.0.5 {
LIBFWUPDPLUGIN_1.0.6 {
global:
fu_common_get_files_recursive;
fu_plugin_get_config_value;
local: *;
} LIBFWUPDPLUGIN_1.0.5;
LIBFWUPDPLUGIN_1.0.8 {
global:
fu_common_get_path;
fu_device_add_child;
fu_device_add_parent_guid;
fu_device_attach;
@ -209,7 +205,6 @@ LIBFWUPDPLUGIN_1.1.2 {
fu_chunk_array_new_from_bytes;
fu_chunk_new;
fu_chunk_to_string;
fu_common_find_program_in_path;
fu_device_add_counterpart_guid;
fu_device_close;
fu_device_ensure_id;
@ -382,7 +377,6 @@ LIBFWUPDPLUGIN_1.3.4 {
LIBFWUPDPLUGIN_1.3.5 {
global:
fu_common_fnmatch;
fu_device_incorporate_flag;
fu_plugin_is_open;
local: *;
@ -478,7 +472,6 @@ LIBFWUPDPLUGIN_1.4.7 {
LIBFWUPDPLUGIN_1.5.0 {
global:
fu_common_cpuid;
fu_common_filename_glob;
fu_device_bind_driver;
fu_device_dump_firmware;
fu_device_report_metadata_post;
@ -846,7 +839,6 @@ LIBFWUPDPLUGIN_1.7.1 {
fu_cfi_device_set_flash_id;
fu_cfi_device_set_size;
fu_common_check_full_disk_encryption;
fu_common_mkdir;
fu_device_add_string;
fu_device_get_internal_flags;
fu_device_set_internal_flags;
@ -996,6 +988,14 @@ LIBFWUPDPLUGIN_1.8.2 {
fu_memwrite_uint64;
fu_memwrite_uint64_safe;
fu_memwrite_uint8_safe;
fu_path_find_program;
fu_path_fnmatch;
fu_path_from_kind;
fu_path_get_files;
fu_path_glob;
fu_path_mkdir;
fu_path_mkdir_parent;
fu_path_rmtree;
fu_progress_add_step;
fu_progress_get_name;
fu_progress_set_name;

View File

@ -23,6 +23,7 @@ fwupdplugin_src = [
'fu-bytes.c', # fuzzing
'fu-kernel.c', # fuzzing
'fu-dump.c', # fuzzing
'fu-path.c', # fuzzing
'fu-common-cab.c',
'fu-common-guid.c',
'fu-common-version.c', # fuzzing
@ -101,6 +102,7 @@ fwupdplugin_headers = [
'fu-crc.h',
'fu-mem.h',
'fu-dump.h',
'fu-path.h',
'fu-bytes.h',
'fu-kernel.h',
'fu-common-cab.h',

View File

@ -31,7 +31,7 @@ fu_plugin_acpi_dmar_add_security_attrs(FuPlugin *plugin, FuSecurityAttrs *attrs)
fu_security_attrs_append(attrs, attr);
/* load DMAR table */
path = fu_common_get_path(FU_PATH_KIND_ACPI_TABLES);
path = fu_path_from_kind(FU_PATH_KIND_ACPI_TABLES);
fn = g_build_filename(path, "DMAR", NULL);
blob = fu_bytes_get_contents(fn, &error_local);
if (blob == NULL) {

View File

@ -27,7 +27,7 @@ fu_plugin_acpi_facp_add_security_attrs(FuPlugin *plugin, FuSecurityAttrs *attrs)
fu_security_attrs_append(attrs, attr);
/* load FACP table */
path = fu_common_get_path(FU_PATH_KIND_ACPI_TABLES);
path = fu_path_from_kind(FU_PATH_KIND_ACPI_TABLES);
fn = g_build_filename(path, "FACP", NULL);
blob = fu_bytes_get_contents(fn, &error_local);
if (blob == NULL) {

View File

@ -32,7 +32,7 @@ fu_plugin_acpi_ivrs_add_security_attrs(FuPlugin *plugin, FuSecurityAttrs *attrs)
fu_security_attrs_append(attrs, attr);
/* load IVRS table */
path = fu_common_get_path(FU_PATH_KIND_ACPI_TABLES);
path = fu_path_from_kind(FU_PATH_KIND_ACPI_TABLES);
fn = g_build_filename(path, "IVRS", NULL);
blob = fu_bytes_get_contents(fn, &error_local);
if (blob == NULL) {

View File

@ -31,7 +31,7 @@ fu_plugin_acpi_phat_coldplug(FuPlugin *plugin, FuProgress *progress, GError **er
g_autoptr(FuFirmware) phat = fu_acpi_phat_new();
g_autoptr(GBytes) blob = NULL;
path = fu_common_get_path(FU_PATH_KIND_ACPI_TABLES);
path = fu_path_from_kind(FU_PATH_KIND_ACPI_TABLES);
fn = g_build_filename(path, "PHAT", NULL);
blob = fu_bytes_get_contents(fn, error);
if (blob == NULL)

View File

@ -284,7 +284,7 @@ fu_ata_device_parse_vendor_name(FuAtaDevice *self, const gchar *name)
/* find match */
for (guint i = 0; map_name[i].prefix != NULL; i++) {
if (fu_common_fnmatch(map_name[i].prefix, name_up)) {
if (fu_path_fnmatch(map_name[i].prefix, name_up)) {
name += strlen(map_name[i].prefix) - 1;
fu_device_set_vendor(FU_DEVICE(self), map_name[i].name);
vendor_id = g_strdup_printf("ATA:0x%X", map_name[i].vid);
@ -295,7 +295,7 @@ fu_ata_device_parse_vendor_name(FuAtaDevice *self, const gchar *name)
/* fall back to fuzzy match */
if (vendor_id == NULL) {
for (guint i = 0; map_fuzzy[i].prefix != NULL; i++) {
if (fu_common_fnmatch(map_fuzzy[i].prefix, name_up)) {
if (fu_path_fnmatch(map_fuzzy[i].prefix, name_up)) {
fu_device_set_vendor(FU_DEVICE(self), map_fuzzy[i].name);
vendor_id = g_strdup_printf("ATA:0x%X", map_fuzzy[i].vid);
break;
@ -308,7 +308,7 @@ fu_ata_device_parse_vendor_name(FuAtaDevice *self, const gchar *name)
g_autofree gchar *version_up =
g_ascii_strup(fu_device_get_version(FU_DEVICE(self)), -1);
for (guint i = 0; map_version[i].prefix != NULL; i++) {
if (fu_common_fnmatch(map_version[i].prefix, version_up)) {
if (fu_path_fnmatch(map_version[i].prefix, version_up)) {
fu_device_set_vendor(FU_DEVICE(self), map_version[i].name);
vendor_id = g_strdup_printf("ATA:0x%X", map_version[i].vid);
break;

View File

@ -83,7 +83,7 @@ fu_bcm57xx_device_probe(FuDevice *device, GError **error)
g_debug("waiting for net devices to appear");
g_usleep(50 * 1000);
}
ifaces = fu_common_filename_glob(fn, "en*", NULL);
ifaces = fu_path_glob(fn, "en*", NULL);
if (ifaces == NULL || ifaces->len == 0) {
fu_device_add_child(FU_DEVICE(self), FU_DEVICE(self->recovery));
} else {

View File

@ -40,7 +40,7 @@ fu_plugin_bios_coldplug(FuPlugin *plugin, FuProgress *progress, GError **error)
#endif
/* get the directory of ESRT entries */
sysfsfwdir = fu_common_get_path(FU_PATH_KIND_SYSFSDIR_FW);
sysfsfwdir = fu_path_from_kind(FU_PATH_KIND_SYSFSDIR_FW);
esrt_path = g_build_filename(sysfsfwdir, "efi", "esrt", NULL);
if (!g_file_test(esrt_path, G_FILE_TEST_IS_DIR)) {
fu_plugin_add_flag(plugin, FWUPD_PLUGIN_FLAG_CAPSULES_UNSUPPORTED);

View File

@ -101,7 +101,7 @@ fu_plugin_dell_esrt_startup(FuPlugin *plugin, FuProgress *progress, GError **err
g_autofree gchar *esrtdir = NULL;
/* already exists */
sysfsfwdir = fu_common_get_path(FU_PATH_KIND_SYSFSDIR_FW);
sysfsfwdir = fu_path_from_kind(FU_PATH_KIND_SYSFSDIR_FW);
esrtdir = g_build_filename(sysfsfwdir, "efi", "esrt", NULL);
if (g_file_test(esrtdir, G_FILE_TEST_EXISTS)) {
g_set_error_literal(error,

View File

@ -935,7 +935,7 @@ fu_plugin_dell_startup(FuPlugin *plugin, FuProgress *progress, GError **error)
*
* Once unlocked, that will enable flashing capsules here too.
*/
sysfsfwdir = fu_common_get_path(FU_PATH_KIND_SYSFSDIR_FW);
sysfsfwdir = fu_path_from_kind(FU_PATH_KIND_SYSFSDIR_FW);
esrtdir = g_build_filename(sysfsfwdir, "efi", "esrt", NULL);
if (g_file_test(esrtdir, G_FILE_TEST_EXISTS))
data->capsule_supported = TRUE;

View File

@ -569,7 +569,7 @@ main(int argc, char **argv)
(void)g_setenv("FWUPD_SYSFSFWDIR", testdatadir, TRUE);
/* change behavior */
sysfsdir = fu_common_get_path(FU_PATH_KIND_SYSFSDIR_FW);
sysfsdir = fu_path_from_kind(FU_PATH_KIND_SYSFSDIR_FW);
(void)g_setenv("FWUPD_UEFI_ESP_PATH", sysfsdir, TRUE);
(void)g_setenv("FWUPD_UEFI_TEST", "1", TRUE);
(void)g_setenv("FWUPD_DELL_FAKE_SMBIOS", "1", FALSE);

View File

@ -30,7 +30,7 @@ fu_test_compare_lines(const gchar *txt1, const gchar *txt2, GError **error)
g_autofree gchar *output = NULL;
if (g_strcmp0(txt1, txt2) == 0)
return TRUE;
if (fu_common_fnmatch(txt2, txt1))
if (fu_path_fnmatch(txt2, txt1))
return TRUE;
if (!g_file_set_contents("/tmp/a", txt1, -1, error))
return FALSE;

View File

@ -166,9 +166,9 @@ fu_flashrom_device_prepare(FuDevice *device,
/* if the original firmware doesn't exist, grab it now */
basename = g_strdup_printf("flashrom-%s.bin", fu_device_get_id(device));
localstatedir = fu_common_get_path(FU_PATH_KIND_LOCALSTATEDIR_PKG);
localstatedir = fu_path_from_kind(FU_PATH_KIND_LOCALSTATEDIR_PKG);
firmware_orig = g_build_filename(localstatedir, "builder", basename, NULL);
if (!fu_common_mkdir_parent(firmware_orig, error))
if (!fu_path_mkdir_parent(firmware_orig, error))
return FALSE;
if (!g_file_test(firmware_orig, G_FILE_TEST_EXISTS)) {
g_autoptr(GBytes) buf = NULL;

View File

@ -15,7 +15,7 @@ fu_plugin_lenovo_thinklmi_startup(FuPlugin *plugin, FuProgress *progress, GError
g_autofree gchar *thinklmidir = NULL;
/* already exists */
sysfsfwdir = fu_common_get_path(FU_PATH_KIND_SYSFSDIR_FW_ATTRIB);
sysfsfwdir = fu_path_from_kind(FU_PATH_KIND_SYSFSDIR_FW_ATTRIB);
thinklmidir = g_build_filename(sysfsfwdir, "thinklmi", NULL);
if (!g_file_test(thinklmidir, G_FILE_TEST_EXISTS)) {
g_set_error_literal(error,
@ -34,7 +34,7 @@ fu_plugin_lenovo_firmware_pending_change(gboolean *result, GError **error)
g_autofree gchar *buf = NULL;
g_autofree gchar *sysfsfwdir = NULL;
g_autofree gchar *pending = NULL;
sysfsfwdir = fu_common_get_path(FU_PATH_KIND_SYSFSDIR_FW_ATTRIB);
sysfsfwdir = fu_path_from_kind(FU_PATH_KIND_SYSFSDIR_FW_ATTRIB);
pending = g_build_filename(sysfsfwdir, "thinklmi", "attributes", "pending_reboot", NULL);
/* we can't check, assume not locked */
@ -57,7 +57,7 @@ fu_plugin_lenovo_firmware_locked(gboolean *locked, GError **error)
g_autofree gchar *sysfsfwdir = NULL;
g_autofree gchar *thinklmi = NULL;
sysfsfwdir = fu_common_get_path(FU_PATH_KIND_SYSFSDIR_FW_ATTRIB);
sysfsfwdir = fu_path_from_kind(FU_PATH_KIND_SYSFSDIR_FW_ATTRIB);
thinklmi = g_build_filename(sysfsfwdir,
"thinklmi",
"attributes",

View File

@ -154,7 +154,7 @@ main(int argc, char **argv)
(void)g_setenv("FWUPD_SYSFSFWDIR", testdatadir, TRUE);
/* change behavior of UEFI plugin for test mode */
sysfsdir = fu_common_get_path(FU_PATH_KIND_SYSFSDIR_FW);
sysfsdir = fu_path_from_kind(FU_PATH_KIND_SYSFSDIR_FW);
(void)g_setenv("FWUPD_UEFI_ESP_PATH", sysfsdir, TRUE);
(void)g_setenv("FWUPD_UEFI_TEST", "1", TRUE);

View File

@ -100,7 +100,7 @@ fu_plugin_linux_lockdown_startup(FuPlugin *plugin, FuProgress *progress, GError
g_autofree gchar *path = NULL;
g_autofree gchar *fn = NULL;
path = fu_common_get_path(FU_PATH_KIND_SYSFSDIR_SECURITY);
path = fu_path_from_kind(FU_PATH_KIND_SYSFSDIR_SECURITY);
fn = g_build_filename(path, "lockdown", NULL);
if (!g_file_test(fn, G_FILE_TEST_EXISTS)) {
g_set_error_literal(error,

View File

@ -52,7 +52,7 @@ fu_plugin_linux_swap_startup(FuPlugin *plugin, FuProgress *progress, GError **er
g_autofree gchar *fn = NULL;
g_autofree gchar *procfs = NULL;
procfs = fu_common_get_path(FU_PATH_KIND_PROCFS);
procfs = fu_path_from_kind(FU_PATH_KIND_PROCFS);
fn = g_build_filename(procfs, "swaps", NULL);
if (!g_file_test(fn, G_FILE_TEST_EXISTS)) {
g_set_error_literal(error,

View File

@ -50,7 +50,7 @@ fu_plugin_linux_tainted_startup(FuPlugin *plugin, FuProgress *progress, GError *
g_autofree gchar *fn = NULL;
g_autofree gchar *procfs = NULL;
procfs = fu_common_get_path(FU_PATH_KIND_PROCFS);
procfs = fu_path_from_kind(FU_PATH_KIND_PROCFS);
fn = g_build_filename(procfs, "sys", "kernel", "tainted", NULL);
data->file = g_file_new_for_path(fn);
data->monitor = g_file_monitor(data->file, G_FILE_MONITOR_NONE, NULL, error);

View File

@ -1433,7 +1433,7 @@ fu_mm_setup_firmware_dir(FuMmDevice *self, GError **error)
g_autofree gchar *mm_fw_dir = NULL;
/* create a directory to store firmware files for modem-manager plugin */
cachedir = fu_common_get_path(FU_PATH_KIND_CACHEDIR_PKG);
cachedir = fu_path_from_kind(FU_PATH_KIND_CACHEDIR_PKG);
mm_fw_dir = g_build_filename(cachedir, "modem-manager", "firmware", NULL);
if (g_mkdir_with_parents(mm_fw_dir, 0700) == -1) {
g_set_error(error,
@ -1460,7 +1460,7 @@ fu_mm_copy_firehose_prog(FuMmDevice *self, GBytes *prog, GError **error)
g_autofree gchar *firehose_file_path = NULL;
qcom_fw_dir = g_build_filename(self->firmware_path, "qcom", NULL);
if (!fu_common_mkdir_parent(qcom_fw_dir, error))
if (!fu_path_mkdir_parent(qcom_fw_dir, error))
return FALSE;
firehose_file_path = g_build_filename(qcom_fw_dir, "prog_firehose_sdx24.mbn", NULL);

View File

@ -26,7 +26,7 @@ fu_plugin_powerd_create_suspend_file(GError **error)
g_autofree gchar *inhibitsuspend_filename = NULL;
g_autofree gchar *getpid_str = NULL;
lockdir = fu_common_get_path(FU_PATH_KIND_LOCKDIR);
lockdir = fu_path_from_kind(FU_PATH_KIND_LOCKDIR);
inhibitsuspend_filename = g_build_filename(lockdir, "power_override", "fwupd.lock", NULL);
getpid_str = g_strdup_printf("%d", getpid());
if (!g_file_set_contents(inhibitsuspend_filename, getpid_str, -1, error)) {
@ -43,7 +43,7 @@ fu_plugin_powerd_delete_suspend_file(GError **error)
g_autofree gchar *lockdir = NULL;
g_autoptr(GFile) inhibitsuspend_file = NULL;
lockdir = fu_common_get_path(FU_PATH_KIND_LOCKDIR);
lockdir = fu_path_from_kind(FU_PATH_KIND_LOCKDIR);
inhibitsuspend_file =
g_file_new_build_filename(lockdir, "power_override", "fwupd.lock", NULL);
if (!g_file_delete(inhibitsuspend_file, NULL, &local_error) &&

View File

@ -49,7 +49,7 @@ fu_test_self_init(FuTest *self)
/* running as an installed test */
if (fu_test_is_installed_test()) {
g_autofree gchar *plugindir = fu_common_get_path(FU_PATH_KIND_PLUGINDIR_PKG);
g_autofree gchar *plugindir = fu_path_from_kind(FU_PATH_KIND_PLUGINDIR_PKG);
pluginfn =
g_build_filename(plugindir, "libfu_plugin_redfish." G_MODULE_SUFFIX, NULL);
} else {

View File

@ -344,7 +344,7 @@ fu_plugin_tpm_startup(FuPlugin *plugin, FuProgress *progress, GError **error)
g_autofree gchar *fn_pcrs = NULL;
/* look for TPM v1.2 */
sysfstpmdir = fu_common_get_path(FU_PATH_KIND_SYSFSDIR_TPM);
sysfstpmdir = fu_path_from_kind(FU_PATH_KIND_SYSFSDIR_TPM);
fn_pcrs = g_build_filename(sysfstpmdir, "tpm0", "pcrs", NULL);
if (g_file_test(fn_pcrs, G_FILE_TEST_EXISTS) && g_getenv("FWUPD_FORCE_TPM2") == NULL) {
data->tpm_device = fu_tpm_v1_device_new(fu_plugin_get_context(plugin));

View File

@ -199,7 +199,7 @@ fu_plugin_uefi_capsule_get_splash_data(guint width, guint height, GError **error
g_autoptr(GBytes) blob_archive = NULL;
/* load archive */
datadir_pkg = fu_common_get_path(FU_PATH_KIND_DATADIR_PKG);
datadir_pkg = fu_path_from_kind(FU_PATH_KIND_DATADIR_PKG);
filename_archive = g_build_filename(datadir_pkg, "uefi-capsule-ux.tar.xz", NULL);
blob_archive = fu_bytes_get_contents(filename_archive, error);
if (blob_archive == NULL)
@ -276,7 +276,7 @@ fu_plugin_uefi_capsule_write_splash_data(FuPlugin *plugin,
directory = fu_uefi_get_esp_path_for_os(device, esp_path);
basename = g_strdup_printf("fwupd-%s.cap", FU_EFIVAR_GUID_UX_CAPSULE);
fn = g_build_filename(directory, "fw", basename, NULL);
if (!fu_common_mkdir_parent(fn, error))
if (!fu_path_mkdir_parent(fn, error))
return FALSE;
ofile = g_file_new_for_path(fn);
ostream =

View File

@ -89,7 +89,7 @@ fu_uefi_backend_linux_device_new(FuUefiBackendLinux *self, const gchar *path)
static gboolean
fu_uefi_backend_linux_check_efivarfs(FuUefiBackendLinux *self, GError **error)
{
g_autofree gchar *sysfsfwdir = fu_common_get_path(FU_PATH_KIND_SYSFSDIR_FW);
g_autofree gchar *sysfsfwdir = fu_path_from_kind(FU_PATH_KIND_SYSFSDIR_FW);
g_autofree gchar *sysfsefivardir = g_build_filename(sysfsfwdir, "efi", "efivars", NULL);
g_autoptr(GUnixMountEntry) mount = g_unix_mount_at(sysfsefivardir, NULL);
@ -138,7 +138,7 @@ fu_uefi_backend_linux_coldplug(FuBackend *backend, FuProgress *progress, GError
return FALSE;
/* get the directory of ESRT entries */
sysfsfwdir = fu_common_get_path(FU_PATH_KIND_SYSFSDIR_FW);
sysfsfwdir = fu_path_from_kind(FU_PATH_KIND_SYSFSDIR_FW);
esrt_path = g_build_filename(sysfsfwdir, "efi", "esrt", NULL);
esrt_entries = g_build_filename(esrt_path, "entries", NULL);
dir = g_dir_open(esrt_entries, 0, error);
@ -210,7 +210,7 @@ fu_uefi_backend_linux_setup(FuBackend *backend, FuProgress *progress, GError **e
/* check SMBIOS for 'UEFI Specification is supported' */
if (!fu_uefi_backend_linux_check_smbios_enabled(fu_backend_get_context(backend),
&error_local)) {
g_autofree gchar *fw = fu_common_get_path(FU_PATH_KIND_SYSFSDIR_FW);
g_autofree gchar *fw = fu_path_from_kind(FU_PATH_KIND_SYSFSDIR_FW);
g_autofree gchar *fn = g_build_filename(fw, "efi", NULL);
if (g_file_test(fn, G_FILE_TEST_EXISTS)) {
g_warning("SMBIOS BIOS Characteristics Extension Byte 2 is invalid -- "

View File

@ -34,7 +34,7 @@ fu_uefi_bgrt_setup(FuUefiBgrt *self, GError **error)
g_return_val_if_fail(FU_IS_UEFI_BGRT(self), FALSE);
sysfsfwdir = fu_common_get_path(FU_PATH_KIND_SYSFSDIR_FW);
sysfsfwdir = fu_path_from_kind(FU_PATH_KIND_SYSFSDIR_FW);
bgrtdir = g_build_filename(sysfsfwdir, "acpi", "bgrt", NULL);
if (!g_file_test(bgrtdir, G_FILE_TEST_EXISTS)) {
g_set_error_literal(error,

View File

@ -172,7 +172,7 @@ fu_uefi_cod_device_write_firmware(FuDevice *device,
return FALSE;
basename = g_strdup_printf("fwupd-%s.cap", fu_uefi_device_get_guid(self));
cod_path = g_build_filename(esp_path, "EFI", "UpdateCapsule", basename, NULL);
if (!fu_common_mkdir_parent(cod_path, error))
if (!fu_path_mkdir_parent(cod_path, error))
return FALSE;
if (!fu_bytes_set_contents(cod_path, fw, error))
return FALSE;

View File

@ -32,7 +32,7 @@ fu_uefi_bootmgr_get_suffix(GError **error)
#endif
{0, NULL}
};
g_autofree gchar *sysfsfwdir = fu_common_get_path(FU_PATH_KIND_SYSFSDIR_FW);
g_autofree gchar *sysfsfwdir = fu_path_from_kind(FU_PATH_KIND_SYSFSDIR_FW);
g_autofree gchar *sysfsefidir = g_build_filename(sysfsfwdir, "efi", NULL);
firmware_bits = fu_uefi_read_file_as_uint64(sysfsefidir, "fw_platform_size");
if (firmware_bits == 0) {
@ -98,7 +98,7 @@ fu_uefi_get_built_app_path(GError **error)
suffix = fu_uefi_bootmgr_get_suffix(error);
if (suffix == NULL)
return NULL;
prefix = fu_common_get_path(FU_PATH_KIND_EFIAPPDIR);
prefix = fu_path_from_kind(FU_PATH_KIND_EFIAPPDIR);
source_path = g_strdup_printf("%s/fwupd%s.efi", prefix, suffix);
source_path_signed = g_strdup_printf("%s.signed", source_path);
@ -140,7 +140,7 @@ fu_uefi_get_framebuffer_size(guint32 *width, guint32 *height, GError **error)
g_autofree gchar *sysfsdriverdir = NULL;
g_autofree gchar *fbdir = NULL;
sysfsdriverdir = fu_common_get_path(FU_PATH_KIND_SYSFSDIR_DRIVERS);
sysfsdriverdir = fu_path_from_kind(FU_PATH_KIND_SYSFSDIR_DRIVERS);
fbdir = g_build_filename(sysfsdriverdir, "efi-framebuffer", "efi-framebuffer.0", NULL);
if (!g_file_test(fbdir, G_FILE_TEST_EXISTS)) {
g_set_error_literal(error,

View File

@ -536,13 +536,13 @@ fu_uefi_device_cleanup_esp(FuDevice *device, GError **error)
return TRUE;
/* delete any files matching the glob in the ESP */
files = fu_common_get_files_recursive(esp_path, error);
files = fu_path_get_files(esp_path, error);
if (files == NULL)
return FALSE;
pattern = g_build_filename(esp_path, "EFI/*/fw/fwupd*.cap", NULL);
for (guint i = 0; i < files->len; i++) {
const gchar *fn = g_ptr_array_index(files, i);
if (fu_common_fnmatch(pattern, fn)) {
if (fu_path_fnmatch(pattern, fn)) {
g_autoptr(GFile) file = g_file_new_for_path(fn);
g_debug("deleting %s", fn);
if (!g_file_delete(file, NULL, error))

View File

@ -29,7 +29,7 @@ fu_uefi_grub_device_mkconfig(FuDevice *device,
g_autofree gchar *grub_mkconfig = NULL;
g_autofree gchar *grub_reboot = NULL;
g_autofree gchar *grub_target = NULL;
g_autofree gchar *localstatedir = fu_common_get_path(FU_PATH_KIND_LOCALSTATEDIR_PKG);
g_autofree gchar *localstatedir = fu_path_from_kind(FU_PATH_KIND_LOCALSTATEDIR_PKG);
g_autofree gchar *output = NULL;
g_autoptr(GString) str = g_string_new(NULL);
@ -45,9 +45,9 @@ fu_uefi_grub_device_mkconfig(FuDevice *device,
}
/* find grub-mkconfig */
grub_mkconfig = fu_common_find_program_in_path("grub-mkconfig", NULL);
grub_mkconfig = fu_path_find_program("grub-mkconfig", NULL);
if (grub_mkconfig == NULL)
grub_mkconfig = fu_common_find_program_in_path("grub2-mkconfig", NULL);
grub_mkconfig = fu_path_find_program("grub2-mkconfig", NULL);
if (grub_mkconfig == NULL) {
g_set_error_literal(error,
G_IO_ERROR,
@ -57,9 +57,9 @@ fu_uefi_grub_device_mkconfig(FuDevice *device,
}
/* find grub-reboot */
grub_reboot = fu_common_find_program_in_path("grub-reboot", NULL);
grub_reboot = fu_path_find_program("grub-reboot", NULL);
if (grub_reboot == NULL)
grub_reboot = fu_common_find_program_in_path("grub2-reboot", NULL);
grub_reboot = fu_path_find_program("grub2-reboot", NULL);
if (grub_reboot == NULL) {
g_set_error_literal(error,
G_IO_ERROR,
@ -143,7 +143,7 @@ fu_uefi_grub_device_write_firmware(FuDevice *device,
directory = fu_uefi_get_esp_path_for_os(device, esp_path);
basename = g_strdup_printf("fwupd-%s.cap", fw_class);
fn = g_build_filename(directory, "fw", basename, NULL);
if (!fu_common_mkdir_parent(fn, error))
if (!fu_path_mkdir_parent(fn, error))
return FALSE;
fixed_fw = fu_uefi_device_fixup_firmware(self, fw, error);
if (fixed_fw == NULL)

View File

@ -81,7 +81,7 @@ fu_uefi_nvram_device_write_firmware(FuDevice *device,
directory = fu_uefi_get_esp_path_for_os(device, esp_path);
basename = g_strdup_printf("fwupd-%s.cap", fw_class);
fn = g_build_filename(directory, "fw", basename, NULL);
if (!fu_common_mkdir_parent(fn, error))
if (!fu_path_mkdir_parent(fn, error))
return FALSE;
fixed_fw = fu_uefi_device_fixup_firmware(self, fw, error);
if (fixed_fw == NULL)

View File

@ -43,7 +43,7 @@ fu_uefi_dbx_signature_list_validate_volume(FuEfiSignatureList *siglist,
esp_path = fu_volume_get_mount_point(esp);
if (esp_path == NULL)
return TRUE;
files = fu_common_get_files_recursive(esp_path, error);
files = fu_path_get_files(esp_path, error);
if (files == NULL)
return FALSE;

View File

@ -15,6 +15,7 @@
#include "fu-bytes.h"
#include "fu-common.h"
#include "fu-config.h"
#include "fu-path.h"
#include "fu-string.h"
enum { SIGNAL_CHANGED, SIGNAL_LAST };
@ -305,8 +306,8 @@ fu_config_set_key_value(FuConfig *self, const gchar *key, const gchar *value, GE
gboolean
fu_config_load(FuConfig *self, GError **error)
{
g_autofree gchar *configdir_mut = fu_common_get_path(FU_PATH_KIND_LOCALCONFDIR_PKG);
g_autofree gchar *configdir = fu_common_get_path(FU_PATH_KIND_SYSCONFDIR_PKG);
g_autofree gchar *configdir_mut = fu_path_from_kind(FU_PATH_KIND_LOCALCONFDIR_PKG);
g_autofree gchar *configdir = fu_path_from_kind(FU_PATH_KIND_SYSCONFDIR_PKG);
g_return_val_if_fail(FU_IS_CONFIG(self), FALSE);
g_return_val_if_fail(self->filenames->len == 0, FALSE);

View File

@ -12,6 +12,7 @@
#include "fu-engine-helper.h"
#include "fu-engine.h"
#include "fu-path.h"
static FwupdRelease *
fu_engine_get_release_with_tag(FuEngine *self,
@ -94,12 +95,12 @@ fu_engine_update_motd(FuEngine *self, GError **error)
target = g_build_filename(g_getenv("RUNTIME_DIRECTORY"), MOTD_FILE, NULL);
/* otherwise use the cache directory */
} else {
g_autofree gchar *directory = fu_common_get_path(FU_PATH_KIND_CACHEDIR_PKG);
g_autofree gchar *directory = fu_path_from_kind(FU_PATH_KIND_CACHEDIR_PKG);
target = g_build_filename(directory, MOTD_DIR, MOTD_FILE, NULL);
}
/* create the directory and file, even if zero devices; we want an empty file then */
if (!fu_common_mkdir_parent(target, error))
if (!fu_path_mkdir_parent(target, error))
return FALSE;
/* nag about syncing or updating, but never both */

View File

@ -62,6 +62,7 @@
#include "fu-kenv.h"
#include "fu-keyring-utils.h"
#include "fu-mutex.h"
#include "fu-path.h"
#include "fu-plugin-list.h"
#include "fu-plugin-private.h"
#include "fu-plugin.h"
@ -868,9 +869,9 @@ fu_engine_verify_update(FuEngine *self,
xb_builder_import_node(builder, component);
/* save silo */
localstatedir = fu_common_get_path(FU_PATH_KIND_LOCALSTATEDIR_PKG);
localstatedir = fu_path_from_kind(FU_PATH_KIND_LOCALSTATEDIR_PKG);
fn = g_strdup_printf("%s/verify/%s.xml", localstatedir, device_id);
if (!fu_common_mkdir_parent(fn, error))
if (!fu_path_mkdir_parent(fn, error))
return FALSE;
file = g_file_new_for_path(fn);
silo = xb_builder_compile(builder, XB_BUILDER_COMPILE_FLAG_NONE, NULL, error);
@ -946,7 +947,7 @@ fu_engine_verify_from_local_metadata(FuEngine *self, FuDevice *device, GError **
g_autoptr(XbNode) release = NULL;
g_autoptr(XbSilo) silo = NULL;
localstatedir = fu_common_get_path(FU_PATH_KIND_LOCALSTATEDIR_PKG);
localstatedir = fu_path_from_kind(FU_PATH_KIND_LOCALSTATEDIR_PKG);
fn = g_strdup_printf("%s/verify/%s.xml", localstatedir, fu_device_get_id(device));
file = g_file_new_for_path(fn);
if (!g_file_query_exists(file, NULL)) {
@ -1207,7 +1208,7 @@ fu_engine_require_vercmp(XbNode *req, const gchar *version, FwupdVersionFormat f
rc = fu_common_vercmp_full(version, version_req, fmt);
ret = rc >= 0;
} else if (g_strcmp0(tmp, "glob") == 0) {
ret = fu_common_fnmatch(version_req, version);
ret = fu_path_fnmatch(version_req, version);
} else if (g_strcmp0(tmp, "regex") == 0) {
ret = g_regex_match_simple(version_req, version, 0, 0);
} else {
@ -1655,7 +1656,7 @@ fu_engine_check_trust(FuEngine *self, FuRelease *release, GError **error)
{
if (fu_config_get_only_trusted(self->config) &&
(fu_release_get_trust_flags(release) & FWUPD_TRUST_FLAG_PAYLOAD) == 0) {
g_autofree gchar *sysconfdir = fu_common_get_path(FU_PATH_KIND_SYSCONFDIR_PKG);
g_autofree gchar *sysconfdir = fu_path_from_kind(FU_PATH_KIND_SYSCONFDIR_PKG);
g_autofree gchar *fn = g_build_filename(sysconfdir, "daemon.conf", NULL);
g_set_error(error,
FWUPD_ERROR,
@ -2232,8 +2233,8 @@ fu_engine_offline_setup(GError **error)
#ifdef HAVE_GIO_UNIX
gint rc;
g_autofree gchar *filename = NULL;
g_autofree gchar *symlink_target = fu_common_get_path(FU_PATH_KIND_LOCALSTATEDIR_PKG);
g_autofree gchar *trigger = fu_common_get_path(FU_PATH_KIND_OFFLINE_TRIGGER);
g_autofree gchar *symlink_target = fu_path_from_kind(FU_PATH_KIND_LOCALSTATEDIR_PKG);
g_autofree gchar *trigger = fu_path_from_kind(FU_PATH_KIND_OFFLINE_TRIGGER);
g_return_val_if_fail(error == NULL || *error == NULL, FALSE);
@ -2269,7 +2270,7 @@ fu_engine_offline_setup(GError **error)
static gboolean
fu_engine_offline_invalidate(GError **error)
{
g_autofree gchar *trigger = fu_common_get_path(FU_PATH_KIND_OFFLINE_TRIGGER);
g_autofree gchar *trigger = fu_path_from_kind(FU_PATH_KIND_OFFLINE_TRIGGER);
g_autoptr(GError) error_local = NULL;
g_autoptr(GFile) file1 = NULL;
@ -2345,7 +2346,7 @@ fu_engine_schedule_update(FuEngine *self,
}
/* create directory */
dirname = fu_common_get_path(FU_PATH_KIND_LOCALSTATEDIR_PKG);
dirname = fu_path_from_kind(FU_PATH_KIND_LOCALSTATEDIR_PKG);
file = g_file_new_for_path(dirname);
if (!g_file_query_exists(file, NULL)) {
if (!g_file_make_directory_with_parents(file, NULL, error))
@ -2670,7 +2671,7 @@ fu_engine_device_check_power(FuEngine *self,
GError **error)
{
if (flags & FWUPD_INSTALL_FLAG_IGNORE_POWER) {
g_autofree gchar *configdir = fu_common_get_path(FU_PATH_KIND_SYSCONFDIR_PKG);
g_autofree gchar *configdir = fu_path_from_kind(FU_PATH_KIND_SYSCONFDIR_PKG);
g_autofree gchar *configfile = g_build_filename(configdir, "daemon.conf", NULL);
g_warning("Ignoring deprecated flag provided by client "
"'FWUPD_INSTALL_FLAG_IGNORE_POWER'. To ignore power levels, modify %s",
@ -3369,7 +3370,7 @@ fu_engine_create_metadata(FuEngine *self, XbBuilder *builder, FwupdRemote *remot
/* find all files in directory */
path = fwupd_remote_get_filename_cache(remote);
files = fu_common_get_files_recursive(path, error);
files = fu_path_get_files(path, error);
if (files == NULL)
return FALSE;
@ -3705,12 +3706,12 @@ fu_engine_load_metadata_store_local(FuEngine *self,
FuPathKind path_kind,
GError **error)
{
g_autofree gchar *fn = fu_common_get_path(path_kind);
g_autofree gchar *fn = fu_path_from_kind(path_kind);
g_autofree gchar *metadata_path = g_build_filename(fn, "local.d", NULL);
g_autoptr(GError) error_local = NULL;
g_autoptr(GPtrArray) metadata_fns = NULL;
metadata_fns = fu_common_filename_glob(metadata_path, "*.xml", &error_local);
metadata_fns = fu_path_glob(metadata_path, "*.xml", &error_local);
if (metadata_fns == NULL) {
g_debug("ignoring: %s", error_local->message);
return TRUE;
@ -3841,7 +3842,7 @@ fu_engine_load_metadata_store(FuEngine *self, FuEngineLoadFlags flags, GError **
if (xmlb == NULL)
return FALSE;
} else {
g_autofree gchar *cachedirpkg = fu_common_get_path(FU_PATH_KIND_CACHEDIR_PKG);
g_autofree gchar *cachedirpkg = fu_path_from_kind(FU_PATH_KIND_CACHEDIR_PKG);
g_autofree gchar *xmlbfn = g_build_filename(cachedirpkg, "metadata.xmlb", NULL);
xmlb = g_file_new_for_path(xmlbfn);
}
@ -6005,7 +6006,7 @@ fu_engine_is_plugin_name_enabled(FuEngine *self, const gchar *name)
return TRUE;
for (guint i = 0; i < self->plugin_filter->len; i++) {
const gchar *name_tmp = g_ptr_array_index(self->plugin_filter, i);
if (fu_common_fnmatch(name_tmp, name))
if (fu_path_fnmatch(name_tmp, name))
return TRUE;
}
return FALSE;
@ -6352,7 +6353,7 @@ fu_engine_load_plugins(FuEngine *self, FuProgress *progress, GError **error)
fu_progress_add_step(progress, FWUPD_STATUS_LOADING, 87, "load");
/* search */
plugin_path = fu_common_get_path(FU_PATH_KIND_PLUGINDIR_PKG);
plugin_path = fu_path_from_kind(FU_PATH_KIND_PLUGINDIR_PKG);
dir = g_dir_open(plugin_path, 0, error);
if (dir == NULL)
return FALSE;
@ -6883,8 +6884,8 @@ fu_engine_ensure_paths_exist(GError **error)
FU_PATH_KIND_CACHEDIR_PKG,
FU_PATH_KIND_LAST};
for (guint i = 0; path_kinds[i] != FU_PATH_KIND_LAST; i++) {
g_autofree gchar *fn = fu_common_get_path(path_kinds[i]);
if (!fu_common_mkdir(fn, error))
g_autofree gchar *fn = fu_path_from_kind(path_kinds[i]);
if (!fu_path_mkdir(fn, error))
return FALSE;
}
return TRUE;
@ -6911,7 +6912,7 @@ fu_engine_load_local_metadata_watches(FuEngine *self, GError **error)
GFileMonitor *monitor;
g_autoptr(GFile) file = NULL;
g_autoptr(GError) error_local = NULL;
g_autofree gchar *base = fu_common_get_path(path_kinds[i]);
g_autofree gchar *base = fu_path_from_kind(path_kinds[i]);
g_autofree gchar *fn = g_build_filename(base, "local.d", NULL);
file = g_file_new_for_path(fn);
@ -7559,9 +7560,9 @@ fu_engine_init(FuEngine *self)
/* setup Jcat context */
self->jcat_context = jcat_context_new();
keyring_path = fu_common_get_path(FU_PATH_KIND_LOCALSTATEDIR_PKG);
keyring_path = fu_path_from_kind(FU_PATH_KIND_LOCALSTATEDIR_PKG);
jcat_context_set_keyring_path(self->jcat_context, keyring_path);
sysconfdir = fu_common_get_path(FU_PATH_KIND_SYSCONFDIR);
sysconfdir = fu_path_from_kind(FU_PATH_KIND_SYSCONFDIR);
pkidir_fw = g_build_filename(sysconfdir, "pki", "fwupd", NULL);
jcat_context_add_public_keys(self->jcat_context, pkidir_fw);
pkidir_md = g_build_filename(sysconfdir, "pki", "fwupd-metadata", NULL);

View File

@ -204,7 +204,7 @@ fu_firmware_builder_process(GBytes *bytes,
g_return_val_if_fail(error == NULL || *error == NULL, NULL);
/* find bwrap in the path */
bwrap_fn = fu_common_find_program_in_path("bwrap", error);
bwrap_fn = fu_path_find_program("bwrap", error);
if (bwrap_fn == NULL)
return NULL;
@ -220,7 +220,7 @@ fu_firmware_builder_process(GBytes *bytes,
return NULL;
/* this is shared with the plugins */
localstatedir = fu_common_get_path(FU_PATH_KIND_LOCALSTATEDIR_PKG);
localstatedir = fu_path_from_kind(FU_PATH_KIND_LOCALSTATEDIR_PKG);
localstatebuilderdir = g_build_filename(localstatedir, "builder", NULL);
/* launch bubblewrap and generate firmware */
@ -277,7 +277,7 @@ fu_firmware_builder_process(GBytes *bytes,
return NULL;
/* cleanup temp directory */
if (!fu_common_rmtree(tmpdir, error))
if (!fu_path_rmtree(tmpdir, error))
return NULL;
/* success */

View File

@ -24,6 +24,7 @@
#include "fu-device-private.h"
#include "fu-history.h"
#include "fu-mutex.h"
#include "fu-path.h"
#include "fu-security-attr.h"
#define FU_HISTORY_CURRENT_SCHEMA_VERSION 7
@ -465,7 +466,7 @@ fu_history_load(FuHistory *self, GError **error)
g_return_val_if_fail(locker != NULL, FALSE);
/* create directory */
dirname = fu_common_get_path(FU_PATH_KIND_LOCALSTATEDIR_PKG);
dirname = fu_path_from_kind(FU_PATH_KIND_LOCALSTATEDIR_PKG);
file = g_file_new_for_path(dirname);
if (!g_file_query_exists(file, NULL)) {
if (!g_file_make_directory_with_parents(file, NULL, error))

View File

@ -13,6 +13,7 @@
#include <stdlib.h>
#include "fu-history.h"
#include "fu-path.h"
#include "fu-plugin-private.h"
#include "fu-spawn.h"
#include "fu-util-common.h"
@ -141,8 +142,8 @@ main(int argc, char *argv[])
gint vercmp;
guint cnt = 0;
g_autofree gchar *link = NULL;
g_autofree gchar *target = fu_common_get_path(FU_PATH_KIND_LOCALSTATEDIR_PKG);
g_autofree gchar *trigger = fu_common_get_path(FU_PATH_KIND_OFFLINE_TRIGGER);
g_autofree gchar *target = fu_path_from_kind(FU_PATH_KIND_LOCALSTATEDIR_PKG);
g_autofree gchar *trigger = fu_path_from_kind(FU_PATH_KIND_OFFLINE_TRIGGER);
g_autoptr(FuHistory) history = NULL;
g_autoptr(FwupdClient) client = NULL;
g_autoptr(GError) error = NULL;

View File

@ -26,6 +26,7 @@
#include <unistd.h>
#include "fu-common.h"
#include "fu-path.h"
#include "fu-polkit-agent.h"
static pid_t agent_pid = 0;
@ -180,7 +181,7 @@ fu_polkit_agent_open(GError **error)
return TRUE;
/* find binary */
pkttyagent_fn = fu_common_find_program_in_path("pkttyagent", error);
pkttyagent_fn = fu_path_find_program("pkttyagent", error);
if (pkttyagent_fn == NULL)
return FALSE;

View File

@ -23,6 +23,7 @@
#include "fwupd-remote-private.h"
#include "fu-common.h"
#include "fu-path.h"
#include "fu-remote-list.h"
#include "fu-string.h"
@ -216,7 +217,7 @@ fu_remote_list_add_for_path(FuRemoteList *self, const gchar *path, GError **erro
}
/* set directory to store data */
remotesdir = fu_common_get_path(FU_PATH_KIND_LOCALSTATEDIR_METADATA);
remotesdir = fu_path_from_kind(FU_PATH_KIND_LOCALSTATEDIR_METADATA);
fwupd_remote_set_remotes_dir(remote, remotesdir);
/* load from keyfile */
@ -389,10 +390,10 @@ fu_remote_list_reload(FuRemoteList *self, GError **error)
g_ptr_array_set_size(self->monitors, 0);
/* use sysremotes, and then fall back to /etc */
remotesdir = fu_common_get_path(FU_PATH_KIND_SYSCONFDIR_PKG);
remotesdir = fu_path_from_kind(FU_PATH_KIND_SYSCONFDIR_PKG);
if (!fu_remote_list_add_for_path(self, remotesdir, error))
return FALSE;
remotesdir_mut = fu_common_get_path(FU_PATH_KIND_LOCALSTATEDIR_PKG);
remotesdir_mut = fu_path_from_kind(FU_PATH_KIND_LOCALSTATEDIR_PKG);
if (!fu_remote_list_add_for_path(self, remotesdir_mut, error))
return FALSE;
@ -428,7 +429,7 @@ fu_remote_list_load_metainfos(XbBuilder *builder, GError **error)
g_autoptr(GDir) dir = NULL;
/* pkg metainfo dir */
datadir = fu_common_get_path(FU_PATH_KIND_DATADIR_PKG);
datadir = fu_path_from_kind(FU_PATH_KIND_DATADIR_PKG);
metainfo_path = g_build_filename(datadir, "metainfo", NULL);
if (!g_file_test(metainfo_path, G_FILE_TEST_EXISTS))
return TRUE;
@ -485,7 +486,7 @@ fu_remote_list_load(FuRemoteList *self, FuRemoteListLoadFlags flags, GError **er
if (xmlb == NULL)
return FALSE;
} else {
g_autofree gchar *cachedirpkg = fu_common_get_path(FU_PATH_KIND_CACHEDIR_PKG);
g_autofree gchar *cachedirpkg = fu_path_from_kind(FU_PATH_KIND_CACHEDIR_PKG);
g_autofree gchar *xmlbfn = g_build_filename(cachedirpkg, "metainfo.xmlb", NULL);
xmlb = g_file_new_for_path(xmlbfn);
}

View File

@ -78,7 +78,7 @@ fu_self_test_mkroot(void)
{
if (g_file_test("/tmp/fwupd-self-test", G_FILE_TEST_EXISTS)) {
g_autoptr(GError) error = NULL;
if (!fu_common_rmtree("/tmp/fwupd-self-test", &error))
if (!fu_path_rmtree("/tmp/fwupd-self-test", &error))
g_warning("failed to mkroot: %s", error->message);
}
g_assert_cmpint(g_mkdir_with_parents("/tmp/fwupd-self-test/var/lib/fwupd", 0755), ==, 0);
@ -90,7 +90,7 @@ fu_test_compare_lines(const gchar *txt1, const gchar *txt2, GError **error)
g_autofree gchar *output = NULL;
if (g_strcmp0(txt1, txt2) == 0)
return TRUE;
if (fu_common_fnmatch(txt2, txt1))
if (fu_path_fnmatch(txt2, txt1))
return TRUE;
if (!g_file_set_contents("/tmp/a", txt1, -1, error))
return FALSE;
@ -2126,7 +2126,7 @@ fu_engine_history_inherit(gconstpointer user_data)
#endif
/* delete history */
localstatedir = fu_common_get_path(FU_PATH_KIND_LOCALSTATEDIR_PKG);
localstatedir = fu_path_from_kind(FU_PATH_KIND_LOCALSTATEDIR_PKG);
history_db = g_build_filename(localstatedir, "pending.db", NULL);
(void)g_unlink(history_db);
@ -3208,7 +3208,7 @@ fu_plugin_module_func(gconstpointer user_data)
g_clear_error(&error);
/* delete files */
localstatedir = fu_common_get_path(FU_PATH_KIND_LOCALSTATEDIR_PKG);
localstatedir = fu_path_from_kind(FU_PATH_KIND_LOCALSTATEDIR_PKG);
history_db = g_build_filename(localstatedir, "pending.db", NULL);
(void)g_unlink(history_db);
(void)g_unlink(pending_cap);
@ -3239,7 +3239,7 @@ fu_history_func(gconstpointer user_data)
g_assert_nonnull(history);
/* delete the database */
dirname = fu_common_get_path(FU_PATH_KIND_LOCALSTATEDIR_PKG);
dirname = fu_path_from_kind(FU_PATH_KIND_LOCALSTATEDIR_PKG);
if (!g_file_test(dirname, G_FILE_TEST_IS_DIR))
return;
filename = g_build_filename(dirname, "pending.db", NULL);

View File

@ -139,7 +139,7 @@ fu_util_save_current_state(FuUtilPrivate *priv, GError **error)
state = json_generator_to_data(json_generator, NULL);
if (state == NULL)
return FALSE;
dirname = fu_common_get_path(FU_PATH_KIND_LOCALSTATEDIR_PKG);
dirname = fu_path_from_kind(FU_PATH_KIND_LOCALSTATEDIR_PKG);
filename = g_build_filename(dirname, "state.json", NULL);
return g_file_set_contents(filename, state, -1, error);
}
@ -212,10 +212,10 @@ fu_util_lock(FuUtilPrivate *priv, GError **error)
if (use_user) {
lockfn = fu_util_get_user_cache_path("fwupdtool");
} else {
g_autofree gchar *lockdir = fu_common_get_path(FU_PATH_KIND_LOCKDIR);
g_autofree gchar *lockdir = fu_path_from_kind(FU_PATH_KIND_LOCKDIR);
lockfn = g_build_filename(lockdir, "fwupdtool", NULL);
}
if (!fu_common_mkdir_parent(lockfn, error))
if (!fu_path_mkdir_parent(lockfn, error))
return FALSE;
priv->lock_fd = g_open(lockfn, O_RDWR | O_CREAT, S_IRWXU);
if (priv->lock_fd < 0) {
@ -1255,7 +1255,7 @@ fu_util_download_if_required(FuUtilPrivate *priv, const gchar *perhapsfn, GError
/* download the firmware to a cachedir */
filename = fu_util_get_user_cache_path(perhapsfn);
if (!fu_common_mkdir_parent(filename, error))
if (!fu_path_mkdir_parent(filename, error))
return NULL;
file = g_file_new_for_path(filename);
if (!fwupd_client_download_file(priv->client,
@ -3139,7 +3139,7 @@ fu_util_esp_list(FuUtilPrivate *priv, gchar **values, GError **error)
if (locker == NULL)
return FALSE;
mount_point = fu_volume_get_mount_point(volume);
files = fu_common_get_files_recursive(mount_point, error);
files = fu_path_get_files(mount_point, error);
if (files == NULL)
return FALSE;
for (guint i = 0; i < files->len; i++) {

View File

@ -29,6 +29,7 @@
#include "fwupd-remote-private.h"
#include "fu-bytes.h"
#include "fu-path.h"
#include "fu-plugin-private.h"
#include "fu-polkit-agent.h"
#include "fu-progressbar.h"
@ -655,7 +656,7 @@ fu_util_download_if_required(FuUtilPrivate *priv, const gchar *perhapsfn, GError
filename = fu_util_get_user_cache_path(perhapsfn);
if (g_file_test(filename, G_FILE_TEST_EXISTS))
return g_steal_pointer(&filename);
if (!fu_common_mkdir_parent(filename, error))
if (!fu_path_mkdir_parent(filename, error))
return NULL;
blob = fwupd_client_download_bytes(priv->client,
perhapsfn,
@ -3538,7 +3539,7 @@ static gboolean
fu_util_check_polkit_actions(GError **error)
{
#ifdef HAVE_POLKIT
g_autofree gchar *directory = fu_common_get_path(FU_PATH_KIND_POLKIT_ACTIONS);
g_autofree gchar *directory = fu_path_from_kind(FU_PATH_KIND_POLKIT_ACTIONS);
g_autofree gchar *filename =
g_build_filename(directory, "org.freedesktop.fwupd.policy", NULL);
if (!g_file_test(filename, G_FILE_TEST_IS_REGULAR)) {