home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 9 Archive / 09-Archive.zip / lha100bt.zip / lha-1.00 / src / lhdir.c < prev    next >
C/C++ Source or Header  |  1992-04-04  |  2KB  |  98 lines

  1. /*----------------------------------------------------------------------*/
  2. /*        Directory access routine for LHarc UNIX            */
  3. /*        This is part of LHarc UNIX Archiver Driver        */
  4. /*                                    */
  5. /*        Copyright(C) MCMLXXXIX  Yooichi.Tagawa            */
  6. /*                                    */
  7. /*    Emulate opendir(),readdir(),closedir() function for LHarc    */
  8. /*                                    */
  9. /*  V0.00  Original                1988.05.31  Y.Tagawa    */
  10. /*  V0.03  Release #3 for LHarc UNIX        1988.07.02  Y.Tagawa    */
  11. /*  V1.00  Fixed                1989.09.22  Y.Tagawa    */
  12. /*----------------------------------------------------------------------*/
  13.  
  14.  
  15. #include <sys/types.h>
  16.  
  17. /* Where is O_RDONLY ? (^_^) */
  18. #include <sys/file.h>
  19. #ifndef O_RDONLY
  20. #include <fcntl.h>
  21. #endif
  22.  
  23. #define direct old_direct
  24. #include <sys/dir.h>
  25. #undef direct
  26.  
  27. #ifndef DIRSIZ
  28. /* Warning :  Are you sure? (normally defined in <sys/dir.h> */
  29. #define DIRSIZ    14
  30. #endif
  31.  
  32. #include "lhdir.h"
  33.  
  34.  
  35. DIR *
  36. opendir (name)
  37.      char *name;
  38. {
  39.   register DIR *dirp;
  40.   register int fd;
  41.  
  42.   if ((fd = open (name, O_RDONLY)) >= 0)
  43.     {
  44.       if ((dirp = (DIR*)malloc (sizeof (DIR))) != (DIR*)0)
  45.     {
  46.       dirp->dd_fd = fd;
  47.       dirp->dd_loc = 0;
  48.       dirp->dd_size = 0;
  49.       return dirp;
  50.     }
  51.  
  52.       close (fd);
  53.     }
  54.  
  55.   return (DIR*)0;
  56. }
  57.  
  58. struct direct *
  59. readdir (dirp)
  60.      register DIR *dirp;
  61. {
  62.   static struct direct lhdir;
  63.   register struct old_direct *dp;
  64.  
  65.   do {
  66.     if (dirp->dd_loc >= dirp->dd_size)
  67.       {
  68.     dirp->dd_loc = 0;
  69.     if ((dirp->dd_size = read (dirp->dd_fd, dirp->dd_buf, DIRBLKSIZ)) <= 0)
  70.       return (struct direct *)0;
  71.       }
  72.  
  73.     dp = (struct old_direct *)(dirp->dd_buf + dirp->dd_loc);
  74.  
  75.     if (dirp->dd_loc + sizeof (struct old_direct) > dirp->dd_size)
  76.       return (struct direct *)0;
  77.  
  78.     dirp->dd_loc += sizeof (struct old_direct);
  79.  
  80.   } while (dp->d_ino == 0) ;
  81.  
  82.   /* construct new format */
  83.   lhdir.d_ino = dp->d_ino;
  84.   strncpy (lhdir.d_name, dp->d_name, DIRSIZ);
  85.   lhdir.d_name[DIRSIZ] = '\0';
  86.   lhdir.d_namlen = strlen (lhdir.d_name);
  87.  
  88.   return &lhdir;
  89. }
  90.  
  91. closedir (dirp)
  92.      DIR *dirp;
  93. {
  94.   close (dirp->dd_fd);
  95.   free (dirp);
  96. }
  97.  
  98.