home *** CD-ROM | disk | FTP | other *** search
- #include <sys/types.h>
- #include <string.h>
- #include <fcntl.h>
- #include <errno.h>
- #include "crtlocal.h"
- #include <Folders.h>
-
- static FSSpec *trashID(int volume)
- {
- static FSSpec tempID = {0};
- if (!tempID.parID || (tempID.vRefNum != volume))
- {
- FindFolder(volume,kTrashFolderType,kDontCreateFolder,&tempID.vRefNum,&tempID.parID);
- }
- return &tempID;
- }
-
- int rename(const char *old, const char *new)
- {
- int err;
- Str63 junk = "\p____tmp____";
- FSSpec oldspec = hfs_canon(crt_parID, old, 0);
- FSSpec newspec = hfs_canon(crt_parID, new, 0);
- if (!*oldspec.name) return -1;
- if (!*newspec.name) return -1;
- if (!memcmp(&oldspec,&newspec,sizeof(FSSpec))) return 0;
- FSpCatMove(&newspec,trashID(newspec.vRefNum));
- if (oldspec.parID!=newspec.parID)
- {
- CMovePBRec paramBlock;
- err = errtran(FSpRename(&oldspec,junk));
- if (err) return -1;
- memcpy(oldspec.name, junk, 1+*junk);
- paramBlock.ioNamePtr = oldspec.name;
- paramBlock.ioVRefNum = oldspec.vRefNum;
- paramBlock.ioDirID = oldspec.parID;
- paramBlock.ioNewDirID = newspec.parID;
- paramBlock.ioNewName = 0;
- err = errtran(PBCatMoveSync(¶mBlock));
- if (err) return -1;
- oldspec.parID = newspec.parID;
- }
- err = errtran(FSpRename(&oldspec,newspec.name));
- return err?-1:0;
- }