diff options
-rw-r--r-- | Mac/Compat/dirent.h | 1 | ||||
-rw-r--r-- | Mac/Compat/getwd.c | 12 | ||||
-rw-r--r-- | Mac/Compat/macstat.c | 5 | ||||
-rw-r--r-- | Mac/Compat/opendir.c | 68 |
4 files changed, 61 insertions, 25 deletions
diff --git a/Mac/Compat/dirent.h b/Mac/Compat/dirent.h index 44cfc5a..7cfe404 100644 --- a/Mac/Compat/dirent.h +++ b/Mac/Compat/dirent.h @@ -9,6 +9,7 @@ #define DIR struct _dir struct _dir { + short vrefnum; long dirid; int nextfile; }; diff --git a/Mac/Compat/getwd.c b/Mac/Compat/getwd.c index 16b010a..a58fb6a 100644 --- a/Mac/Compat/getwd.c +++ b/Mac/Compat/getwd.c @@ -59,13 +59,18 @@ getwd(cwd) sprintf(cwd, "I/O error %d in PBHGetVolSync", err); return NULL; } +#ifdef TARGET_API_MAC_CARBON + p2cstrcpy(cwd, (StringPtr)cwd); + ecwd = strchr(cwd, EOS); +#else ecwd= strchr((const char *)p2cstr((unsigned char*)cwd), EOS); +#endif ebuf= buf; *ebuf = EOS; /* Next, if at least we're running HFS, walk up the path. */ - if (hfsrunning()) { + { long dirid= pb.w.ioWDDirID; pb.d.ioVRefNum= pb.w.ioWDVRefNum; while (dirid != ROOTID) { @@ -78,7 +83,12 @@ getwd(cwd) return NULL; } dirid= pb.d.ioDrParID; +#ifdef TARGET_API_MAC_CARBON + p2cstrcpy(ebuf, (StringPtr)ebuf); + ebuf += strlen(ebuf); +#else ebuf += strlen((const char *)p2cstr((unsigned char *)ebuf)); +#endif /* Should check for buf overflow */ } } diff --git a/Mac/Compat/macstat.c b/Mac/Compat/macstat.c index 8c67994..ee2c099 100644 --- a/Mac/Compat/macstat.c +++ b/Mac/Compat/macstat.c @@ -28,10 +28,7 @@ macstat(path, buf) pb.d.ioFDirIndex = 0; pb.d.ioDrDirID = 0; pb.f.ioFVersNum = 0; /* Fix found by Timo! See Tech Note 102 */ - if (hfsrunning()) - err = PBGetCatInfoSync((CInfoPBPtr)&pb); - else - err = PBGetFInfoSync((ParmBlkPtr)&pb); + err = PBGetCatInfoSync((CInfoPBPtr)&pb); if (err != noErr) { errno = ENOENT; return -1; diff --git a/Mac/Compat/opendir.c b/Mac/Compat/opendir.c index d24f5fd..f803236 100644 --- a/Mac/Compat/opendir.c +++ b/Mac/Compat/opendir.c @@ -20,6 +20,31 @@ DIR * opendir(path) char *path; { +#ifdef TARGET_API_MAC_CARBON + Str255 ppath; + FSSpec fss; + int plen; + OSErr err; + + if (opened.nextfile != 0) { + errno = EBUSY; + return NULL; /* A directory is already open. */ + } + plen = strlen(path); + c2pstrcpy(ppath, path); + if ( ppath[plen] != ':' ) + ppath[++plen] = ':'; + ppath[++plen] = 'x'; + ppath[0] = plen; + if( (err = FSMakeFSSpec(0, 0, ppath, &fss)) < 0 && err != fnfErr ) { + errno = EIO; + return NULL; + } + opened.dirid = fss.parID; + opened.vrefnum = fss.vRefNum; + opened.nextfile = 1; + return &opened; +#else union { WDPBRec d; VolumeParam v; @@ -34,15 +59,9 @@ opendir(path) strncpy(ppath+1, path, ppath[0]= strlen(path)); pb.d.ioNamePtr= (unsigned char *)ppath; pb.d.ioVRefNum= 0; - if (hfsrunning()) { - pb.d.ioWDProcID= 0; - pb.d.ioWDDirID= 0; - err= PBOpenWD((WDPBPtr)&pb, 0); - } - else { - pb.v.ioVolIndex= 0; - err= PBGetVInfo((ParmBlkPtr)&pb, 0); - } + pb.d.ioWDProcID= 0; + pb.d.ioWDDirID= 0; + err= PBOpenWD((WDPBPtr)&pb, 0); if (err != noErr) { errno = ENOENT; return NULL; @@ -50,6 +69,7 @@ opendir(path) opened.dirid= pb.d.ioVRefNum; opened.nextfile= 1; return &opened; +#endif } /* @@ -60,14 +80,16 @@ void closedir(dirp) DIR *dirp; { - if (hfsrunning()) { - WDPBRec pb; - - pb.ioVRefNum= dirp->dirid; - (void) PBCloseWD(&pb, 0); - } +#ifdef TARGET_API_MAC_CARBON + dirp->nextfile = 0; +#else + WDPBRec pb; + + pb.ioVRefNum= dirp->dirid; + (void) PBCloseWD(&pb, 0); dirp->dirid= 0; dirp->nextfile= 0; +#endif } /* @@ -88,17 +110,23 @@ readdir(dp) dir.d_name[0]= 0; pb.d.ioNamePtr= (unsigned char *)dir.d_name; +#ifdef TARGET_API_MAC_CARBON + pb.d.ioVRefNum= dp->vrefnum; + pb.d.ioDrDirID= dp->dirid; +#else pb.d.ioVRefNum= dp->dirid; - pb.d.ioFDirIndex= dp->nextfile++; pb.d.ioDrDirID= 0; - if (hfsrunning()) - err= PBGetCatInfo((CInfoPBPtr)&pb, 0); - else - err= PBGetFInfo((ParmBlkPtr)&pb, 0); +#endif + pb.d.ioFDirIndex= dp->nextfile++; + err= PBGetCatInfo((CInfoPBPtr)&pb, 0); if (err != noErr) { errno = EIO; return NULL; } +#ifdef TARGET_API_MAC_CARBON + p2cstrcpy(dir.d_name, (StringPtr)dir.d_name); +#else (void) p2cstr((unsigned char *)dir.d_name); +#endif return &dir; } |