Unify process_alloc() and process_realloc() with PROCESS_ALLOC_MODE_REALLOC bit
[moveable_pool.git] / fuzix_fs.h
1 #ifndef _FUZIX_FS_H
2 #define _FUZIX_FS_H 1
3
4 #include <stdint.h>
5 #include <stdlib.h>
6
7 #define FILENAME_LEN 30
8
9 #define ROOTDEV 0
10 #define ROOTINODE 1
11 #define SMOUNTED 12742   /* Magic number to specify mounted filesystem */
12 #define SMOUNTED_WRONGENDIAN 50737   /* byteflipped */
13 #define CMAGIC   24721
14 #define UFTSIZE 10
15 //#define NSIGS 16
16 #define NDEVS 1
17 #define NBUFS 4 //10
18 #define OFTSIZE 15
19 #define ITABSIZE 18 //20
20 #define _NSIG NSIGS
21 #define NULLINODE ((inoptr)NULL)
22 #define NULLBLK ((blkno_t)-1)
23 #define NULLINOPTR ((inoptr*)NULL)
24
25 /* Flags for setftime() */
26 #define A_TIME 1
27 #define M_TIME 2
28 #define C_TIME 4
29
30
31 #define FO_RDONLY        0
32 #define FO_WRONLY        1
33 #define FO_RDWR          2
34
35 #define ifnot(x) if(!(x))
36
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 */
44 } queue_t;
45
46 struct  uzi_stat    /* Really only used by users */
47 {
48     int16_t   st_dev;
49     uint16_t  st_ino;
50     uint16_t  st_mode;
51     uint16_t  st_nlink;
52     uint16_t  st_uid;
53     uint16_t  st_gid;
54     uint16_t  st_rdev;
55     uint32_t  st_size;
56     uint32_t  fst_atime;
57     uint32_t  fst_mtime;
58     uint32_t  fst_ctime;
59 };
60
61 typedef struct direct {
62         uint16_t   d_ino;
63         char     d_name[30];
64 } direct;
65
66 typedef uint16_t blkno_t;    /* Can have 65536 512-byte blocks in filesystem */
67
68 typedef struct blkbuf {
69     char        bf_data[512];    /* This MUST be first ! */
70     char        bf_dev;
71     blkno_t     bf_blk;
72     char        bf_dirty;
73     char        bf_busy;
74     long/*uint16_t*/      bf_time;         /* LRU time stamp */
75 } blkbuf;
76
77 typedef blkbuf *bufptr;
78
79 typedef struct dinode {
80     uint16_t i_mode;
81     uint16_t i_nlink;
82     uint16_t i_uid;
83     uint16_t i_gid;
84     uint32_t    i_size;
85     uint32_t   i_atime;
86     uint32_t   i_mtime;
87     uint32_t   i_ctime;
88     blkno_t  i_addr[20];
89 } dinode;               /* Exactly 64 bytes long! */
90
91 /* Bit masks for i_mode and st_mode */
92
93 #define OTH_EX  0001
94 #define OTH_WR  0002
95 #define OTH_RD  0004
96 #define GRP_EX  0010
97 #define GRP_WR  0020
98 #define GRP_RD  0040
99 #define OWN_EX  0100
100 #define OWN_WR  0200
101 #define OWN_RD  0400
102
103 #define SAV_TXT 01000
104 #define SET_GID 02000
105 #define SET_UID 04000
106
107 #define MODE_MASK 07777
108
109 #define F_REG   0100000
110 #define F_DIR   040000
111 #define F_PIPE  010000
112 #define F_BDEV  060000
113 #define F_CDEV  020000
114
115 #define F_MASK  0170000
116
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 # */
121     dinode     c_node;
122     char       c_refs;            /* In-core reference count */
123     char       c_dirty;           /* Modified flag. */
124 } cinode, *inoptr;
125
126 typedef struct filesys {
127     uint16_t    s_mounted;
128     uint16_t    s_isize;
129     uint16_t    s_fsize;
130     int16_t     s_nfree;
131     blkno_t     s_free[50];
132     int16_t     s_ninode;
133     uint16_t    s_inode[50];
134     uint8_t     s_fmod;
135     uint8_t     s_timeh;        /* top bits of time */
136     uint32_t    s_time;
137     blkno_t     s_tfree;
138     uint16_t    s_tinode;
139     uint8_t     s_shift;
140     inoptr      s_mntpt;
141 } filesys, *fsptr;
142
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 */
175
176
177 #ifdef UCP
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 */
190     //int         u_argn2;
191     //int         u_argn3;        /* args n-3, n-2, n-1, and n */
192
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*/
198
199     //int         u_gid;
200     int         u_euid;
201     int         u_egid;
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) */
210
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 */
216     //uint32_t      u_cstime;
217 } u_data;
218
219 #if 0
220 typedef struct oft {
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*/
225 } oft;
226 extern struct oft of_tab[OFTSIZE]; /* Open File Table */
227 #endif
228
229 extern inoptr root;
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;
235
236 void xfs_init(int bootdev);
237 void xfs_end(void);
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);
249 void updoff(int d);
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);
273 int oft_alloc(void);
274 void oft_deref(int of);
275 int uf_alloc(void);
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);
295 char *tmpbuf(void);
296 char *zerobuf(void);
297 void bufsync(void);
298 bufptr bfind(int dev, blkno_t blk);
299 bufptr freebuf(void);
300 void bufinit(void);
301 int bdread(bufptr bp);
302 int bdwrite(bufptr bp);
303 #endif
304
305 #endif