home *** CD-ROM | disk | FTP | other *** search
/ Frozen Fish 1: Amiga / FrozenFish-Apr94.iso / bbs / alib / d1xx / d109 / uupc.lha / UUpc / Source / LOCAL / ndir.c < prev    next >
C/C++ Source or Header  |  1987-10-28  |  2KB  |  136 lines

  1. #include "ndir.h"
  2. #include <exec/memory.h>
  3. #include <functions.h>
  4.  
  5. #ifdef TEST
  6. #include <stdio.h>
  7. #endif
  8.  
  9. /*
  10.  * support for Berkeley directory reading routine on a V7 file system
  11.  */
  12.  
  13. extern char *malloc();
  14.  
  15. /*
  16.  * open a directory.
  17.  */
  18.  
  19. DIR *
  20. opendir(name)
  21. char *name;
  22. {
  23.     register DIR *dirp;
  24.     struct Lock  *lock;
  25.  
  26. #ifdef TEST
  27.     fprintf( stderr, "opendir: Opening \"%s\"\n", name );
  28. #endif
  29.     if ( ( lock = Lock( name, ACCESS_READ )) == NULL )
  30.       {
  31. #ifdef TEST
  32.         fprintf( stderr, "opendir: Can't open.\n" );
  33. #endif
  34.         return NULL;
  35.       }
  36.  
  37.     if ( (dirp = (DIR *)malloc(sizeof(DIR))) == NULL )
  38.       {
  39. #ifdef TEST
  40.         fprintf( stderr, "opendir: couldn't malloc %d\n",sizeof(DIR));
  41. #endif
  42.         UnLock( lock );
  43.         return NULL;
  44.       }
  45.     if ( !Examine( lock, &dirp->fib) )
  46.       {
  47. #ifdef TEST
  48.          fprintf( stderr, "opendir: Couldn't Examine directory\n" );
  49. #endif
  50.          free( dirp );
  51.          UnLock( lock );
  52.       }
  53.  
  54.     dirp->lock = lock;
  55. #ifdef TEST
  56.     fprintf( stderr, "opendir: Sucessful\n" );
  57. #endif
  58.  
  59.     return dirp;
  60. }
  61.  
  62.  
  63. /*
  64.  * get next entry in a directory.
  65.  */
  66. struct direct *
  67. readdir(dirp)
  68. register DIR *dirp;
  69. {
  70.     static struct direct dir;
  71.  
  72.     while ( ExNext( dirp->lock, &dirp->fib ) )
  73.        {
  74.         if ( dirp->fib.fib_DirEntryType <= 0 )
  75.           {
  76.             dir.d_ino = 0;
  77.             strcpy( dir.d_name, dirp->fib.fib_FileName );
  78. #ifdef TEST
  79.             fprintf( stderr, "readdir: OK \"%s\"\n",  dir.d_name);
  80. #endif
  81.             dir.d_namlen = strlen(dir.d_name);
  82.             dir.d_reclen = DIRSIZ(&dir);
  83.             return (&dir);
  84.           }
  85.         }
  86.  
  87. #ifdef TEST
  88.     fprintf( stderr, "readdir: No More Entries.\n" );
  89. #endif
  90.     strcpy( dir.d_name, "" );
  91.     return NULL;
  92.  
  93. }
  94.  
  95. /*
  96.  * close a directory.
  97.  */
  98. void
  99. closedir(dirp)
  100. register DIR *dirp;
  101. {
  102.  
  103.     UnLock( dirp->lock );
  104.     free((char *)dirp);
  105. }
  106.  
  107.  
  108. #ifdef TEST
  109. #include <errno.h>
  110.  
  111. main()
  112. {
  113.     char command[100];
  114.  
  115.     struct DIR *dirp;
  116.     struct direct *dp;
  117.     
  118.     while(gets(command) != NULL) {
  119.  
  120.         fprintf( stderr, "test: %s\n", command );
  121.  
  122.         if ((dirp = opendir( command )) == NULL ) {
  123.             fprintf( stderr, "couldn't open dir %s\n", command );
  124.         }
  125.         else
  126.            {
  127.             while ((dp = readdir(dirp)) != NULL) 
  128.                 fprintf( stderr, "%s", dp->d_name );
  129.         
  130.             closedir( dirp );
  131.            }    
  132.     }
  133. }
  134. #endif
  135.  
  136.