summaryrefslogtreecommitdiffstats
path: root/cpukit/libcsupport/src/base_fs.c
blob: e5ddb24494753de522796fe62d278b2ab23c314a (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
/*
 *  Base file system initialization
 *
 *  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$
 */

#if HAVE_CONFIG_H
#include "config.h"
#endif

#include <rtems.h>
#include <rtems/libio.h>
#include <rtems/libio_.h>

/*
 *  Global information for the base file system.
 */

rtems_user_env_t   rtems_global_user_env;
rtems_user_env_t * rtems_current_user_env = &rtems_global_user_env;

/*
 *  Default mode for created files.
 */


/*
 *  rtems_filesystem_initialize
 *
 *  Initialize the foundation of the file system.  This is specified
 *  by the structure rtems_filesystem_mount_table.  The usual
 *  configuration is a single instantiation of the IMFS or miniIMFS with
 *  a single "/dev" directory in it.
 */

void rtems_filesystem_initialize( void )
{
#if !defined(RTEMS_UNIX)
  int                                   status;
  rtems_filesystem_mount_table_entry_t *entry;
  rtems_filesystem_mount_table_t       *mt;
  rtems_filesystem_location_info_t		loc;

  /*
   *  Set the default umask to "022".
   */

  rtems_filesystem_umask = 022;


  init_fs_mount_table();

  /*
   *  mount the first filesystem.
   */

  if ( rtems_filesystem_mount_table_size == 0 )
    rtems_fatal_error_occurred( 0xABCD0001 );

  mt = &rtems_filesystem_mount_table[0];

  status = mount(
     &entry, mt->fs_ops, mt->fsoptions, mt->device, mt->mount_point );

  if ( status == -1 )
    rtems_fatal_error_occurred( 0xABCD0002 );

  rtems_filesystem_link_counts = 0;

  /* setup the 'current' and 'root' directories
   *
   * NOTE: cloning the pathlocs is not strictly
   *       necessary. Since we implicitely let
   *       all threads that don't call
   *       libio_set_private_env() share the same
   *       (initial) 'root' and 'current' locs,
   *       we (also implicitely) assume that the
   *       root filesystem doesn't care about
   *       reference counts.
   *       I just inserted the code snippet below
   *       to remind everybody of the fact by
   *       making it more explicit...
   *       Ideally, every thread would have to
   *       call either share_private_env() or
   *       set_private_env() - but then: that's
   *       gonna hit performance.
   *
   *       Till Straumann, 10/25/2002
   */
  rtems_filesystem_root        = entry->mt_fs_root;
  /* Clone the root pathloc */
  rtems_filesystem_evaluate_path("/", 0, &loc, 0);
  rtems_filesystem_root        = loc;
  /* One more clone for the current node */
  rtems_filesystem_evaluate_path("/", 0, &loc, 0);
  rtems_filesystem_current     = loc;

  /* Note: the global_env's refcnt doesn't matter
   * as the global env is never released
   */


  /*
   *  Traditionally RTEMS devices are under "/dev" so install this directory.
   *
   *  If the mkdir() fails, we can't print anything so just fatal error.
   *
   *  NOTE: UNIX root is 755 and owned by root/root (0/0).  It is actually
   *        created that way by the IMFS.
   */

  status = mkdir( "/dev", 0777);
  if ( status != 0 )
    rtems_fatal_error_occurred( 0xABCD0003 );

  /*
   *  You can't mount another filesystem properly until the mount point
   *  it will be mounted onto is created.  Moreover, if it is going to
   *  use a device, then it is REALLY unfair to attempt this
   *  before device drivers are initialized.  So we return via a base
   *  filesystem image and nothing auto-mounted at this point.
   */

#endif
}