home *** CD-ROM | disk | FTP | other *** search
/ Fish 'n' More 2 / fishmore-publicdomainlibraryvol.ii1991xetec.iso / disks / disk445.lzh / Tar / src / dir.c < prev    next >
C/C++ Source or Header  |  1991-01-24  |  2KB  |  84 lines

  1. #include <dirent.h>
  2.  
  3. DIR *
  4. opendir(char *dirname)
  5. {
  6.     struct FileLock *alock;
  7.     struct FileInfoBlock *fib;
  8.     DIR *dp;
  9.  
  10.     if (alock = Lock(dirname, ACCESS_READ))
  11.     {
  12.     if ((fib = (struct FileInfoBlock *) malloc(sizeof(*fib))) == NULL)
  13.     {
  14.         UnLock(alock);
  15.         return(NULL);    /* malloc failed */
  16.     }
  17.     if (Examine(alock, fib) && (fib->fib_DirEntryType > 0))
  18.     {
  19.         if (dp = (DIR *) malloc(sizeof(*dp)))
  20.         {
  21.             if ((dp->dd_dirent =
  22.             (struct dirent *) malloc(DIRENTSIZ(MAXNAMELEN))) == NULL)
  23.         {
  24.                 UnLock(alock);
  25.             free(fib);
  26.             free(dp);
  27.             return(NULL);    /* malloc failed */
  28.             }
  29.         dp->dd_lock = alock;
  30.         dp->dd_fib = fib;
  31.             dp->dd_loc = 0;
  32.             return(dp);
  33.             }
  34.         else
  35.         {
  36.             UnLock(alock);
  37.         free(fib);
  38.             return(NULL);        /* malloc failed */
  39.         }
  40.     }
  41.     else
  42.     {
  43.         UnLock(alock);
  44.         free(fib);
  45.         return(NULL);        /* not a directory */
  46.     }
  47.     }
  48.     else
  49.     return(NULL);            /* couldn't access file */
  50. }
  51.  
  52.  
  53. struct dirent *
  54. readdir(DIR *dirp)
  55. {
  56.     struct dirent *dp;
  57.  
  58.     if ((dirp == NULL) || (dirp->dd_dirent == NULL))
  59.     return(NULL);            /* malloc failed */
  60.     if (ExNext(dirp->dd_lock, dirp->dd_fib))
  61.     {
  62.     dirp->dd_loc++;
  63.     dp = dirp->dd_dirent;
  64.     dp->d_ino = 0;
  65.     dp->d_reclen = strlen(dirp->dd_fib->fib_FileName);
  66.     strcpy(dp->d_name, dirp->dd_fib->fib_FileName);
  67.         return(dirp->dd_dirent);
  68.     }
  69.     else
  70.     return(NULL);            /* hit end */
  71. }
  72.  
  73. int
  74. closedir(DIR *dirp)
  75. {
  76.     if ((dirp == NULL) || (dirp->dd_dirent == NULL))
  77.     return(1);
  78.     UnLock(dirp->dd_lock);
  79.     free(dirp->dd_dirent);
  80.     free(dirp->dd_fib);
  81.     free(dirp);
  82.     return(0);
  83. }
  84.