home *** CD-ROM | disk | FTP | other *** search
/ rtsi.com / 2014.01.www.rtsi.com.tar / www.rtsi.com / OS9 / OSK / ARCHIVERS / lha208src.lzh / LHA / SRC / lhdir.c < prev    next >
Text File  |  1994-02-14  |  2KB  |  99 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.     } 
  81.     while (dp->d_ino == 0) ;
  82.  
  83.     /* construct new format */
  84.     lhdir.d_ino = dp->d_ino;
  85.     strncpy (lhdir.d_name, dp->d_name, DIRSIZ);
  86.     lhdir.d_name[DIRSIZ] = '\0';
  87.     lhdir.d_namlen = strlen (lhdir.d_name);
  88.  
  89.     return &lhdir;
  90. }
  91.  
  92. closedir (dirp)
  93. DIR *dirp;
  94. {
  95.     close (dirp->dd_fd);
  96.     free (dirp);
  97. }
  98.  
  99.