source: rtems/cpukit/libfs/src/rfs/rtems-rfs-rtems-dev.c @ fed66f99

4.11
Last change on this file since fed66f99 was fed66f99, checked in by Sebastian Huber <sebastian.huber@…>, on May 14, 2012 at 1:19:20 PM

Filesystem: Add shared device IO support

The device IO file system support in IMFS, devFS, and RFS uses now a
shared implementation.

  • Property mode set to 100644
File size: 4.8 KB
Line 
1/*
2 *  COPYRIGHT (c) 2010 Chris Johns <chrisj@rtems.org>
3 *
4 *  The license and distribution terms for this file may be
5 *  found in the file LICENSE in this distribution or at
6 *  http://www.rtems.com/license/LICENSE.
7 */
8/**
9 * @file
10 *
11 * @ingroup rtems-rfs
12 *
13 * RTEMS RFS Device Interface.
14 *
15 * This file contains the set of handlers used to map operations on RFS device
16 * nodes onto calls to the RTEMS Classic API IO Manager.
17 *
18 */
19
20#if HAVE_CONFIG_H
21  #include "config.h"
22#endif
23
24#include "rtems-rfs-rtems.h"
25
26#include <rtems/deviceio.h>
27
28static void
29rtems_rfs_rtems_device_get_major_and_minor ( const rtems_libio_t       *iop,
30                                             rtems_device_major_number *major,
31                                             rtems_device_minor_number *minor)
32{
33  *major = iop->data0;
34  *minor = (rtems_device_minor_number) iop->data1;
35}
36
37/**
38 * This handler maps an open() operation onto rtems_io_open().
39 *
40 * @param iop
41 * @param pathname
42 * @param flag
43 * @param mode
44 * @return int
45 */
46static int
47rtems_rfs_rtems_device_open ( rtems_libio_t *iop,
48                              const char    *pathname,
49                              int            oflag,
50                              mode_t         mode)
51{
52  rtems_rfs_file_system*        fs = rtems_rfs_rtems_pathloc_dev (&iop->pathinfo);
53  rtems_rfs_ino                 ino = rtems_rfs_rtems_get_iop_ino (iop);
54  rtems_rfs_inode_handle        inode;
55  rtems_device_major_number     major;
56  rtems_device_minor_number     minor;
57  int                           rc;
58
59  rtems_rfs_rtems_lock (fs);
60
61  rc = rtems_rfs_inode_open (fs, ino, &inode, true);
62  if (rc > 0)
63  {
64    rtems_rfs_rtems_unlock (fs);
65    return rtems_rfs_rtems_error ("device_open: opening inode", rc);
66  }
67
68  major = rtems_rfs_inode_get_block (&inode, 0);
69  minor = rtems_rfs_inode_get_block (&inode, 1);
70
71  rc = rtems_rfs_inode_close (fs, &inode);
72  if (rc > 0)
73  {
74    rtems_rfs_rtems_unlock (fs);
75    return rtems_rfs_rtems_error ("device_open: closing inode", rc);
76  }
77
78  rtems_rfs_rtems_unlock (fs);
79
80  iop->data0 = major;
81  iop->data1 = (void *) minor;
82
83  return rtems_deviceio_open (iop, pathname, oflag, mode, minor, major);
84}
85
86/**
87 * This handler maps a close() operation onto rtems_io_close().
88 *
89 * @param iop
90 * @return int
91 */
92
93static int
94rtems_rfs_rtems_device_close (rtems_libio_t* iop)
95{
96  rtems_device_major_number     major;
97  rtems_device_minor_number     minor;
98
99  rtems_rfs_rtems_device_get_major_and_minor (iop, &major, &minor);
100
101  return rtems_deviceio_close (iop, major, minor);
102}
103
104/**
105 * This handler maps a read() operation onto rtems_io_read().
106 *
107 * @param iop
108 * @param buffer
109 * @param count
110 * @return ssize_t
111 */
112
113static ssize_t
114rtems_rfs_rtems_device_read (rtems_libio_t* iop, void* buffer, size_t count)
115{
116  rtems_device_major_number major;
117  rtems_device_minor_number minor;
118
119  rtems_rfs_rtems_device_get_major_and_minor (iop, &major, &minor);
120
121  return rtems_deviceio_read (iop, buffer, count, major, minor);
122}
123
124/*
125 * This handler maps a write() operation onto rtems_io_write().
126 *
127 * @param iop
128 * @param buffer
129 * @param count
130 * @return ssize_t
131 */
132
133static ssize_t
134rtems_rfs_rtems_device_write (rtems_libio_t* iop,
135                              const void*    buffer,
136                              size_t         count)
137{
138  rtems_device_major_number major;
139  rtems_device_minor_number minor;
140
141  rtems_rfs_rtems_device_get_major_and_minor (iop, &major, &minor);
142
143  return rtems_deviceio_write (iop, buffer, count, major, minor);
144}
145
146/**
147 * This handler maps an ioctl() operation onto rtems_io_ioctl().
148 *
149 * @param iop
150 * @param command
151 * @param buffer
152 * @return int
153 */
154
155static int
156rtems_rfs_rtems_device_ioctl (rtems_libio_t*  iop,
157                              ioctl_command_t command,
158                              void*           buffer)
159{
160  rtems_device_major_number major;
161  rtems_device_minor_number minor;
162
163  rtems_rfs_rtems_device_get_major_and_minor (iop, &major, &minor);
164
165  return rtems_deviceio_control (iop, command, buffer, major, minor);
166}
167
168/**
169 * The consumes the truncate call. You cannot truncate device files.
170 *
171 * @param iop
172 * @param length
173 * @return int
174 */
175
176static int
177rtems_rfs_rtems_device_ftruncate (rtems_libio_t* iop, off_t length)
178{
179  return 0;
180}
181
182/*
183 *  Handler table for RFS device nodes
184 */
185
186const rtems_filesystem_file_handlers_r rtems_rfs_rtems_device_handlers = {
187  .open_h      = rtems_rfs_rtems_device_open,
188  .close_h     = rtems_rfs_rtems_device_close,
189  .read_h      = rtems_rfs_rtems_device_read,
190  .write_h     = rtems_rfs_rtems_device_write,
191  .ioctl_h     = rtems_rfs_rtems_device_ioctl,
192  .lseek_h     = rtems_filesystem_default_lseek_file,
193  .fstat_h     = rtems_rfs_rtems_fstat,
194  .ftruncate_h = rtems_rfs_rtems_device_ftruncate,
195  .fsync_h     = rtems_filesystem_default_fsync_or_fdatasync,
196  .fdatasync_h = rtems_filesystem_default_fsync_or_fdatasync,
197  .fcntl_h     = rtems_filesystem_default_fcntl
198};
Note: See TracBrowser for help on using the repository browser.