source: rtems/c/src/libfs/src/imfs/imfs.h @ 94b357c2

4.104.114.84.95
Last change on this file since 94b357c2 was 94b357c2, checked in by Joel Sherrill <joel.sherrill@…>, on 11/05/99 at 21:10:54

Unmount was failing as a side-effect of splitting the rmnod handler
and not handling every case properly.

  • Property mode set to 100644
File size: 13.3 KB
RevLine 
[07a3253d]1/*
2 *  Header file for the In-Memory File System
3 *
4 *  COPYRIGHT (c) 1989-1998.
5 *  On-Line Applications Research Corporation (OAR).
6 *  Copyright assigned to U.S. Government, 1994.
7 *
8 *  The license and distribution terms for this file may be
9 *  found in the file LICENSE in this distribution or at
10 *  http://www.OARcorp.com/rtems/license.html.
11 *
12 *  $Id$
13 */
14
15#ifndef __IMFS_h
16#define __IMFS_h
17
18#ifdef __cplusplus
19extern "C" {
20#endif
21
22#include <rtems.h>
23#include <chain.h>
24
25#include <sys/types.h>
26#include <limits.h>
27#include <rtems/libio.h>
28
29/*
30 *  File name macros
31 */
32
33#define IMFS_is_valid_name_char( _ch ) ( 1 )
34
35#define IMFS_is_separator( _ch ) \
36   rtems_filesystem_is_separator( _ch )
37
38/*
39 *  Data types
40 */
41
42struct IMFS_jnode_tt;
43typedef struct IMFS_jnode_tt IMFS_jnode_t;
44
45typedef struct {
46  Chain_Control                          Entries;
47  rtems_filesystem_mount_table_entry_t  *mt_fs;
48}  IMFS_directory_t;
49
50typedef struct {
51  rtems_device_major_number  major;
52  rtems_device_minor_number  minor;
53}  IMFS_device_t;
54
55typedef struct {
56  IMFS_jnode_t  *link_node;
57} IMFS_link_t;
58
59typedef struct {
60  const char *name;
61} IMFS_sym_link_t;
62
63/*
64 *  IMFS "memfile" information
65 *
66 *  The data structure for the in-memory "memfiles" is based on classic UNIX.
67 *
68 *  block_ptr is a pointer to a block of IMFS_MEMFILE_BYTES_PER_BLOCK in
69 *  length which could be data or a table of pointers to blocks.
70 */
71
72#define IMFS_MEMFILE_BYTES_PER_BLOCK     64 /* 512 */
73#define IMFS_MEMFILE_BLOCK_SLOTS \
74  (IMFS_MEMFILE_BYTES_PER_BLOCK / sizeof(void *))
75
76typedef unsigned char * block_p;
77typedef block_p *block_ptr;
78
79typedef struct {
80  off_t      size;             /* size of file in bytes */
81  block_ptr  indirect;         /* array of 128 data blocks pointers */
82  block_ptr  doubly_indirect;  /* 128 indirect blocks */
83  block_ptr  triply_indirect;  /* 128 doubly indirect blocks */
84} IMFS_memfile_t;
85
86/*
87 *  Important block numbers for "memfiles"
88 */
89
90#define FIRST_INDIRECT           (0)
91#define LAST_INDIRECT            (IMFS_MEMFILE_BLOCK_SLOTS - 1)
92
93#define FIRST_DOUBLY_INDIRECT    (LAST_INDIRECT + 1)
94#define LAST_DOUBLY_INDIRECT     \
95   (LAST_INDIRECT + \
96     (IMFS_MEMFILE_BLOCK_SLOTS * IMFS_MEMFILE_BLOCK_SLOTS))
97
98#define FIRST_TRIPLY_INDIRECT    (LAST_DOUBLY_INDIRECT + 1)
99#define LAST_TRIPLY_INDIRECT \
100   (LAST_DOUBLY_INDIRECT +\
101     (IMFS_MEMFILE_BLOCK_SLOTS * \
102        IMFS_MEMFILE_BLOCK_SLOTS * IMFS_MEMFILE_BLOCK_SLOTS))
103
104#define IMFS_MEMFILE_MAXIMUM_SIZE \
105  (LAST_TRIPLY_INDIRECT * IMFS_MEMFILE_BYTES_PER_BLOCK)
106
107/*
108 *  What types of IMFS file systems entities there can be.
109 */
110
111#define IMFS_jnode_types_t rtems_filesystem_node_types_t
112#define IMFS_DIRECTORY     RTEMS_FILESYSTEM_DIRECTORY
113#define IMFS_DEVICE        RTEMS_FILESYSTEM_DEVICE
114#define IMFS_HARD_LINK     RTEMS_FILESYSTEM_HARD_LINK
115#define IMFS_SYM_LINK      RTEMS_FILESYSTEM_SYM_LINK
116#define IMFS_MEMORY_FILE   RTEMS_FILESYSTEM_MEMORY_FILE
117
118#define IMFS_NUMBER_OF_TYPES  (IMFS_MEMORY_FILE + 1)
119
120typedef union {
121  IMFS_directory_t   directory;
122  IMFS_device_t      device;
123  IMFS_link_t        hard_link;
124  IMFS_sym_link_t    sym_link;   
125  IMFS_memfile_t     file;   
126} IMFS_types_union;
127
[3cf8394]128/*
129 *  Maximum length of a "basename" of an IMFS file/node.
130 */
131
132#define IMFS_NAME_MAX  32
133
[07a3253d]134/*
135 *  The control structure for an IMFS jnode.
136 */
137
138struct IMFS_jnode_tt {
[3cf8394]139  Chain_Node          Node;                  /* for chaining them together */
140  IMFS_jnode_t       *Parent;                /* Parent node */
141  char                name[IMFS_NAME_MAX+1]; /* "basename" */
142  mode_t              st_mode;               /* File mode */
143  nlink_t             st_nlink;              /* Link count */
144  ino_t               st_ino;                /* inode */
145
146  uid_t               st_uid;                /* User ID of owner */
147  gid_t               st_gid;                /* Group ID of owner */
148
149  time_t              st_atime;              /* Time of last access */
150  time_t              st_mtime;              /* Time of last modification */
151  time_t              st_ctime;              /* Time of last status change */
152  IMFS_jnode_types_t  type;                  /* Type of this entry */
153  IMFS_types_union    info;
[07a3253d]154};
155
156#define IMFS_update_atime( _jnode )         \
157  do {                                      \
158    struct timeval tv;                      \
159    gettimeofday( &tv, 0 );                 \
160    _jnode->st_atime  = (time_t) tv.tv_sec; \
161  } while (0)
162               
163#define IMFS_update_mtime( _jnode )         \
164  do {                                      \
165    struct timeval tv;                      \
166    gettimeofday( &tv, 0 );                 \
167    _jnode->st_mtime  = (time_t) tv.tv_sec; \
168  } while (0)
169               
170#define IMFS_update_ctime( _jnode )         \
171  do {                                      \
172    struct timeval tv;                      \
173    gettimeofday( &tv, 0 );                 \
174    _jnode->st_ctime  = (time_t) tv.tv_sec; \
175  } while (0)
176
177#define IMFS_atime_mtime_update( _jnode )   \
178  do {                                      \
179    struct timeval tv;                      \
180    gettimeofday( &tv, 0 );                 \
181    _jnode->st_mtime  = (time_t) tv.tv_sec; \
182    _jnode->st_atime  = (time_t) tv.tv_sec; \
183  } while (0)
184
185typedef struct {
[657e1bf6]186  ino_t                             ino_count;
187  rtems_filesystem_file_handlers_r *memfile_handlers;
188  rtems_filesystem_file_handlers_r *directory_handlers;
[07a3253d]189} IMFS_fs_info_t;
190
191#define increment_and_check_linkcounts( _fs_info )                  \
192  ((IMFS_fs_info_t * )_fs_info)->link_counts++;                     \
193  if ( ((IMFS_fs_info_t * )_fs_info)->link_counts  > MAXSYMLINKS )  \
194    set_errno_and_return_minus_one( ELOOP )
195
196#define decrement_linkcounts(  _fs_info )             \
197  ((IMFS_fs_info_t * )_fs_info)->link_counts--;       
198
199/*
200 *  Type defination for tokens returned from IMFS_get_token
201 */
202
203typedef enum {
204  IMFS_NO_MORE_PATH,
205  IMFS_CURRENT_DIR,
206  IMFS_UP_DIR,
207  IMFS_NAME,
208  IMFS_INVALID_TOKEN
209} IMFS_token_types;
210
211/*
212 *  Shared Data
213 */
214
[94b357c2]215extern rtems_filesystem_file_handlers_r       IMFS_directory_handlers;
[51435fc7]216extern rtems_filesystem_file_handlers_r       IMFS_device_handlers;
[94b357c2]217extern rtems_filesystem_file_handlers_r       IMFS_link_handlers;
[51435fc7]218extern rtems_filesystem_file_handlers_r       IMFS_memfile_handlers;
[07a3253d]219extern rtems_filesystem_operations_table      IMFS_ops;
[657e1bf6]220extern rtems_filesystem_operations_table      miniIMFS_ops;
[07a3253d]221extern rtems_filesystem_limits_and_options_t  IMFS_LIMITS_AND_OPTIONS;
222
223/*
224 *  Routines
225 */
226
227int IMFS_initialize(
228   rtems_filesystem_mount_table_entry_t *mt_entry
229);
230
[657e1bf6]231int miniIMFS_initialize(
232   rtems_filesystem_mount_table_entry_t *mt_entry
233);
234
235int IMFS_initialize_support(
236   rtems_filesystem_mount_table_entry_t *mt_entry,
237   rtems_filesystem_operations_table    *op_table,
238   rtems_filesystem_file_handlers_r     *memfile_handlers,
239   rtems_filesystem_file_handlers_r     *directory_handlers
240);
241
[07a3253d]242int IMFS_fsunmount(
243   rtems_filesystem_mount_table_entry_t *mt_entry
244);
245
246
247/*
248 * Returns the number of characters copied from path to token.
249 */
250IMFS_token_types IMFS_get_token(
251  const char       *path,
252  char             *token,
253  int              *token_len
254);
255
256void IMFS_dump( void );
257
258void IMFS_initialize_jnode(
259  IMFS_jnode_t        *the_jnode,
260  IMFS_jnode_types_t   type,
261  IMFS_jnode_t        *the_parent,
262  char                *name,
263  mode_t               mode
264);
265
266IMFS_jnode_t *IMFS_find_match_in_dir(
267  IMFS_jnode_t *directory,                         /* IN */
268  char         *name                               /* IN */
269);
270
271rtems_filesystem_node_types_t IMFS_node_type(
272  rtems_filesystem_location_info_t    *pathloc     /* IN */
273);
274
275int IMFS_stat(
276  rtems_filesystem_location_info_t *loc,           /* IN  */
277  struct stat                      *buf            /* OUT */
278);
279
280int IMFS_evaluate_link(
281  rtems_filesystem_location_info_t *node,        /* IN/OUT */
282  int                               flags        /* IN     */
283);
284
285int IMFS_eval_path( 
286  const char                        *pathname,     /* IN     */
287  int                               flags,         /* IN     */
288  rtems_filesystem_location_info_t  *pathloc       /* IN/OUT */
289);
290
291
292int IMFS_link(
293  rtems_filesystem_location_info_t  *to_loc,      /* IN */
294  rtems_filesystem_location_info_t  *parent_loc,  /* IN */
295  const char                        *token        /* IN */
296);
297
298int IMFS_unlink(
299  rtems_filesystem_location_info_t  *pathloc       /* IN */
300);
301
302int IMFS_chown(
303  rtems_filesystem_location_info_t  *pathloc,      /* IN */
304  uid_t                              owner,        /* IN */
305  gid_t                              group         /* IN */
306);
307
308int IMFS_freenodinfo(
309  rtems_filesystem_location_info_t  *pathloc       /* IN */
310);
311
312int IMFS_mknod(
313  const char                        *path,         /* IN */
314  mode_t                             mode,         /* IN */
315  dev_t                              dev,          /* IN */
316  rtems_filesystem_location_info_t  *pathloc       /* IN/OUT */
317);
318
319IMFS_jnode_t *IMFS_create_node(
320  rtems_filesystem_location_info_t  *parent_loc,   /* IN  */
321  IMFS_jnode_types_t                 type,         /* IN  */
322  char                              *name,         /* IN  */
323  mode_t                             mode,         /* IN  */
324  IMFS_types_union                  *info          /* IN  */
325);
326
327int IMFS_evaluate_for_make(
328  const char                         *path,        /* IN     */
329  rtems_filesystem_location_info_t   *pathloc,     /* IN/OUT */
330  const char                        **name         /* OUT    */
331);
332
333int IMFS_mount(
334  rtems_filesystem_mount_table_entry_t *mt_entry  /* IN */
335);
336
337int IMFS_unmount(
338  rtems_filesystem_mount_table_entry_t *mt_entry  /* IN */
339);
340
341int IMFS_freenod(
342  rtems_filesystem_location_info_t  *node         /* IN/OUT */
343);
344
345int IMFS_memfile_remove(
346 IMFS_jnode_t  *the_jnode         /* IN/OUT */
347);
348
349int memfile_ftruncate(
350  rtems_libio_t *iop,               /* IN  */
351  off_t          length             /* IN  */
352);
[b568ccb]353
[07a3253d]354int imfs_dir_open(
355  rtems_libio_t *iop,             /* IN  */
356  const char    *pathname,        /* IN  */
357  unsigned32     flag,            /* IN  */
358  unsigned32     mode             /* IN  */
359);
[b568ccb]360
[07a3253d]361int imfs_dir_close(
362  rtems_libio_t *iop             /* IN  */
363);
[b568ccb]364
[07a3253d]365int imfs_dir_read(
366  rtems_libio_t *iop,              /* IN  */
367  void          *buffer,           /* IN  */
368  unsigned32     count             /* IN  */
369);
[b568ccb]370
[07a3253d]371int imfs_dir_lseek(
372  rtems_libio_t        *iop,              /* IN  */
373  off_t                 offset,           /* IN  */
374  int                   whence            /* IN  */
375);
[b568ccb]376
[07a3253d]377int imfs_dir_fstat(
378  rtems_filesystem_location_info_t *loc,         /* IN  */
379  struct stat                      *buf          /* OUT */
380);
[b568ccb]381
382int imfs_dir_rmnod(
383  rtems_filesystem_location_info_t      *pathloc       /* IN */
384);
385
[07a3253d]386int memfile_open(
387  rtems_libio_t *iop,             /* IN  */
388  const char    *pathname,        /* IN  */
389  unsigned32     flag,            /* IN  */
390  unsigned32     mode             /* IN  */
391);
[b568ccb]392
[07a3253d]393int memfile_close(
394  rtems_libio_t *iop             /* IN  */
395);
[b568ccb]396
[07a3253d]397int memfile_read(
398  rtems_libio_t *iop,             /* IN  */
399  void          *buffer,          /* IN  */
400  unsigned32     count            /* IN  */
401);
[b568ccb]402
[07a3253d]403int memfile_write(
404  rtems_libio_t *iop,             /* IN  */
405  const void    *buffer,          /* IN  */
406  unsigned32     count            /* IN  */
407);
[b568ccb]408
[07a3253d]409int memfile_ioctl(
410  rtems_libio_t *iop,             /* IN  */
411  unsigned32     command,         /* IN  */
412  void          *buffer           /* IN  */
413);
[b568ccb]414
[07a3253d]415int memfile_lseek(
416  rtems_libio_t        *iop,        /* IN  */
417  off_t                 offset,     /* IN  */
418  int                   whence      /* IN  */
419);
[b568ccb]420
421int memfile_rmnod(
422  rtems_filesystem_location_info_t      *pathloc       /* IN */
423);
424
[07a3253d]425int device_open(
426  rtems_libio_t *iop,            /* IN  */
427  const char    *pathname,       /* IN  */
428  unsigned32     flag,           /* IN  */
429  unsigned32     mode            /* IN  */
430);
[b568ccb]431
[07a3253d]432int device_close(
433  rtems_libio_t *iop             /* IN  */
434);
[b568ccb]435
[07a3253d]436int device_read(
437  rtems_libio_t *iop,            /* IN  */
438  void          *buffer,         /* IN  */
439  unsigned32     count           /* IN  */
440);
[b568ccb]441
[07a3253d]442int device_write(
443  rtems_libio_t *iop,               /* IN  */
444  const void    *buffer,            /* IN  */
445  unsigned32     count              /* IN  */
446);
[b568ccb]447
[07a3253d]448int device_ioctl(
449  rtems_libio_t *iop,               /* IN  */
450  unsigned32     command,           /* IN  */
451  void          *buffer             /* IN  */
452);
[b568ccb]453
[07a3253d]454int device_lseek(
455  rtems_libio_t *iop,               /* IN  */
456  off_t          offset,            /* IN  */
457  int            whence             /* IN  */
458);
[b568ccb]459
[07a3253d]460int IMFS_utime(
461  rtems_filesystem_location_info_t  *pathloc,       /* IN */
462  time_t                             actime,        /* IN */
463  time_t                             modtime        /* IN */
464);
[b568ccb]465
[07a3253d]466int IMFS_fchmod(
467  rtems_filesystem_location_info_t *loc,
468  mode_t                            mode
469);
470
471int IMFS_symlink(
472  rtems_filesystem_location_info_t  *parent_loc,  /* IN */
473  const char                        *link_name,
474  const char                        *node_name
475);
476
477int IMFS_readlink(
478 rtems_filesystem_location_info_t   *loc,         /* IN */
479 char                               *buf,         /* OUT */
480 size_t                             bufsize   
481);
482
[49629bd8]483int IMFS_fdatasync(
484  rtems_libio_t *iop
485);
486
[578a415]487int IMFS_fcntl(
488  int            cmd,
489  rtems_libio_t *iop
490);
491
[94b357c2]492int IMFS_rmnod(
493  rtems_filesystem_location_info_t      *pathloc       /* IN */
494);
495
[07a3253d]496#ifdef __cplusplus
497}
498#endif
499
500#endif
501/* end of include file */
Note: See TracBrowser for help on using the repository browser.