9 #include <sys/dirent.h>
14 * Maximum number of open files. This is *currently* constrained by the
15 * fact that PXE needs to be able to fit all its packet buffers into a
16 * 64K segment; this should be fixed by moving the packet buffers to high
19 #define MAX_OPEN_LG2 5
20 #define MAX_OPEN (1 << MAX_OPEN_LG2)
22 #define FILENAME_MAX_LG2 8
23 #define FILENAME_MAX (1 << FILENAME_MAX_LG2)
25 #define CURRENTDIR_MAX FILENAME_MAX
27 #define BLOCK_SIZE(fs) ((fs)->block_size)
28 #define BLOCK_SHIFT(fs) ((fs)->block_shift)
29 #define SECTOR_SIZE(fs) ((fs)->sector_size)
30 #define SECTOR_SHIFT(fs) ((fs)->sector_shift)
33 const struct fs_ops
*fs_ops
;
34 struct device
*fs_dev
;
35 void *fs_info
; /* The fs-specific information */
36 int sector_shift
, sector_size
;
37 int block_shift
, block_size
;
38 struct inode
*root
, *cwd
; /* Root and current directories */
39 char cwd_name
[CURRENTDIR_MAX
]; /* Current directory by name */
42 extern struct fs_info
*this_fs
;
44 struct dirent
; /* Directory entry structure */
48 FS_USEMEM
= 1 << 1, /* If we need a malloc routine, set it */
49 FS_THISIND
= 1 << 2, /* Set cwd based on config file location */
53 /* in fact, we use fs_ops structure to find the right fs */
55 enum fs_flags fs_flags
;
57 int (*fs_init
)(struct fs_info
*);
58 void (*searchdir
)(const char *, struct file
*);
59 uint32_t (*getfssec
)(struct file
*, char *, int, bool *);
60 void (*close_file
)(struct file
*);
61 void (*mangle_name
)(char *, const char *);
62 size_t (*realpath
)(struct fs_info
*, char *, const char *, size_t);
63 int (*chdir
)(struct fs_info
*, const char *);
64 int (*load_config
)(void);
66 struct inode
* (*iget_root
)(struct fs_info
*);
67 struct inode
* (*iget
)(const char *, struct inode
*);
68 int (*readlink
)(struct inode
*, char *);
71 int (*readdir
)(struct file
*, struct dirent
*);
73 int (*next_extent
)(struct inode
*, uint32_t);
77 * Extent structure: contains the mapping of some chunk of a file
78 * that is contiguous on disk.
81 sector_t pstart
; /* Physical start sector */
82 uint32_t lstart
; /* Logical start sector */
83 uint32_t len
; /* Number of contiguous sectors */
86 /* Special sector numbers used for struct extent.pstart */
87 #define EXTENT_ZERO ((sector_t)-1) /* All-zero extent */
88 #define EXTENT_VOID ((sector_t)-2) /* Invalid information */
90 #define EXTENT_SPECIAL(x) ((x) >= EXTENT_VOID)
93 * The inode structure, including the detail file information
96 struct fs_info
*fs
; /* The filesystem this inode is associated with */
97 struct inode
*parent
; /* Parent directory, if any */
98 const char *name
; /* Name, valid for generic path search only */
100 int mode
; /* FILE , DIR or SYMLINK */
102 uint32_t blocks
; /* How many blocks the file take */
103 uint32_t ino
; /* Inode number */
104 uint32_t atime
; /* Access time */
105 uint32_t mtime
; /* Modify time */
106 uint32_t ctime
; /* Create time */
107 uint32_t dtime
; /* Delete time */
110 struct extent this_extent
, next_extent
;
111 char pvt
[0]; /* Private filesystem data */
116 uint32_t offset
; /* for next read */
117 struct inode
*inode
; /* The file-specific information */
121 * Struct device contains:
122 * the pointer points to the disk structure,
130 /* the cache stuff */
132 struct cache
*cache_head
;
133 uint16_t cache_block_size
;
134 uint16_t cache_entries
;
139 * Our definition of "not whitespace"
141 static inline bool not_whitespace(char c
)
143 return (unsigned char)c
> ' ';
147 * Inode allocator/deallocator
149 struct inode
*alloc_inode(struct fs_info
*fs
, uint32_t ino
, size_t data
);
150 static inline void free_inode(struct inode
* inode
)
155 static inline struct inode
*get_inode(struct inode
*inode
)
161 void put_inode(struct inode
*inode
);
163 static inline void malloc_error(char *obj
)
165 printf("Out of memory: can't allocate memory for %s\n", obj
);
170 * File handle conversion functions
172 extern struct file files
[];
173 static inline uint16_t file_to_handle(struct file
*file
)
175 return file
? (file
- files
)+1 : 0;
177 static inline struct file
*handle_to_file(uint16_t handle
)
179 return handle
? &files
[handle
-1] : NULL
;
183 void pm_mangle_name(com32sys_t
*);
184 void pm_searchdir(com32sys_t
*);
185 void mangle_name(char *, const char *);
186 int searchdir(const char *name
);
187 void _close_file(struct file
*);
188 size_t pmapi_read_file(uint16_t *handle
, void *buf
, size_t sectors
);
189 int open_file(const char *name
, struct com32_filedata
*filedata
);
190 void pm_open_file(com32sys_t
*);
191 void close_file(uint16_t handle
);
192 void pm_close_file(com32sys_t
*);
195 void pm_realpath(com32sys_t
*regs
);
196 size_t realpath(char *dst
, const char *src
, size_t bufsize
);
197 int chdir(const char *src
);
200 DIR *opendir(const char *pathname
);
201 struct dirent
*readdir(DIR *dir
);
202 int closedir(DIR *dir
);
205 char *getcwd(char *buf
, size_t size
);
208 * Generic functions that filesystem drivers may choose to use
212 void generic_mangle_name(char *, const char *);
215 int search_config(const char *search_directores
[], const char *filenames
[]);
216 int generic_load_config(void);
219 void generic_close_file(struct file
*file
);
222 uint32_t generic_getfssec(struct file
*file
, char *buf
,
223 int sectors
, bool *have_more
);
226 int no_next_extent(struct inode
*, uint32_t);