home *** CD-ROM | disk | FTP | other *** search
/ The CDPD Public Domain Collection for CDTV 4 / CDPD_IV.bin / networking / uucp / amigauucpsrc / lib / ndir.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-06-29  |  2.5 KB  |  148 lines

  1.  
  2. /*
  3.  *  NDIR.C
  4.  *
  5.  *  Amiga (Lattice & Manx) "ndir" Library
  6.  */
  7.  
  8. #ifndef _DCC    /*  DICE has its own */
  9.  
  10. #include <exec/types.h>
  11. #include <exec/memory.h>
  12. #include <libraries/dosextens.h>
  13.  
  14. #include <stdio.h>
  15. #include <stdlib.h>
  16. #include <string.h>
  17.  
  18. #include "ndir.h"
  19. #include "config.h"
  20. #include "version.h"
  21.  
  22. IDENT(".01");
  23.  
  24. Prototype struct DIR *opendir(const char *);
  25. Prototype int rewinddir(struct DIR *);
  26. Prototype struct direct *readdir(struct DIR *);
  27. Prototype int closedir(struct DIR *);
  28.  
  29. /*
  30.  * open a directory.
  31.  */
  32.  
  33. DIR *
  34. opendir(const char *name)
  35. {
  36.     register DIR *dirp;
  37.     BPTR lock;
  38.  
  39. #ifdef TEST
  40.     fprintf(stderr, "opendir: Opening \"%s\"\n", name);
  41. #endif
  42.     if ((lock = Lock(name, (long)ACCESS_READ)) == NULL) {
  43. #ifdef TEST
  44.     fprintf(stderr, "opendir: Can't open.\n");
  45. #endif
  46.     return NULL;
  47.     }
  48.     if ((dirp = (DIR *)malloc(sizeof(DIR))) == NULL) {
  49. #ifdef TEST
  50.     fprintf(stderr, "opendir: couldn't malloc %d\n", sizeof(DIR));
  51. #endif
  52.     UnLock(lock);
  53.     return NULL;
  54.     }
  55. #ifdef TEST
  56.     fprintf(stderr, "FIB location is 0%lo\n", &dirp->fib);
  57. #endif
  58.     if (!Examine(lock, &dirp->fib)) {
  59. #ifdef TEST
  60.      fprintf(stderr, "opendir: Couldn't Examine directory\n");
  61. #endif
  62.      free(dirp);
  63.      UnLock(lock);
  64.     }
  65.     dirp->lock = (long)lock;
  66. #ifdef TEST
  67.     fputs("opendir: Sucessful\n", stderr);
  68. #endif
  69.     return dirp;
  70. }
  71.  
  72. /*
  73.  * go back to the begining of the directory
  74.  */
  75.  
  76. int
  77. rewinddir(DIR *dirp)
  78. {
  79.     Examine((BPTR)dirp->lock, &dirp->fib);
  80.     return(0);
  81. }
  82.  
  83. /*
  84.  * get next entry in a directory.
  85.  */
  86.  
  87. struct direct *
  88. readdir(DIR *dirp)
  89. {
  90.     static struct direct dir;
  91.  
  92.     while (ExNext((BPTR)dirp->lock, &dirp->fib)) {
  93.     if (dirp->fib.fib_DirEntryType <= 0) {
  94.         dir.d_ino = dirp->fib.fib_DiskKey;
  95.         strcpy(dir.d_name, dirp->fib.fib_FileName);
  96. #ifdef TEST
  97.         fprintf(stderr, "readdir: OK \"%s\"\n",  dir.d_name);
  98. #endif
  99.         dir.d_namlen = strlen(dir.d_name);
  100.         dir.d_reclen = DIRSIZ(&dir);
  101.         return &dir;
  102.     }
  103.     }
  104. #ifdef TEST
  105.     fprintf(stderr, "readdir: No More Entries.\n");
  106. #endif
  107.     dir.d_name[0] = '\0';
  108.     return NULL;
  109. }
  110.  
  111. /*
  112.  * close a directory.
  113.  */
  114.  
  115. int
  116. closedir(DIR *dirp)
  117. {
  118.     UnLock((BPTR)dirp->lock);
  119.     free((char *)dirp);
  120.     return(0);
  121. }
  122.  
  123. #ifdef TEST
  124.  
  125. main(void)
  126. {
  127.     char command[100];
  128.  
  129.     DIR *dirp;
  130.     struct direct *dp;
  131.  
  132.     while(gets(command) != NULL) {
  133.     fprintf(stderr, "test: %s\n", command);
  134.     if ((dirp = opendir(command)) == NULL) {
  135.         fprintf(stderr, "couldn't open dir %s\n", command);
  136.     } else {
  137.         while ((dp = readdir(dirp)) != NULL)
  138.         fprintf(stderr, "%s\n", dp->d_name);
  139.         closedir(dirp);
  140.     }
  141.     }
  142.     return 0;
  143. }
  144.  
  145. #endif
  146.  
  147. #endif    /* _DCC */
  148.