1 | /** |
---|
2 | * @file |
---|
3 | * |
---|
4 | * @brief Set of Utility Functions to Support RTEMS RFS on RTEMS |
---|
5 | * @ingroup rtems_rfs |
---|
6 | */ |
---|
7 | |
---|
8 | /* |
---|
9 | * COPYRIGHT (c) 2010 Chris Johns <chrisj@rtems.org> |
---|
10 | * |
---|
11 | * The license and distribution terms for this file may be |
---|
12 | * found in the file LICENSE in this distribution or at |
---|
13 | * http://www.rtems.org/license/LICENSE. |
---|
14 | */ |
---|
15 | |
---|
16 | #if HAVE_CONFIG_H |
---|
17 | #include "config.h" |
---|
18 | #endif |
---|
19 | |
---|
20 | #include <sys/types.h> |
---|
21 | #include <sys/stat.h> |
---|
22 | #include <stdlib.h> |
---|
23 | |
---|
24 | #include "rtems-rfs-rtems.h" |
---|
25 | |
---|
26 | /* |
---|
27 | * The following sets the handlers based on the type of inode. |
---|
28 | */ |
---|
29 | |
---|
30 | bool |
---|
31 | rtems_rfs_rtems_set_handlers (rtems_filesystem_location_info_t* loc, |
---|
32 | rtems_rfs_inode_handle* inode) |
---|
33 | { |
---|
34 | uint16_t mode = rtems_rfs_inode_get_mode (inode); |
---|
35 | loc->handlers = NULL; |
---|
36 | if (RTEMS_RFS_S_ISDIR (mode)) |
---|
37 | loc->handlers = rtems_rfs_rtems_handlers (dir); |
---|
38 | else if (RTEMS_RFS_S_ISCHR (mode) || RTEMS_RFS_S_ISBLK(mode)) |
---|
39 | loc->handlers = rtems_rfs_rtems_handlers (device); |
---|
40 | else if (RTEMS_RFS_S_ISLNK (mode)) |
---|
41 | loc->handlers = rtems_rfs_rtems_handlers (link); |
---|
42 | else if (RTEMS_RFS_S_ISREG (mode)) |
---|
43 | loc->handlers = rtems_rfs_rtems_handlers (file); |
---|
44 | else |
---|
45 | { |
---|
46 | printf ("rtems-rfs: mode type unknown: %04x\n", mode); |
---|
47 | return false; |
---|
48 | } |
---|
49 | return true; |
---|
50 | } |
---|
51 | |
---|
52 | uint16_t |
---|
53 | rtems_rfs_rtems_imode (mode_t mode) |
---|
54 | { |
---|
55 | /* |
---|
56 | * Mapping matches RTEMS so no need to change. |
---|
57 | */ |
---|
58 | return mode; |
---|
59 | } |
---|
60 | |
---|
61 | mode_t |
---|
62 | rtems_rfs_rtems_mode (int imode) |
---|
63 | { |
---|
64 | /* |
---|
65 | * Mapping matches RTEMS so no need to change. |
---|
66 | */ |
---|
67 | return imode; |
---|
68 | } |
---|
69 | |
---|
70 | /* |
---|
71 | * Only provide if there is no macro version. |
---|
72 | */ |
---|
73 | #if !defined (rtems_rfs_rtems_error) |
---|
74 | int |
---|
75 | rtems_rfs_rtems_error (const char* mesg, int error) |
---|
76 | { |
---|
77 | if (error) |
---|
78 | printf ("rtems-rfs: %s: %d: %s\n", mesg, error, strerror (error)); |
---|
79 | errno = error; |
---|
80 | return error == 0 ? 0 : -1; |
---|
81 | } |
---|
82 | #endif |
---|
83 | |
---|
84 | #if RTEMS_RFS_RTEMS_TRACE |
---|
85 | static uint32_t rtems_rfs_rtems_trace_mask; |
---|
86 | |
---|
87 | bool |
---|
88 | rtems_rfs_rtems_trace (uint32_t mask) |
---|
89 | { |
---|
90 | bool result = false; |
---|
91 | if (mask & rtems_rfs_rtems_trace_mask) |
---|
92 | result = true; |
---|
93 | return result; |
---|
94 | } |
---|
95 | |
---|
96 | void |
---|
97 | rtems_rfs_trace_rtems_set_mask (uint32_t mask) |
---|
98 | { |
---|
99 | rtems_rfs_rtems_trace_mask |= mask; |
---|
100 | } |
---|
101 | |
---|
102 | void |
---|
103 | rtems_rfs_trace_rtems_clear_mask (uint32_t mask) |
---|
104 | { |
---|
105 | rtems_rfs_rtems_trace_mask &= ~mask; |
---|
106 | } |
---|
107 | |
---|
108 | int |
---|
109 | rtems_rfs_rtems_trace_shell_command (int argc, char *argv[]) |
---|
110 | { |
---|
111 | const char* table[] = |
---|
112 | { |
---|
113 | "error-msgs", |
---|
114 | "eval-path" |
---|
115 | "eval-for-make", |
---|
116 | "eval-perms", |
---|
117 | "mknod", |
---|
118 | "rmnod", |
---|
119 | "link", |
---|
120 | "unlink", |
---|
121 | "chown", |
---|
122 | "readlink", |
---|
123 | "fchmod", |
---|
124 | "stat", |
---|
125 | "dir-rmnod", |
---|
126 | "file-open", |
---|
127 | "file-close", |
---|
128 | "file-read", |
---|
129 | "file-write", |
---|
130 | "file-lseek", |
---|
131 | "file-ftrunc" |
---|
132 | }; |
---|
133 | |
---|
134 | bool set = true; |
---|
135 | int arg; |
---|
136 | int t; |
---|
137 | |
---|
138 | for (arg = 1; arg < argc; arg++) |
---|
139 | { |
---|
140 | if (argv[arg][0] == '-') |
---|
141 | { |
---|
142 | switch (argv[arg][1]) |
---|
143 | { |
---|
144 | case 'h': |
---|
145 | printf ("usage: %s [-hl] [set/clear] [flags]\n", argv[0]); |
---|
146 | return 0; |
---|
147 | case 'l': |
---|
148 | printf ("%s: valid flags to set or clear are:\n", argv[0]); |
---|
149 | for (t = 0; t < (sizeof (table) / sizeof (const char*)); t++) |
---|
150 | printf (" %s\n", table[t]); |
---|
151 | return 0; |
---|
152 | default: |
---|
153 | printf ("error: unknown option\n"); |
---|
154 | return 1; |
---|
155 | } |
---|
156 | } |
---|
157 | else |
---|
158 | { |
---|
159 | uint32_t value = 0; |
---|
160 | if (strcmp (argv[arg], "set") == 0) |
---|
161 | set = true; |
---|
162 | if (strcmp (argv[arg], "clear") == 0) |
---|
163 | set = false; |
---|
164 | else if (strcmp (argv[arg], "all") == 0) |
---|
165 | value = RTEMS_RFS_RTEMS_DEBUG_ALL; |
---|
166 | else |
---|
167 | { |
---|
168 | for (t = 0; t < (sizeof (table) / sizeof (const char*)); t++) |
---|
169 | { |
---|
170 | if (strcmp (argv[arg], table[t]) == 0) |
---|
171 | { |
---|
172 | value = 1 << t; |
---|
173 | break; |
---|
174 | } |
---|
175 | } |
---|
176 | } |
---|
177 | |
---|
178 | if (set) |
---|
179 | rtems_rfs_rtems_trace_mask |= value; |
---|
180 | else |
---|
181 | rtems_rfs_rtems_trace_mask &= ~value; |
---|
182 | } |
---|
183 | } |
---|
184 | |
---|
185 | return 0; |
---|
186 | } |
---|
187 | |
---|
188 | #endif |
---|