Filesystem
Functions
Section titled “Functions”fs_get_descriptor
Section titled “fs_get_descriptor”fs_get_descriptor(): Get a file descriptor’s data
This function is used internally in order to implement read(), write(), and other standard functions functions. It could be useful for other APIs that want to present their resources as file descriptors but still implement extra non-standard functions; this allows them to use the file descriptor as input and still access the custom data.
Returns NULL if there is no file descriptor with this number, in which case the caller probably needs to set errno = EBADF.
fs_descriptor_t const *fs_get_descriptor(int fd)fs_create_descriptor
Section titled “fs_create_descriptor”fs_create_descriptor(): Create a new file descriptor
This function is used in open() and its variants to allocate new file descriptors. The descriptor’s data is created with a copy of the provided structure, which must include a non-NULL type attribute.
This function always returns the smallest file descriptor that is unused by the application and is not 0, 1 or 2; unless it runs out of file descriptors, in which case it returns -1 and the caller might want to set errno = ENFILE.
int fs_create_descriptor(fs_descriptor_t const *data)fs_free_descriptor
Section titled “fs_free_descriptor”fs_free_descriptor(): Close a file descriptor’s slot
This function frees the specified file descriptor. It is automatically called by close() after the descriptor type’s close() function, so there is normally no need to call this function directly.
void fs_free_descriptor(int fd)open_generic
Section titled “open_generic”open_generic(): Open a file descriptor using custom file functions
Opens a new file descriptor of the specified type with the provided user data. If reuse_fd < 0, a new file descriptor is allocated, otherwise the exact file descriptor reuse_fd is used. (This is useful to reopen standard streams.) In this case, the only possible return values are -1 and reuse_fd itself.
int open_generic(fs_descriptor_type_t const *type, void *data, int reuse_fd)fs_path_normalize
Section titled “fs_path_normalize”fs_path_normalize(): Normalize a path to eliminate ., .. and redundant /
This function creates a copy of the specified path which is an absolute path with redundant / removed and . and .. components resolved. For instance:
"" -> ”/” “/subfolder/./” -> “/subfolder” ”/../subfolder/../subfolder” -> “/subfolder” ”/../../x/y/../t” -> “/x/t”
The new string is created with malloc() and should be free()‘d after use.
char *fs_path_normalize(char const *path)fs_path_normalize_fc
Section titled “fs_path_normalize_fc”fs_path_normalize_fc(): Normalize a path and translate it to FONTCHARACTER
This function is similar to fs_path_normalize(), but it creates a 16-bit string that starts with \fls0\ rather than /, and can be used in direct calls to BFile.
uint16_t *fs_path_normalize_fc(char const *path)Macros
Section titled “Macros”FS_FD_MAX
Section titled “FS_FD_MAX”Maximum number of file descriptors
#define FS_FD_MAX 16typedef struct{ /* See <unistd.h> for a description of these functions */ ssize_t (*read)(void *data, void *buf, size_t size); ssize_t (*write)(void *data, void const *buf, size_t size); off_t (*lseek)(void *data, off_t offset, int whence); int (*close)(void *data);}fs_descriptor_type_tfs_descriptor_t: File descriptor information This internal type describes the entries of the descriptor table.
typedef struct{ /* Interface functions */ fs_descriptor_type_t const *type; /* Custom data (can also be an integer cast to (void *)) */ void *data;}fs_descriptor_t