home *** CD-ROM | disk | FTP | other *** search
/ Beijing Paradise BBS Backup / PARADISE.ISO / software / BBSDOORW / UUPC11XT.ZIP / RN / NDIR.C < prev    next >
Encoding:
C/C++ Source or Header  |  1992-11-21  |  2.7 KB  |  135 lines

  1. /* $Header: E:\SRC\UUPC\RN\RCS/NDIR.C 1.1 1992/11/21 06:14:58 ahd Exp $
  2.  *
  3.  * $Log: NDIR.C $
  4.  * Revision 1.1  1992/11/21  06:14:58  ahd
  5.  * Initial
  6.  *
  7.  *
  8.  *    Rev 1.0   18 Nov 1990  0:22:24
  9.  * Initial revision.
  10.  * Revision 4.3.1.3  85/05/23  11:19:24  lwall
  11.  * Oops, shouldn't have included sys/types.h again.
  12.  *
  13.  * Revision 4.3.1.2  85/05/15  14:46:00  lwall
  14.  * Changed short to ino_t, which may be ushort on some systems.
  15.  *
  16.  * Revision 4.3.1.1  85/05/10  11:35:34  lwall
  17.  * Branch for patches.
  18.  *
  19.  * Revision 4.3  85/05/01  11:42:55  lwall
  20.  * Baseline for release with 4.3bsd.
  21.  *
  22.  */
  23.  
  24. #include "EXTERN.h"
  25. #include "common.h"
  26. #include "INTERN.h"
  27. #include "ndir.h"
  28.  
  29. #ifdef USENDIR
  30. /*
  31.  * support for Berkeley directory reading routine on a V7 file system
  32.  */
  33.  
  34. /*
  35.  * open a directory.
  36.  */
  37. DIR *
  38.   opendir(name)
  39.    char *name;
  40. {
  41.    register DIR *dirp;
  42.    register int fd;
  43.    char *malloc();
  44.  
  45.    if ((fd = open(name, 0)) == -1)
  46.       return NULL;
  47.    if ((dirp = (DIR *) malloc(sizeof (DIR))) == NULL)
  48.    {
  49.       close(fd);
  50.       return NULL;
  51.    }
  52.    dirp->dd_fd = fd;
  53.    dirp->dd_loc = 0;
  54.    return dirp;
  55. }
  56.  
  57. /*
  58.  * read an old style directory entry and present it as a new one
  59.  */
  60.  
  61. #ifndef pyr
  62. #define ODIRSIZ 14
  63.  
  64. struct olddirect
  65. {
  66.    ino_t od_ino;
  67.    char od_name[ODIRSIZ];
  68. };
  69.  
  70. #else                        /* an Pyramid in the ATT
  71.                               * universe */
  72. #define ODIRSIZ 248
  73.  
  74. struct olddirect
  75. {
  76.    long od_ino;
  77.    short od_fill1, od_fill2;
  78.    char od_name[ODIRSIZ];
  79. };
  80.  
  81. #endif
  82.  
  83. /*
  84.  * get next entry in a directory.
  85.  */
  86. struct direct *
  87.   readdir(dirp)
  88.    register DIR *dirp;
  89. {
  90.    register struct olddirect *dp;
  91.    static struct direct dir;
  92.  
  93.    for (;;)
  94.    {
  95.       if (dirp->dd_loc == 0)
  96.       {
  97.          dirp->dd_size = read(dirp->dd_fd, dirp->dd_buf,
  98.                               DIRBLKSIZ);
  99.          if (dirp->dd_size <= 0)
  100.             return NULL;
  101.       }
  102.       if (dirp->dd_loc >= dirp->dd_size)
  103.       {
  104.          dirp->dd_loc = 0;
  105.          continue;
  106.       }
  107.       dp = (struct olddirect *) (dirp->dd_buf + dirp->dd_loc);
  108.       dirp->dd_loc += sizeof (struct olddirect);
  109.       if (dp->od_ino == 0)
  110.          continue;
  111.       dir.d_ino = dp->od_ino;
  112.       strncpy(dir.d_name, dp->od_name, ODIRSIZ);
  113.       dir.d_name[ODIRSIZ] = '\0';       /* insure null
  114.                                          * termination */
  115.       dir.d_namlen = strlen(dir.d_name);
  116.       dir.d_reclen = DIRSIZ(&dir);
  117.       return (&dir);
  118.    }
  119. }
  120.  
  121. /*
  122.  * close a directory.
  123.  */
  124. void
  125.   closedir(dirp)
  126.    register DIR *dirp;
  127. {
  128.    close(dirp->dd_fd);
  129.    dirp->dd_fd = -1;
  130.    dirp->dd_loc = 0;
  131.    free(dirp);
  132. }
  133.  
  134. #endif                       /* USENDIR */
  135.