It is easier to use an empty string when the root directory is intended. Adjust the code to drop use of "/" and NULL and just use and empty string. Signed-off-by: Simon Glass <sjg@chromium.org>
143 lines
3.8 KiB
C
143 lines
3.8 KiB
C
/* SPDX-License-Identifier: GPL-2.0 */
|
|
/*
|
|
* U-Boot Filesystem directory
|
|
*
|
|
* Copyright 2025 Simon Glass <sjg@chromium.org>
|
|
*/
|
|
|
|
#ifndef __DIR_H
|
|
#define __DIR_H
|
|
|
|
struct driver;
|
|
struct fs_dirent;
|
|
struct fs_dir_stream;
|
|
struct udevice;
|
|
|
|
/**
|
|
* enum dir_open_flags_t - Flags to control the open mode of files
|
|
*
|
|
* @DIR_O_RDONLY: Open the file read-only
|
|
* @DIR_O_WRONLY: Open the file write-only, overwriting existing file contents
|
|
* @DIR_O_RDWR: Open the file for read/write, allowing the file to be updated
|
|
*/
|
|
enum dir_open_flags_t {
|
|
DIR_O_RDONLY,
|
|
DIR_O_WRONLY,
|
|
DIR_O_RDWR,
|
|
};
|
|
|
|
/**
|
|
* struct dir_uc_priv - Uclass information for each directory
|
|
*
|
|
* @path: Absolute path to directory, "" for root
|
|
*/
|
|
struct dir_uc_priv {
|
|
char *path;
|
|
};
|
|
|
|
/**
|
|
* struct dir_ops - Operations on directories
|
|
*/
|
|
struct dir_ops {
|
|
/**
|
|
* open() - Open a directory for reading
|
|
*
|
|
* @dev: Directory device (UCLASS_DIR)
|
|
* @strm: Stream information to fill in, on success (zeroed on entry)
|
|
*/
|
|
int (*open)(struct udevice *dev, struct fs_dir_stream *strm);
|
|
|
|
/**
|
|
* read() - Read a single directory entry
|
|
*
|
|
* @dev: Directory device (UCLASS_DIR)
|
|
* @strm: Directory stream as created by open()
|
|
* @dent: Directory entry to fill in (zeroed on entry)
|
|
* Return: 0 if OK, -ENOENT if no more entries, other -ve value on error
|
|
*/
|
|
int (*read)(struct udevice *dev, struct fs_dir_stream *strm,
|
|
struct fs_dirent *dent);
|
|
|
|
/**
|
|
* close() - Stop reading the directory
|
|
*
|
|
* @dev: Directory device (UCLASS_DIR)
|
|
* @strm: Directory stream as created by dir_opendir()
|
|
* Return: 0 if OK, -ve on error
|
|
*/
|
|
int (*close)(struct udevice *dev, struct fs_dir_stream *strm);
|
|
|
|
/**
|
|
* open_file() - Create a new file device for a file
|
|
*
|
|
* @dev: Directory device (UCLASS_DIR)
|
|
* @leaf: Filename within the directory
|
|
* @flags: Open-mode flags to use
|
|
* @filp: Returns the UCLASS_FILE device
|
|
* Return: 0 if OK, -ve on error
|
|
*/
|
|
int (*open_file)(struct udevice *dev, const char *leaf,
|
|
enum dir_open_flags_t oflags, struct udevice **filp);
|
|
};
|
|
|
|
/* Get access to a directory's operations */
|
|
#define dir_get_ops(dev) ((struct dir_ops *)(dev)->driver->ops)
|
|
|
|
/**
|
|
* dir_open() - Open a directory for reading
|
|
*
|
|
* @dev: Directory device (UCLASS_DIR)
|
|
* @strm: Returns allocated pointer to stream information, on success
|
|
*/
|
|
int dir_open(struct udevice *dev, struct fs_dir_stream **strmp);
|
|
|
|
/**
|
|
* dir_read() - Read a single directory entry
|
|
*
|
|
* @dev: Directory device (UCLASS_DIR)
|
|
* @strm: Directory stream as created by open()
|
|
* @dent: Directory entry to fill in
|
|
* Return: 0 if OK, -ENOENT if no more entries, other -ve value on other
|
|
* error
|
|
*/
|
|
int dir_read(struct udevice *dev, struct fs_dir_stream *strm,
|
|
struct fs_dirent *dent);
|
|
|
|
/**
|
|
* dir_close() - Stop reading the directory
|
|
*
|
|
* Frees @strm and releases the directory
|
|
*
|
|
* @dev: Directory device (UCLASS_DIR)
|
|
* @strm: Directory stream as created by dir_opendir()
|
|
* Return: 0 if OK, -ve on error
|
|
*/
|
|
int dir_close(struct udevice *dev, struct fs_dir_stream *strm);
|
|
|
|
/**
|
|
* dir_add_probe() - Add a new directory and probe it
|
|
*
|
|
* This sets up the uclass-private data for the new directory
|
|
*
|
|
* @fsdev: Filesystem containing the directory
|
|
* @drv: Driver to use
|
|
* @path Absolute path to directory (within the filesystem), or "" for root
|
|
* @devp: Returns the new device, probed ready for use *
|
|
*/
|
|
int dir_add_probe(struct udevice *fsdev, struct driver *drv, const char *path,
|
|
struct udevice **devp);
|
|
|
|
/**
|
|
* dir_open_file() - Create a new file device for a file
|
|
*
|
|
* @dev: Directory device (UCLASS_DIR)
|
|
* @leaf: Filename within the directory
|
|
* @flags: Open-mode flags to use
|
|
* @filp: Returns the UCLASS_FILE device
|
|
* Return: 0 if OK, -ve on error
|
|
*/
|
|
int dir_open_file(struct udevice *dev, const char *leaf,
|
|
enum dir_open_flags_t oflags, struct udevice **filp);
|
|
|
|
#endif
|