dirLib.c
上传用户:nvosite88
上传日期:2007-01-17
资源大小:4983k
文件大小:15k
源码类别:

VxWorks

开发平台:

C/C++

  1. /* dirLib.c - directory handling library (POSIX) */
  2. /* Copyright 1984-1995 Wind River Systems, Inc. */
  3. #include "copyright_wrs.h"
  4. /*
  5. modification history
  6. --------------------
  7. 01p,02nov01,cyr  doc: fix SPR 35650 fstatfs
  8. 01o,19jun96,dgp  doc: added note to stat() (SPR #6560)
  9. 01n,18jan95,rhp  doc: explain opendir() does not work over netDrv
  10. 01m,19apr94,jmm  fixed closedir() so it doesn't attempt invalid free ()
  11.                  added statfs(), fstatfs(), and utime()
  12. 01m,18oct94,tmk  made closedir() check close() status before freeing (SPR#2744)
  13. 01l,05mar93,jdi  doc tweak.
  14. 01k,23nov92,jdi  documentation cleanup.
  15. 01j,18jul92,smb  Changed errno.h to errnoLib.h.
  16. 01i,26may92,rrr  the tree shuffle
  17. 01h,10dec91,gae  added includes for ANSI.
  18. 01g,04oct91,rrr  passed through the ansification filter
  19.                   -changed functions to ansi style
  20.   -changed includes to have absolute path from h/
  21.   -changed READ, WRITE and UPDATE to O_RDONLY O_WRONLY and ...
  22.   -changed VOID to void
  23.   -changed copyright notice
  24. 01f,05apr91,jdi  documentation -- removed header parens and x-ref numbers;
  25.  doc review by kdl.
  26. 01e,11feb91,jaa  documentation.
  27. 01d,01oct90,dnw  changed to return ENOTDIR instead of S_dirLib_NOT_DIRECTORY
  28.  removed references to deleted dirLib.h
  29. 01c,09aug90,kdl  mangen fixes.
  30. 01b,07may90,kdl  lint.
  31. 01a,04may90,kdl  written.
  32.    +llk
  33.    +dnw
  34. */
  35. /*
  36. DESCRIPTION
  37. This library provides POSIX-defined routines for opening, reading, and
  38. closing directories on a file system.  It also provides routines to obtain
  39. more detailed information on a file or directory.
  40. SEARCHING DIRECTORIES
  41. Basic directory operations, including opendir(), readdir(), rewinddir(),
  42. and closedir(), determine the names of files and subdirectories in a
  43. directory.
  44. A directory is opened for reading using opendir(), specifying the name of
  45. the directory to be opened.  The opendir() call returns a pointer to a
  46. directory descriptor, which identifies a directory stream.  The stream is
  47. initially positioned at the first entry in the directory.
  48. Once a directory stream is opened, readdir() is used to obtain individual
  49. entries from it.  Each call to readdir() returns one directory entry, in
  50. sequence from the start of the directory.  The readdir() routine returns a
  51. pointer to a `dirent' structure, which contains the name of the file (or
  52. subdirectory) in the `d_name' field.
  53. The rewinddir() routine resets the directory stream to the start of the
  54. directory.  After rewinddir() has been called, the next readdir() will cause
  55. the current directory state to be read in, just as if a new opendir() had
  56. occurred.  The first entry in the directory will be returned by the first
  57. readdir().
  58. The directory stream is closed by calling closedir().
  59. GETTING FILE INFORMATION
  60. The directory stream operations described above provide a mechanism to
  61. determine the names of the entries in a directory, but they do not provide
  62. any other information about those entries.  More detailed information is
  63. provided by stat() and fstat().
  64. The stat() and fstat() routines are essentially the same, except for how
  65. the file is specified.  The stat() routine takes the name of the file as
  66. an input parameter, while fstat() takes a file descriptor number as
  67. returned by open() or creat().  Both routines place the information from a
  68. directory entry in a `stat' structure whose address is passed as an input
  69. parameter.  This structure is defined in the include file stat.h.  The
  70. fields in the structure include the file size, modification date/time,
  71. whether it is a directory or regular file, and various other values.
  72. The `st_mode' field contains the file type; several macro functions are
  73. provided to test the type easily.  These macros operate on the `st_mode'
  74. field and evaluate to TRUE or FALSE depending on whether the file is a
  75. specific type.  The macro names are:
  76. .RS 4
  77. .iP S_ISREG 15
  78. test if the file is a regular file
  79. .iP S_ISDIR
  80. test if the file is a directory
  81. .iP S_ISCHR
  82. test if the file is a character special file
  83. .iP S_ISBLK
  84. test if the file is a block special file
  85. .iP S_ISFIFO
  86. test if the file is a FIFO special file
  87. .RE
  88. .LP
  89. Only the regular file and directory types are used for VxWorks local
  90. file systems.  However, the other file types may appear when getting
  91. file status from a remote file system (using NFS).
  92. As an example, the S_ISDIR macro tests whether a particular entry describes
  93. a directory.  It is used as follows:
  94. .CS
  95.     char          *filename;
  96.     struct stat   fileStat;
  97.     stat (filename, &fileStat);
  98.     if (S_ISDIR (fileStat.st_mode))
  99. printf ("%s is a directory.en", filename);
  100.     else
  101. printf ("%s is not a directory.en", filename);
  102. .CE
  103. See the ls() routine in usrLib for an illustration of how to combine
  104. the directory stream operations with the stat() routine.
  105. INCLUDE FILES: dirent.h, stat.h
  106. */
  107. /* LINTLIBRARY */
  108. #include "vxWorks.h"
  109. #include "dirent.h"
  110. #include "ioLib.h"
  111. #include "memLib.h"
  112. #include "sys/stat.h"
  113. #include "errnoLib.h"
  114. #include "fcntl.h"
  115. #include "stdlib.h"
  116. #include "unistd.h"
  117. #include "utime.h"
  118. /*******************************************************************************
  119. *
  120. * opendir - open a directory for searching (POSIX)
  121. *
  122. * This routine opens the directory named by <dirName> and allocates a
  123. * directory descriptor (DIR) for it.  A pointer to the DIR structure is
  124. * returned.  The return of a NULL pointer indicates an error.
  125. *
  126. * After the directory is opened, readdir() is used to extract individual
  127. * directory entries.  Finally, closedir() is used to close the directory.
  128. *
  129. * WARNING: For remote file systems mounted over netDrv, opendir() fails,
  130. * because the netDrv implementation strategy does not provide a way to 
  131. * distinguish directories from plain files.  To permit use of opendir() 
  132. * on remote files, use NFS rather than netDrv.
  133. *
  134. * RETURNS: A pointer to a directory descriptor, or NULL if there is an error.
  135. *
  136. * SEE ALSO:
  137. * closedir(), readdir(), rewinddir(), ls()
  138. */
  139. DIR *opendir
  140.     (
  141.     char        *dirName                /* name of directory to open */
  142.     )
  143.     {
  144.     FAST int fd; /* file descriptor for open directory */
  145.     FAST DIR *pDir; /* ptr to allocated dir descriptor */
  146.     struct stat fileStat; /* structure for file stat */
  147.     if ((fd = open (dirName, O_RDONLY, 0)) == ERROR)
  148. return (NULL); /* can't open */
  149.     /* Check that it really is a directory */
  150.     if (fstat (fd, &fileStat) != OK)
  151. {
  152. (void) close (fd);
  153. return (NULL); /* can't stat */
  154. }
  155.     if (S_ISDIR (fileStat.st_mode) != TRUE)
  156. {
  157. errnoSet (ENOTDIR);
  158. (void) close (fd);
  159. return (NULL); /* not a dir */
  160. }
  161.     /* Allocate directory descriptor */
  162.     if ((pDir = (DIR *) calloc (sizeof (DIR), 1)) == NULL)
  163. {
  164. (void) close (fd);
  165. return (NULL); /* no memory */
  166. }
  167.     pDir->dd_fd     = fd; /* put file descriptor in DIR */
  168.     pDir->dd_cookie = 0; /* start at beginning of dir */
  169.     return (pDir);
  170.     }
  171. /*******************************************************************************
  172. *
  173. * readdir - read one entry from a directory (POSIX)
  174. *
  175. * This routine obtains directory entry data for the next file from an
  176. * open directory.  The <pDir> parameter is the pointer to a directory
  177. * descriptor (DIR) which was returned by a previous opendir().
  178. *
  179. * This routine returns a pointer to a `dirent' structure which contains
  180. * the name of the next file.  Empty directory entries and MS-DOS volume
  181. * label entries are not reported.  The name of the file (or subdirectory)
  182. * described by the directory entry is returned in the `d_name' field
  183. * of the `dirent' structure.  The name is a single null-terminated string.
  184. *
  185. * The returned `dirent' pointer will be NULL, if it is at the end of the
  186. * directory or if an error occurred.  Because there are two conditions which
  187. * might cause NULL to be returned, the task's error number (`errno') must be
  188. * used to determine if there was an actual error.  Before calling readdir(),
  189. * set `errno' to OK.  If a NULL pointer is returned, check the new
  190. * value of `errno'.  If `errno' is still OK, the end of the directory was
  191. * reached; if not, `errno' contains the error code for an actual error which
  192. * occurred.
  193. *
  194. * RETURNS: A pointer to a `dirent' structure,
  195. * or NULL if there is an end-of-directory marker or error.
  196. *
  197. * SEE ALSO:
  198. * opendir(), closedir(), rewinddir(), ls()
  199. */
  200. struct dirent *readdir
  201.     (
  202.     DIR         *pDir                   /* pointer to directory descriptor */
  203.     )
  204.     {
  205.     if (ioctl (pDir->dd_fd, FIOREADDIR, (int)pDir) != OK)
  206. return (NULL); /* can't ioctl */
  207.     return (&pDir->dd_dirent); /* return ptr to dirent */
  208.     }
  209. /*******************************************************************************
  210. *
  211. * rewinddir - reset position to the start of a directory (POSIX)
  212. *
  213. * This routine resets the position pointer in a directory descriptor (DIR).
  214. * The <pDir> parameter is the directory descriptor pointer that was returned
  215. * by opendir().
  216. *
  217. * As a result, the next readdir() will cause the current directory data to be
  218. * read in again, as if an opendir() had just been performed.  Any changes
  219. * in the directory that have occurred since the initial opendir() will now
  220. * be visible.  The first entry in the directory will be returned by the
  221. * next readdir().
  222. *
  223. * RETURNS: N/A
  224. *
  225. * SEE ALSO:
  226. * opendir(), readdir(), closedir()
  227. */
  228. void rewinddir
  229.     (
  230.     DIR         *pDir                   /* pointer to directory descriptor */
  231.     )
  232.     {
  233.     pDir->dd_cookie = 0; /* reset filesys-specific ptr */
  234.     }
  235. /*******************************************************************************
  236. *
  237. * closedir - close a directory (POSIX)
  238. *
  239. * This routine closes a directory which was previously opened using
  240. * opendir().  The <pDir> parameter is the directory descriptor pointer
  241. * that was returned by opendir().
  242. *
  243. * RETURNS: OK or ERROR.
  244. *
  245. * SEE ALSO:
  246. * opendir(), readdir(), rewinddir()
  247. */
  248. STATUS closedir
  249.     (
  250.     DIR         *pDir                   /* pointer to directory descriptor */
  251.     )
  252.     {
  253.     FAST STATUS status; /* return status */
  254.     if ((status = close (pDir->dd_fd)) != ERROR)
  255.         free ((char *) pDir);
  256.     return (status);
  257.     }
  258. /*******************************************************************************
  259. *
  260. * fstat - get file status information (POSIX)
  261. *
  262. * This routine obtains various characteristics of a file (or directory).
  263. * The file must already have been opened using open() or creat().
  264. * The <fd> parameter is the file descriptor returned by open() or creat().
  265. *
  266. * The <pStat> parameter is a pointer to a `stat' structure (defined
  267. * in stat.h).  This structure must be allocated before fstat() is called.
  268. *
  269. * Upon return, the fields in the `stat' structure are updated to
  270. * reflect the characteristics of the file.
  271. *
  272. * RETURNS: OK or ERROR.
  273. *
  274. * SEE ALSO:
  275. * stat(), ls()
  276. */
  277. STATUS fstat
  278.     (
  279.     int         fd,                     /* file descriptor for file to check */
  280.     struct stat *pStat                  /* pointer to stat structure */
  281.     )
  282.     {
  283.     return (ioctl (fd, FIOFSTATGET, (int)pStat));
  284.     }
  285. /*******************************************************************************
  286. *
  287. * stat - get file status information using a pathname (POSIX)
  288. *
  289. * This routine obtains various characteristics of a file (or directory).
  290. * This routine is equivalent to fstat(), except that the <name> of the file
  291. * is specified, rather than an open file descriptor.
  292. *
  293. * The <pStat> parameter is a pointer to a `stat' structure (defined
  294. * in stat.h).  This structure must have already been allocated before
  295. * this routine is called.
  296. *
  297. * NOTE: When used with netDrv devices (FTP or RSH), stat() returns the size
  298. * of the file and always sets the mode to regular; stat() does not distinguish
  299. * between files, directories, links, etc.
  300. *
  301. * Upon return, the fields in the `stat' structure are updated to
  302. * reflect the characteristics of the file.
  303. *
  304. * RETURNS: OK or ERROR.
  305. *
  306. * SEE ALSO:
  307. * fstat(), ls()
  308. */
  309. STATUS stat
  310.     (
  311.     char        *name,                  /* name of file to check */
  312.     struct stat *pStat                  /* pointer to stat structure */
  313.     )
  314.     {
  315.     FAST int fd; /* file descriptor */
  316.     FAST STATUS status; /* return status */
  317.     if ((fd = open (name, O_RDONLY, 0)) == ERROR)
  318. return (ERROR); /* can't open file */
  319.     status = fstat (fd, pStat);
  320.     status |= close (fd);
  321.     return (status);
  322.     }
  323. /*******************************************************************************
  324. *
  325. * fstatfs - get file status information (POSIX)
  326. *
  327. * This routine obtains various characteristics of a file system.
  328. * A file in the file system must already have been opened using open() or creat().
  329. * The <fd> parameter is the file descriptor returned by open() or creat().
  330. *
  331. * The <pStat> parameter is a pointer to a `statfs' structure (defined
  332. * in stat.h).  This structure must be allocated before fstat() is called.
  333. *
  334. * Upon return, the fields in the `statfs' structure are updated to
  335. * reflect the characteristics of the file.
  336. *
  337. * RETURNS: OK or ERROR.
  338. *
  339. * SEE ALSO:
  340. * statfs(), ls()
  341. */
  342. STATUS fstatfs
  343.     (
  344.     int           fd,                     /* file descriptor for file to check */
  345.     struct statfs *pStat                  /* pointer to statfs structure */
  346.     )
  347.     {
  348.     return (ioctl (fd, FIOFSTATFSGET, (int)pStat));
  349.     }
  350. /*******************************************************************************
  351. *
  352. * statfs - get file status information using a pathname (POSIX)
  353. *
  354. * This routine obtains various characteristics of a file system.
  355. * This routine is equivalent to fstatfs(), except that the <name> of the file
  356. * is specified, rather than an open file descriptor.
  357. *
  358. * The <pStat> parameter is a pointer to a `statfs' structure (defined
  359. * in stat.h).  This structure must have already been allocated before
  360. * this routine is called.
  361. *
  362. * Upon return, the fields in the `statfs' structure are updated to
  363. * reflect the characteristics of the file.
  364. *
  365. * RETURNS: OK or ERROR.
  366. *
  367. * SEE ALSO:
  368. * fstatfs(), ls()
  369. */
  370. STATUS statfs
  371.     (
  372.     char          *name,                  /* name of file to check */
  373.     struct statfs *pStat                  /* pointer to statfs structure */
  374.     )
  375.     {
  376.     FAST int fd; /* file descriptor */
  377.     FAST STATUS status; /* return status */
  378.     if ((fd = open (name, O_RDONLY, 0)) == ERROR)
  379. return (ERROR); /* can't open file */
  380.     status = fstatfs (fd, pStat);
  381.     status |= close (fd);
  382.     return (status);
  383.     }
  384. /*******************************************************************************
  385. *
  386. * utime - update time on a file
  387. *
  388. * RETURNS: OK or ERROR.
  389. *
  390. * SEE ALSO:
  391. * stat(), fstat(), ls()
  392. */
  393. int utime
  394.     (
  395.     char *           file,
  396.     struct utimbuf * newTimes
  397.     )
  398.     {
  399.     int fd;
  400.     int retVal;
  401.     if ((fd = open (file, O_RDONLY, 0666)) == ERROR)
  402.         return (ERROR);
  403.     else
  404. {
  405.         retVal = ioctl (fd, FIOTIMESET, (int) newTimes);
  406. close (fd);
  407. return (retVal);
  408. }
  409.     }