source: rtems/cpukit/libfs/src/dosfs/fat_file.h @ c735cd5

4.115
Last change on this file since c735cd5 was c735cd5, checked in by Sebastian Huber <sebastian.huber@…>, on Mar 5, 2015 at 9:34:28 AM

dosfs: Fix warnings

  • Property mode set to 100644
File size: 7.3 KB
Line 
1/**
2 * @file
3 *
4 * @brief Constants/Data Structures/Prototypes for Operations on "fat-file"
5 *
6 * @ingroup libfs_ff
7 */
8
9/*
10 *
11 *  Copyright (C) 2001 OKTET Ltd., St.-Petersburg, Russia
12 *  Author: Eugeny S. Mints <Eugeny.Mints@oktet.ru>
13 *
14 *  The license and distribution terms for this file may be
15 *  found in the file LICENSE in this distribution or at
16 *  http://www.rtems.org/license/LICENSE.
17 */
18
19#ifndef __DOSFS_FAT_FILE_H__
20#define __DOSFS_FAT_FILE_H__
21
22#include <rtems.h>
23#include <rtems/libio_.h>
24
25#include <time.h>
26
27#include "fat.h"
28
29/**
30 *  @defgroup libfs_ff Fat File
31 *
32 *  @ingroup libfs
33 */
34/**@{*/
35
36#ifdef __cplusplus
37extern "C" {
38#endif
39
40typedef enum {
41  FAT_DIRECTORY = 0,
42  FAT_HARD_LINK = 2, /* pseudo type */
43  FAT_FILE = 4
44} fat_file_type_t;
45
46/**
47 * @brief The "fat-file" representation.
48 *
49 * the idea is: fat-file is nothing but a cluster chain, any open fat-file is
50 * represented in system by fat-file descriptor and has well-known
51 * file interface:
52 *
53 * fat_file_open()
54 * fat_file_close()
55 * fat_file_read()
56 * fat_file_write()
57 *
58 * Such interface hides the architecture of fat-file and represents it like
59 * linear file
60 */
61typedef struct fat_file_map_s
62{
63    uint32_t   file_cln;
64    uint32_t   disk_cln;
65    uint32_t   last_cln;
66} fat_file_map_t;
67
68/**
69 * @brief Descriptor of a fat-file.
70 *
71 * To each particular clusters chain
72 */
73typedef struct fat_file_fd_s
74{
75    rtems_chain_node link;          /*
76                                     * fat-file descriptors organized into hash;
77                                     * collision lists are handled via link
78                                     * field
79                                     */
80    uint32_t         links_num;     /*
81                                     * the number of fat_file_open call on
82                                     * this fat-file
83                                     */
84    uint32_t         ino;           /* inode, file serial number :)))) */
85    fat_file_type_t  fat_file_type;
86    uint32_t         size_limit;
87    uint32_t         fat_file_size; /* length  */
88    uint32_t         cln;
89    fat_dir_pos_t    dir_pos;
90    uint8_t          flags;
91    fat_file_map_t   map;
92    time_t           ctime;
93    time_t           mtime;
94
95} fat_file_fd_t;
96
97#define FAT_FILE_REMOVED 0x01
98
99#define FAT_FILE_META_DATA_CHANGED 0x02
100
101static inline bool FAT_FILE_IS_REMOVED(const fat_file_fd_t *fat_fd)
102{
103     return (fat_fd->flags & FAT_FILE_REMOVED) != 0;
104}
105
106static inline bool FAT_FILE_HAS_META_DATA_CHANGED(const fat_file_fd_t *fat_fd)
107{
108     return (fat_fd->flags & FAT_FILE_META_DATA_CHANGED) != 0;
109}
110
111/* ioctl macros */
112#define F_CLU_NUM  0x01
113
114/*
115 * Each file and directory on a MSDOS volume is unique identified by it
116 * location, i.e. location of it 32 Bytes Directory Entry Structure. We can
117 * distinguish them by cluster number it locates on and offset inside this
118 * cluster. But root directory on any volumes (FAT12/16/32) has no 32 Bytes
119 * Directory Entry Structure corresponded to it. So we assume 32 Bytes
120 * Directory Entry Structure of root directory locates at cluster 1 (invalid
121 * cluaster number) and offset 0
122 */
123#define FAT_ROOTDIR_CLUSTER_NUM 0x01
124
125#define FAT_FD_OF_ROOT_DIR(fat_fd)  \
126  ((fat_fd->dir_pos.sname.cln == FAT_ROOTDIR_CLUSTER_NUM) && \
127  (fat_fd->dir_pos.sname.ofs == 0))
128
129#define FAT_EOF           0x00
130
131/* @brief Construct key for hash access.
132 *
133 * Construct key for hash access: convert (cluster num, offset) to
134 * (sector512 num, new offset) and than construct key as
135 * key = (sector512 num) << 4 | (new offset)
136 *
137 * @param[in] cl - cluster number
138 * @param[in] ofs - offset inside cluster 'cl'
139 * @param[in] fs_info - FS info
140 *
141 * @retval constructed key
142 */
143static inline uint32_t
144fat_construct_key(
145    const fat_fs_info_t                  *fs_info,
146    fat_pos_t                            *pos)
147{
148    return ( ((fat_cluster_num_to_sector512_num(fs_info, pos->cln) +
149              (pos->ofs >> FAT_SECTOR512_BITS)) << 4)              +
150              ((pos->ofs >> 5) & (FAT_DIRENTRIES_PER_SEC512 - 1)) );
151}
152
153static inline void
154fat_file_set_first_cluster_num(fat_file_fd_t *fat_fd, uint32_t cln)
155{
156    fat_fd->cln = cln;
157    fat_fd->flags |= FAT_FILE_META_DATA_CHANGED;
158}
159
160static inline void fat_file_set_file_size(fat_file_fd_t *fat_fd, uint32_t s)
161{
162    fat_fd->fat_file_size = s;
163    fat_fd->flags |= FAT_FILE_META_DATA_CHANGED;
164}
165
166static inline void fat_file_set_ctime(fat_file_fd_t *fat_fd, time_t t)
167{
168    fat_fd->ctime = t;
169    fat_fd->flags |= FAT_FILE_META_DATA_CHANGED;
170}
171
172static inline void fat_file_set_mtime(fat_file_fd_t *fat_fd, time_t t)
173{
174    fat_fd->mtime = t;
175    fat_fd->flags |= FAT_FILE_META_DATA_CHANGED;
176}
177
178static inline void fat_file_set_ctime_mtime(fat_file_fd_t *fat_fd, time_t t)
179{
180    fat_fd->ctime = t;
181    fat_fd->mtime = t;
182    fat_fd->flags |= FAT_FILE_META_DATA_CHANGED;
183}
184
185/* Prototypes for "fat-file" operations */
186int
187fat_file_open(fat_fs_info_t                         *fs_info,
188              fat_dir_pos_t                         *dir_pos,
189              fat_file_fd_t                        **fat_fd);
190
191int
192fat_file_reopen(fat_file_fd_t *fat_fd);
193
194int
195fat_file_close(fat_fs_info_t                        *fs_info,
196               fat_file_fd_t                        *fat_fd);
197
198ssize_t
199fat_file_read(fat_fs_info_t                        *fs_info,
200              fat_file_fd_t                        *fat_fd,
201              uint32_t                              start,
202              uint32_t                              count,
203              uint8_t                              *buf);
204
205ssize_t
206fat_file_write(fat_fs_info_t                        *fs_info,
207               fat_file_fd_t                        *fat_fd,
208               uint32_t                              start,
209               uint32_t                              count,
210               const uint8_t                        *buf);
211
212int
213fat_file_extend(fat_fs_info_t                        *fs_info,
214                fat_file_fd_t                        *fat_fd,
215                bool                                  zero_fill,
216                uint32_t                              new_length,
217                uint32_t                             *a_length);
218
219int
220fat_file_truncate(fat_fs_info_t                        *fs_info,
221                  fat_file_fd_t                        *fat_fd,
222                  uint32_t                              new_length);
223
224int
225fat_file_ioctl(fat_fs_info_t                        *fs_info,
226               fat_file_fd_t                        *fat_fd,
227               int                                   cmd,
228               ...);
229
230int
231fat_file_size(fat_fs_info_t                        *fs_info,
232              fat_file_fd_t                        *fat_fd);
233
234void
235fat_file_mark_removed(fat_fs_info_t                        *fs_info,
236                      fat_file_fd_t                        *fat_fd);
237
238int
239fat_file_size(fat_fs_info_t                        *fs_info,
240              fat_file_fd_t                        *fat_fd);
241
242int
243fat_file_write_first_cluster_num(fat_fs_info_t *fs_info,
244                                 fat_file_fd_t *fat_fd);
245
246int
247fat_file_write_file_size(fat_fs_info_t *fs_info,
248                         fat_file_fd_t *fat_fd);
249
250int
251fat_file_write_time_and_date(fat_fs_info_t *fs_info,
252                             fat_file_fd_t *fat_fd);
253
254int
255fat_file_update(fat_fs_info_t *fs_info,
256                fat_file_fd_t *fat_fd);
257
258#ifdef __cplusplus
259}
260#endif
261/**@}*/
262#endif /* __DOSFS_FAT_FILE_H__ */
Note: See TracBrowser for help on using the repository browser.