fwupd/libfwupdplugin/fu-common.h
Jason Gerecke 835975d66c trivial: Add "full" CRC8 function
The CRC32 and CRC16 algorithms have "full" functions that allow callers to
provide their own polynomial and initial CRC value. Provide the same ability
to users of the CRC8 algorithm.
2021-10-26 18:15:23 +01:00

442 lines
14 KiB
C

/*
* Copyright (C) 2017 Richard Hughes <richard@hughsie.com>
*
* SPDX-License-Identifier: LGPL-2.1+
*/
#pragma once
#include <gio/gio.h>
#include <xmlb.h>
#include "fu-volume.h"
/**
* FuAppFlags:
* @FU_APP_FLAGS_NONE: No flags set
* @FU_APP_FLAGS_NO_IDLE_SOURCES: Disallow idle sources
*
* The flags to use when loading an application.
**/
typedef enum {
FU_APP_FLAGS_NONE = 0,
FU_APP_FLAGS_NO_IDLE_SOURCES = 1 << 0,
/*< private >*/
FU_APP_FLAGS_LAST
} FuAppFlags;
/**
* FuDumpFlags:
* @FU_DUMP_FLAGS_NONE: No flags set
* @FU_DUMP_FLAGS_SHOW_ASCII: Show ASCII in debugging dumps
* @FU_DUMP_FLAGS_SHOW_ADDRESSES: Show addresses in debugging dumps
*
* The flags to use when configuring debugging
**/
typedef enum {
FU_DUMP_FLAGS_NONE = 0,
FU_DUMP_FLAGS_SHOW_ASCII = 1 << 0,
FU_DUMP_FLAGS_SHOW_ADDRESSES = 1 << 1,
/*< private >*/
FU_DUMP_FLAGS_LAST
} FuDumpFlags;
/**
* FuEndianType:
*
* The endian type, e.g. %G_LITTLE_ENDIAN
**/
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)
*
* 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,
/*< private >*/
FU_PATH_KIND_LAST
} FuPathKind;
/**
* FuCpuVendor:
* @FU_CPU_VENDOR_UNKNOWN: Unknown
* @FU_CPU_VENDOR_INTEL: Intel
* @FU_CPU_VENDOR_AMD: AMD
*
* The CPU vendor.
**/
typedef enum {
FU_CPU_VENDOR_UNKNOWN,
FU_CPU_VENDOR_INTEL,
FU_CPU_VENDOR_AMD,
/*< private >*/
FU_CPU_VENDOR_LAST
} FuCpuVendor;
/**
* FU_BATTERY_VALUE_INVALID:
*
* This value signifies the battery level is either unset, or the value cannot
* be discovered.
*/
#define FU_BATTERY_VALUE_INVALID 101
/**
* FuBatteryState:
* @FU_BATTERY_STATE_UNKNOWN: Unknown
* @FU_BATTERY_STATE_CHARGING: Charging
* @FU_BATTERY_STATE_DISCHARGING: Discharging
* @FU_BATTERY_STATE_EMPTY: Empty
* @FU_BATTERY_STATE_FULLY_CHARGED: Fully charged
*
* The device battery state.
**/
typedef enum {
FU_BATTERY_STATE_UNKNOWN,
FU_BATTERY_STATE_CHARGING,
FU_BATTERY_STATE_DISCHARGING,
FU_BATTERY_STATE_EMPTY,
FU_BATTERY_STATE_FULLY_CHARGED,
/*< private >*/
FU_BATTERY_STATE_LAST
} FuBatteryState;
/**
* FuOutputHandler:
* @line: text data
* @user_data: user data
*
* The process spawn iteration callback.
*/
typedef void (*FuOutputHandler)(const gchar *line, gpointer user_data);
gboolean
fu_common_spawn_sync(const gchar *const *argv,
FuOutputHandler handler_cb,
gpointer handler_user_data,
guint timeout_ms,
GCancellable *cancellable,
GError **error) G_GNUC_WARN_UNUSED_RESULT;
gchar *
fu_common_get_path(FuPathKind path_kind);
gchar *
fu_common_realpath(const gchar *filename, GError **error) G_GNUC_WARN_UNUSED_RESULT;
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;
gboolean
fu_common_set_contents_bytes(const gchar *filename,
GBytes *bytes,
GError **error) G_GNUC_WARN_UNUSED_RESULT;
GBytes *
fu_common_get_contents_bytes(const gchar *filename, GError **error) G_GNUC_WARN_UNUSED_RESULT;
GBytes *
fu_common_get_contents_fd(gint fd, gsize count, GError **error) G_GNUC_WARN_UNUSED_RESULT;
gboolean
fu_common_extract_archive(GBytes *blob, const gchar *dir, GError **error) G_GNUC_WARN_UNUSED_RESULT;
GBytes *
fu_common_firmware_builder(GBytes *bytes,
const gchar *script_fn,
const gchar *output_fn,
GError **error) G_GNUC_WARN_UNUSED_RESULT;
GError *
fu_common_error_array_get_best(GPtrArray *errors);
guint64
fu_common_strtoull(const gchar *str);
gchar *
fu_common_find_program_in_path(const gchar *basename, GError **error) G_GNUC_WARN_UNUSED_RESULT;
gchar *
fu_common_strstrip(const gchar *str);
void
fu_common_dump_raw(const gchar *log_domain, const gchar *title, const guint8 *data, gsize len);
void
fu_common_dump_full(const gchar *log_domain,
const gchar *title,
const guint8 *data,
gsize len,
guint columns,
FuDumpFlags flags);
void
fu_common_dump_bytes(const gchar *log_domain, const gchar *title, GBytes *bytes);
GBytes *
fu_common_bytes_align(GBytes *bytes, gsize blksz, gchar padval);
const guint8 *
fu_bytes_get_data_safe(GBytes *bytes, gsize *bufsz, GError **error);
gboolean
fu_common_bytes_is_empty(GBytes *bytes);
gboolean
fu_common_bytes_compare(GBytes *bytes1, GBytes *bytes2, GError **error) G_GNUC_WARN_UNUSED_RESULT;
gboolean
fu_common_bytes_compare_raw(const guint8 *buf1,
gsize bufsz1,
const guint8 *buf2,
gsize bufsz2,
GError **error) G_GNUC_WARN_UNUSED_RESULT;
GBytes *
fu_common_bytes_pad(GBytes *bytes, gsize sz);
GBytes *
fu_common_bytes_new_offset(GBytes *bytes, gsize offset, gsize length, GError **error)
G_GNUC_WARN_UNUSED_RESULT;
gsize
fu_common_strwidth(const gchar *text);
guint8 *
fu_memdup_safe(const guint8 *src, gsize n, GError **error) G_GNUC_WARN_UNUSED_RESULT;
gboolean
fu_memcpy_safe(guint8 *dst,
gsize dst_sz,
gsize dst_offset,
const guint8 *src,
gsize src_sz,
gsize src_offset,
gsize n,
GError **error) G_GNUC_WARN_UNUSED_RESULT;
gboolean
fu_common_read_uint8_safe(const guint8 *buf,
gsize bufsz,
gsize offset,
guint8 *value,
GError **error) G_GNUC_WARN_UNUSED_RESULT;
gboolean
fu_common_read_uint16_safe(const guint8 *buf,
gsize bufsz,
gsize offset,
guint16 *value,
FuEndianType endian,
GError **error) G_GNUC_WARN_UNUSED_RESULT;
gboolean
fu_common_read_uint32_safe(const guint8 *buf,
gsize bufsz,
gsize offset,
guint32 *value,
FuEndianType endian,
GError **error) G_GNUC_WARN_UNUSED_RESULT;
gboolean
fu_common_read_uint64_safe(const guint8 *buf,
gsize bufsz,
gsize offset,
guint64 *value,
FuEndianType endian,
GError **error) G_GNUC_WARN_UNUSED_RESULT;
gboolean
fu_common_write_uint8_safe(guint8 *buf, gsize bufsz, gsize offset, guint8 value, GError **error)
G_GNUC_WARN_UNUSED_RESULT;
gboolean
fu_common_write_uint16_safe(guint8 *buf,
gsize bufsz,
gsize offset,
guint16 value,
FuEndianType endian,
GError **error) G_GNUC_WARN_UNUSED_RESULT;
gboolean
fu_common_write_uint32_safe(guint8 *buf,
gsize bufsz,
gsize offset,
guint32 value,
FuEndianType endian,
GError **error) G_GNUC_WARN_UNUSED_RESULT;
gboolean
fu_common_write_uint64_safe(guint8 *buf,
gsize bufsz,
gsize offset,
guint64 value,
FuEndianType endian,
GError **error) G_GNUC_WARN_UNUSED_RESULT;
void
fu_byte_array_set_size(GByteArray *array, guint length);
void
fu_byte_array_set_size_full(GByteArray *array, guint length, guint8 data);
void
fu_byte_array_align_up(GByteArray *array, guint8 alignment, guint8 data);
void
fu_byte_array_append_uint8(GByteArray *array, guint8 data);
void
fu_byte_array_append_uint16(GByteArray *array, guint16 data, FuEndianType endian);
void
fu_byte_array_append_uint32(GByteArray *array, guint32 data, FuEndianType endian);
void
fu_byte_array_append_uint64(GByteArray *array, guint64 data, FuEndianType endian);
void
fu_byte_array_append_bytes(GByteArray *array, GBytes *bytes);
void
fu_common_write_uint16(guint8 *buf, guint16 val_native, FuEndianType endian);
void
fu_common_write_uint32(guint8 *buf, guint32 val_native, FuEndianType endian);
void
fu_common_write_uint64(guint8 *buf, guint64 val_native, FuEndianType endian);
guint16
fu_common_read_uint16(const guint8 *buf, FuEndianType endian);
guint32
fu_common_read_uint32(const guint8 *buf, FuEndianType endian);
guint64
fu_common_read_uint64(const guint8 *buf, FuEndianType endian);
guint
fu_common_string_replace(GString *string, const gchar *search, const gchar *replace);
void
fu_common_string_append_kv(GString *str, guint idt, const gchar *key, const gchar *value);
void
fu_common_string_append_ku(GString *str, guint idt, const gchar *key, guint64 value);
void
fu_common_string_append_kx(GString *str, guint idt, const gchar *key, guint64 value);
void
fu_common_string_append_kb(GString *str, guint idt, const gchar *key, gboolean value);
gchar **
fu_common_strnsplit(const gchar *str, gsize sz, const gchar *delimiter, gint max_tokens);
/**
* FuCommonStrsplitFunc:
* @token: a #GString
* @token_idx: the token number
* @user_data: user data
* @error: a #GError or NULL
*
* The fu_common_strnsplit_full() iteration callback.
*/
typedef gboolean (*FuCommonStrsplitFunc)(GString *token,
guint token_idx,
gpointer user_data,
GError **error);
gboolean
fu_common_strnsplit_full(const gchar *str,
gssize sz,
const gchar *delimiter,
FuCommonStrsplitFunc callback,
gpointer user_data,
GError **error);
gchar *
fu_common_strsafe(const gchar *str, gsize maxsz);
gchar *
fu_common_strjoin_array(const gchar *separator, GPtrArray *array);
gboolean
fu_common_kernel_locked_down(void);
gboolean
fu_common_check_kernel_version(const gchar *minimum_kernel, GError **error);
gboolean
fu_common_cpuid(guint32 leaf,
guint32 *eax,
guint32 *ebx,
guint32 *ecx,
guint32 *edx,
GError **error) G_GNUC_WARN_UNUSED_RESULT;
FuCpuVendor
fu_common_get_cpu_vendor(void);
gboolean
fu_common_is_live_media(void);
guint64
fu_common_get_memory_size(void);
GPtrArray *
fu_common_get_volumes_by_kind(const gchar *kind, GError **error) G_GNUC_WARN_UNUSED_RESULT;
FuVolume *
fu_common_get_volume_by_device(const gchar *device, GError **error) G_GNUC_WARN_UNUSED_RESULT;
FuVolume *
fu_common_get_volume_by_devnum(guint32 devnum, GError **error) G_GNUC_WARN_UNUSED_RESULT;
FuVolume *
fu_common_get_esp_for_path(const gchar *esp_path, GError **error) G_GNUC_WARN_UNUSED_RESULT;
FuVolume *
fu_common_get_esp_default(GError **error) G_GNUC_WARN_UNUSED_RESULT;
gboolean
fu_common_check_full_disk_encryption(GError **error);
guint8
fu_common_crc8(const guint8 *buf, gsize bufsz);
guint8
fu_common_crc8_full(const guint8 *buf, gsize bufsz, guint8 crc_init, guint8 polynomial);
guint16
fu_common_crc16(const guint8 *buf, gsize bufsz);
guint16
fu_common_crc16_full(const guint8 *buf, gsize bufsz, guint16 crc, guint16 polynomial);
guint32
fu_common_crc32(const guint8 *buf, gsize bufsz);
guint32
fu_common_crc32_full(const guint8 *buf, gsize bufsz, guint32 crc, guint32 polynomial);
gchar *
fu_common_uri_get_scheme(const gchar *uri);
gsize
fu_common_align_up(gsize value, guint8 alignment);
gchar *
fu_common_get_firmware_search_path(GError **error);
gboolean
fu_common_set_firmware_search_path(const gchar *path, GError **error);
gboolean
fu_common_reset_firmware_search_path(GError **error);
const gchar *
fu_battery_state_to_string(FuBatteryState battery_state);
void
fu_xmlb_builder_insert_kv(XbBuilderNode *bn, const gchar *key, const gchar *value);
void
fu_xmlb_builder_insert_kx(XbBuilderNode *bn, const gchar *key, guint64 value);
void
fu_xmlb_builder_insert_kb(XbBuilderNode *bn, const gchar *key, gboolean value);