home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / misc / volume1 / 8708 / 24 / ndir.c < prev    next >
Encoding:
C/C++ Source or Header  |  1990-07-13  |  2.3 KB  |  147 lines

  1.  
  2. /*#include <ndir.h>*/
  3. #include <local/ndir.h>
  4.  
  5. #include <pb.h>
  6.  
  7. #ifdef TEST
  8. #include <stdio.h>
  9. #define _DEBUG
  10. #include <max/debug.h>
  11. #endif
  12.  
  13. /*
  14.  * support for Berkeley directory reading routine on a V7 file system
  15.  */
  16.  
  17. extern char *malloc();
  18.  
  19. /*
  20.  * open a directory.
  21.  */
  22.  
  23. DIR *
  24. opendir(name)
  25. char *name;
  26. {
  27.     register DIR *dirp;
  28.     register int fd;
  29.  
  30.     char buf[100];
  31.     CInfoPBRec cpb;
  32.     int err;
  33.  
  34.     /* fix name, and get volume reference number */
  35.  
  36.  
  37.     cpb.ioVRefNum = hfixnam( name, buf );
  38.     cpb.ioNamePtr = ctop( buf );
  39.     cpb.ioFDirIndex = 0;
  40.     cpb.u.di.ioDrDirID = 0L;
  41.  
  42. #ifdef TEST
  43.     fprintf( stderr, "opendir: %s\n", buf );
  44. #endif
  45.  
  46.     if ((err = PBGetCatInfo( &cpb, 0 )) != 0 ) {
  47. #ifdef TEST
  48.         fprintf( stderr, "setdir: PBGetCatInfo %d\n", err );
  49. #endif
  50.         return NULL;
  51.     }
  52.  
  53.     if ((dirp = (DIR *)malloc(sizeof(DIR))) == NULL) {
  54. #ifdef TEST
  55.         fprintf( stderr, "opendir: couldn't malloc %d\n",sizeof(DIR));
  56. #endif
  57.         return NULL;
  58.     }
  59.     dirp->ioVRefNum = cpb.ioVRefNum;
  60.     dirp->ioDrDirID = cpb.u.di.ioDrDirID;
  61.     dirp->ioFDirIndex = 1;
  62.  
  63. #ifdef TEST
  64.     fprintf( stderr, "opendir: # %ld\n", cpb.u.di.ioDrDirID );
  65. #endif
  66.  
  67.     return dirp;
  68. }
  69.  
  70.  
  71. /*
  72.  * get next entry in a directory.
  73.  */
  74. struct direct *
  75. readdir(dirp)
  76. register DIR *dirp;
  77. {
  78.     CInfoPBRec cpb;
  79.     int err;
  80.     static struct direct dir;
  81.  
  82. #ifdef TEST
  83.     fprintf( stderr, "readdir: v:%d d:%ld i:%d\n", 
  84.             dirp->ioVRefNum, dirp->ioDrDirID, dirp->ioFDirIndex );
  85. #endif
  86.     strcpy( dir.d_name, "" );
  87.     cpb.ioNamePtr = dir.d_name;
  88.     cpb.ioVRefNum = dirp->ioVRefNum;
  89.     cpb.u.di.ioDrDirID = dirp->ioDrDirID;
  90.     cpb.ioFDirIndex = dirp->ioFDirIndex++;
  91.  
  92.     if ((err = PBGetCatInfo( &cpb, 0 )) != 0 ) {
  93. #ifdef TEST
  94.         fprintf( stderr, "readdir: err %d\n", err );
  95. #endif
  96.         return NULL;
  97.     }
  98.  
  99.     dir.d_ino = 0;
  100.     ptoc( dir.d_name );
  101.  
  102. #ifdef TEST
  103.     fprintf( stderr, "readdir: OK \"%s\"\n",  dir.d_name);
  104. #endif
  105.  
  106.     dir.d_namlen = strlen(dir.d_name);
  107.     dir.d_reclen = DIRSIZ(&dir);
  108.     return (&dir);
  109.     
  110. }
  111.  
  112. /*
  113.  * close a directory.
  114.  */
  115. void
  116. closedir(dirp)
  117. register DIR *dirp;
  118. {
  119.     free((char *)dirp);
  120. }
  121.  
  122.  
  123. #ifdef TEST
  124. #include <errno.h>
  125.  
  126. main()
  127. {
  128.     char command[100];
  129.  
  130.     struct DIR *dirp;
  131.     struct direct *dp;
  132.     
  133.     while(gets(command) != NULL) {
  134.  
  135.         fprintf( stderr, "test: %s\n", command );
  136.  
  137.         if ((dirp = opendir( command )) == NULL ) {
  138.             fprintf( stderr, "couldn't open dir %s\n", command );
  139.         }
  140.         while ((dp = readdir(dirp)) != NULL) 
  141.             fprintf( stderr, "%s", dp->d_name );
  142.  
  143.         closedir( dirp );
  144.     }
  145. }
  146. #endif
  147.