Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | Download | RSS feed

  1. /*
  2.   Copyright (c) 1990-2000 Info-ZIP.  All rights reserved.
  3.  
  4.   See the accompanying file LICENSE, version 2000-Apr-09 or later
  5.   (the contents of which are also included in unzip.h) for terms of use.
  6.   If, for some reason, all these files are missing, the Info-ZIP license
  7.   also may be found at:  ftp://ftp.info-zip.org/pub/infozip/license.html
  8. */
  9. /*---------------------------------------------------------------------------
  10.  
  11.   macdir.c
  12.  
  13.  *  This file provides dirent-style directory-reading procedures
  14.  *  for V7 Unix systems that don't have such procedures.
  15.  *
  16.  *
  17.   ---------------------------------------------------------------------------*/
  18.  
  19.  
  20. /*****************************************************************************/
  21. /*  Includes                                                                 */
  22. /*****************************************************************************/
  23.  
  24.  
  25. #include    <Errors.h>
  26. #include    <Files.h>
  27. #include    <Strings.h>
  28. #include    <sound.h>
  29.  
  30. #include <errno.h>
  31. #include <stdio.h>
  32. #include <stdlib.h>
  33. #include <string.h>
  34.  
  35. #include "macdir.h"
  36. #include "helpers.h"
  37. #include "pathname.h"
  38.  
  39.  
  40. /*****************************************************************************/
  41. /*  Functions                                                                */
  42. /*****************************************************************************/
  43.  
  44. int closedir(DIR *dPtr)
  45. {
  46.     free(dPtr);
  47.  
  48.     return 0;
  49. }
  50.  
  51.  
  52. DIR *opendir(char *dirName)
  53. {
  54.     int fullPath;
  55.     unsigned pathLen;
  56.     char *s;
  57.     HParamBlockRec hPB;
  58.     CInfoPBRec cPB;
  59.     DIR *dPtr;
  60.     OSErr err;
  61.     FSSpec spec;
  62.     char CompletePath[NAME_MAX];
  63.  
  64.     GetCompletePath(CompletePath, dirName, &spec, &err);
  65.     printerr("GetCompletePath", err, err, __LINE__, __FILE__, dirName);
  66.  
  67.     if (dirName == NULL || *dirName == '\0' ||
  68.         (pathLen = strlen(dirName)) >= 256) {
  69.         errno = EINVAL;
  70.         return NULL;
  71.     }
  72.  
  73.  
  74.     /* Get information about volume. */
  75.     memset(&hPB, '\0', sizeof(hPB));
  76.  
  77.     if (((s = strchr(dirName, ':')) == NULL) || (*dirName == ':')) {
  78.         fullPath = false;
  79.     } else {
  80.         *(s + 1) = '\0';
  81.         hPB.volumeParam.ioVolIndex = -1;
  82.         fullPath = true;
  83.     }
  84.  
  85.     hPB.volumeParam.ioNamePtr = spec.name;
  86.  
  87.     err = PBHGetVInfoSync(&hPB);
  88.  
  89.     if ((err != noErr) || (hPB.volumeParam.ioVFSID != 0)) {
  90.         errno = ENOENT;
  91.         return NULL;
  92.     }
  93.  
  94.     /* Get information about file. */
  95.  
  96.     memset(&cPB, '\0', sizeof(cPB));
  97.  
  98.     if (fullPath)
  99.         cPB.hFileInfo.ioVRefNum = hPB.volumeParam.ioVRefNum;
  100.  
  101.     cPB.hFileInfo.ioNamePtr = spec.name;
  102.  
  103.     err = PBGetCatInfoSync(&cPB);
  104.  
  105.     if (err != noErr) {
  106.         errno = (err == fnfErr) ? ENOENT : EIO;
  107.         return NULL;
  108.     }
  109.  
  110.     if (!(cPB.hFileInfo.ioFlAttrib & ioDirMask)) {
  111.         errno = ENOTDIR;
  112.         return NULL;
  113.     }
  114.  
  115.     /* Get space for, and fill in, DIR structure. */
  116.  
  117.     if ((dPtr = (DIR *)malloc(sizeof(DIR))) == NULL) {
  118.         return NULL;
  119.     }
  120.  
  121.     dPtr->ioVRefNum = cPB.dirInfo.ioVRefNum;
  122.     dPtr->ioDrDirID = cPB.dirInfo.ioDrDirID;
  123.     dPtr->ioFDirIndex = 1;
  124.     dPtr->flags = 0;
  125.  
  126.     return dPtr;
  127. }
  128.  
  129.  
  130. struct dirent *readdir(DIR *dPtr)
  131. {
  132.     struct dirent *dirPtr;
  133.     CInfoPBRec cPB;
  134.     char name[256];
  135.     OSErr err;
  136.  
  137.     if (dPtr->flags) {
  138.         return NULL;
  139.     }
  140.  
  141.     /* Get information about file. */
  142.  
  143.     memset(&cPB, '\0', sizeof(cPB));
  144.  
  145.     cPB.hFileInfo.ioNamePtr = (StringPtr)name;
  146.     cPB.hFileInfo.ioFDirIndex = dPtr->ioFDirIndex;
  147.     cPB.hFileInfo.ioVRefNum = dPtr->ioVRefNum;
  148.     cPB.hFileInfo.ioDirID = dPtr->ioDrDirID;
  149.  
  150.     err = PBGetCatInfoSync(&cPB);
  151.  
  152.     if (err != noErr) {
  153.         dPtr->flags = 0xff;
  154.         errno = (err == fnfErr) ? ENOENT : EIO;
  155.         return NULL;
  156.     }
  157.  
  158.     p2cstr((StringPtr)name);
  159.  
  160.     dirPtr = &dPtr->currEntry;
  161.  
  162.     dirPtr->d_fileno = dPtr->ioFDirIndex++;
  163.     dirPtr->d_namlen = strlen(name);
  164.     strcpy(dirPtr->d_name, name);
  165.     dirPtr->d_reclen = sizeof(struct dirent) - sizeof(dirPtr->d_name) +
  166.                        dirPtr->d_namlen;
  167.  
  168.     return dirPtr;
  169. }
  170.