7 #define FILENAME_LEN 30
11 #define SMOUNTED 12742 /* Magic number to specify mounted filesystem */
12 #define SMOUNTED_WRONGENDIAN 50737 /* byteflipped */
19 #define ITABSIZE 18 //20
21 #define NULLINODE ((inoptr)NULL)
22 #define NULLBLK ((blkno_t)-1)
23 #define NULLINOPTR ((inoptr*)NULL)
25 /* Flags for setftime() */
35 #define ifnot(x) if(!(x))
37 typedef struct s_queue {
38 char *q_base; /* Pointer to data */
39 char *q_head; /* Pointer to addr of next char to read. */
40 char *q_tail; /* Pointer to where next char to insert goes. */
41 int q_size; /* Max size of queue */
42 int q_count; /* How many characters presently in queue */
43 int q_wakeup; /* Threshold for waking up processes waiting on queue */
46 struct uzi_stat /* Really only used by users */
61 typedef struct direct {
66 typedef uint16_t blkno_t; /* Can have 65536 512-byte blocks in filesystem */
68 typedef struct blkbuf {
69 char bf_data[512]; /* This MUST be first ! */
74 long/*uint16_t*/ bf_time; /* LRU time stamp */
77 typedef blkbuf *bufptr;
79 typedef struct dinode {
89 } dinode; /* Exactly 64 bytes long! */
91 /* Bit masks for i_mode and st_mode */
103 #define SAV_TXT 01000
104 #define SET_GID 02000
105 #define SET_UID 04000
107 #define MODE_MASK 07777
109 #define F_REG 0100000
111 #define F_PIPE 010000
112 #define F_BDEV 060000
113 #define F_CDEV 020000
115 #define F_MASK 0170000
117 typedef struct cinode {
118 int c_magic; /* Used to check for corruption. */
119 int c_dev; /* Inode's device */
120 unsigned c_num; /* Inode # */
122 char c_refs; /* In-core reference count */
123 char c_dirty; /* Modified flag. */
126 typedef struct filesys {
133 uint16_t s_inode[50];
135 uint8_t s_timeh; /* top bits of time */
143 #define EPERM 1 /* Not owner */
144 #define ENOENT 2 /* No such file or directory */
145 #define ESRCH 3 /* No such process */
146 #define EINTR 4 /* Interrupted System Call */
147 #define EIO 5 /* I/O Error */
148 #define ENXIO 6 /* No such device or address */
149 #define E2BIG 7 /* Arg list too long */
150 #define ENOEXEC 8 /* Exec format error */
151 #define EBADF 9 /* Bad file number */
152 #define ECHILD 10 /* No children */
153 #define EAGAIN 11 /* No more processes */
154 #define ENOMEM 12 /* Not enough core */
155 #define EACCES 13 /* Permission denied */
156 #define EFAULT 14 /* Bad address */
157 #define ENOTBLK 15 /* Block device required */
158 #define EBUSY 16 /* Mount device busy */
159 #define EEXIST 17 /* File exists */
160 #define EXDEV 18 /* Cross-device link */
161 #define ENODEV 19 /* No such device */
162 #define ENOTDIR 20 /* Not a directory */
163 #define EISDIR 21 /* Is a directory */
164 #define EINVAL 22 /* Invalid argument */
165 #define ENFILE 23 /* File table overflow */
166 #define EMFILE 24 /* Too many open files */
167 #define ENOTTY 25 /* Not a typewriter */
168 #define ETXTBSY 26 /* Text file busy */
169 #define EFBIG 27 /* File too large */
170 #define ENOSPC 28 /* No space left on device */
171 #define ESPIPE 29 /* Illegal seek */
172 #define EROFS 30 /* Read-only file system */
173 #define EMLINK 31 /* Too many links */
174 #define EPIPE 32 /* Broken pipe */
178 typedef struct u_data {
179 //struct p_tab *u_ptab; /* Process table pointer */
180 char u_insys; /* True if in kernel */
181 //char u_callno; /* sys call being executed. */
182 //char *u_retloc; /* Return location from sys call */
183 //int u_retval; /* Return value from sys call */
184 int u_error; /* Last error number */
185 //char *u_sp; /* Used when a process is swapped. */
186 //char *u_bc; /* Place to save user's frame pointer */
187 //int u_cursig; /* Signal currently being caught */
188 //int u_argn; /* Last system call arg */
189 //int u_argn1; /* This way because args on stack backwards */
191 //int u_argn3; /* args n-3, n-2, n-1, and n */
193 char * u_base; /* Source or dest for I/O */
194 unsigned u_count; /* Amount for I/O */
195 uint32_t u_offset; /* Place in file for I/O */
196 struct blkbuf *u_buf;
197 char u_sysio; /* True if I/O is to system data space 280*/
202 int u_mask; /* umask: file creation mode mask */
203 //uint32_t u_time; /* Start time */
204 char u_files[UFTSIZE]; /* Process file table:
205 contains indexes into open file table. */
206 inoptr u_cwd; /* Index into inode table of cwd. */
207 //unsigned u_break; /* Top of data space */
208 //inoptr u_ino; /* Used during execve() */
209 //char *u_isp; /* Value of initial sp (argv) */
211 //int (*u_sigvec[NSIGS])(); /* Array of signal vectors */
212 //char u_name[8]; /* Name invoked with */
213 //uint32_t u_utime; /* Elapsed ticks in user mode */
214 //uint32_t u_stime; /* Ticks in system mode */
215 //uint32_t u_cutime; /* Total childrens ticks */
221 uint32_t o_ptr; /* File position pointer */
222 inoptr o_inode; /* Pointer into in-core inode table */
223 char o_access; /* O_RDONLY, O_WRONLY, or O_RDWR */
224 char o_refs; /* Reference count: depends on # of active children*/
226 extern struct oft of_tab[OFTSIZE]; /* Open File Table */
230 extern struct cinode i_tab[ITABSIZE];
231 extern struct filesys fs_tab[1];
232 extern long/*uint16_t*/ bufclock; /* Time-stamp counter for LRU */
233 extern struct blkbuf bufpool[NBUFS];
234 extern struct u_data udata;
236 void xfs_init(int bootdev);
238 int fuzix_open(char *name, int16_t flag);
239 int doclose(int16_t uindex);
240 int fuzix_close(int16_t uindex);
241 int fuzix_creat(char *name, int16_t mode);
242 int fuzix_link(char *name1, char *name2);
243 int fuzix_unlink(char *path);
244 uint16_t fuzix_read(int16_t d, char *buf, uint16_t nbytes);
245 uint16_t fuzix_write(int16_t d, char *buf, uint16_t nbytes);
246 inoptr rwsetup(int rwflag, int d, char *buf, int nbytes);
247 uint16_t readi(inoptr ino);
248 uint16_t writei(inoptr ino);
250 int fuzix_mknod(char *name, int16_t mode, int16_t dev);
251 void fuzix_sync(void);
252 int fuzix_chdir(char *dir);
253 int min(int a, int b);
254 int fuzix_chmod(char *path, int16_t mode);
255 int fuzix_stat(char *path, struct uzi_stat *buf);
256 void stcpy(inoptr ino, struct uzi_stat *buf);
257 int fuzix_getfsys(int dev, char *buf);
258 int fuzix_mkdir(char *name, int mode);
259 inoptr n_open(register char *name, register inoptr *parent);
260 inoptr srch_dir(inoptr wd, register char *compname);
261 inoptr srch_mt(inoptr ino);
262 inoptr i_open(register int dev, register unsigned ino);
263 int ch_link(inoptr wd, char *oldname, char *newname, inoptr nindex);
264 char *filename(char *path);
265 void filename_2(char *path, char *name);
266 int namecomp(char *n1, char *n2);
267 inoptr newfile(inoptr pino, char *name);
268 fsptr getdev(int devno);
269 unsigned i_alloc(int devno);
270 void i_free(int devno, unsigned ino);
271 blkno_t blk_alloc(int devno);
272 void blk_free(int devno, blkno_t blk);
274 void oft_deref(int of);
276 void i_ref(inoptr ino);
277 void i_deref(inoptr ino);
278 void wr_inode(inoptr ino);
279 int isdevice(inoptr ino);
280 void f_trunc(inoptr ino);
281 void freeblk_partial2(int dev, blkno_t blk, int32_t blocks);
282 void freeblk_partial1(int dev, blkno_t blk, int blocks);
283 void freeblk(int dev, blkno_t blk, int level);
284 blkno_t bmap(inoptr ip, blkno_t bn, int rwflg);
285 void validblk(int dev, blkno_t num);
286 inoptr getinode(int uindex);
287 void setftime(inoptr ino, int flag);
288 int fuzix_getmode(inoptr ino);
289 int fmount(int dev, inoptr ino);
290 void magic(inoptr ino);
291 char *bread(int dev, blkno_t blk, int rewrite);
292 void brelse(bufptr bp);
293 void bawrite(bufptr bp);
294 int bfree(bufptr bp, int dirty);
298 bufptr bfind(int dev, blkno_t blk);
299 bufptr freebuf(void);
301 int bdread(bufptr bp);
302 int bdwrite(bufptr bp);