1 #ifndef __CMIOS9_H
2 #define __CMIOS9_H
3 /*
4 * Copyright (C) 2001, 2002, 2003, 2004, 2005  K. M. Indlekofer
5 *
6 * M.Indlekofer@fz-juelich.de
7 *
8 * This program is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU General Public License
10 * as published by the Free Software Foundation; either version 2
11 * of the License, or (at your option) any later version.
12 *
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16 * GNU General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, write to the Free Software
20 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
21 */
22 
23 
24 
25 #ifdef WIN32
26 /* e.g. VC++ */
27 
28 #include "winlib_cmios9.h"
29 
30 #else /* !WIN32 */
31 /* e.g. UNIX-like systems or cygwin */
32 
33 #include <stdio.h>
34 #include <stdlib.h>
35 #include <fcntl.h>
36 #include <sys/stat.h>
37 #include <sys/types.h>
38 #include <limits.h>
39 #include <unistd.h>
40 #include <strings.h>
41 #include <string.h>
42 #include <ctype.h>
43 #include <time.h>
44 
45 #endif /* !WIN32 */
46 
47 
48 
49 #include "cmios9_io.h"
50 
51 
52 
53 /* basic I/O: OS9, and MDR-DOS */
54 #define OS9L2_BLOCKSIZE 0x0100 /* OS9L2 blocksize in bytes, fixed */
55 #define OS9MAX_BLOCKSIZE 0x8000 /* max. OS9 blocksize in bytes, fixed */
56 #define MDR_BLOCKSIZE OS9L2_BLOCKSIZE /* MDR-DOS blocksize in bytes, fixed */
57 /* Note: for OS9/MDR-DOS, block-numbers are limited to 24 Bits */
58 /*       => always fit into signed 32-Bit int! */
59 /*       Byte addresses however need OFF_T! */
60 
61 /* basic I/O: QDOS */
62 /* Note: QDOS blocksize is 1/2 * OS9L2_BLOCKSIZE!!! */
63 #define QDOS_BLOCKSIZE 0x0080 /* QDOS blocksize in bytes, fixed */
64 /* Note: XXX 32-Bit int QDOS block number only enough if located below 256GB of disk!!! */
65 
66 
67 
68 /* OS9 data structures */
69 
70 /* LSN0 */
71 /* XXX in cmios9, partition file is read as 1 block */
72 /*     => parttab buffers are assumed to be OS9MAX_BLOCKSIZE!!! */
73 struct lsn0_s{
74 	/* 0x00: */
75 	u_char dd_tot[3]; /* partition size, same as mdr_tot for MDR-DOS!!! */
76 	u_char dd_tks;
77 	u_char dd_map[2]; /* size of bitmap in bytes, ==0 for MDR-DOS partition */
78 	u_char dd_bit[2]; /* size of cluster in blocks */
79 	u_char dd_dir[3];
80 	u_char dd_own[2];
81 	u_char dd_att;
82 	u_char dd_dsk[2];
83 	u_char dd_fmt;
84 	u_char dd_spt[2];
85 	u_char dd_res[2];
86 	u_char dd_bt[3];
87 	u_char dd_bsz[2];
88 	u_char dd_date[5];
89 #define LSN0_NAMELEN 32
90 	char dd_name[LSN0_NAMELEN]; /* first char starts later in MDR-DOS partition */
91 	/* 0x3f: */
92 	u_char dd_opt[32];
93 	u_char dummy1;
94 	u_char dd_sync[4];
95 #define OS9L2_BMAPSTART 1 /* OS9L2 start of bitmap */
96 	u_char dd_maplsn[4]; /* start sector of bitmap (default: OS9L2_BMPSTART) */
97 	u_char dd_lsnsize[2]; /* logical sector size in bytes (default: OS9L2_BLOCKSIZE) */
98 	u_char dd_versid[2];
99 	char dummy2[4];
100 	/* 0x70: */
101 	u_char dd_ptabstart[3];
102 	u_char dd_pnr;
103 	char dummy3[2];
104 	u_char dd_qdosstart[3]; /* QDOS image partitions */
105 	u_char dd_qdosnr[2];
106 	u_char dd_cmistart[3];  /* CMI image partitions */
107 	u_char dd_cminr[2];
108 	char dummy4[OS9MAX_BLOCKSIZE-128];
109 };
110 
111 /* partition file entry */
112 /* XXX in cmios9, partition file is read as 1 block */
113 /*     => parttab buffers are assumed to be OS9MAX_BLOCKSIZE!!! */
114 struct parttabent_s{
115 	u_char index;
116 	u_char startsec[3];
117 	u_char size[3];
118 	char dummy[9];
119 };
120 #define PARTTAB_NR 16 /* max. number of partitions */
121 
122 /* standard k-partition */
123 #define KPART_STD_PARTSIZE 0x10cc
124 #define KPART_STD_FSYSSIZE 0x10cc
125 #define KPART_STD_BITMSIZE 0x10d0 /* FSYSSIZE according to clustersize*bitmapsize */
126 
127 /* segment descriptor */
128 struct seg_s{
129 	u_char addr[3]; /* in blocksize */
130 	u_char size[2]; /* in blocksize */
131 };
132 #define SEG_S_SIZEMAX 0xffff /* in blocksize */
133 
134 /* file descriptor */
135 /* XXX in cmios9, file descriptor is read as 1 block */
136 /*     filedes buffers assumed to be OS9MAX_BLOCKSIZE!!! */
137 struct filedes_s{
138 	u_char fd_att;
139 	u_char fd_own[2];
140 	u_char fd_dat[5];
141 	u_char fd_link;
142 	u_char fd_fsize[4]; /* file size in bytes (max. 4GB) */
143 	u_char fd_creat[3];
144 #define FILEDES_SEGNR 48
145 	struct seg_s fd_seg[FILEDES_SEGNR];
146 	u_char dummy[OS9MAX_BLOCKSIZE-256];
147 };
148 
149 /* file and device names are case-insensitive when compared */
150 #define FILENAMELEN 29 /* max. file name length */
151 
152 /* directory entry */
153 struct dirent_s{
154 	char dir_name[FILENAMELEN];
155 	u_char dir_addr[3];
156 };
157 #define DIRBLKS 8 /* XXX directory file allocation granularity */
158 
159 /* attributes */
160 #define ATT_D  0x80 /* directory */
161 #define ATT_S  0x40 /* non-sharable */
162 #define ATT_PE 0x20 /* public execute */
163 #define ATT_PW 0x10 /* public write */
164 #define ATT_PR 0x08 /* public read */
165 #define ATT_E  0x04 /* owner execute */
166 #define ATT_W  0x02 /* owner write */
167 #define ATT_R  0x01 /* owner read */
168 
169 
170 
171 /* MDR-DOS data structures */
172 
173 /* sizes and starts in MDR_BLOCKSIZE! */
174 #define MDR_CLUSTERSIZE  0x001000 /* granularity */
175 #define MDR_BMAPSTART    0x000004 /* start of Bitmap */
176 #define MDR_BMAPSIZE     0x000002 /* Bitmap size */
177 #define MDR_DIRSTART     0x000006 /* start of directory */
178 #define MDR_DIRENTRYSIZE 0x000028 /* file entry in directory */
179 
180 /* LSN0 */
181 struct mdr_lsn0_s{
182 	u_char mdr_tot[3];  /* same as dd_tot for OS9!!! */
183 	u_char mdr_clsz;    /* cluster size in MDR_CLUSTERSIZE blocks! */
184 	u_char zero1[2];    /* must be zero: !=0 for OS9 partition */
185 	u_char mdr_clnr[2]; /* total number of clusters */
186 	u_char zero2[2];    /* must be zero */
187 	u_char mdr_dfnr[2]; /* total number of file entries in directory */
188 	u_char zero3[2];    /* must be zero */
189 	u_char mdr_fnr[2];  /* last valid file entry number+1 */
190 	u_char zero4[16];   /* must be zero */
191 #define MDR_LSN0_NAMELEN 32
192 	char mdr_name[MDR_LSN0_NAMELEN];  /* name (null-terminated) */
193 	u_char zero5[192];  /* must be zero */
194 };
195 
196 #define MDR_LSN0_P(p) ((struct mdr_lsn0_s *)(p))
197 /* Note: mdr_lsn0_s fits into lsn0_s!!! */
198 
199 /* directory entry */
200 #define MDR_FILECLNR 0xf00  /* max. number of clusters in file */
201 
202 /* should be MDR_DIRENTRYSIZE*MDR_BLOCKSIZE */
203 #define MDR_DIRENT_NAMELEN 32
204 struct mdr_dirent_s{
205 	u_char dummy1[512];
206 	char name[MDR_DIRENT_NAMELEN]; /* file name (null-terminated), name[0]==0 if not used  */
207 #define MDR_MDOSTYPE "MDOS"
208 	char type[4];    /* type */
209 	u_char size[4];  /* file size in bytes (max. 4GB) */
210 	u_char dummy2[8];
211 	u_char back[6];  /* creation/backup date: yy-mm-dd hh:mm:ss */
212 	u_char dummy3[10];
213 	u_char modif[6]; /* modification date: yy-mm-dd hh:mm:ss */
214 	u_char dummy4[10];
215 	u_char dummy5[0x7b0];
216 	u_char clist[MDR_FILECLNR][2]; /* cluster list */
217 };
218 
219 
220 
221 /* QDOS data structures (derived from MDOS) */
222 /* Note: partitions are for floppy images, supported by "QDOS Tackiton driver" */
223 /* Note: system floppy is in CMI Series IIx QDOS-6809 low-level format */
224 /*       sound floppy is in CMI Series I/II QDOS-6800 low-level format */
225 
226 #define QDOS_PBLKS (2*26*77) /* number QDOS blocks within QDOS partition */
227 							 /* Note: comes from 2 heads, 26 sectors/track, 77 tracks */
228 #define QDOS_PSIZE (QDOS_PBLKS*QDOS_BLOCKSIZE) /* QDOS partition size in bytes */
229 #define QDOS_CSIZE 4 /* fixed QDOS cluster size in QDOS blocks */
230 
231 /* QDOS disk ID (block 0) */
232 /* should be QDOS_BLOCKSIZE */
233 struct qdos_did_s{
234 	char did_id[8];  /* disk ID (unused chars filled with space) */
235 	char did_vn[2];  /* version number */
236 	char did_rn[2];  /* revision number */
237 	char did_dt[6];  /* date: DD-MM-YY */
238 	char did_nm[20]; /* user name (unused chars filled with space) */
239 #define QDOS_DID_RBNR 7
240 	u_char did_rb[QDOS_DID_RBNR][2]; /* overlay RIB addresses in QDOS blocks */
241 	u_char did_btsec[2]; /* bootblock: start sector in QDOS blocks */
242 						 /* Note: typ. QDOS_BTSEC */
243 	u_char did_btsiz[2]; /* bootblock: size in QDOS blocks */
244 						 /* Note: typ. QDOS_BTSIZ */
245 	u_char did_btloa[2]; /* bootblock: load address in bytes */
246 						 /* Note: typ. QDOS_BTLOA */
247 	char did_slinflag; /* start line flag */
248 	char did_slin[69]; /* start line (shell command, executed at boot time) */
249 };
250 
251 #define QDOS_BTSEC       0x0017 /* default bootblock in QDOS blocks */
252 								/* Note: actual value in did_btsec */
253 #define QDOS_BTSIZ       0x0002 /* default bootblock load size in QDOS blocks */
254 								/* Note: default loads QDOS_BTSEC and QDOS_DOSRIB */
255 								/* Note: actual value in did_btsiz */
256 #define QDOS_BTLOA       0x0080 /* default bootblock load address in bytes */
257 								/* Note: actual value in did_btloa */
258 #define QDOS_DOSRIB      0x0018 /* default RIB of xxxDOS.SY in QDOS blocks */
259 								/* Note: typ. loaded together with QDOS_BTSEC */
260 #define QDOS_FSYSSTART   0x0018 /* start of file-system area in QDOS blocks */
261 								/* Note: typ. xxxDOS.SY starts here */
262 
263 #define QDOS_LSN0_P(p) ((struct qdos_did_s *)(p))
264 /* Note: qdos_did_s fits into lsn0_s!!! */
265 
266 /* cluster allocation table (CAT): 1 block */
267 #define QDOS_CATSTART     0x0001 /* in QDOS blocks */
268 /* lockout cluster allocation table (LCAT): 1 block */
269 #define QDOS_LCATSTART    0x0002 /* in QDOS blocks */
270 
271 /* directory */
272 #define QDOS_DIRSTART     0x0003 /* in QDOS blocks */
273 #define QDOS_DIRSIZE      0x0014 /* in QDOS blocks */
274 #define QDOS_DIRENTRYSIZE 0x0010 /* in bytes */
275 #define QDOS_DIRENTRYNR   ((QDOS_DIRSIZE*QDOS_BLOCKSIZE)/QDOS_DIRENTRYSIZE)
276                           /* number of files in directory */
277 /* QDOS directory entry */
278 /* should be QDOS_DIRENTRYSIZE */
279 struct qdos_dir_s{
280 #define QDOS_DIR_VACANT  0x00 /* first char in dir_nm if first vacant entry */
281 #define QDOS_DIR_DELETED ((char)0xff) /* first char in dir_nm if deleted entry */
282 									  /* Note: typ. also second char */
283 	char dir_nm[8]; /* name (unused chars filled with space) */
284 	char dir_sx[2]; /* suffix (unused chars filled with space) */
285 	u_char dir_rb[2]; /* RIB address in QDOS blocks */
286 	u_char dir_at[2]; /* attributes */
287 	u_char dir_nu[2]; /* not used area */
288 };
289 
290 /* attributes */
291 /* Byte 0: */
292 #define QDOS_ATT_FLM 0xf8 /* flag mask */
293 #define QDOS_ATT_WRT 0x80 /* write protect */
294 #define QDOS_ATT_DEL 0x40 /* delete protect */
295 #define QDOS_ATT_SYS 0x20 /* system file */
296 #define QDOS_ATT_CON 0x10 /* contiguous allocation */
297 #define QDOS_ATT_NCS 0x08 /* non-compressed spaces */
298 #define QDOS_ATT_FMM 0x07 /* format mask */
299 #define QDOS_ATT_FMU 0x00 /* user-defined format */
300 #define QDOS_ATT_FMD 0x01 /* default object record format */
301 #define QDOS_ATT_FML 0x02 /* binary load format */
302 #define QDOS_ATT_FMB 0x03 /* binary record format */
303 #define QDOS_ATT_FMA 0x05 /* ASCII record format */
304 #define QDOS_ATT_FMC 0x07 /* ASCII-converted-binary record format */
305 /* Byte 1: */
306 /* XXX */
307 
308 /* QDOS "retrieval information block" (RIB) */
309 /* should be QDOS_BLOCKSIZE */
310 /* Note: first block of file allocation (in rib_seg) is used for RIB!!! */
311 struct qdos_rib_s{
312 #define QDOS_RIB_SDWEND    0x8000 /* terminator (end flag) */
313 #define QDOS_RIB_SDWTOTSIZ 0x7fff /* if end flag: mask for file data size-1 in QDOS blocks */
314 #define QDOS_RIB_SDWSIZ    0x7c00 /* mask for segment size-1 in QDOS clusters */
315 #define QDOS_RIB_SDWSIZMAX 0x0020 /* max. number of clusters per segment */
316 #define QDOS_RIB_SDWOFF    0x03ff /* mask for segment start in QDOS clusters */
317 #define QDOS_RIB_SDWNR     58
318 	u_char rib_sdw[QDOS_RIB_SDWNR][2]; /* segment descriptor words (SDW) */
319 	u_char zero0;
320 	u_char rib_lb; /* number of bytes in last sector(==block) */
321 				   /* rib_lb==0 means full block (QDOS_BLOCKSIZE) */
322 				   /* MDOS requires rib_lb%8==0 */
323 	u_char rib_sl[2]; /* number of sectors(==blocks) to load */
324 	u_char rib_la[2]; /* memory load address */
325 	u_char rib_sa[2]; /* start execution address */
326 	u_char zero1[4];
327 };
328 
329 
330 
331 /* personal data structures */
332 
333 /* partition */
334 struct part_s{
335 	/* general */
336 #define PARTTYPE_UNDEF  0 /* undefined */
337 #define PARTTYPE_OS9MDR 1 /* OS9/MDR-DOS */
338 #define PARTTYPE_QDOS   2 /* QDOS */
339 	u_int type; /* partition/filesystem type */
340 	u_int master; /* !=0 if OS9/MDR-DOS master partition */
341 	u_int mdr; /* !=0 if MDR-DOS partition */
342 	u_int blksiz; /* blocksize of partition in bytes */
343 	u_int startsec; /* in blksiz!!! */
344 	u_int psize;   /* size according to partition table entry in blksiz!!! */
345 	               /* or totsize */
346 	u_int totsize; /* size (dd_tot) according to LSN0 of partition in blksiz!!! */
347 	               /* if ==0: partition marked invalid! */
348 	struct lsn0_s *lsn0; /* pointer to LSN0 of this partition */
349 	int fdes; /* file descriptor of this partition */
350 	/* OS9 */
351 	u_int bitmapstart; /* in blocksize */
352 	u_int bitmapsize; /* in bytes */
353 	u_int clustersize;
354 	u_int filesyssize;
355 	u_int rootdirsec;
356 	u_int bootsec;
357 	u_int bootsize;
358 	u_int ptabsec;
359 	u_int pnr;
360 	/* MDR-DOS */
361 	u_int mdr_clustersize; /* now in MDR_BLOCKSIZE!!! */
362 	u_int mdr_clusternr;
363 	u_int mdr_filesyssize;
364 	u_int mdr_dfilenr;
365 	u_int mdr_filenr;
366 	/* QDOS */
367 	/* XXX */
368 	/* general */
369 	char devname[FILENAMELEN+1];
370 };
371 
372 /* "QDOS file descriptor" */
373 /* Note: RIB not enough: need dir_at as well!!! */
374 struct qdos_fdes_s{
375 	struct qdos_dir_s dir;
376 	struct qdos_rib_s rib;
377 };
378 
379 /* general */
380 /* generic file descriptor */
381 union genfdes_u{
382 	struct filedes_s os9;       /* OS9 */
383 	struct mdr_dirent_s mdrdos; /* MDR-DOS */
384 	struct qdos_fdes_s qdos;    /* QDOS */
385 };
386 
387 /* general */
388 /* generic file */
389 struct genfile_s{
390 	union genfdes_u fdes;
391 	struct part_s *part;
392 	u_int startsec;
393 	u_int fdessec;
394 	u_int size;
395 };
396 
397 
398 
399 /* general */
400 /* current partition I/O */
401 #ifndef READBLOCK_CURPART
402 #define READBLOCK_CURPART(a,b,c) readblock(curpart->fdes,a,b,c,curpart->startsec,curpart->totsize,curpart->blksiz)
403 #endif
404 #ifndef WRITEBLOCK_CURPART
405 #define WRITEBLOCK_CURPART(a,b,c) writeblock(curpart->fdes,a,b,c,curpart->startsec,curpart->totsize,curpart->blksiz)
406 #endif
407 
408 
409 
410 /* general */
411 #define PARTITION_NR 128
412 extern struct lsn0_s lsn0[PARTITION_NR];
413 extern struct part_s part[PARTITION_NR];
414 extern u_int partnr; /* number of used partitions */
415 
416 /* current partition */
417 extern struct part_s *curpart;
418 extern u_int curowner; /* who we are */
419 
420 
421 
422 /* OS9 */
423 /* current directory */
424 extern u_int curdirsec;
425 
426 /* general */
427 #define DIRLEVELNR 8 /* just for display-purposes, no OS9-specific limitation!!! */
428 extern int dirlevel; /* 0: root, level index to dirlist=dirlevel-1 */
429 extern char dirlist[DIRLEVELNR][FILENAMELEN];
430 
431 /* general */
432 /* device aliases */
433 struct devalias_s{
434 	char *alias;
435 	char *equ;
436 };
437 
438 extern struct devalias_s devalias[];
439 
440 
441 
442 extern void translatename(char *name,char *buf);
443 extern void translatebackname(char *name,char *buf,u_int size);
444 extern void printname(char *name);
445 extern void printnstr(char *str,int maxn);
446 extern void qdos_makefname(char *in,char *out);
447 extern int lsn0label(char *name);
448 extern int qdos_didlabel(char *id,char *vnrn,char *date,char *user);
449 extern void setdate(struct filedes_s *fd,int cre);
450 extern void lsn0setdate(struct lsn0_s *pp);
451 extern void mdr_setdate(struct mdr_dirent_s *fd,int cre);
452 extern int setseg(struct seg_s *seglist,u_int start,u_int size);
453 extern int getseg(struct seg_s *seglist,u_int *startp,u_int *sizep);
454 extern u_int countseg(struct seg_s *seglist,u_int segnr,u_int *contblp);
455 extern u_int mdr_countclu(struct mdr_dirent_s *direntp,u_int clunr,u_int *contclp);
456 extern int qdos_setseg(struct qdos_rib_s *ribp,u_int seg,u_int start,u_int size);
457 extern int qdos_getseg(struct qdos_rib_s *ribp,u_int seg,u_int *startp,u_int *sizep);
458 extern u_int qdos_countseg(struct qdos_rib_s *ribp,u_int segnr,u_int *contclp);
459 extern u_int qdos_fsize(struct qdos_rib_s *ribp);
460 extern int qdos_setfsize(struct qdos_rib_s *ribp,u_int fsize);
461 extern int bitmaptranslate(u_int sec,u_int *bmapbitp,u_int *bmapbytep,u_int *bmapblkp);
462 extern int mdr_bitmaptranslate(u_int sec,u_int *bmapbitp,u_int *bmapbytep,u_int *bmapblkp);
463 extern int qdos_bitmaptranslate(u_int sec,u_int *bmapbitp,u_int *bmapbytep);
464 extern int markbitmap2(u_int startblk,u_int size,int markused,int check);
465 extern int markbitmap(struct seg_s *seglist,u_int segnr,int markused);
466 extern int mdr_markbitmap2(u_int startblk,u_int size,int markused,int check);
467 extern int mdr_markbitmap(struct mdr_dirent_s *direntp,u_int fclunr,int markused);
468 extern int qdos_markbitmap2(u_int startblk,u_int size,int markused,int check,int lcat);
469 extern int qdos_markbitmap(struct qdos_rib_s *ribp,u_int segnr,int markused);
470 extern int initbitmap(void);
471 extern int mdr_initbitmap(void);
472 extern int qdos_initbitmap(int single,int newlcat);
473 extern int newfs(u_int blksiz,u_int totsize,u_int clustersize,u_int filesyssize,int floppyflag);
474 extern int mdr_newfs(u_int totsize,u_int clustersize,u_int dfilenr);
475 extern int qdos_newfs(int single,int newlcat);
476 extern int findfree(u_int seekstart,u_int minsize,
477 					u_int *segstartp,u_int *segsizep,
478 					u_int *lsegstartp,u_int *lsegsizep,u_int *segnrp,
479 					struct seg_s *skiplist,u_int skipnr,int fullscan);
480 extern int mdr_findfree(u_int seekstart,u_int minsize,
481 						u_int *segstartp,u_int *segsizep,
482 						u_int *lsegstartp,u_int *lsegsizep,u_int *segnrp,
483 						struct mdr_dirent_s *skipdirentp,u_int skipnr,int fullscan);
484 extern int qdos_findfree(u_int seekstart,u_int minsize,
485 						 u_int *segstartp,u_int *segsizep,
486 						 u_int *lsegstartp,u_int *lsegsizep,u_int *segnrp,
487 						 struct qdos_rib_s *skipribp,u_int skipnr,int fullscan);
488 extern int findfreelist(struct seg_s *seglist,u_int segnr,
489 						u_int startblk,u_int blknr);
490 extern int mdr_findfreelist(struct mdr_dirent_s *direntp,u_int startfclu,u_int fclunr,
491 							u_int startblk,u_int blknr);
492 extern int qdos_findfreelist(struct qdos_rib_s *ribp,u_int startseg,u_int segnr,
493 							 u_int startblk,u_int blknr);
494 extern int appendfreelist(struct seg_s *seglist,u_int segnr,u_int blknr);
495 extern int mdr_appendfreelist(struct mdr_dirent_s *direntp,u_int startfclu,u_int fclunr,u_int blknr);
496 extern int qdos_appendfreelist(struct qdos_rib_s *ribp,u_int startseg,u_int segnr,u_int blknr);
497 extern void qdos_printatt0(u_char att);
498 extern void printatt(u_char att);
499 extern int setattr(struct filedes_s *fdes,char *str);
500 extern int qdos_setattr(struct qdos_rib_s *ribp,u_int fnr,void *indirp,char *attstr);
501 extern u_int printfiledes(struct part_s *pp,struct filedes_s *fdes,int verbose);
502 extern void mdr_printdirent(struct mdr_dirent_s *direntp);
503 extern void qdos_printfdes(	struct qdos_dir_s *dirp,struct qdos_rib_s *ribp);
504 extern int filelseek(union genfdes_u *fp,u_int lblk,u_int *contblksp);
505 extern int fileread(union genfdes_u *fp,void *buf,u_int lblkstart,u_int lblknr);
506 extern int filewrite(union genfdes_u *fp,void *buf,u_int lblkstart,u_int lblknr);
507 extern int filedel(u_int fdessec);
508 extern int mdr_filedel(struct mdr_dirent_s *direntp);
509 extern int qdos_filedel(struct qdos_rib_s *qrib);
510 extern int filecreat(struct filedes_s *fdes,u_int blknr,int extend);
511 extern int mdr_filecreat(struct mdr_dirent_s *direntp,u_int blknr,int extend);
512 extern int qdos_filecreat(struct qdos_rib_s *ribp,u_int blknr,int extend);
513 extern int getdir(u_int newdirsec,struct filedes_s *curdirdesp,u_int *curdirsizep);
514 extern int findfile(char *name,int countfree,u_int *freeentp);
515 extern int mdr_findfile(char *name);
516 extern int qdos_findfile(char *name);
517 extern int deldirent(char *name,int dir);
518 extern int creatdirent(char *name,u_int startsec);
519 extern int changedir2(char *name);
520 extern int delfile(char *name,int dir);
521 extern int mdr_updatefilenr(void);
522 extern int mdr_delfile(char *name);
523 extern int qdos_delfile(char *name);
524 extern int creatfile(char *name,u_int bytesize,int dir,struct filedes_s *tmplt);
525 extern int mdr_creatfile(char *name,u_int bytesize,struct mdr_dirent_s *tmplt);
526 extern int qdos_creatfile(char *name,u_int bytesize,struct qdos_fdes_s *tmplt);
527 extern int readlsn0(u_int blocksize0);
528 extern void printlsn0(void);
529 extern int partsetup(int fdes,u_int devid,int forceqdosnr);
530 extern int partmodif(struct parttabent_s *parttab,u_int index,u_int size,u_int startsec,int clearall);
531 extern struct part_s *partchange2(char *name,int check);
532 extern int printpartinfo(char *part,u_int seekstart,u_int minsize,int mode);
533 extern void printpartlist(int mode);
534 extern int findfile3(char *path,u_int *startsecp,struct part_s **partp);
535 extern int dirlistupdate3(char *path);
536 extern void printdirlist(void);
537 extern int changedir3(char *path,int update);
538 extern int creatfile3(char *path,u_int bytesize,int dir,struct genfile_s *tmplt);
539 extern int readfiledes3(char *path,union genfdes_u *fp,u_int *typep,u_int *mdrp,
540 						u_int *startsecp,struct part_s **partp,u_int *fdessecp,
541 						int pchg,u_int *sizep,int touch);
542 extern int extendfile3(char *path,u_int bytesize);
543 extern int lsn0reset(void);
544 extern int lsn0bootfile(char *path,int bsz);
545 extern int lsn0partfile(char *path);
546 extern int qdos_ovfile(char *path,u_int ovnr);
547 extern int qdos_setboot(u_int btsec,u_int btsiz,u_int btloa);
548 extern int listdirtree(int (*recfct)(char *name,int rec,int arg),int arg);
549 extern int mdr_listdir(void);
550 extern int qdos_listdir(void);
551 extern int listdir(int (*recfct)(char *name,int rec,int arg),int arg);
552 extern int printdir3(char *path,int recursive,int tree);
553 extern int openfile3(char *path,struct genfile_s *fp,int touch);
554 extern int readfile4(struct genfile_s *fp,char *buf,u_int bytestart,u_int bytenr);
555 extern int writefile4(struct genfile_s *fp,char *buf,u_int bytestart,u_int bytenr);
556 extern int movefile3(char *path1,char *path2,int link);
557 extern int delfile3 (char *path,int dir);
558 extern int filesetattr3(char *path,char *str,int own);
559 
560 
561 
562 #endif /* !__CMIOS9_H */
563