macdir.c
上传用户:andy_li
上传日期:2007-01-06
资源大小:1019k
文件大小:4k
源码类别:

压缩解压

开发平台:

MultiPlatform

  1. /*---------------------------------------------------------------------------
  2.   macdir.c
  3.  *  This file provides dirent-style directory-reading procedures
  4.  *  for V7 Unix systems that don't have such procedures.
  5.  *
  6.  *
  7.   ---------------------------------------------------------------------------*/
  8. /*****************************************************************************/
  9. /*  Includes                                                                 */
  10. /*****************************************************************************/
  11. #include    <Errors.h>
  12. #include    <Files.h>
  13. #include    <Strings.h>
  14. #include <errno.h>
  15. #include <stdio.h>
  16. #include <stdlib.h>
  17. #include <string.h>
  18. #include "macdir.h"
  19. #include "helpers.h"
  20. #include "pathname.h"
  21. /*****************************************************************************/
  22. /*  Functions                                                                */
  23. /*****************************************************************************/
  24. int closedir(DIR *dPtr)
  25. {
  26.     free(dPtr);
  27.     return 0;
  28. }
  29. DIR *opendir(char *dirName)
  30. {
  31.     int fullPath;
  32.     unsigned pathLen;
  33.     char *s;
  34.     HParamBlockRec hPB;
  35.     CInfoPBRec cPB;
  36.     DIR *dPtr;
  37.     OSErr err;
  38.     FSSpec spec;
  39.     char CompletePath[NAME_MAX];
  40.     GetCompletePath(CompletePath, dirName, &spec, &err);
  41.     printerr("GetCompletePath", err, err, __LINE__, __FILE__, dirName);
  42.     if (dirName == NULL || *dirName == '' ||
  43.         (pathLen = strlen(dirName)) >= 256) {
  44.         errno = EINVAL;
  45.         return NULL;
  46.     }
  47.     /* Get information about volume. */
  48.     memset(&hPB, '', sizeof(hPB));
  49.     if (((s = strchr(dirName, ':')) == NULL) || (*dirName == ':')) {
  50.         fullPath = false;
  51.     } else {
  52.         *(s + 1) = '';
  53.         hPB.volumeParam.ioVolIndex = -1;
  54.         fullPath = true;
  55.     }
  56.     hPB.volumeParam.ioNamePtr = spec.name;
  57.     err = PBHGetVInfoSync(&hPB);
  58.     if ((err != noErr) || (hPB.volumeParam.ioVFSID != 0)) {
  59.         errno = ENOENT;
  60.         return NULL;
  61.     }
  62.     /* Get information about file. */
  63.     memset(&cPB, '', sizeof(cPB));
  64.     if (fullPath)
  65.         cPB.hFileInfo.ioVRefNum = hPB.volumeParam.ioVRefNum;
  66.     cPB.hFileInfo.ioNamePtr = spec.name;
  67.     err = PBGetCatInfoSync(&cPB);
  68.     if (err != noErr) {
  69.         errno = (err == fnfErr) ? ENOENT : EIO;
  70.         return NULL;
  71.     }
  72.     if (!(cPB.hFileInfo.ioFlAttrib & ioDirMask)) {
  73.         errno = ENOTDIR;
  74.         return NULL;
  75.     }
  76.     /* Get space for, and fill in, DIR structure. */
  77.     if ((dPtr = (DIR *)malloc(sizeof(DIR))) == NULL) {
  78.         return NULL;
  79.     }
  80.     dPtr->ioVRefNum = cPB.dirInfo.ioVRefNum;
  81.     dPtr->ioDrDirID = cPB.dirInfo.ioDrDirID;
  82.     dPtr->ioFDirIndex = 1;
  83.     dPtr->flags = 0;
  84.     return dPtr;
  85. }
  86. struct dirent *readdir(DIR *dPtr)
  87. {
  88.     struct dirent *dirPtr;
  89.     CInfoPBRec cPB;
  90.     char name[256];
  91.     OSErr err;
  92.     if (dPtr->flags) {
  93.         return NULL;
  94.     }
  95.     /* Get information about file. */
  96.     memset(&cPB, '', sizeof(cPB));
  97.     cPB.hFileInfo.ioNamePtr = (StringPtr)name;
  98.     cPB.hFileInfo.ioFDirIndex = dPtr->ioFDirIndex;
  99.     cPB.hFileInfo.ioVRefNum = dPtr->ioVRefNum;
  100.     cPB.hFileInfo.ioDirID = dPtr->ioDrDirID;
  101.     err = PBGetCatInfoSync(&cPB);
  102.     if (err != noErr) {
  103.         dPtr->flags = 0xff;
  104.         errno = (err == fnfErr) ? ENOENT : EIO;
  105.         return NULL;
  106.     }
  107.     p2cstr((StringPtr)name);
  108.     dirPtr = &dPtr->currEntry;
  109.     dirPtr->d_fileno = dPtr->ioFDirIndex++;
  110.     dirPtr->d_namlen = strlen(name);
  111.     strcpy(dirPtr->d_name, name);
  112.     dirPtr->d_reclen = sizeof(struct dirent) - sizeof(dirPtr->d_name) +
  113.                        dirPtr->d_namlen;
  114.     return dirPtr;
  115. }