dosFsLibP.h
上传用户:luoyougen
上传日期:2008-05-12
资源大小:23136k
文件大小:22k
源码类别:

VxWorks

开发平台:

C/C++

  1. /* dosFsLibP.h - DOS file system private header file */
  2. /* Copyright 1984-2002 Wind River Systems, Inc. */
  3.  
  4. /* modification history
  5. --------------------
  6. 01q,03mar02,jkf  SPR#29751, added volIsCaseSens to DOS_VOLUME_DESC, orig by chn
  7. 01p,30nov01,jkf  SPR#68203, add updateLastAccessDate boolean to DOS_VOLUME_DESC
  8. 01o,17nov01,jkf  fixing dosFsVolIsFat12 divide error.
  9. 01n,10nov01,jkf  SPR#32178, made dosFsVolDescGet public, moved 
  10.                  DOS_VOLUME_DESC_ID typedef to public dosFsLib.h
  11. 01m,30jul01,jkf  SPR#69031, common code for both AE & 5.x. 
  12. 01l,13mar01,jkf  SPR#34704, adding dosFsVolIsFat12
  13. 01k,29feb00,jkf  removed semLibP.h usage for t3.
  14. 01j,31aug99,jkf  CBIO API overhaul changes.
  15. 01i,31jul99,jkf  added DOS_BOOT_FSTYPE_ID, and DOS_BOOT_FSTYPE_LEN,
  16.                  SPR#28272, 28273, 28274, 28275.
  17. 01h,31jul99,jkf  T2 merge, tidiness & spelling.
  18. 01g,21dec98,mjc  changed name of <contigEnd> field in structure <DOS_FILE_HDL> 
  19.                  to <contigEndPlus1>
  20. 01f,22nov98,vld  field <seekOut> changed to <seekOutPos> in
  21.  DOS_FILE_DESC structure;
  22.  added macros POS_TO_DD_COOKIE() and DD_COOKIE_TO_POS();
  23.            fields <rootStartSec> and <rootNSec> added to
  24.  DOS_DIR_DESC structure
  25. 01e,23sep98,vld  field <bufToDisk> added to CHK_DSK_DESC;
  26. 01d,17sep98,vld  field <activeCopyNum> added to DOS_FAT_DESC;
  27.  changed prototypes of some func ptr fields of DOS_FAT_DESC;
  28.  func ptr field <syncToggle> added to DOS_FAT_DESC;
  29.                  added constant DOS_FAT_RAW;
  30.                  added constant DOS_FAT_SET_ALL;
  31.            changed prototypes of some function ptrs
  32.           in DOS_FAT_DESC;
  33. 01c,16sep98,vld  definition of DOS_VOL_LABEL_LEN moved to dosFsLib.h 
  34. 01b,02jul98,lrn  ready for prerelease
  35. 01a,22jan98,vld  written,
  36. */
  37. #ifndef __INCdoFsLibP
  38. #define __INCdoFsLibP
  39. #ifdef __cplusplus
  40. extern "C" {
  41. #endif
  42. #include "vxWorks.h"
  43. #include "private/dosFsVerP.h"
  44. #include "semLib.h" 
  45. #include "iosLib.h"
  46. #include "cbioLib.h"
  47. #include "dirent.h"
  48. #include "stat.h"
  49. #include "dosFsLib.h"
  50. /* defines */
  51. /* use 64-bit arithmetic */
  52. #define SIZE64
  53. #define DOS_FS_MAGIC 0xdfac9723 /* used for verification of vol desc */
  54. #define DOS_VX_LONG_NAMES_SYS_ID "VXEXT"
  55. #define SLASH           '/'
  56. #define BACK_SLASH      '\'
  57. #define DOT             '.'
  58. #define SPACE           ' '
  59. /* 
  60.  * handlers ID.
  61.  * Each handler (FAT, Directory and so on) must have its own
  62.  * identification number in order to be able to distinguish
  63.  * different handler types when selecting handlers
  64.  */
  65.     /* directory handlers */
  66. #define DOS_DIR_HDLR_MASK (1 << 8) /* dir handlers mask */
  67. #define DOS_DIROLD_ID (DOS_DIR_HDLR_MASK +1) /* 8.3 and vxLong names */
  68.     /* FAT handlers */
  69. #define DOS_FAT_HDLR_MASK (1 << 9) /* fat handlers mask */
  70. /* function arguments */
  71. /* for directory handler API */
  72. #define DH_TIME_CREAT 1
  73. #define DH_TIME_MODIFY (1<<1)
  74. #define DH_TIME_ACCESS (1<<2)
  75. #define DH_DELETE (1<<8)
  76. /* FAT handler API */
  77. #define FAT_NOT_ALLOC 0
  78. #define FAT_ALLOC (1<<31)
  79. #define FAT_ALLOC_ONE (FAT_ALLOC|1)
  80. #define FH_INCLUDE 0
  81. #define FH_EXCLUDE 1
  82. #define FH_FILE_START ((u_int)(-1))
  83. /* dosFs file system constants */
  84. #define DOS_BOOT_SEC_NUM        0       /* sector number of boot sector */
  85. #define DOS_MIN_CLUST           2       /* lowest cluster number used */
  86. #define DOS_SYS_ID_LEN          8       /* length of system ID string */
  87. #define DOS_FAT_12BIT_MAX 4085    /* max clusters for 12-bit FAT entries*/
  88. #define DOS_NFILES_DEFAULT 20 /* default max number of files */
  89. /* Boot sector offsets */
  90.  
  91. /*   Because the MS-DOS boot sector format has word data items
  92.  *   on odd-byte boundaries, it cannot be represented as a standard C
  93.  *   structure.  Instead, the following symbolic offsets are used to
  94.  *   isolate data items.  Non-string data values longer than 1 byte are
  95.  *   in "Intel 8086" order.
  96.  *
  97.  *   These definitions include fields used by MS-DOS Version 4.0.
  98.  */
  99. #define DOS_BOOT_JMP            0x00    /* 8086 jump instruction     (3 bytes)*/
  100. #define DOS_BOOT_SYS_ID         0x03    /* system ID string          (8 bytes)*/
  101. #define DOS_BOOT_BYTES_PER_SEC  0x0b    /* bytes per sector          (2 bytes)*/
  102. #define DOS_BOOT_SEC_PER_CLUST  0x0d    /* sectors per cluster       (1 byte) */
  103. #define DOS_BOOT_NRESRVD_SECS   0x0e    /* # of reserved sectors     (2 bytes)*/
  104. #define DOS_BOOT_NFATS          0x10    /* # of FAT copies           (1 byte) */
  105. #define DOS_BOOT_MAX_ROOT_ENTS  0x11    /* max # of root dir entries (2 bytes)*/
  106. #define DOS_BOOT_NSECTORS       0x13    /* total # of sectors on vol (2 bytes)*/
  107. #define DOS_BOOT_MEDIA_BYTE     0x15    /* media format ID byte      (1 byte) */
  108. #define DOS_BOOT_SEC_PER_FAT    0x16    /* # of sectors per FAT copy (2 bytes)*/
  109. #define DOS_BOOT_SEC_PER_TRACK  0x18    /* # of sectors per track    (2 bytes)*/
  110. #define DOS_BOOT_NHEADS         0x1a    /* # of heads (surfaces)     (2 bytes)*/
  111. #define DOS_BOOT_NHIDDEN_SECS   0x1c    /* # of hidden sectors       (4 bytes)*/
  112. #define DOS_BOOT_LONG_NSECTORS  0x20    /* total # of sectors on vol (4 bytes)*/
  113. #define DOS_BOOT_DRIVE_NUM      0x24    /* physical drive number     (1 byte) */
  114. #define DOS_BOOT_SIG_REC        0x26    /* boot signature record     (1 byte) */
  115. #define DOS_BOOT_VOL_ID         0x27    /* binary volume ID number   (4 bytes)*/
  116. #define DOS_BOOT_VOL_LABEL      0x2b    /* volume label string      (11 bytes)*/
  117. #define DOS_BOOT_FSTYPE_ID 0x36    /* new MS ID, FAT12 or FAT16 */
  118. #define DOS_BOOT_FSTYPE_LEN 0x08    /* length in bytes of FSTYPE */
  119. #define DOS_BOOT_FSTYPE_FAT16   "FAT16   "  /* FSTYPE_ID FAT16 */
  120. #define DOS_BOOT_FSTYPE_FAT12   "FAT12   "  /* FSTYPE_ID FAT12 */
  121. #define DOS_BOOT_SYSID_FAT32    "FAT32   "  /* FAT32 SYS_ID, */
  122. #define DOS_BOOT_PART_TBL       0x1be   /* first disk partition tbl (16 bytes)*/
  123. #define DOS_EXT_BOOT_SIG        0x29    /* value written to boot signature */
  124.                                         /* record to indicate extended */
  125.                                         /* (DOS v4) boot record in use  */
  126. /* extended FAT32 fields offsets */
  127. #define DOS32_BOOT_SEC_PER_FAT 0x24    /* sectors per FAT           (4 bytes)*/
  128. #define DOS32_BOOT_EXT_FLAGS 0x28    /* FAT  miscellaneous flags  (2 bytes)*/
  129. #define DOS32_BOOT_FS_VERSION 0x2a    /* file system version       (2 bytes)*/
  130. #define DOS32_BOOT_ROOT_START_CLUST 0x2c /* root start cluster       (4 bytes)*/
  131. #define DOS32_BOOT_FS_INFO_SEC 0x30    /* file system info sector   (2 bytes)*/
  132. #define DOS32_BOOT_BOOT_BKUP 0x32    /* bkup of boot sector       (2 bytes)*/
  133. #define DOS32_BOOT_RESERVED 0x3a    /* reserved area             (6 bytes)*/
  134. #define DOS32_BOOT_BIOS_DRV_NUM 0x40 /* 0x80 for hard disk        (1 byte)*/
  135. #define DOS32_BOOT_SIGNATURE 0x42 /* ')' (0x29)                (1 byte)*/
  136. #define DOS32_BOOT_VOL_ID 0x43 /* binary volume Id          (4 bytes*/
  137. #define DOS32_BOOT_VOL_LABEL 0x47    /* volume label string      (11 bytes)*/
  138. #define DOS32_BOOT_FS_TYPE 0x52 /* string FAT32 */
  139. #define DOS_BOOT_BUF_SIZE 0x80 /* size of buffer large enough to */
  140. /* get boot sector data to */
  141. /* ( without partition table ) */
  142. #define CHK_MAX_PATH 1024 /* max path in check disk's message */
  143. /* macros */
  144. /* endian data conversion macros, disk always L.E. */
  145. #define DISK_TO_VX_16( pSrc ) (UINT16)(
  146.   ( *((u_char *)(pSrc)+1) << 8 ) |
  147.   ( *(u_char *)(pSrc)          ) )
  148. #define DISK_TO_VX_32( pSrc ) (UINT32)(
  149.   ( *((u_char *)(pSrc)+3)<<24 ) |
  150.                      ( *((u_char *)(pSrc)+2)<<16 ) |
  151.                      ( *((u_char *)(pSrc)+1)<< 8 ) |
  152.                       ( *(u_char *)(pSrc)         ) )
  153. #define VX_TO_DISK_16( src, pDst )  
  154. ( * (u_char *)(pDst)       = (src)       & 0xff, 
  155.   *((u_char *)(pDst) + 1)  = ((src)>> 8) & 0xff )
  156. #define VX_TO_DISK_32( src, pDst )    
  157. ( * (u_char *)(pDst)       = (src)        & 0xff,  
  158.   *((u_char *)(pDst) + 1)  = ((src)>> 8)  & 0xff,  
  159.   *((u_char *)(pDst) + 2)  = ((src)>> 16) & 0xff,  
  160.   *((u_char *)(pDst) + 3)  = ((src)>> 24) & 0xff ) 
  161. /* sector macros */
  162. #define NSECTORS( pVolDesc, off ) ( (off) >> (pVolDesc)->secSizeShift )
  163. #define OFFSET_IN_SEC( pVolDesc, off )
  164. ( (off) & ((pVolDesc)->bytesPerSec - 1) )
  165. /* conversions of sector <-> cluster numbers */
  166. /* check, if directory is root */
  167. #define IS_ROOT( pFd )
  168.     ((pFd)->pFileHdl->dirHdl.parDirStartCluster == (u_long) NONE)
  169. #define ROOT_SET( pFd )
  170.     ((pFd)->pFileHdl->dirHdl.parDirStartCluster = NONE)
  171. /* FAT entry types, returned by clustValueSet() and clustValueGet() */
  172. #define DOS_FAT_AVAIL 0x00000001 /* available cluster */
  173. #define DOS_FAT_EOF 0x00000002 /* end of file's cluster chain */
  174. #define DOS_FAT_BAD 0x00000004 /* bad cluster (damaged media) */
  175. #define DOS_FAT_ALLOC 0x00000008 /* allocated cluster */
  176. #define DOS_FAT_INVAL 0x00000010 /* invalid cluster (illegal value) */
  177. #define DOS_FAT_RESERV 0x00000020 /* reserved cluster */
  178. #define DOS_FAT_RAW 0x00000040 /* write raw data, when fat copy */
  179. /* is used as temporary buffer */
  180. #define DOS_FAT_SET_ALL 0x00000080 /* fill all bytes of FAT copy with */
  181. /* a specified value. */
  182. #define DOS_FAT_ERROR 0x11111111 /* CBIO ERROR */
  183. /*
  184.  * handlers Id-s. All installed handlers are sorted by
  185.  * Id-s, and are tried on every volume in accordance with that order
  186.  */
  187. #define DOS_MAX_HDLRS 4 /* max handlers of one type */
  188. #define DOS_FATALL_HDLR_ID 255 /* dosFsFat16 - supports FAT 12/16/32 */
  189. /* in a simple manner */
  190. /* ( without any buffering ) */
  191. #define DOS_VDIR_HDLR_ID   1 /* dosVDirLib - supports VDIR */
  192. /* directory structure for all FAT types */
  193. #define DOS_DIROLD_HDLR_ID 2 /* dosDirOldLib - supports DOS4.0 */
  194. /* "8.3" names and vxLong names for */
  195. /* all FAT types */
  196. /* definition of 64-bit type and macro to check for 32-bit overflowing */
  197. #ifdef SIZE64
  198. typedef long long fsize_t;
  199. #define DOS_IS_VAL_HUGE( val ) ( ( (fsize_t)(val) >> 32 ) != 0 )
  200. /* test for 32 bit overflowing */
  201. #define DOS_MAX_FSIZE ( ~((fsize_t)1<<(sizeof(fsize_t)*8-1)) )
  202. /* max disk/file size */
  203. #else /* ! SIZE64 */
  204. typedef u_long  fsize_t;
  205. #define DOS_IS_VAL_HUGE( val ) FALSE
  206. #define DOS_MAX_FSIZE ( (fsize_t)(-1) ) /* max disk/file size */
  207. #endif /* SIZE64 */
  208. /*
  209.  * processing for dd_cookie field in DIR structure(). (see dirent.h)
  210.  * Current position in directory supposed to be always power of 2
  211.  */
  212. #define POS_TO_DD_COOKIE( pos ) ( ((u_long)(pos)) | 1 )
  213. #define DD_COOKIE_TO_POS( pDir ) ( ((DIR *)(pDir))->dd_cookie & (~1) )
  214. /* typedefs */
  215. /*
  216.  * Directory entry descriptor.
  217.  * This structure is part of file handle and
  218.  * is intended to directory handlers usage.
  219.  */
  220. typedef struct DOS_DIR_HDL
  221.     {
  222.     u_int parDirStartCluster; /* sector containing parent */
  223.      /* directory entry */
  224.     block_t sector; /* sector containing  alias (short name) */
  225. /* directory entry */
  226.     off_t offset; /* alias (short name) directory entry offset  */
  227. /* in sector */
  228.     block_t lnSector; /* sector containing long name start */
  229.     off_t lnOffset; /* long name offset in sector */
  230.     cookie_t cookie; /* for cache quick access */
  231.     
  232.     /* implementation private usage */
  233.     
  234.     u_long dh_Priv1;
  235.     u_long dh_Priv2;
  236.     u_long dh_Priv3;
  237.     u_long dh_Priv4;
  238.     
  239.     u_char crc; /* crcon directory entry (not used) */
  240.     } DOS_DIR_HDL;
  241. typedef DOS_DIR_HDL * DOS_DIR_HDL_ID;
  242. /*
  243.  * File FAT descriptor.
  244.  * This structure is part of file descriptor and
  245.  * is intended to FAT handlers usage.
  246.  */
  247. typedef struct DOS_FAT_HDL
  248.     {
  249.     uint32_t lastClust; /* number of last passed cluster in chain */
  250.     uint32_t nextClust; /* contents of <lastClust> entry */
  251.     cookie_t cbioCookie; /* CBIO dev. cookie for last accessed sector */
  252.     uint32_t errCode; /*  */
  253.     } DOS_FAT_HDL;
  254. typedef DOS_FAT_HDL * DOS_FAT_HDL_ID;
  255. /*
  256.  * File handle.
  257.  * This structure is shared by all file descriptors (see below).
  258.  * that are opened for the same file.
  259.  * Field <pDirHdl> is filled and used by directory handler.
  260.  */
  261. typedef struct DOS_FILE_HDL
  262.     {
  263.     fsize_t size; /* recent file size */
  264.     u_int deleted  : 1, /* file deleted */
  265.      obsolet  : 1, /* file was changed, but not closed yet */
  266.      changed  : 1, /* file was changed, but not closed yet */
  267.      res  : 29;
  268.     /* FAT fields */
  269.     uint32_t startClust; /* file start cluster */
  270.      /* ( 0 - not allocated yet ) */
  271.     uint32_t contigEndPlus1; /* end clust. of contiguous area in file + 1 */
  272.     uint32_t fatSector; /* last modified FAT sector */
  273.     DOS_DIR_HDL dirHdl; /* directory entry descriptor */
  274.     u_short nRef; /* reference count - the number of times */
  275.      /* file is simultaneously opened */
  276.     u_char attrib; /* file attributes */
  277.     } DOS_FILE_HDL;
  278. typedef DOS_FILE_HDL * DOS_FILE_HDL_ID;
  279. /*
  280.  * File descriptor.
  281.  * This structure is allocated every time new file is opened.
  282.  * Fields <curSec>, <nSec>, <cluster> are filled by fat handler
  283.  * via get next cluster operation and then are corrected by other
  284.  * modules in accordance with operation being executed.
  285.  */
  286. typedef struct DOS_FILE_DESC
  287.     {
  288.     DOS_VOLUME_DESC_ID pVolDesc; /* volume descriptor ptr */
  289.     DOS_FILE_HDL_ID pFileHdl; /* file handle, that is shared */
  290.      /* between file descriptors */
  291.      /* of the same file */
  292.     fsize_t pos; /* current absolute position in file */
  293.                     /* for directory: absolute offset from */
  294. /* from directory start */
  295.     fsize_t seekOutPos; /* save position in case seek passes EOF */
  296.                     /* contains 0, if no such seek occurred */
  297.     block_t curSec; /* current data sector */
  298.     u_int nSec; /* number of contiguous sectors */
  299.     cookie_t cbioCookie; /* last accessed sector ptr */
  300.      /* ( is filled by cbio ) */
  301.     u_char accessed; /* file was accessed */
  302.     u_char changed; /* file was changed */
  303.     
  304.     DOS_FAT_HDL fatHdl;
  305.     
  306.     u_char openMode; /* open mode ( DRONLY/WRONLY/RDWR ) */
  307.     
  308.     BOOL busy;
  309.     } DOS_FILE_DESC;
  310. typedef DOS_FILE_DESC * DOS_FILE_DESC_ID;
  311. /*
  312.  * FAT handler descriptor.
  313.  * This structure defines generic FAT handler API.
  314.  * It must be start field in every FAT handler
  315.  * descriptor structure.
  316.  */
  317. typedef struct DOS_FAT_DESC
  318.     {
  319.     /* interface functions */
  320.     
  321.     STATUS (*getNext)( DOS_FILE_DESC_ID pFd, u_int allocatePolicy );
  322.      /* get/allocate next cluster for file */
  323. /* <allocatePolicy> : FAT_NOT_ALLO/FAT_ALLOC/ */
  324. /* FAT_ALLOC_ONE */
  325.     STATUS (*contigChk)( DOS_FILE_DESC_ID pFd );
  326.      /* check file chain for contiguity */
  327.     STATUS (*truncate)( DOS_FILE_DESC_ID pFd, uint32_t sector,
  328.                         uint32_t flag );
  329.      /* truncate chain starting from <sector>, */
  330. /* <sector> = FH_FILE_START - from file start; */
  331. /* <flag> : FH_INCLUDE/FH_EXCLUDE */
  332.     STATUS (*seek)( DOS_FILE_DESC_ID pFd, uint32_t startSec, uint32_t nSec );
  333.      /* seek <nSec> sectors starting from */
  334.      /* <startClust>, */
  335. /* <startClust> = FH_FILE_START - from file start */
  336.     fsize_t (*nFree)( DOS_FILE_DESC_ID pFd );
  337. /* free bytes on disk */
  338.     STATUS (*contigAlloc)( DOS_FILE_DESC_ID pFd, uint32_t nSec );
  339. /* allocate <nSec> contiguous first feet chain */
  340.     size_t (*maxContig)( DOS_FILE_DESC_ID pFd );
  341. /* max free contiguous chain length in sectors */
  342.     void (*volUnmount)( DOS_VOLUME_DESC_ID pVolDesc );
  343.      /* free all resources, that were allocated */
  344.      /* for the volume */
  345.     void (*show)( DOS_VOLUME_DESC_ID pVolDesc );
  346. /* display handler specific data */
  347.     STATUS (*flush)( DOS_FILE_DESC_ID pFd );
  348. /* flush all internal FAT handler data that */
  349. /* belongs to the file */
  350.     void (*syncToggle)( DOS_VOLUME_DESC_ID pVolDesc, BOOL syncEnable );
  351. /* toggle FAT copies mirroring; synchronize */
  352. /* FAT copies, when mirror is being enabled */
  353.     STATUS (*clustValueSet)
  354.         (
  355.         DOS_FILE_DESC_ID pFd,
  356.      uint32_t fatCopyNum, /* FAT copy to use */
  357.         uint32_t clustNum, /* cluster number to set */
  358.         uint32_t value, /* DOS_FAT_AVAIL, DOS_FAT_EOF, */
  359. /* DOS_FAT_BAD, DOS_FAT_ALLOC, */
  360. /* DOS_FAT_INVAL, DOS_FAT_RESERV, */
  361. /* DOS_FAT_RAW */
  362.         uint32_t nextClust /* next cluster number */
  363.         );
  364.     uint32_t (*clustValueGet)
  365.         (
  366.         DOS_FILE_DESC_ID pFd,
  367.      uint32_t fatCopyNum, /* FAT copy to use */
  368.         uint32_t clustNum, /* cluster number to check */
  369.         uint32_t * pNextClust /* return cluster value */
  370.         );
  371.     uint8_t activeCopyNum; /* number of active FAT copy */
  372.     } DOS_FAT_DESC;
  373. typedef DOS_FAT_DESC *  DOS_FAT_DESC_ID;
  374. /*
  375. * Directory handler descriptor.
  376.  * This structure defines generic directory handler API.
  377.  * It must be start field in every directory handler
  378.  * descriptor structure.
  379.  */
  380. typedef struct DOS_DIR_DESC
  381.     {
  382.     STATUS (*pathLkup)( DOS_FILE_DESC_ID pFd, void * pPath,
  383.              u_int creatFlags );
  384.      /* lkup path file in directory hierarchy tree */
  385.     STATUS (*readDir)( DOS_FILE_DESC_ID pFd, DIR * pDir,
  386.        DOS_FILE_DESC_ID pResFd );
  387.      /* regular readdir; <pResFd> if not NULL, is */
  388. /* filled for entry just accepted */
  389. /* on exit <pdir->dd_coocie> should contain */
  390. /* POS_TO_DD_COOKIE( pFd->pos ) */
  391.     STATUS (*updateEntry)( DOS_FILE_DESC_ID pFd, u_int flags,
  392.    time_t curTime );
  393.      /* set directory entry values; */
  394.      /* size, start cluster, attributes and so on */
  395.      /* are delivered from file descriptor */ 
  396.      /* <flags> can be or-ed of */
  397.      /* DH_TIME_CREAT, DH_TIME_MODIFY, DH_TIME_ACCESS */
  398.                /* to encode <curTime> value into correspondence */
  399. /* field or DH_DELETE for to delete the entry */
  400.     STATUS (*dateGet)( DOS_FILE_DESC_ID pFd, struct stat * pStat );
  401.      /* fill in date-time fields in stat structure */
  402.     STATUS (*volLabel)( DOS_VOLUME_DESC_ID pVolDesc, u_char * label,
  403. u_int operation );
  404. /* get/set volume label */
  405. /* <operation> is one of FIOLABELGET/FIOLABELSET */
  406.     STATUS (*nameChk)( DOS_VOLUME_DESC_ID pVolDesc, u_char * name );
  407. /* validate name (intended to check disk) */
  408.     void (*volUnmount)( DOS_VOLUME_DESC_ID pVolDesc );
  409.      /* free all resources, that were allocated */
  410.      /* for the volume */
  411.     void (*show)( DOS_VOLUME_DESC_ID pVolDesc );
  412. /* display handler specific data */
  413.     u_int rootStartSec; /* root directory start sector: */
  414.      /* some value for FAT12/FAT16; */
  415.      /* 0 for FAT32; is filled by dir handler */
  416.     u_int rootNSec; /* sectors per root directory */
  417.      /* some value for FAT12/FAT16; */
  418.      /* 0 for FAT32; is filled by dir handler */
  419.     } DOS_DIR_DESC;
  420. typedef DOS_DIR_DESC *  DOS_DIR_DESC_ID;
  421. /* check disk work structure */ 
  422.  
  423. typedef struct CHK_DSK_DESC 
  424.     { 
  425.     UINT32 * chkFatMap;      /* clusters usage map */
  426.     DIR chkDir;        /* readdir buffer */
  427.     fsize_t chkTotalFSize;  /* total bytes in all files */
  428.     fsize_t     chkTotalBytesInLostChains;
  429.     u_int nErrors; /* total number of errors detected */
  430.     UINT32      chkNDirs;       /* total directories */
  431.     UINT32      chkNFiles;      /* total files */
  432.     UINT32      chkNLostChains; /* total lost chains */
  433.     UINT32      chkNFreeClusts; /* total # of free clusters */
  434.     UINT32      chkNBadClusts; /* total # of bad clusters */
  435.     time_t chkMaxCreatTime;
  436.     time_t chkMaxModifTime;
  437.     time_t chkMaxAccTime;
  438.     BOOL bufToDisk; /* FAT copy used as tmp buffer */
  439.     struct stat stat; /* buffer to accept file statistics */
  440.     u_char chkPath[ CHK_MAX_PATH ]; /* buffer for path strings */
  441.     u_char curPathLev; /* dynamic counter of path levels */
  442.     char chkCurPath[ CHK_MAX_PATH + 256 ];
  443.     } CHK_DSK_DESC;
  444. typedef CHK_DSK_DESC * CHK_DSK_DESC_ID;
  445. /* Volume descriptor */
  446. typedef struct DOS_VOLUME_DESC
  447.     {
  448.     DEV_HDR      devHdr; /* i/o system device header */
  449.     u_int magic; /* control magic number */
  450.      /* DOS_FS_MAGIC */
  451.     BOOL mounted; /* volume mounted */
  452.     CBIO_DEV_ID  pCbio; /* cached I/O device handle */
  453.     DOS_DIR_DESC_ID pDirDesc; /* directory handler descriptor ptr */
  454.     DOS_FAT_DESC_ID pFatDesc; /* FAT handler descriptor ptr */
  455.     SEM_ID devSem; /* device mutual semaphore, */
  456.     SEM_ID shortSem; /* protect very short operations, */
  457.      /* such as allocation of file */
  458.      /* descriptor */
  459.     DOS_FILE_DESC_ID pFdList; /* file descriptors array */
  460.     DOS_FILE_HDL_ID pFhdlList; /* file handles array */
  461.     SEM_ID * pFsemList; /* file semaphores array */
  462.     
  463.     /* -- boot sector data -- */
  464.     
  465.     u_int bootSecNum; /* number of sector containing boot */
  466. /* information */
  467.     UINT32 volId; /* volume Id */
  468.     UINT32 secPerFat; /* sectors per FAT copy */
  469.     UINT32 nHiddenSecs; /* hiden sectors (unused tail) */
  470.     UINT32 totalSec; /* total number of sectors */
  471.     UINT16 bytesPerSec;
  472.     UINT16 secPerClust;
  473.     UINT16 nReservedSecs; /* reserved sectors (ahead first fat copy) */
  474.     UINT8 nFats; /* number of FAT copies */
  475.     UINT32 nFatEnts; /* number of entries in FAT */
  476.     char bootVolLab[ DOS_VOL_LABEL_LEN]; /* volume label */
  477.     /*     --    --       */
  478.     
  479.     enum { FAT12, FAT16, FAT32 } fatType;
  480.     u_int dataStartSec; /* sector number of the start */
  481.      /* cluster (DOS_MIN_CLUCT) */
  482.     u_short maxFiles; /* maximum open files in a time */
  483.     u_short nBusyFd; /* number of fd-s in use */
  484.     u_short volIdOff; /* offset of volume Id field */
  485. /* in boot sector */
  486.     u_short volLabOff; /* offset of volume label field */
  487. /* in boot sector */
  488.     u_char secSizeShift; /* log2( bytesPerSect ) */
  489.     /* check disk fields */
  490.     CHK_DSK_DESC_ID pChkDesc;
  491.     u_char autoChk; /* autocheck on mount level */
  492.     u_char autoChkVerb; /* autocheck verbosity */
  493.     u_char chkLevel;       /* check disk progress level */
  494.     u_char chkVerbLevel;   /* check disk verbosity level */
  495.     FUNCPTR fatVolMount;
  496.     BOOL                updateLastAccessDate; /* SPR#68203 */
  497.     BOOL                volIsCaseSens;  /* Make SPR#29751 fix switchable */
  498.     } DOS_VOLUME_DESC;
  499. typedef struct DOS_HDLR_DESC
  500.     {
  501.     u_int id; /* unique handler Id */
  502. /* 0 - 256 reserved by implementation */
  503.     STATUS (*mountRtn)( DOS_VOLUME_DESC_ID pVolDesc, void * arg );
  504.     void * arg; /* handler dependent argument */
  505.     } DOS_HDLR_DESC;
  506. typedef DOS_HDLR_DESC * DOS_HDLR_DESC_ID;
  507.          
  508. /* function pointers to chk and fmt handlers */
  509. IMPORT STATUS (*dosFsChkRtn)( DOS_FILE_DESC_ID pFd ); /* check disk routine */
  510. IMPORT STATUS (*dosFsVolFormatRtn)( void * dev, int opt,
  511.                                     FUNCPTR pPromptFunc );
  512. /* handler lists for fat and dir handlers */
  513. IMPORT DOS_HDLR_DESC dosFatHdlrsList[];
  514. IMPORT DOS_HDLR_DESC dosDirHdlrsList[];
  515. /* forward declarations */
  516. IMPORT STATUS dosFsHdlrInstall( DOS_HDLR_DESC_ID hdlrsList,
  517.         DOS_HDLR_DESC_ID hdlr );
  518. IMPORT int dosFsVolIsFat12 (u_char * pBootBuf); /* pick fat12 or fat16 */
  519. #ifdef __cplusplus
  520.     }
  521. #endif
  522. #endif /* __INCdoFsLibP */