]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
fix bug with volume root
authorGuido van Rossum <guido@python.org>
Tue, 21 Feb 1995 00:44:14 +0000 (00:44 +0000)
committerGuido van Rossum <guido@python.org>
Tue, 21 Feb 1995 00:44:14 +0000 (00:44 +0000)
Mac/Compat/nfullpath.c

index 94ccc4c4019f6af14af5e9ec2566010f1478322c..ca027c889666c8f9dc4dafd592aaf6f8380ca169 100644 (file)
@@ -1,6 +1,5 @@
 /* GET FULL PATHNAME OF A FILE.
 ** Original by Guido, modified by Jack to handle FSSpecs 
-** (and only tested under MetroWerks, so far)
 */
 
 #include <string.h>
@@ -12,7 +11,6 @@
 /* Mac file system parameters */
 #define MAXPATH 256    /* Max path name length+1 */
 #define SEP ':'                /* Separator in path names */
-#define ROOTID 2       /* DirID of a volume's root directory */
 
 /* Macro to find out whether we can do HFS-only calls: */
 #define FSFCBLen (* (short *) 0x3f6)
@@ -29,45 +27,49 @@ nfullpath(fsp, retbuf)
                WDPBRec w;
                VolumeParam v;
        } pb;
-       static char cwd[2*MAXPATH];
+       char cwd[2*MAXPATH];
        unsigned char namebuf[MAXPATH];
        short err;
        int dir;
        long dirid;
-       char *next= cwd + sizeof cwd - 1;
+       char *next = cwd + sizeof cwd - 1;
        int len;
-       
+       int need_sep = 1;
        
        if (!hfsrunning())
                return -1;
        
-       dir  = fsp->vRefNum;
+       dir = fsp->vRefNum;
        dirid = fsp->parID;
        /* Stuff the filename into the buffer */
        len = fsp->name[0];
        *next = '\0';
-       next -= len+1;
-       memcpy(next, &fsp->name[1], len);
+       next -= len;
+       memcpy(next, fsp->name+1, len);
        
-       for (;;) {
-               pb.d.ioNamePtr= namebuf;
-               pb.d.ioVRefNum= dir;
-               pb.d.ioFDirIndex= -1;
-               pb.d.ioDrDirID= dirid;
+       while (dirid != fsRtParID) {
+               pb.d.ioNamePtr = namebuf;
+               pb.d.ioVRefNum = dir;
+               pb.d.ioFDirIndex = -1;
+               pb.d.ioDrDirID = dirid;
                err= PBGetCatInfo((CInfoPBPtr)&pb.d, 0);
-               if (err != noErr) {
+               if (err != noErr)
                        return err;
-               }
-               *--next= SEP;
-               len= namebuf[0];
+               *--next = SEP;
+               len = namebuf[0];
                if ( len + strlen(next) >= MAXPATH )
                        return -1;
                next -= len;
                memcpy(next, (char *)namebuf+1, len);
-               if (pb.d.ioDrDirID == ROOTID)
-                       break;
-               dirid= pb.d.ioDrParID;
+               dirid = pb.d.ioDrParID;
+               need_sep = 0;
        }
+       
        strcpy(retbuf, next);
+       if (need_sep) {
+               next = strchr(retbuf, '\0');
+               *next++ = SEP;
+               *next++ = '\0';
+       }
        return 0;
 }