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

VxWorks

开发平台:

C/C++

  1. /* usrDosFsOld.c - old DosFs compatibility library */
  2. /* Copyright 1998-2002 Wind River Systems, Inc. */
  3. #include "copyright_wrs.h"
  4. /*
  5. modification history
  6. --------------------
  7. 01j,15may02,jkf  SPR#77063, adding dosFsVolFormat option to dosFsDevInit
  8. 01i,14nov01,jkf  general clean up, removed void * use.
  9. 01h,20sep01,jkf  SPR#69031, common code for both AE & 5.x.
  10. 01g,26dec99,jkf  T3 changes
  11. 01f,31jul99,jkf  T2 merge, tidiness & spelling.
  12. 01e,23nov98,???  clean warning
  13. 01d,14jul98,lrn  usrFsLib now linked in by usrLib
  14. 01c,09jul98,lrn  moved definitions to dosFsLib.h, added dosFsCacheSizeDefault
  15. 01b,30jun98,lrn  added dosFsInit() installing all sub-modules,
  16.  added PCMCIA comment, dosFsDateTimeInstall
  17. 01a,24jun98,mjc  written.
  18. */
  19. /*
  20. DESCRIPTION
  21. This library provides backward compatibility with old DosFs implementation.
  22. Many of the routines here are just stubs and the other are simply envelopes to 
  23. new DosFs user interface.
  24. This backwards compatibility module is intended to allow easy upgrade of
  25. the MS-DOS file system without modification of any of the VxWorks
  26. configuration and initialization files.
  27. In some cases however this backwards compatibility interface is
  28. insufficient, and will require the user to modify the VxWorks
  29. configuration code to use the new interface. One such configuration is
  30. the PCMCIA support for x86 targets.
  31. This is strongly recommended do not use the routines from this library in the
  32. new application design.  Instead, they may be used as examples which 
  33. demonstrate use of routines to initialize and configure devices in the new 
  34. DosFs.
  35. LIMITATIONS
  36. SEE ALSO: dosFsLib, dcacheLib, dpartLib
  37. */
  38. /* INCLUDES */
  39. #include "vxWorks.h"
  40. #include "private/dosFsVerP.h"
  41. #include "errnoLib.h"
  42. #include "string.h"
  43. #include "stdlib.h"
  44. #include "dosFsLib.h"
  45. #include "dcacheCbio.h"
  46. #include "time.h"
  47. #include "timers.h"
  48. #include "usrLib.h"
  49. /* DEFINES */
  50. #define DEFAULT_OPTIONS         0       /* default volume options */
  51. /* locals */
  52. LOCAL UINT dosFsMkfsOptions = DEFAULT_OPTIONS;
  53. /* options to use during mkfs */
  54. LOCAL FUNCPTR pDosFsDateTimeFunc = NULL ;
  55. LOCAL BOOL dosFsInitCalled = FALSE ;
  56. /* globals */
  57. int dosFsCacheSizeDefault = 128 * 1024 ;
  58. /* forward */
  59. LOCAL void dosFsDateTimeSet (void );
  60. /*******************************************************************************
  61. *
  62. * dosFsInit - initialize the MS-DOS file system and related libraries
  63. *
  64. * This function is part of the backward compatibility library delivered
  65. * with the new MS-DOS file system. It is intended to provide the same
  66. * interface as the old version of the MS-DOS file system, and configure
  67. * all sub-modules of the new file system implementation.
  68. *
  69. * In order to avoid modifying the VxWorks configuration files, this
  70. * backward compatibility function will install all available MS-DOS file
  71. * system sub-modules. This code is provided in source so that the user may
  72. * eliminate the options which they do not require and save memory.
  73. *
  74. * RETURNS: ERROR if the main dosFsLib module has failed to initialize
  75. *
  76. * SEE ALSO dosFsLib
  77. */
  78. STATUS dosFsInit (int ignored )
  79.     {
  80.     IMPORT STATUS dosFsFat16Init(void);
  81.     if( TRUE == dosFsInitCalled )
  82. {
  83. return OK;
  84. }
  85.     /* First initialize the main module */
  86.     if( dosFsLibInit( 0 ) == ERROR )
  87. return ERROR;
  88.     /* Initialize sub-modules */
  89.     /* Sub-module: VFAT Directory Handler */
  90.     dosVDirLibInit();
  91.     /* Sub-module: Vintage 8.2 and VxLong Directory Handler */
  92.     dosDirOldLibInit();
  93.     /* Sub-module: FAT12/FAT16/FAT32 FAT Handler */
  94.     dosFsFatInit();
  95.     /* Sub-module: Consistency check handler */
  96.     dosChkLibInit();
  97.     /* Sub-module: Formatter */
  98.     dosFsFmtLibInit();
  99.     dosFsInitCalled = TRUE ;
  100.     return OK;
  101.     }
  102. /*******************************************************************************
  103. *
  104. * dosFsDevInit - associate a block device with dosFs file system functions
  105. *
  106. * This function is part of the backward compatibility library delivered
  107. * with the new MS-DOS file system. It is intended to provide the same
  108. * interface as the old version of the MS-DOS file system.
  109. *
  110. * This routine takes a block device structure (BLK_DEV) created by
  111. * a device driver and defines it as a DosFs volume.  As a result, when
  112. * high-level I/O operations (e.g., open(), write()) are performed on
  113. * the device, the calls will be routed through dosFsLib.  The <pBlkDev>
  114. * parameter is the address of the BLK_DEV structure which describes this
  115. * device.
  116. *
  117. * This routine associates the name <pDevName> with the device and installs
  118. * it in the VxWorks I/O system's device table.  The driver number used when
  119. * the device is added to the table is that which was assigned to the
  120. * DosFs library during dosFsInit().
  121. *
  122. * The <pConfig> parameter is now minimally supported.  If <pConfig> is NULL, 
  123. * it is ignored.  If <pConfig> is not NULL, dosFsVolFormat is called with 
  124. * default formatting options.
  125. *
  126. * If the device being initialized already has a valid DosFs file system on it,  
  127. * the configuration data will be read from the boot sector of the disk while 
  128. * the volume will be mounted.
  129. *
  130. * The specific dosFs configuration data to be used for this volume may be 
  131. * provided during the volume formatting with the new dosFsVolFormat() call.
  132. *
  133. * The FIODISKINIT ioctl() command can be issued now on a preformatted device 
  134. * only to reformat this one.
  135. *
  136. * This routine allocates and initializes a dummy volume descriptor 
  137. * (DOS_VOL_DESC) for the device.  It returns a pointer to DOS_VOL_DESC.
  138. *
  139. * RETURNS: A pointer to the dummy volume descriptor DOS_VOL_DESC, or NULL if
  140. *          there is an error.
  141. *
  142. * SEE ALSO: dosFsMkfs()
  143. */
  144. DOS_VOL_DESC *dosFsDevInit
  145.     (
  146.     char * pDevName,       /* device name */
  147.     BLK_DEV * pBlkDev,       /* pointer to block device struct */
  148.     DOS_VOL_CONFIG * pConfig        /* pointer to volume config data */
  149.     )
  150.     {
  151.     DOS_VOL_DESC * pVolDesc; /* pointer to volume descriptor */
  152.     CBIO_DEV_ID cbio;
  153.     /* Return error if no BLK_DEV */
  154.     if (pBlkDev == NULL)
  155. {
  156. errnoSet (S_dosFsLib_INVALID_PARAMETER);
  157. return (NULL);
  158. }
  159.     /* make sure all modules are initialized */
  160.     if( FALSE == dosFsInitCalled )
  161. {
  162. dosFsInit( 0 );
  163. }
  164.     /* Create e.g. 128 Kbytes disk cache */
  165.     if ( (cbio = dcacheDevCreate( (CBIO_DEV_ID) pBlkDev, NULL,
  166. dosFsCacheSizeDefault, pDevName)) == NULL )
  167.         return NULL;
  168.     /* 
  169.      * Create file system with 20 (default) simultaneously open files and 
  170.      * default volume integrity check on mount level (repair + verbous_1).
  171.      */
  172.     if (dosFsDevCreate (pDevName, cbio, 0, NONE) != OK)
  173.         return NULL;
  174.     /* 
  175.      * if <pConfig> is not NULL, then dosFsVolFormat the volume 
  176.      * This will help a subsequent diskInit() to function closer
  177.      * to how dosFs1 user may expect...
  178.      */
  179.     
  180.     if (NULL != pConfig)
  181.         {
  182.         dosFsVolFormat (cbio, DOS_OPT_DEFAULT, NULL);
  183.         }
  184.     /* Allocate a dummy dosFs volume descriptor */
  185.     pVolDesc = (DOS_VOL_DESC *) KHEAP_ALLOC((sizeof (DOS_VOL_DESC)));
  186.     if (NULL == pVolDesc) 
  187.         return (NULL); /* no memory */
  188.     bzero ((char *)pVolDesc, sizeof (DOS_VOL_DESC));
  189.     if ( (*pVolDesc = KHEAP_ALLOC((strlen (pDevName) + 1))) == NULL )
  190. return NULL; /* no memory */
  191.     strcpy (*pVolDesc, pDevName);
  192.     dosFsDateTimeSet();
  193.     return (pVolDesc);
  194.     } /* dosFsDevInit */
  195. /*******************************************************************************
  196. *
  197. * dosFsDevInitOptionsSet - specify volume options for dosFsDevInit()
  198. *
  199. * This function is part of the backward compatibility library delivered
  200. * with the new MS-DOS file system. It is intended to provide the same
  201. * interface as the old version of the MS-DOS file system.
  202. *
  203. * Since the volume options which might be specified in this call are 
  204. * inapplicable now, this routine just returns OK.
  205. *
  206. * RETURNS: OK always.
  207. *
  208. * SEE ALSO: dosFsDevInit(), dosFsVolOptionsSet()
  209. *  
  210. */
  211. STATUS dosFsDevInitOptionsSet
  212.     (
  213.     UINT options /* options for future dosFsDevInit() calls */
  214.     )
  215.     {
  216.     return (OK);
  217.     } /* dosFsDevInitOptionsSet */
  218. /*******************************************************************************
  219. *
  220. * dosFsMkfs - initialize a device and create a dosFs file system
  221. *
  222. * This function is part of the backward compatibility library delivered
  223. * with the new MS-DOS file system. It is intended to provide the same
  224. * interface as the old version of the MS-DOS file system.
  225. *
  226. * This routine provides a quick method of creating a DosFs file system on
  227. * a device.
  228. *
  229. * It uses default values for various DosFs configuration parameters.
  230. * These defaults differ from old DosFs ones.
  231. *
  232. * The only long filenames volume option is enabled by this routine now.
  233. * This option can be set using dosFsMkfsOptionsSet().  By default, no it is 
  234. * enabled for disks initialized by dosFsMkfs().
  235. *
  236. * RETURNS: A pointer to a dummy DosFs volume descriptor, or NULL if there is an 
  237. *          error.
  238. *
  239. * SEE ALSO: dosFsDevInit()
  240. */
  241. DOS_VOL_DESC * dosFsMkfs
  242.     (
  243.     char * pVolName, /* volume name to use */
  244.     BLK_DEV * pBlkDev /* pointer to block device structure */
  245.     )
  246.     {
  247.     DOS_VOL_DESC * pVolDesc; /* pointer to dummy volume descriptor */
  248.     int options;
  249.     dosFsDateTimeSet() ;
  250.     if ( (dosFsMkfsOptions & DOS_OPT_LONGNAMES) == 0 )
  251.         options = DOS_OPT_DEFAULT;
  252.     else
  253.         options = DOS_OPT_VXLONGNAMES;
  254.     /* Init as dosFs device */
  255.     if ( (pVolDesc = dosFsDevInit (pVolName, pBlkDev, NULL)) == NULL )
  256. return (NULL);
  257.     /* Init dosFs structures on disk */
  258.     if (dosFsVolFormat (pVolName, options, NULL) != OK)
  259.         return NULL;
  260.     return (pVolDesc);
  261.     } /* dosFsMkfs */
  262. /*******************************************************************************
  263. *
  264. * dosFsMkfsOptionsSet - specify volume options for dosFsMkfs()
  265. *
  266. * This function is part of the backward compatibility library delivered
  267. * with the new MS-DOS file system. It is intended to provide the same
  268. * interface as the old version of the MS-DOS file system.
  269. *
  270. * This routine allows long filenames volume option to be set that will be 
  271. * enabled by subsequent calls to dosFsMkfs().  The value of <options> 
  272. * will be used for all volumes that are initialized by dosFsMkfs().
  273. *
  274. * RETURNS: OK always.
  275. *
  276. * SEE ALSO: dosFsMkfs(), dosFsVolOptionsSet()
  277. *  
  278. */
  279. STATUS dosFsMkfsOptionsSet
  280.     (
  281.     UINT options /* options for future dosFsMkfs() calls */
  282.     )
  283.     {
  284.     dosFsMkfsOptions = options; /* change options */
  285.     return (OK);
  286.     } /* dosFsMkfsOptionsSet */
  287. /*******************************************************************************
  288. *
  289. * dosFsConfigInit - initialize dosFs volume configuration structure
  290. *
  291. * This function is part of the backward compatibility library delivered
  292. * with the new MS-DOS file system. It is intended to provide the same
  293. * interface as the old version of the MS-DOS file system.
  294. *
  295. * Since dosFsDevInit() routine does not take care about the <pConfig> parameter
  296. * now, this routine just return OK.
  297. *
  298. * RETURNS: OK always.
  299. *
  300. * SEE ALSO: dosFsDevInit()
  301. */
  302. STATUS dosFsConfigInit
  303.     (
  304.     DOS_VOL_CONFIG * pConfig, /* pointer to volume config structure */
  305.     char mediaByte, /* media descriptor byte */
  306.     UINT8 secPerClust, /* sectors per cluster */
  307.     short nResrvd, /* number of reserved sectors */
  308.     char nFats, /* number of FAT copies */
  309.     UINT16 secPerFat, /* number of sectors per FAT copy */
  310.     short maxRootEnts, /* max number of entries in root dir */
  311.     UINT nHidden, /* number of hidden sectors */
  312.     UINT options /* volume options */
  313.     )
  314.     {
  315.     return (OK);
  316.     } /* dosFsConfigInit */
  317. /*******************************************************************************
  318. *
  319. * dosFsConfigGet - obtain dosFs volume configuration values
  320. *
  321. * This function is part of the backward compatibility library delivered
  322. * with the new MS-DOS file system. It is intended to provide the same
  323. * interface as the old version of the MS-DOS file system.
  324. *
  325. * Since dosFsDevInit() routine does not take care about the <pConfig> parameter
  326. * now, this routine just return OK.
  327. *
  328. * RETURNS: OK always.
  329. *
  330. */
  331. STATUS dosFsConfigGet
  332.     (
  333.     DOS_VOL_DESC * pVolDesc, /* pointer to volume descriptor */
  334.     DOS_VOL_CONFIG * pConfig /* ptr to config structure to fill */
  335.     )
  336.     {
  337.     return (OK);
  338.     } /* dosFsConfigGet */
  339. /*******************************************************************************
  340. *
  341. * dosFsConfigShow - display dosFs volume configuration data
  342. *
  343. * This function is part of the backward compatibility library delivered
  344. * with the new MS-DOS file system. It is intended to provide the same
  345. * interface as the old version of the MS-DOS file system.
  346. *
  347. * This routine obtains the dosFs volume configuration for the named
  348. * device, formats the data, and displays it on the standard output.
  349. *
  350. * If no device name is specified, the current default device is described.
  351. *
  352. * RETURNS: OK or ERROR.
  353. *
  354. */
  355. STATUS dosFsConfigShow
  356.     (
  357.     char                *pDevName        /* name of device */
  358.     )
  359.     {
  360.     return dosFsShow (pDevName, 1);
  361.     } /* dosFsConfigShow */
  362. /*******************************************************************************
  363. *
  364. * dosFsModeChange - modify the mode of a dosFs volume
  365. *
  366. * This function is part of the backward compatibility library delivered
  367. * with the new MS-DOS file system. It is intended to provide the same
  368. * interface as the old version of the MS-DOS file system.
  369. *
  370. * This routine do nothing, because O_RDONLY mod is not implemented in the 
  371. * current release.
  372. *
  373. * RETURNS: N/A
  374. * SEE ALSO: dosFsReadyChange()
  375. */
  376. void dosFsModeChange
  377.     (
  378.     DOS_VOL_DESC * pVolDesc, /* pointer to volume descriptor */
  379.     int newMod /* O_RDONLY/O_WRONLY/O_RDWR (both) */
  380.     )
  381.     {
  382.     return; /* not implemented yet */
  383.     } /* dosFsModeChange */
  384. /*******************************************************************************
  385. *
  386. * dosFsReadyChange - notify dosFs of a change in ready status
  387. *
  388. * This function is part of the backward compatibility library delivered
  389. * with the new MS-DOS file system. It is intended to provide the same
  390. * interface as the old version of the MS-DOS file system.
  391. *
  392. * Since the Disk Cache module takes care about disk removal now, this routine 
  393. * do nothing.
  394. *
  395. * RETURNS: N/A
  396. */
  397. void dosFsReadyChange
  398.     (
  399.     DOS_VOL_DESC * pVolDesc /* pointer to volume descriptor */
  400.     )
  401.     {
  402.     return; /* unnecessary in new DosFs design */
  403.     } /* dosFsReadyChange */
  404. /*******************************************************************************
  405. *
  406. * dosFsVolOptionsGet - get current dosFs volume options 
  407. *
  408. * This function is part of the backward compatibility library delivered
  409. * with the new MS-DOS file system. It is intended to provide the same
  410. * interface as the old version of the MS-DOS file system.
  411. *
  412. * The main purpose of this routine is to allow dosFsVolOptionsSet() setting of 
  413. * the desired options without clearing of another ones.
  414. * Since the volume options which might be specified in the dosFsVolOptionsSet() 
  415. * call are inapplicable now, this routine just stores zero in the field pointed 
  416. * to by <pOptions> and return OK.
  417. *
  418. * RETURNS: OK, always.
  419. *
  420. * SEE ALSO: dosFsVolOptionsSet()
  421. *
  422. */
  423. STATUS dosFsVolOptionsGet
  424.     (
  425.     DOS_VOL_DESC * pVolDesc, /* pointer to volume descriptor */
  426.     UINT *     pOptions /* where to put current options value */
  427.     )
  428.     {
  429.     *pOptions = 0;
  430.     return (OK); /* N/A for new DosFs design */
  431.     } /* dosFsVolOptionsGet */
  432. /*******************************************************************************
  433. *
  434. * dosFsVolOptionsSet - set dosFs volume options 
  435. *
  436. * This function is part of the backward compatibility library delivered
  437. * with the new MS-DOS file system. It is intended to provide the same
  438. * interface as the old version of the MS-DOS file system.
  439. *
  440. * Since the volume options which might be specified in this call are 
  441. * inapplicable now, this routine just returns OK.
  442. * DOS_OPT_CHANGENOWARN - detection of replaced removable disk is automatically
  443. *                        performed by the Disk Cache module.
  444. * DOS_OPT_AUTOSYNC     - set <syncInterval> parameter of dcacheDevTune() 
  445. *                        procedure to 0 to achieve similar behavior.
  446. *
  447. * RETURNS: OK, always.
  448. *
  449. * SEE ALSO: dosFsDevInitOptionsSet(), dosFsMkfsOptionsSet(), 
  450. *     dosFsVolOptionsGet()
  451. *
  452. */
  453. STATUS dosFsVolOptionsSet
  454.     (
  455.     DOS_VOL_DESC * pVolDesc, /* pointer to volume descriptor */
  456.     UINT       options /* new options for volume */
  457.     )
  458.     {
  459.     return (OK); /* N/A for new DosFs design */
  460.     } /* dosFsVolOptionsSet */
  461. /*******************************************************************************
  462. *
  463. * dosFsDateTimeInstall - set system date and time
  464. *
  465. * This is a stub function for backward compatibility only.
  466. * Since the new MS-DOS file system implementation will only use the
  467. * system time and date to set modification and creation times on files,
  468. * this function will simply get the current time and date, and set the
  469. * system time accordingly.
  470. * RETURNS: N/A.
  471. *
  472. * SEE ALSO: dosFsLib, ansiTime
  473. */
  474. void dosFsDateTimeInstall (FUNCPTR pDateTimeFunc)
  475.     {
  476.     pDosFsDateTimeFunc = pDateTimeFunc ;
  477.     }
  478. /*******************************************************************************
  479. *
  480. * dosFsDateTimeSet - set system time using old dosFs type function
  481. *
  482. */
  483. LOCAL void dosFsDateTimeSet (void )
  484.     {
  485.     DOS_DATE_TIME dosdt ; /* old dosFs date time format */
  486.     struct tm tm ; /* ANSII time format */
  487.     struct timespec tv ; /* POSIX time */
  488.     if( pDosFsDateTimeFunc == NULL )
  489. return ;
  490.     /* call the user-supplied function */
  491.     (*pDosFsDateTimeFunc) ( &dosdt );
  492.     /* convert this to ANSI time */
  493.     tm.tm_sec       = dosdt.dosdt_second ;
  494.     tm.tm_min       = dosdt.dosdt_minute ;
  495.     tm.tm_hour      = dosdt.dosdt_hour ;
  496.     tm.tm_mday      = dosdt.dosdt_day ;
  497.     tm.tm_mon       = dosdt.dosdt_month -1 ;
  498.     tm.tm_year      = dosdt.dosdt_year -1900 ;
  499.     tm.tm_wday = 0 ;
  500.     tm.tm_yday = 0 ;
  501.     tm.tm_isdst = 0 ;
  502.     /* convert ANSI to POSIX */
  503.     tv.tv_sec = mktime( &tm );
  504.     tv.tv_nsec = 0;
  505.     /* set system time */
  506.     clock_settime( CLOCK_REALTIME, &tv );
  507.     }