⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 imfs.h

📁 RTEMS (Real-Time Executive for Multiprocessor Systems) is a free open source real-time operating sys
💻 H
字号:
/* *  Header file for the In-Memory File System * *  COPYRIGHT (c) 1989-1999. *  On-Line Applications Research Corporation (OAR). * *  The license and distribution terms for this file may be *  found in the file LICENSE in this distribution or at *  http://www.rtems.com/license/LICENSE. * *  $Id: imfs.h,v 1.16.2.1 2003/09/04 18:47:02 joel Exp $ */#ifndef __IMFS_h#define __IMFS_h#ifdef __cplusplusextern "C" {#endif#include <rtems.h>#include <chain.h>#include <sys/types.h>#include <limits.h>#include <rtems/libio.h>/* *  File name macros */#define IMFS_is_valid_name_char( _ch ) ( 1 )#define IMFS_is_separator( _ch ) \   rtems_filesystem_is_separator( _ch )/* *  Data types */struct IMFS_jnode_tt;typedef struct IMFS_jnode_tt IMFS_jnode_t;typedef struct {  Chain_Control                          Entries;  rtems_filesystem_mount_table_entry_t  *mt_fs;}  IMFS_directory_t;typedef struct {  rtems_device_major_number  major;  rtems_device_minor_number  minor;}  IMFS_device_t;typedef struct {  IMFS_jnode_t  *link_node;} IMFS_link_t;typedef struct {  const char *name;} IMFS_sym_link_t;/* *  IMFS "memfile" information * *  The data structure for the in-memory "memfiles" is based on classic UNIX. * *  block_ptr is a pointer to a block of IMFS_MEMFILE_BYTES_PER_BLOCK in *  length which could be data or a table of pointers to blocks. * *  Setting IMFS_MEMFILE_BYTES_PER_BLOCK to different values has a significant *  impact on the maximum file size supported as well as the amount of *  memory wasted due to internal file fragmentation.  The following *  is a list of maximum file sizes based on various settings * *    max_filesize with blocks of   16 is         1,328 *    max_filesize with blocks of   32 is        18,656 *    max_filesize with blocks of   64 is       279,488 *    max_filesize with blocks of  128 is     4,329,344 *    max_filesize with blocks of  256 is    68,173,568 *    max_filesize with blocks of  512 is 1,082,195,456 */#define IMFS_MEMFILE_BYTES_PER_BLOCK     128#define IMFS_MEMFILE_BLOCK_SLOTS \  (IMFS_MEMFILE_BYTES_PER_BLOCK / sizeof(void *))typedef unsigned char * block_p;typedef block_p *block_ptr;typedef struct {  off_t      size;             /* size of file in bytes */  block_ptr  indirect;         /* array of 128 data blocks pointers */  block_ptr  doubly_indirect;  /* 128 indirect blocks */  block_ptr  triply_indirect;  /* 128 doubly indirect blocks */} IMFS_memfile_t;typedef struct {  off_t      size;             /* size of file in bytes */  block_p    direct;           /* pointer to file image */} IMFS_linearfile_t;/* *  Important block numbers for "memfiles" */#define FIRST_INDIRECT           (0)#define LAST_INDIRECT            (IMFS_MEMFILE_BLOCK_SLOTS - 1)#define FIRST_DOUBLY_INDIRECT    (LAST_INDIRECT + 1)#define LAST_DOUBLY_INDIRECT     \   (LAST_INDIRECT + \     (IMFS_MEMFILE_BLOCK_SLOTS * IMFS_MEMFILE_BLOCK_SLOTS))#define FIRST_TRIPLY_INDIRECT    (LAST_DOUBLY_INDIRECT + 1)#define LAST_TRIPLY_INDIRECT \   (LAST_DOUBLY_INDIRECT +\     (IMFS_MEMFILE_BLOCK_SLOTS * \        IMFS_MEMFILE_BLOCK_SLOTS * IMFS_MEMFILE_BLOCK_SLOTS))#define IMFS_MEMFILE_MAXIMUM_SIZE \  (LAST_TRIPLY_INDIRECT * IMFS_MEMFILE_BYTES_PER_BLOCK)/* *  What types of IMFS file systems entities there can be. */#define IMFS_jnode_types_t rtems_filesystem_node_types_t#define IMFS_DIRECTORY     RTEMS_FILESYSTEM_DIRECTORY#define IMFS_DEVICE        RTEMS_FILESYSTEM_DEVICE#define IMFS_HARD_LINK     RTEMS_FILESYSTEM_HARD_LINK#define IMFS_SYM_LINK      RTEMS_FILESYSTEM_SYM_LINK#define IMFS_MEMORY_FILE   RTEMS_FILESYSTEM_MEMORY_FILE#define IMFS_LINEAR_FILE   (IMFS_MEMORY_FILE + 1)#define IMFS_NUMBER_OF_TYPES  (IMFS_LINEAR_FILE + 1)typedef union {  IMFS_directory_t   directory;  IMFS_device_t      device;  IMFS_link_t        hard_link;  IMFS_sym_link_t    sym_link;     IMFS_memfile_t     file;     IMFS_linearfile_t  linearfile;   } IMFS_types_union;/* *  Maximum length of a "basename" of an IMFS file/node. */#define IMFS_NAME_MAX  32/* *  The control structure for an IMFS jnode. */struct IMFS_jnode_tt {  Chain_Node          Node;                  /* for chaining them together */  IMFS_jnode_t       *Parent;                /* Parent node */  char                name[IMFS_NAME_MAX+1]; /* "basename" */   mode_t              st_mode;               /* File mode */  nlink_t             st_nlink;              /* Link count */  ino_t               st_ino;                /* inode */  uid_t               st_uid;                /* User ID of owner */  gid_t               st_gid;                /* Group ID of owner */  time_t              stat_atime;            /* Time of last access */  time_t              stat_mtime;            /* Time of last modification */  time_t              stat_ctime;            /* Time of last status change */  IMFS_jnode_types_t  type;                  /* Type of this entry */  IMFS_types_union    info;};#define IMFS_update_atime( _jnode )         \  do {                                      \    struct timeval tv;                      \    gettimeofday( &tv, 0 );                 \    _jnode->stat_atime  = (time_t) tv.tv_sec; \  } while (0)                #define IMFS_update_mtime( _jnode )         \  do {                                      \    struct timeval tv;                      \    gettimeofday( &tv, 0 );                 \    _jnode->stat_mtime  = (time_t) tv.tv_sec; \  } while (0)                #define IMFS_update_ctime( _jnode )         \  do {                                      \    struct timeval tv;                      \    gettimeofday( &tv, 0 );                 \    _jnode->stat_ctime  = (time_t) tv.tv_sec; \  } while (0)#define IMFS_atime_mtime_update( _jnode )   \  do {                                      \    struct timeval tv;                      \    gettimeofday( &tv, 0 );                 \    _jnode->stat_mtime  = (time_t) tv.tv_sec; \    _jnode->stat_atime  = (time_t) tv.tv_sec; \  } while (0)typedef struct {  ino_t                             ino_count;  rtems_filesystem_file_handlers_r *linearfile_handlers;  rtems_filesystem_file_handlers_r *memfile_handlers;  rtems_filesystem_file_handlers_r *directory_handlers;} IMFS_fs_info_t;#if UNUSED/* FIXME: Unused, we might want to remove it */#define increment_and_check_linkcounts( _fs_info )                  \  ((IMFS_fs_info_t * )_fs_info)->link_counts++;                     \  if ( ((IMFS_fs_info_t * )_fs_info)->link_counts  > MAXSYMLINKS )  \    rtems_set_errno_and_return_minus_one( ELOOP )#endif#define decrement_linkcounts(  _fs_info )             \  ((IMFS_fs_info_t * )_fs_info)->link_counts--;        /* *  Type defination for tokens returned from IMFS_get_token */typedef enum {  IMFS_NO_MORE_PATH,  IMFS_CURRENT_DIR,  IMFS_UP_DIR,  IMFS_NAME,  IMFS_INVALID_TOKEN} IMFS_token_types;/* *  Shared Data */extern rtems_filesystem_file_handlers_r       IMFS_directory_handlers;extern rtems_filesystem_file_handlers_r       IMFS_device_handlers;extern rtems_filesystem_file_handlers_r       IMFS_link_handlers;extern rtems_filesystem_file_handlers_r       IMFS_linearfile_handlers;extern rtems_filesystem_file_handlers_r       IMFS_memfile_handlers;extern rtems_filesystem_operations_table      IMFS_ops;extern rtems_filesystem_operations_table      miniIMFS_ops;extern rtems_filesystem_limits_and_options_t  IMFS_LIMITS_AND_OPTIONS; /* *  Routines */int IMFS_initialize(    rtems_filesystem_mount_table_entry_t *mt_entry);int miniIMFS_initialize(    rtems_filesystem_mount_table_entry_t *mt_entry);int IMFS_initialize_support(    rtems_filesystem_mount_table_entry_t *mt_entry,   rtems_filesystem_operations_table    *op_table,   rtems_filesystem_file_handlers_r     *linearfile_handlers,   rtems_filesystem_file_handlers_r     *memfile_handlers,   rtems_filesystem_file_handlers_r     *directory_handlers);int IMFS_fsunmount(   rtems_filesystem_mount_table_entry_t *mt_entry);int rtems_tarfs_load(   char          *mountpoint,   unsigned char *addr,   unsigned long length);/* * Returns the number of characters copied from path to token. */IMFS_token_types IMFS_get_token(  const char       *path,  char             *token,  int              *token_len);void IMFS_dump( void );void IMFS_initialize_jnode(  IMFS_jnode_t        *the_jnode,  IMFS_jnode_types_t   type,  IMFS_jnode_t        *the_parent,  char                *name,  mode_t               mode);IMFS_jnode_t *IMFS_find_match_in_dir(  IMFS_jnode_t *directory,                         /* IN */  char         *name                               /* IN */);rtems_filesystem_node_types_t IMFS_node_type(  rtems_filesystem_location_info_t    *pathloc     /* IN */);int IMFS_stat(  rtems_filesystem_location_info_t *loc,           /* IN  */  struct stat                      *buf            /* OUT */);int IMFS_Set_handlers(    rtems_filesystem_location_info_t   *loc );int IMFS_evaluate_link(  rtems_filesystem_location_info_t *node,        /* IN/OUT */  int                               flags        /* IN     */);int IMFS_eval_path(    const char                        *pathname,     /* IN     */  int                               flags,         /* IN     */  rtems_filesystem_location_info_t  *pathloc       /* IN/OUT */);int IMFS_link(  rtems_filesystem_location_info_t  *to_loc,      /* IN */  rtems_filesystem_location_info_t  *parent_loc,  /* IN */  const char                        *token        /* IN */);int IMFS_unlink(  rtems_filesystem_location_info_t  *pathloc       /* IN */);int IMFS_chown(  rtems_filesystem_location_info_t  *pathloc,      /* IN */  uid_t                              owner,        /* IN */  gid_t                              group         /* IN */);int IMFS_freenodinfo(  rtems_filesystem_location_info_t  *pathloc       /* IN */);int IMFS_mknod(  const char                        *path,         /* IN */  mode_t                             mode,         /* IN */  dev_t                              dev,          /* IN */  rtems_filesystem_location_info_t  *pathloc       /* IN/OUT */);IMFS_jnode_t *IMFS_create_node(  rtems_filesystem_location_info_t  *parent_loc,   /* IN  */  IMFS_jnode_types_t                 type,         /* IN  */  char                              *name,         /* IN  */  mode_t                             mode,         /* IN  */  IMFS_types_union                  *info          /* IN  */);int IMFS_evaluate_for_make(  const char                         *path,        /* IN     */  rtems_filesystem_location_info_t   *pathloc,     /* IN/OUT */  const char                        **name         /* OUT    */);int IMFS_mount(  rtems_filesystem_mount_table_entry_t *mt_entry  /* IN */);int IMFS_unmount(  rtems_filesystem_mount_table_entry_t *mt_entry  /* IN */);int IMFS_freenod(  rtems_filesystem_location_info_t  *node         /* IN/OUT */);int IMFS_memfile_remove( IMFS_jnode_t  *the_jnode         /* IN/OUT */);int memfile_ftruncate(  rtems_libio_t *iop,               /* IN  */  off_t          length             /* IN  */);int imfs_dir_open(  rtems_libio_t *iop,             /* IN  */  const char    *pathname,        /* IN  */  unsigned32     flag,            /* IN  */  unsigned32     mode             /* IN  */);int imfs_dir_close(  rtems_libio_t *iop             /* IN  */);ssize_t imfs_dir_read(  rtems_libio_t *iop,              /* IN  */  void          *buffer,           /* IN  */  unsigned32     count             /* IN  */);int imfs_dir_lseek(  rtems_libio_t        *iop,              /* IN  */  off_t                 offset,           /* IN  */  int                   whence            /* IN  */);int imfs_dir_fstat(  rtems_filesystem_location_info_t *loc,         /* IN  */  struct stat                      *buf          /* OUT */);int imfs_dir_rmnod(  rtems_filesystem_location_info_t      *pathloc       /* IN */);int linearfile_read(  rtems_libio_t *iop,             /* IN  */  void          *buffer,          /* IN  */  unsigned32     count            /* IN  */);int linearfile_lseek(  rtems_libio_t        *iop,        /* IN  */  off_t                 offset,     /* IN  */  int                   whence      /* IN  */);int memfile_open(  rtems_libio_t *iop,             /* IN  */  const char    *pathname,        /* IN  */  unsigned32     flag,            /* IN  */  unsigned32     mode             /* IN  */);int memfile_close(  rtems_libio_t *iop             /* IN  */);ssize_t memfile_read(  rtems_libio_t *iop,             /* IN  */  void          *buffer,          /* IN  */  unsigned32     count            /* IN  */);ssize_t memfile_write(  rtems_libio_t *iop,             /* IN  */  const void    *buffer,          /* IN  */  unsigned32     count            /* IN  */);int memfile_ioctl(  rtems_libio_t *iop,             /* IN  */  unsigned32     command,         /* IN  */  void          *buffer           /* IN  */);int memfile_lseek(  rtems_libio_t        *iop,        /* IN  */  off_t                 offset,     /* IN  */  int                   whence      /* IN  */);int memfile_rmnod(  rtems_filesystem_location_info_t      *pathloc       /* IN */);int device_open(  rtems_libio_t *iop,            /* IN  */  const char    *pathname,       /* IN  */  unsigned32     flag,           /* IN  */  unsigned32     mode            /* IN  */);int device_close(  rtems_libio_t *iop             /* IN  */);ssize_t device_read(  rtems_libio_t *iop,            /* IN  */  void          *buffer,         /* IN  */  unsigned32     count           /* IN  */);ssize_t device_write(  rtems_libio_t *iop,               /* IN  */  const void    *buffer,            /* IN  */  unsigned32     count              /* IN  */);int device_ioctl(  rtems_libio_t *iop,               /* IN  */  unsigned32     command,           /* IN  */  void          *buffer             /* IN  */);int device_lseek(  rtems_libio_t *iop,               /* IN  */  off_t          offset,            /* IN  */  int            whence             /* IN  */);int IMFS_utime(  rtems_filesystem_location_info_t  *pathloc,       /* IN */  time_t                             actime,        /* IN */  time_t                             modtime        /* IN */);int IMFS_fchmod(  rtems_filesystem_location_info_t *loc,  mode_t                            mode);int IMFS_symlink(  rtems_filesystem_location_info_t  *parent_loc,  /* IN */  const char                        *link_name,  const char                        *node_name);int IMFS_readlink( rtems_filesystem_location_info_t   *loc,         /* IN */ char                               *buf,         /* OUT */ size_t                             bufsize    );int IMFS_fdatasync(  rtems_libio_t *iop);int IMFS_fcntl(  int            cmd,  rtems_libio_t *iop);int IMFS_rmnod(  rtems_filesystem_location_info_t      *pathloc       /* IN */);#ifdef __cplusplus}#endif#endif/* end of include file */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -