api_dir.c
上传用户:yj_qqy
上传日期:2017-01-28
资源大小:2911k
文件大小:7k
源码类别:

uCOS

开发平台:

C/C++

  1. /*
  2. **********************************************************************
  3. *                          Micrium, Inc.
  4. *                      949 Crestview Circle
  5. *                     Weston,  FL 33327-1848
  6. *
  7. *                            uC/FS
  8. *
  9. *             (c) Copyright 2001 - 2003, Micrium, Inc.
  10. *                      All rights reserved.
  11. *
  12. ***********************************************************************
  13. ----------------------------------------------------------------------
  14. File        : api_dir.c
  15. Purpose     : POSIX 1003.1 like directory support
  16. ----------------------------------------------------------------------
  17. Known problems or limitations with current version
  18. ----------------------------------------------------------------------
  19. None.
  20. ---------------------------END-OF-HEADER------------------------------
  21. */
  22. /*********************************************************************
  23. *
  24. *             #include Section
  25. *
  26. **********************************************************************
  27. */
  28. #include "fs_port.h"
  29. #include "fs_conf.h"
  30. #include "fs_dev.h"
  31. #include "fs_api.h"
  32. #include "fs_os.h"
  33. #include "fs_fsl.h"
  34. #include "fs_int.h"
  35. #include "api_int.h"
  36. #if FS_POSIX_DIR_SUPPORT
  37. /*********************************************************************
  38. *
  39. *             Local variables        
  40. *
  41. **********************************************************************
  42. */
  43. static const unsigned int _FS_dir_maxopen = FS_DIR_MAXOPEN;
  44. static FS_DIR             _FS_dirhandle[FS_DIR_MAXOPEN];
  45. /*********************************************************************
  46. *
  47. *             Global functions
  48. *
  49. **********************************************************************
  50. */
  51. /*********************************************************************
  52. *
  53. *             FS_OpenDir
  54. *
  55.   Description:
  56.   API function. Open an existing directory for reading.
  57.   Parameters:
  58.   pDirName    - Fully qualified directory name. 
  59.   
  60.   Return value:
  61.   ==0         - Unable to open the directory.
  62.   !=0         - Address of an FS_DIR data structure.
  63. */
  64. FS_DIR *FS_OpenDir(const char *pDirName) {
  65.   FS_DIR *handle;
  66.   unsigned int i;
  67.   int idx;
  68.   char *s;
  69.   /* Find correct FSL (device:unit:name) */
  70.   idx = FS__find_fsl(pDirName, &s);
  71.   if (idx < 0) {
  72.     return 0;  /* Device not found */
  73.   }
  74.   if (FS__pDevInfo[idx].fs_ptr->fsl_opendir) {
  75.     /*  Find next free entry in _FS_dirhandle */
  76.     FS_X_OS_LockDirHandle();
  77.     i = 0;
  78.     while (1) {
  79.       if (i >= _FS_dir_maxopen) {
  80.         break;  /* No free entry in _FS_dirhandle */
  81.       }
  82.       if (!_FS_dirhandle[i].inuse) {
  83.         break;  /* Free entry found */
  84.       }
  85.       i++;
  86.     }
  87.     if (i < _FS_dir_maxopen) {
  88.       /* Execute open function of the found FSL */
  89.       _FS_dirhandle[i].dev_index = idx; 
  90.       handle = (FS__pDevInfo[idx].fs_ptr->fsl_opendir)(s, &_FS_dirhandle[i]);
  91.       FS_X_OS_UnlockDirHandle();
  92.       return handle;
  93.     }
  94.     FS_X_OS_UnlockDirHandle();
  95.   }
  96.   return 0;
  97. }
  98. /*********************************************************************
  99. *
  100. *             FS_CloseDir
  101. *
  102.   Description:
  103.   API function. Close a directory referred by pDir.
  104.   Parameters:
  105.   pDir        - Pointer to a FS_DIR data structure. 
  106.   
  107.   Return value:
  108.   ==0         - Directory has been closed.
  109.   ==-1        - Unable to close directory.
  110. */
  111. int FS_CloseDir(FS_DIR *pDir) {
  112.   int i;
  113.   if (!pDir) {
  114.     return -1;  /* No pointer to a FS_DIR data structure */
  115.   }
  116.   FS_X_OS_LockDirHandle();
  117.   if (!pDir->inuse) {
  118.     /* FS_DIR structure is not in use and cannot be closed */
  119.     FS_X_OS_UnlockDirHandle();
  120.     return -1;
  121.   }
  122.   i = -1;
  123.   if (pDir->dev_index >= 0) {
  124.     if (FS__pDevInfo[pDir->dev_index].fs_ptr->fsl_closedir) {
  125.       /* Execute close function of the corresponding FSL */
  126.       i = (FS__pDevInfo[pDir->dev_index].fs_ptr->fsl_closedir)(pDir);
  127.     }
  128.   }
  129.   FS_X_OS_UnlockDirHandle();
  130.   return i;
  131. }
  132. /*********************************************************************
  133. *
  134. *             FS_ReadDir
  135. *
  136.   Description:
  137.   API function. Read next directory entry in directory specified by 
  138.   pDir.
  139.   Parameters:
  140.   pDir        - Pointer to a FS_DIR data structure. 
  141.   
  142.   Return value:
  143.   ==0         - No more directory entries or error.
  144.   !=0         - Pointer to a directory entry.
  145. */
  146. struct FS_DIRENT *FS_ReadDir(FS_DIR *pDir) {
  147.   struct FS_DIRENT *entry;
  148.   if (!pDir) {
  149.     return 0;  /* No pointer to a FS_DIR data structure */
  150.   }
  151.   FS_X_OS_LockDirOp(pDir);
  152.   entry = 0;
  153.   if (pDir->dev_index >= 0) {
  154.     if (FS__pDevInfo[pDir->dev_index].fs_ptr->fsl_readdir) {
  155.       /* Execute FSL function */
  156.       entry = (FS__pDevInfo[pDir->dev_index].fs_ptr->fsl_readdir)(pDir);
  157.     }
  158.   }
  159.   FS_X_OS_UnlockDirOp(pDir);
  160.   return entry;  
  161. }
  162. /*********************************************************************
  163. *
  164. *             FS_RewindDir
  165. *
  166.   Description:
  167.   API function. Set pointer for reading the next directory entry to 
  168.   the first entry in the directory.
  169.   Parameters:
  170.   pDir        - Pointer to a FS_DIR data structure. 
  171.   
  172.   Return value:
  173.   None.
  174. */
  175. void FS_RewindDir(FS_DIR *pDir) {
  176.   if (!pDir) {
  177.     return;  /* No pointer to a FS_DIR data structure */
  178.   }
  179.   pDir->dirpos = 0;
  180. }
  181. /*********************************************************************
  182. *
  183. *             FS_MkDir
  184. *
  185.   Description:
  186.   API function. Create a directory.
  187.   Parameters:
  188.   pDirName    - Fully qualified directory name. 
  189.   
  190.   Return value:
  191.   ==0         - Directory has been created.
  192.   ==-1        - An error has occured.
  193. */
  194. int FS_MkDir(const char *pDirName) {
  195.   int idx;
  196.   int i;
  197.   char *s;
  198.   /* Find correct FSL (device:unit:name) */
  199.   idx = FS__find_fsl(pDirName, &s);
  200.   if (idx < 0) {
  201.     return -1;  /* Device not found */
  202.   }
  203.   if (FS__pDevInfo[idx].fs_ptr->fsl_mkdir) {
  204.     /* Execute the FSL function */
  205.     FS_X_OS_LockDirHandle();
  206.     i = (FS__pDevInfo[idx].fs_ptr->fsl_mkdir)(s, idx, 1);
  207.     FS_X_OS_UnlockDirHandle();
  208.     return i;
  209.   }
  210.   return -1;
  211. }
  212. /*********************************************************************
  213. *
  214. *             FS_RmDir
  215. *
  216.   Description:
  217.   API function. Remove a directory.
  218.   Parameters:
  219.   pDirName    - Fully qualified directory name. 
  220.   
  221.   Return value:
  222.   ==0         - Directory has been removed.
  223.   ==-1        - An error has occured.
  224. */
  225. int FS_RmDir(const char *pDirName) {
  226.   FS_DIR *dirp;
  227.   struct FS_DIRENT *direntp;
  228.   int idx;
  229.   int i;
  230.   char *s;
  231.   
  232.   /* Check if directory is empty */
  233.   dirp = FS_OpenDir(pDirName);
  234.   if (!dirp) {
  235.     /* Directory not found */
  236.     return -1;
  237.   } 
  238.   i=0;
  239.   while (1) {
  240.     direntp = FS_ReadDir(dirp);
  241.     i++;
  242.     if (i >= 4) {
  243.       break;  /* There is more than '..' and '.' */
  244.     }
  245.     if (!direntp) {
  246.       break;  /* There is no more entry in this directory. */
  247.     }
  248.   }
  249.   FS_CloseDir(dirp);
  250.   if (i >= 4) {
  251.     /* 
  252.         There is more than '..' and '.' in the directory, so you 
  253.         must not delete it.
  254.     */
  255.     return -1;
  256.   }
  257.   /* Find correct FSL (device:unit:name) */
  258.   idx = FS__find_fsl(pDirName, &s);
  259.   if (idx < 0) {
  260.     return -1;  /* Device not found */
  261.   }
  262.   if (FS__pDevInfo[idx].fs_ptr->fsl_rmdir) {
  263.     /* Execute the FSL function */
  264.     FS_X_OS_LockDirHandle();
  265.     i = (FS__pDevInfo[idx].fs_ptr->fsl_rmdir)(s, idx, 0);
  266.     FS_X_OS_UnlockDirHandle();
  267.     return i;
  268.   }
  269.   return -1;
  270. }
  271. #endif  /* FS_POSIX_DIR_SUPPORT */