home *** CD-ROM | disk | FTP | other *** search
/ rtsi.com / 2014.01.www.rtsi.com.tar / www.rtsi.com / OS9 / OSK / TELECOM / rn_4_3_blars.lzh / ndir.c < prev    next >
Text File  |  1990-08-22  |  2KB  |  120 lines

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