diff options
Diffstat (limited to 'cpukit/include/rtems/fsmount.h')
-rw-r--r-- | cpukit/include/rtems/fsmount.h | 211 |
1 files changed, 211 insertions, 0 deletions
diff --git a/cpukit/include/rtems/fsmount.h b/cpukit/include/rtems/fsmount.h new file mode 100644 index 0000000000..441b0d68ef --- /dev/null +++ b/cpukit/include/rtems/fsmount.h @@ -0,0 +1,211 @@ +/** + * @file rtems/fsmount.h + * + * @defgroup rtems_fstab File System Mount Support + * + * @ingroup FileSystemTypesAndMount + * @brief File System Mount Functions + * + * This file contains the fsmount functions. These functions + * are used to mount a list of filesystems (and create their mount + * points before). + */ + +/* + * Copyright (c) 2003 IMD + * + * Ingenieurbuero fuer Microcomputertechnik Th. Doerfler + * <Thomas.Doerfler@imd-systems.de> + * all rights reserved + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * http://www.rtems.org/license/LICENSE. + */ + +#ifndef _FSMOUNT_H +#define _FSMOUNT_H + +#include <rtems.h> +#include <rtems/libio.h> +#include <rtems/libcsupport.h> + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @defgroup rtems_fstab File System Mount Support + * + * @ingroup FileSystemTypesAndMount + */ +/**@{**/ + +/** + * File system mount report and abort condition flags. + * + * The flags define, which conditions will cause a report during the mount + * process (via printf()) or abort the mount process. + * + * @see rtems_fstab_entry and rtems_fsmount(). + */ +typedef enum { + /** + * No conditions. + */ + RTEMS_FSTAB_NONE = 0U, + + /** + * Complete mount process was successful. + */ + RTEMS_FSTAB_OK = 0x1U, + + /** + * Mount point creation failed. + */ + RTEMS_FSTAB_ERROR_MOUNT_POINT = 0x2U, + + /** + * File system mount failed. + */ + RTEMS_FSTAB_ERROR_MOUNT = 0x4U, + + /** + * Something failed. + */ + RTEMS_FSTAB_ERROR = RTEMS_FSTAB_ERROR_MOUNT_POINT | RTEMS_FSTAB_ERROR_MOUNT, + + /** + * Any condition. + */ + RTEMS_FSTAB_ANY = RTEMS_FSTAB_OK | RTEMS_FSTAB_ERROR +} rtems_fstab_conditions; + +/** + * File system table entry. + */ +typedef struct { + /** + * Source for the mount. + */ + const char *source; + + /** + * Target for the mount. + */ + const char *target; + + /** + * File system operations. + */ + const char *type; + + /** + * File system mount options. + */ + rtems_filesystem_options_t options; + + /** + * Report @ref rtems_fstab_conditions "condition flags". + */ + uint16_t report_reasons; + + /** + * Abort @ref rtems_fstab_conditions "condition flags". + */ + uint16_t abort_reasons; +} rtems_fstab_entry; + +/** + * @brief Mounts the file systems listed in the file system mount table. + * + * Mounts the file systems listed in the file system mount table @a fstab of + * size @a size. + * + * Each file system will be mounted according to its table entry parameters. + * In case of an abort condition the corresponding table index will be reported + * in @a abort_index. The pointer @a abort_index may be @c NULL. The mount + * point paths will be created with rtems_mkdir() and need not exist + * beforehand. + * + * On success, zero is returned. On error, -1 is returned, and @c errno is set + * appropriately. + * + * @see rtems_bdpart_register_from_disk(). + * + * The following example code tries to mount a FAT file system within a SD + * Card. Some cards do not have a partition table so at first it tries to find + * a file system inside the hole disk. If this is successful the mount process + * will be aborted because the @ref RTEMS_FSTAB_OK condition is true. If this + * did not work it tries to mount the file system inside the first partition. + * If this fails the mount process will not be aborted (this is already the + * last entry), but the last error status will be returned. + * + * @code + * #include <stdio.h> + * #include <string.h> + * #include <errno.h> + * + * #include <rtems.h> + * #include <rtems/bdpart.h> + * #include <rtems/error.h> + * #include <rtems/fsmount.h> + * + * static const rtems_fstab_entry fstab [] = { + * { + * .source = "/dev/sd-card-a", + * .target = "/mnt", + * .type = "dosfs", + * .options = RTEMS_FILESYSTEM_READ_WRITE, + * .report_reasons = RTEMS_FSTAB_ANY, + * .abort_reasons = RTEMS_FSTAB_OK + * }, { + * .source = "/dev/sd-card-a1", + * .target = "/mnt", + * .type = "dosfs", + * .options = RTEMS_FILESYSTEM_READ_WRITE, + * .report_reasons = RTEMS_FSTAB_ANY, + * .abort_reasons = RTEMS_FSTAB_NONE + * } + * }; + * + * static void my_mount(void) + * { + * rtems_status_code sc = RTEMS_SUCCESSFUL; + * int rv = 0; + * size_t abort_index = 0; + * + * sc = rtems_bdpart_register_from_disk("/dev/sd-card-a"); + * if (sc != RTEMS_SUCCESSFUL) { + * printf("read partition table failed: %s\n", rtems_status_text(sc)); + * } + * + * rv = rtems_fsmount(fstab, sizeof(fstab) / sizeof(fstab [0]), &abort_index); + * if (rv != 0) { + * printf("mount failed: %s\n", strerror(errno)); + * } + * printf("mount aborted at %zu\n", abort_index); + * } + * @endcode + */ +int rtems_fsmount( + const rtems_fstab_entry *fstab, + size_t size, + size_t *abort_index +); + +/** @} */ + +typedef rtems_fstab_entry fstab_t; + +#define FSMOUNT_MNT_OK RTEMS_FSTAB_OK + +#define FSMOUNT_MNTPNT_CRTERR RTEMS_FSTAB_ERROR_MOUNT_POINT + +#define FSMOUNT_MNT_FAILED RTEMS_FSTAB_ERROR_MOUNT + +#ifdef __cplusplus +} +#endif + +#endif /* _FSMOUNT_H */ |