home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / unix / volume23 / trn / part13 / ndir.c < prev    next >
C/C++ Source or Header  |  1991-08-22  |  3KB  |  130 lines

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