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