summaryrefslogtreecommitdiffstats
path: root/Mac/Compat
diff options
context:
space:
mode:
Diffstat (limited to 'Mac/Compat')
-rw-r--r--Mac/Compat/dirent.h1
-rw-r--r--Mac/Compat/getwd.c12
-rw-r--r--Mac/Compat/macstat.c5
-rw-r--r--Mac/Compat/opendir.c68
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;
}