home *** CD-ROM | disk | FTP | other *** search
/ Otherware / Otherware_1_SB_Development.iso / mac / developm / librarie / posix10.sit / POSIX / ThinkCPosix / getcwd.c < prev    next >
Encoding:
C/C++ Source or Header  |  1992-09-15  |  990 b   |  55 lines

  1. /* $Id: $ */
  2.  
  3. #include "ThinkCPosix.h"
  4.  
  5. char *getcwd(char *buf, size_t buflen)
  6. {
  7.     CInfoPBRec cipbr;
  8.     HFileInfo *fpb = (HFileInfo*)&cipbr;
  9.     DirInfo *dpb = (DirInfo*)&cipbr;
  10.     char dirname[256];
  11.     short err;
  12.     int depth = 0;
  13.     int dirlen, pathlen = 0;
  14.     
  15.     if (buf == NULL) {
  16.         buf = (char*)malloc(buflen);
  17.         if (buf == NULL) {
  18.             errno = ENOSPC;
  19.             return NULL;
  20.         }
  21.     }
  22.  
  23.     buf[0] = 0;
  24.     dpb->ioDrParID = 0;
  25.     while (1) {
  26.         dirname[0] = 0;
  27.         fpb->ioDirID = dpb->ioDrParID;
  28.         fpb->ioNamePtr = (unsigned char*)dirname;
  29.         fpb->ioVRefNum = 0;
  30.         fpb->ioFDirIndex = -1;
  31.         fpb->ioFVersNum = 0;
  32.         err = PBGetCatInfo(&cipbr, FALSE);
  33.         if (err != noErr)
  34.             break;
  35.         p2cstr(dirname);
  36.         if (depth > 1)
  37.             strcat(dirname, ":");
  38.         dirlen = strlen(dirname);
  39.         if (dirlen + pathlen + 1 >= buflen) {
  40.             errno = ERANGE;
  41.             return NULL;
  42.         }
  43.         memmove(buf + dirlen, buf, pathlen + 1);
  44.         memcpy(buf, dirname, dirlen);
  45.         pathlen += dirlen;
  46.     }
  47.     if (err == fnfErr)
  48.         return buf;
  49.     else {
  50.         errno = ENODEV;
  51.         return NULL;
  52.     }
  53. }
  54.  
  55.