20typedef struct _sysfs_item
42#define SYSFS_RO_ITEM(_name, _show_fn) { .name = _name, .type = SYSFS_RO, .show = _show_fn }
43#define SYSFS_RW_ITEM(_name, _show_fn, _store_fn) { .name = _name, .type = SYSFS_RW, .show = _show_fn, .store = _store_fn }
44#define SYSFS_WO_ITEM(_name, _store_fn) { .name = _name, .type = SYSFS_WO, .store = _store_fn }
45#define SYSFS_MEM_ITEM(_name, _mmap_fn, _munmap_fn) { .name = _name, .type = SYSFS_MEM, .mem = { .mmap = _mmap_fn, .munmap = _munmap_fn } }
46#define SYSFS_DYN_ITEMS(_name, _iterate_fn, _lookup_fn) { .type = SYSFS_DYN, .dyn_iterate = _iterate_fn, .dyn_lookup = _lookup_fn }
47#define SYSFS_DYN_DIR(_name, _iterate_fn, _lookup_fn, _create_fn) { .type = SYSFS_DYN, .dyn_iterate = _iterate_fn, .dyn_lookup = _lookup_fn, .dyn_create = _create_fn }
50#define SYSFS_ITEM_RO_PRINTF(name, fmt, ...) \
51 static bool name(sysfs_file_t *file) \
53 sysfs_printf(file, fmt, ##__VA_ARGS__); \
57#define SYSFS_ITEM_RO_STRING(name, value) SYSFS_ITEM_RO_PRINTF(name, "%s\n", value)
59#define SYSFS_DEFINE_DIR(sysfs_name, sysfs_items) static sysfs_dir_t __sysfs_##sysfs_name(#sysfs_name, sysfs_items, MOS_ARRAY_SIZE(sysfs_items))
MOSAPI void(1, 2) fatal_abort(const char *fmt
list_node_t list_head
A linked list head.
basic_string_view< char > string_view
mos::basic_string< char, mos::default_allocator > string
sysfs_item_t *const items
sysfs_dir_t(mos::string_view name, sysfs_item_t *items, size_t num_items)
list_head _dynamic_items
for internal use only
dentry_t * _dentry
for internal use only
void(* dyn_iterate)(struct _sysfs_item *item, dentry_t *dentry, vfs_listdir_state_t *iterator_state, dentry_iterator_op op)
size_t(* store)(sysfs_file_t *file, const char *buf, size_t count, off_t offset)
bool(* mmap)(sysfs_file_t *file, vmap_t *vmap, off_t offset)
bool(* munmap)(sysfs_file_t *file, vmap_t *vmap, bool *unmapped)
bool(* dyn_create)(inode_t *parent_dir, dentry_t *dentry, file_type_t type, file_perm_t perm)
bool(* dyn_lookup)(inode_t *parent_dir, dentry_t *dentry)
bool(* show)(sysfs_file_t *file)
ssize_t sysfs_printf(sysfs_file_t *file, const char *fmt,...)
ssize_t sysfs_put_data(sysfs_file_t *file, const void *data, size_t count)
should_inline void sysfs_register_root_file(sysfs_item_t *item)
Register an entry in the sysfs root directory.
void sysfs_register(sysfs_dir_t *entry)
Register a sysfs directory.
void sysfs_file_set_data(sysfs_file_t *file, void *data)
void sysfs_register_file(sysfs_dir_t *sysfs_dir, sysfs_item_t *item)
Register an entry in a sysfs directory.
inode_t * sysfs_create_inode(file_type_t type, void *data)
@ SYSFS_MEM
memory-backed file
@ SYSFS_DYN
dynamic directory items
sysfs_item_t * sysfs_file_get_item(sysfs_file_t *file)
void * sysfs_file_get_data(sysfs_file_t *file)
void dentry_iterator_op(vfs_listdir_state_t *state, u64 ino, mos::string_view name, file_type_t type)