source: rtems/cpukit/libfs/src/imfs/imfs_initsupp.c @ f785492

4.115
Last change on this file since f785492 was a2f5c7e1, checked in by Sebastian Huber <sebastian.huber@…>, on 02/08/15 at 15:09:27

IMFS: Allow static initialization of FS info

  • Property mode set to 100644
File size: 4.1 KB
Line 
1/**
2 * @file
3 *
4 * @brief IMFS Node Support
5 * @ingroup IMFS
6 */
7
8/*
9 *  COPYRIGHT (c) 1989-2010.
10 *  On-Line Applications Research Corporation (OAR).
11 *
12 *  The license and distribution terms for this file may be
13 *  found in the file LICENSE in this distribution or at
14 *  http://www.rtems.org/license/LICENSE.
15 */
16
17#if HAVE_CONFIG_H
18  #include "config.h"
19#endif
20
21#include "imfs.h"
22
23#include <errno.h>
24#include <stdlib.h>
25#include <string.h>
26#include <unistd.h>
27
28/*
29 *  IMFS_determine_bytes_per_block
30 */
31int imfs_memfile_bytes_per_block = 0;
32
33static int IMFS_determine_bytes_per_block(
34  int *dest_bytes_per_block,
35  int requested_bytes_per_block,
36  int default_bytes_per_block
37)
38{
39  bool is_valid = false;
40  int bit_mask;
41
42  /*
43   * check, whether requested bytes per block is valid
44   */
45  for (bit_mask = 16; !is_valid && (bit_mask <= 512); bit_mask <<= 1) {
46    if (bit_mask == requested_bytes_per_block) {
47      is_valid = true;
48      break;
49    }
50    if(bit_mask > requested_bytes_per_block)
51      break;
52  }
53  *dest_bytes_per_block = ((is_valid)
54                           ? requested_bytes_per_block
55                           : default_bytes_per_block);
56  return 0;
57}
58
59IMFS_jnode_t *IMFS_initialize_node(
60  IMFS_jnode_t *node,
61  const IMFS_node_control *node_control,
62  const char *name,
63  size_t namelen,
64  mode_t mode,
65  void *arg
66)
67{
68  struct timeval tv;
69
70  if ( namelen > IMFS_NAME_MAX ) {
71    errno = ENAMETOOLONG;
72
73    return NULL;
74  }
75
76  gettimeofday( &tv, 0 );
77
78  /*
79   *  Fill in the basic information
80   */
81  node->reference_count = 1;
82  node->st_nlink = 1;
83  memcpy( node->name, name, namelen );
84  node->name [namelen] = '\0';
85  node->control = node_control;
86
87  /*
88   *  Fill in the mode and permission information for the jnode structure.
89   */
90  node->st_mode = mode;
91  node->st_uid = geteuid();
92  node->st_gid = getegid();
93
94  /*
95   *  Now set all the times.
96   */
97
98  node->stat_atime  = (time_t) tv.tv_sec;
99  node->stat_mtime  = (time_t) tv.tv_sec;
100  node->stat_ctime  = (time_t) tv.tv_sec;
101
102  return (*node_control->node_initialize)( node, arg );
103}
104
105int IMFS_initialize_support(
106  rtems_filesystem_mount_table_entry_t *mt_entry,
107  const void                           *data
108)
109{
110  const IMFS_mount_data *mount_data = data;
111  IMFS_fs_info_t *fs_info = mount_data->fs_info;
112  IMFS_jnode_t *root_node;
113
114  fs_info->mknod_controls = mount_data->mknod_controls;
115
116  root_node = IMFS_initialize_node(
117    &fs_info->Root_directory.Node,
118    &fs_info->mknod_controls->directory->node_control,
119    "",
120    0,
121    (S_IFDIR | 0755),
122    NULL
123  );
124  IMFS_assert( root_node != NULL );
125
126  mt_entry->fs_info = fs_info;
127  mt_entry->ops = mount_data->ops;
128  mt_entry->pathconf_limits_and_options = &IMFS_LIMITS_AND_OPTIONS;
129  mt_entry->mt_fs_root->location.node_access = root_node;
130  IMFS_Set_handlers( &mt_entry->mt_fs_root->location );
131
132  IMFS_determine_bytes_per_block(
133    &imfs_memfile_bytes_per_block,
134    imfs_rq_memfile_bytes_per_block,
135    IMFS_MEMFILE_DEFAULT_BYTES_PER_BLOCK
136  );
137
138  return 0;
139}
140
141int IMFS_node_clone( rtems_filesystem_location_info_t *loc )
142{
143  IMFS_jnode_t *node = loc->node_access;
144
145  ++node->reference_count;
146
147  return 0;
148}
149
150void IMFS_node_destroy( IMFS_jnode_t *node )
151{
152  IMFS_assert( node->reference_count == 0 );
153
154  (*node->control->node_destroy)( node );
155}
156
157void IMFS_node_free( const rtems_filesystem_location_info_t *loc )
158{
159  IMFS_jnode_t *node = loc->node_access;
160
161  --node->reference_count;
162
163  if ( node->reference_count == 0 ) {
164    IMFS_node_destroy( node );
165  }
166}
167
168static IMFS_jnode_t *IMFS_node_initialize_enosys(
169  IMFS_jnode_t *node,
170  void *arg
171)
172{
173  errno = ENOSYS;
174
175  return NULL;
176}
177
178IMFS_jnode_t *IMFS_node_initialize_default(
179  IMFS_jnode_t *node,
180  void *arg
181)
182{
183  return node;
184}
185
186IMFS_jnode_t *IMFS_node_remove_default(
187  IMFS_jnode_t *node
188)
189{
190  return node;
191}
192
193void IMFS_node_destroy_default( IMFS_jnode_t *node )
194{
195  free( node );
196}
197
198const IMFS_mknod_control IMFS_mknod_control_enosys = {
199  {
200    .handlers = &rtems_filesystem_handlers_default,
201    .node_initialize = IMFS_node_initialize_enosys,
202    .node_remove = IMFS_node_remove_default,
203    .node_destroy = IMFS_node_destroy_default
204  },
205  .node_size = sizeof( IMFS_jnode_t )
206};
Note: See TracBrowser for help on using the repository browser.