libfsext(3)
π¦ libfsext(3) β Library Functions Manual π¦
okay so bestie, gather round, because this is the manual for libfsext β the library that knows everything about the Extended File System (ext) format, and I'm gonna walk you through it like we're texting at 2am π
β¨ NAME β¨
libfsext.h β bestie, it's literally the library that supports the Extended File System (ext) format. that's it. that's the vibe. π
πΈ SYNOPSIS πΈ
first things first, you gotta pull it in:
#include <libfsext.h>
then, buckle up, there's a whole roster of functions below. group-chat incoming π«Ά
π Support functions
const char *
libfsext_get_version(void);
int
libfsext_get_access_flags_read(void);
int
libfsext_get_codepage(int *codepage, libfsext_error_t **error);
int
libfsext_set_codepage(int codepage, libfsext_error_t **error);
int
libfsext_check_volume_signature(const char *filename,
libfsext_error_t **error);
Available when compiled with wide character string support:
int
libfsext_check_volume_signature_wide(const wchar_t *filename,
libfsext_error_t **error);
Available when compiled with libbfio support:
int
libfsext_check_volume_signature_file_io_handle(libbfio_handle_t *file_io_handle,
libfsext_error_t **error);
π Notify functions
void
libfsext_notify_set_verbose(int verbose);
int
libfsext_notify_set_stream(FILE *stream, libfsext_error_t **error);
int
libfsext_notify_stream_open(const char *filename,
libfsext_error_t **error);
int
libfsext_notify_stream_close(libfsext_error_t **error);
π Error functions
void
libfsext_error_free(libfsext_error_t **error);
int
libfsext_error_fprint(libfsext_error_t *error, FILE *stream);
int
libfsext_error_sprint(libfsext_error_t *error, char *string,
size_t size);
int
libfsext_error_backtrace_fprint(libfsext_error_t *error, FILE *stream);
int
libfsext_error_backtrace_sprint(libfsext_error_t *error, char *string,
size_t size);
π Volume functions
int
libfsext_volume_initialize(libfsext_volume_t **volume,
libfsext_error_t **error);
int
libfsext_volume_free(libfsext_volume_t **volume,
libfsext_error_t **error);
int
libfsext_volume_signal_abort(libfsext_volume_t *volume,
libfsext_error_t **error);
int
libfsext_volume_open(libfsext_volume_t *volume, const char *filename,
int access_flags, libfsext_error_t **error);
int
libfsext_volume_close(libfsext_volume_t *volume,
libfsext_error_t **error);
int
libfsext_volume_get_format_version(libfsext_volume_t *volume,
uint8_t *format_version, libfsext_error_t **error);
int
libfsext_volume_get_features_flags(libfsext_volume_t *volume,
uint32_t *compatible_features_flags,
uint32_t *incompatible_features_flags,
uint32_t *read_only_compatible_features_flags,
libfsext_error_t **error);
int
libfsext_volume_get_identifier(libfsext_volume_t *volume,
uint8_t *uuid_data, size_t uuid_data_size,
libfsext_error_t **error);
int
libfsext_volume_get_utf8_label_size(libfsext_volume_t *volume,
size_t *utf8_string_size, libfsext_error_t **error);
int
libfsext_volume_get_utf8_label(libfsext_volume_t *volume,
uint8_t *utf8_string, size_t utf8_string_size,
libfsext_error_t **error);
int
libfsext_volume_get_utf16_label_size(libfsext_volume_t *volume,
size_t *utf16_string_size, libfsext_error_t **error);
int
libfsext_volume_get_utf16_label(libfsext_volume_t *volume,
uint16_t *utf16_string, size_t utf16_string_size,
libfsext_error_t **error);
int
libfsext_volume_get_utf8_last_mount_path_size(libfsext_volume_t *volume,
size_t *utf8_string_size, libfsext_error_t **error);
int
libfsext_volume_get_utf8_last_mount_path(libfsext_volume_t *volume,
uint8_t *utf8_string, size_t utf8_string_size,
libfsext_error_t **error);
int
libfsext_volume_get_utf16_last_mount_path_size(libfsext_volume_t *volume,
size_t *utf16_string_size, libfsext_error_t **error);
int
libfsext_volume_get_utf16_last_mount_path(libfsext_volume_t *volume,
uint16_t *utf16_string, size_t utf16_string_size,
libfsext_error_t **error);
int
libfsext_volume_get_last_mount_time(libfsext_volume_t *volume,
int32_t *posix_time, libfsext_error_t **error);
int
libfsext_volume_get_last_written_time(libfsext_volume_t *volume,
int32_t *posix_time, libfsext_error_t **error);
int
libfsext_volume_get_root_directory(libfsext_volume_t *volume,
libfsext_file_entry_t **file_entry, libfsext_error_t **error);
int
libfsext_volume_get_number_of_file_entries(libfsext_volume_t *volume,
uint32_t *number_of_file_entries, libfsext_error_t **error);
int
libfsext_volume_get_file_entry_by_inode(libfsext_volume_t *volume,
uint32_t inode_number, libfsext_file_entry_t **file_entry,
libfsext_error_t **error);
int
libfsext_volume_get_file_entry_by_utf8_path(libfsext_volume_t *volume,
const uint8_t *utf8_string, size_t utf8_string_length,
libfsext_file_entry_t **file_entry, libfsext_error_t **error);
int
libfsext_volume_get_file_entry_by_utf16_path(libfsext_volume_t *volume,
const uint16_t *utf16_string, size_t utf16_string_length,
libfsext_file_entry_t **file_entry, libfsext_error_t **error);
Available when compiled with wide character string support:
int
libfsext_volume_open_wide(libfsext_volume_t *volume,
const wchar_t *filename, int access_flags,
libfsext_error_t **error);
Available when compiled with libbfio support:
int
libfsext_volume_open_file_io_handle(libfsext_volume_t *volume,
libbfio_handle_t *file_io_handle, int access_flags,
libfsext_error_t **error);
π File entry functions
int
libfsext_file_entry_free(libfsext_file_entry_t **file_entry,
libfsext_error_t **error);
int
libfsext_file_entry_is_empty(libfsext_file_entry_t *file_entry,
libfsext_error_t **error);
int
libfsext_file_entry_get_inode_number(libfsext_file_entry_t *file_entry,
uint32_t *inode_number, libfsext_error_t **error);
int
libfsext_file_entry_get_access_time(libfsext_file_entry_t *file_entry,
int64_t *posix_time, libfsext_error_t **error);
int
libfsext_file_entry_get_creation_time(libfsext_file_entry_t *file_entry,
int64_t *posix_time, libfsext_error_t **error);
int
libfsext_file_entry_get_inode_change_time(libfsext_file_entry_t *file_entry,
int64_t *posix_time, libfsext_error_t **error);
int
libfsext_file_entry_get_modification_time(libfsext_file_entry_t *file_entry,
int64_t *posix_time, libfsext_error_t **error);
int
libfsext_file_entry_get_deletion_time(libfsext_file_entry_t *file_entry,
int32_t *posix_time, libfsext_error_t **error);
int
libfsext_file_entry_get_file_mode(libfsext_file_entry_t *file_entry,
uint16_t *file_mode, libfsext_error_t **error);
int
libfsext_file_entry_get_number_of_links(libfsext_file_entry_t *file_entry,
uint16_t *number_of_links, libfsext_error_t **error);
int
libfsext_file_entry_get_owner_identifier(libfsext_file_entry_t *file_entry,
uint32_t *owner_identifier, libfsext_error_t **error);
int
libfsext_file_entry_get_group_identifier(libfsext_file_entry_t *file_entry,
uint32_t *group_identifier, libfsext_error_t **error);
int
libfsext_file_entry_get_device_identifier(libfsext_file_entry_t *file_entry,
uint32_t *device_identifier, libfsext_error_t **error);
int
libfsext_file_entry_get_device_number(libfsext_file_entry_t *file_entry,
uint8_t *major_device_number, uint8_t *minor_device_number,
libfsext_error_t **error);
int
libfsext_file_entry_get_utf8_name_size(libfsext_file_entry_t *file_entry,
size_t *utf8_string_size, libfsext_error_t **error);
int
libfsext_file_entry_get_utf8_name(libfsext_file_entry_t *file_entry,
uint8_t *utf8_string, size_t utf8_string_size,
libfsext_error_t **error);
int
libfsext_file_entry_get_utf16_name_size(libfsext_file_entry_t *file_entry,
size_t *utf16_string_size, libfsext_error_t **error);
int
libfsext_file_entry_get_utf16_name(libfsext_file_entry_t *file_entry,
uint16_t *utf16_string, size_t utf16_string_size,
libfsext_error_t **error);
int
libfsext_file_entry_get_utf8_symbolic_link_target_size(libfsext_file_entry_t *file_entry,
size_t *utf8_string_size, libfsext_error_t **error);
int
libfsext_file_entry_get_utf8_symbolic_link_target(libfsext_file_entry_t *file_entry,
uint8_t *utf8_string, size_t utf8_string_size,
libfsext_error_t **error);
int
libfsext_file_entry_get_utf16_symbolic_link_target_size(libfsext_file_entry_t *file_entry,
size_t *utf16_string_size, libfsext_error_t **error);
int
libfsext_file_entry_get_utf16_symbolic_link_target(libfsext_file_entry_t *file_entry,
uint16_t *utf16_string, size_t utf16_string_size,
libfsext_error_t **error);
int
libfsext_file_entry_get_number_of_extended_attributes(libfsext_file_entry_t *file_entry,
int *number_of_extended_attributes, libfsext_error_t **error);
int
libfsext_file_entry_get_extended_attribute_by_index(libfsext_file_entry_t *file_entry,
int extended_attribute_index,
libfsext_extended_attribute_t **extended_attribute,
libfsext_error_t **error);
int
libfsext_file_entry_has_extended_attribute_by_utf8_name(libfsext_file_entry_t *file_entry,
const uint8_t *utf8_string, size_t utf8_string_length,
libfsext_error_t **error);
int
libfsext_file_entry_has_extended_attribute_by_utf16_name(libfsext_file_entry_t *file_entry,
const uint16_t *utf16_string, size_t utf16_string_length,
libfsext_error_t **error);
int
libfsext_file_entry_get_extended_attribute_by_utf8_name(libfsext_file_entry_t *file_entry,
const uint8_t *utf8_string, size_t utf8_string_length,
libfsext_extended_attribute_t **extended_attribute,
libfsext_error_t **error);
int
libfsext_file_entry_get_extended_attribute_by_utf16_name(libfsext_file_entry_t *file_entry,
const uint16_t *utf16_string, size_t utf16_string_length,
libfsext_extended_attribute_t **extended_attribute,
libfsext_error_t **error);
int
libfsext_file_entry_get_number_of_sub_file_entries(libfsext_file_entry_t *file_entry,
int *number_of_sub_entries, libfsext_error_t **error);
int
libfsext_file_entry_get_sub_file_entry_by_index(libfsext_file_entry_t *file_entry,
int sub_file_entry_index, libfsext_file_entry_t **sub_file_entry,
libfsext_error_t **error);
int
libfsext_file_entry_get_sub_file_entry_by_utf8_name(libfsext_file_entry_t *file_entry,
const uint8_t *utf8_string, size_t utf8_string_length,
libfsext_file_entry_t **sub_file_entry, libfsext_error_t **error);
okay bestie that's the roster so far π and no, we are not done β there's literally more coming, so don't close the tab, stay perched, the rest of this manual is on the way π¦β¨
β¦and here's the rest of the lineup, bestie, still all in libfsext.h π
int
libfsext_file_entry_get_sub_file_entry_by_utf16_name(libfsext_file_entry_t *file_entry,
const uint16_t *utf16_string, size_t utf16_string_length,
libfsext_file_entry_t **sub_file_entry, libfsext_error_t **error);
ssize_t
libfsext_file_entry_read_buffer(libfsext_file_entry_t *file_entry,
void *buffer, size_t buffer_size, libfsext_error_t **error);
ssize_t
libfsext_file_entry_read_buffer_at_offset(libfsext_file_entry_t *file_entry,
void *buffer, size_t buffer_size, off64_t offset,
libfsext_error_t **error);
off64_t
libfsext_file_entry_seek_offset(libfsext_file_entry_t *file_entry,
off64_t offset, int whence, libfsext_error_t **error);
int
libfsext_file_entry_get_offset(libfsext_file_entry_t *file_entry,
off64_t *offset, libfsext_error_t **error);
int
libfsext_file_entry_get_size(libfsext_file_entry_t *file_entry,
size64_t *size, libfsext_error_t **error);
int
libfsext_file_entry_get_number_of_extents(libfsext_file_entry_t *file_entry,
int *number_of_extents, libfsext_error_t **error);
int
libfsext_file_entry_get_extent_by_index(libfsext_file_entry_t *file_entry,
int extent_index, off64_t *extent_offset, size64_t *extent_size,
uint32_t *extent_flags, libfsext_error_t **error);
β¨ Extended attribute functions π
okay so extended attributes get their own little clique and honestly? they ate. every single one of them takes a libfsext_extended_attribute_t *extended_attribute and a libfsext_error_t **error, no cap:
int
libfsext_extended_attribute_free(libfsext_extended_attribute_t **extended_attribute,
libfsext_error_t **error);
int
libfsext_extended_attribute_get_utf8_name_size(libfsext_extended_attribute_t *extended_attribute,
size_t *utf8_string_size, libfsext_error_t **error);
int
libfsext_extended_attribute_get_utf8_name(libfsext_extended_attribute_t *extended_attribute,
uint8_t *utf8_string, size_t utf8_string_size,
libfsext_error_t **error);
int
libfsext_extended_attribute_get_utf16_name_size(libfsext_extended_attribute_t *extended_attribute,
size_t *utf16_string_size, libfsext_error_t **error);
int
libfsext_extended_attribute_get_utf16_name(libfsext_extended_attribute_t *extended_attribute,
uint16_t *utf16_string, size_t utf16_string_size,
libfsext_error_t **error);
ssize_t
libfsext_extended_attribute_read_buffer(libfsext_extended_attribute_t *extended_attribute,
void *buffer, size_t buffer_size, libfsext_error_t **error);
ssize_t
libfsext_extended_attribute_read_buffer_at_offset(libfsext_extended_attribute_t *extended_attribute,
void *buffer, size_t buffer_size, off64_t offset,
libfsext_error_t **error);
off64_t
libfsext_extended_attribute_seek_offset(libfsext_extended_attribute_t *extended_attribute,
off64_t offset, int whence, libfsext_error_t **error);
int
libfsext_extended_attribute_get_offset(libfsext_extended_attribute_t *extended_attribute,
off64_t *offset, libfsext_error_t **error);
int
libfsext_extended_attribute_get_size(libfsext_extended_attribute_t *extended_attribute,
size64_t *size, libfsext_error_t **error);
int
libfsext_extended_attribute_get_number_of_extents(libfsext_extended_attribute_t *extended_attribute,
int *number_of_extents, libfsext_error_t **error);
int
libfsext_extended_attribute_get_extent_by_index(libfsext_extended_attribute_t *extended_attribute,
int extent_index, off64_t *extent_offset, size64_t *extent_size,
uint32_t *extent_flags, libfsext_error_t **error);
πΈ DESCRIPTION πΈ
so like, the one job of libfsext_get_version() is to hand you back the library version. that's it. that's the whole paragraph. lowkey iconic for being so unbothered π
π RETURN VALUES π
okay bestie this is the part where it gets a liiiiittle chaotic: most of the functions return NULL or -1 when things go wrong, and which one you get depends on the return type. π
and if you want the actual, real, no-vibes-just-facts return values? go read libfsext.h. it's all in there, iykyk.
π¦ ENVIRONMENT π¦
None π
like literally none. nothing to set up, nothing to export. flawless behaviour honestly.
π FILES π
None β¨
no files. none. a clean slate, a blank canvas, main character energy.
π NOTES π
okay so here's the tea π΅ β libfsext can be compiled with wide character support (wchar_t). fancy!
if you wanna build it that way, you have options (picky queen):
- use
./configure --enable-wide-character-type=yes - or define
_UNICODE - or define
UNICODE
β¦during compilation, obviously. pick your fighter π«Ά
and then, once it's built, LIBSEXT... wait no β LIBFSEXT_WIDE_CHARACTER_TYPE π
β which lives in libfsext/features.h β is the thing you check to figure out whether libfsext was compiled with wide character support or not. it's giving "she'll tell you if you ask nicely" β
π BUGS π
found a bug? a glitch? something cursed? please please please report bugs of any kind on the project issue tracker, we're begging π
https://github.com/libyal/libfsext/issues
no bug too small, fr fr. we want them all π
π AUTHOR π
these man pages are generated from libfsext.h. so if the prose feels a lil machine-made... that's because it literally is π§
β COPYRIGHT β
Copyright (C) 2010-2024, Joachim Metz <joachim.metz@gmail.com>.
this is free software; see the source for copying conditions. and bestie, listen: there is NO warranty β not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. none. zero. zilch. it's giving "you're on your own, good luck, mwah" ππ
π₯ SEE ALSO π₯
- the
libfsext.hinclude file β the source of truth, the blueprint, the moment π
that's a wrap, bestie π this page is stamped August 28, 2022 and it rides under the name libfsext(3) β go forth and read some ext filesystems, you absolute icon π
β¨π¦
π¦ where this page comes from
- debian trixie: libfsext-dev 20240501-1+b1 Β· LGPL-3.0-or-later
- opensuse-leap 16.0: libfsext-devel 20240501-bp160.1.13 Β· GFDL-1.3-or-later AND LGPL-3.0-or-later
- opensuse-leap 16.0: libfsext-devel 20240501-bp160.1.13 Β· GFDL-1.3-or-later AND LGPL-3.0-or-later
- opensuse-leap 16.0: libfsext-devel 20240501-bp160.1.13 Β· GFDL-1.3-or-later AND LGPL-3.0-or-later
- opensuse-leap 16.0: libfsext-devel 20240501-bp160.1.13 Β· GFDL-1.3-or-later AND LGPL-3.0-or-later
- ubuntu questing: libfsext-dev 20240501-1ubuntu1
- ubuntu resolute: libfsext-dev 20240501-1ubuntu2 Β· LGPL-3.0-or-later
- ubuntu stonking: libfsext-dev 20240501-1ubuntu2 Β· LGPL-3.0-or-later
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash on : a language model's rewrite of the original, under its terms