opendir.c
上传用户:rrhhcc
上传日期:2015-12-11
资源大小:54129k
文件大小:2k
源码类别:

通讯编程

开发平台:

Visual C++

  1. /* 
  2.  * opendir.c --
  3.  *
  4.  * This file provides dirent-style directory-reading procedures
  5.  * for V7 Unix systems that don't have such procedures.  The
  6.  * origin of this code is unclear, but it seems to have come
  7.  * originally from Larry Wall.
  8.  *
  9.  *
  10.  * RCS: @(#) $Id: opendir.c,v 1.2 1998/09/14 18:39:44 stanton Exp $
  11.  */
  12. #include "tclInt.h"
  13. #include "tclPort.h"
  14. #undef DIRSIZ
  15. #define DIRSIZ(dp) 
  16.     ((sizeof (struct dirent) - (MAXNAMLEN+1)) + (((dp)->d_namlen+1 + 3) &~ 3))
  17. /*
  18.  * open a directory.
  19.  */
  20. DIR *
  21. opendir(name)
  22. char *name;
  23. {
  24. register DIR *dirp;
  25. register int fd;
  26. char *myname;
  27. myname = ((*name == '') ? "." : name);
  28. if ((fd = open(myname, 0, 0)) == -1)
  29. return NULL;
  30. if ((dirp = (DIR *)ckalloc(sizeof(DIR))) == NULL) {
  31. close (fd);
  32. return NULL;
  33. }
  34. dirp->dd_fd = fd;
  35. dirp->dd_loc = 0;
  36. return dirp;
  37. }
  38. /*
  39.  * read an old style directory entry and present it as a new one
  40.  */
  41. #ifndef pyr
  42. #define ODIRSIZ 14
  43. struct olddirect {
  44. ino_t od_ino;
  45. char od_name[ODIRSIZ];
  46. };
  47. #else /* a Pyramid in the ATT universe */
  48. #define ODIRSIZ 248
  49. struct olddirect {
  50. long od_ino;
  51. short od_fill1, od_fill2;
  52. char od_name[ODIRSIZ];
  53. };
  54. #endif
  55. /*
  56.  * get next entry in a directory.
  57.  */
  58. struct dirent *
  59. readdir(dirp)
  60. register DIR *dirp;
  61. {
  62. register struct olddirect *dp;
  63. static struct dirent dir;
  64. for (;;) {
  65. if (dirp->dd_loc == 0) {
  66. dirp->dd_size = read(dirp->dd_fd, dirp->dd_buf,
  67.     DIRBLKSIZ);
  68. if (dirp->dd_size <= 0)
  69. return NULL;
  70. }
  71. if (dirp->dd_loc >= dirp->dd_size) {
  72. dirp->dd_loc = 0;
  73. continue;
  74. }
  75. dp = (struct olddirect *)(dirp->dd_buf + dirp->dd_loc);
  76. dirp->dd_loc += sizeof(struct olddirect);
  77. if (dp->od_ino == 0)
  78. continue;
  79. dir.d_ino = dp->od_ino;
  80. strncpy(dir.d_name, dp->od_name, ODIRSIZ);
  81. dir.d_name[ODIRSIZ] = ''; /* insure null termination */
  82. dir.d_namlen = strlen(dir.d_name);
  83. dir.d_reclen = DIRSIZ(&dir);
  84. return (&dir);
  85. }
  86. }
  87. /*
  88.  * close a directory.
  89.  */
  90. void
  91. closedir(dirp)
  92. register DIR *dirp;
  93. {
  94. close(dirp->dd_fd);
  95. dirp->dd_fd = -1;
  96. dirp->dd_loc = 0;
  97. ckfree((char *) dirp);
  98. }