/*** *rename.c - rename file * * Copyright (c) 1989-1997, Microsoft Corporation. All rights reserved. * *Purpose: * Defines rename() - rename a file * *******************************************************************************/ #ifndef _MAC #include #include #include #include #include /*** *int rename(oldname, newname) - rename a file * *Purpose: * Renames a file to a new name -- no file with new name must * currently exist. * *Entry: * _TSCHAR *oldname - name of file to rename * _TSCHAR *newname - new name for file * *Exit: * returns 0 if successful * returns not 0 and sets errno if not successful * *Exceptions: * *******************************************************************************/ int __cdecl _trename ( const _TSCHAR *oldname, const _TSCHAR *newname ) { ULONG dosretval; /* ask OS to move file */ if (!MoveFile((LPTSTR)oldname, (LPTSTR)newname)) dosretval = GetLastError(); else dosretval = 0; if (dosretval) { /* error occured -- map error code and return */ _dosmaperr(dosretval); return -1; } return 0; } #else /* _MAC */ #include #include #include #include #include #include #include #include #include #include /*** *int rename(oldname, newname) - rename a file * *Purpose: * Renames a file to a new name -- no file with new name must * currently exist. * *Entry: * char *oldname - name of file to rename * char *newname - new name for file * *Exit: * returns 0 if successful * returns not 0 and sets errno if not successful * *Exceptions: * *******************************************************************************/ void __getdirandname(char *szdir, char *szname, const char *szpath); int __srename ( const char *oldname, const char *newname); int __accesspath (const char *dirname, const char *filename); int __cdecl rename ( const char *oldname, const char *newname ) { /* ask OS to move file */ HParamBlockRec hparamBlock; char szOldName[32]; //old file name char szOldDir[256]; //old dir name char szNewName[32]; //new file name char szNewDir[256]; //new dir name char st[256]; //temp array for p-c string convertion char st2[256]; //temp array for p-c string conversion char szT[9]; //temp file name OSErr osErr; CMovePBRec cmovePB; int fTemp = 0; char *pch; char *pchOld; pchOld = strrchr(oldname, ':'); if ( (pchOld!= NULL) && (*(pchOld+1) == '\0') && (strchr(oldname, ':') == strrchr(oldname, ':')) ) { /* rename a volume*/ pch = strrchr(newname, ':'); if (pch != NULL && *(pch+1) != '\0') { /* not rename to another volume name*/ errno = EINVAL; return -1; } else if (pch != NULL && *(pch+1) == '\0') { osErr = __srename(oldname, newname); if (osErr) { _dosmaperr(osErr); return -1; } return 0; } else if (pch == NULL) { strcpy(szNewName, newname); strcat(szNewName, ":"); osErr = __srename(oldname, szNewName); if (osErr) { _dosmaperr(osErr); return -1; } return 0; } } /*Separate file name and directory*/ __getdirandname(szOldDir, szOldName, oldname); __getdirandname(szNewDir, szNewName, newname); if (strcmp(szNewName, "")==0) { errno = EINVAL; return -1; } /*if same dir*/ if (strcmp(szNewDir, szOldDir)==0 ) { osErr = __srename(oldname, newname); if (osErr) { /* error occured -- map error code and return */ _dosmaperr(osErr); return -1; } return 0; } /*if new directory didn't supplied, getcwd*/ if (!*szNewDir) { _getcwd(szNewDir, 255); } /*if same name*/ if (strcmp(szNewName, szOldName)==0 ) { /*just move*/ strcpy(st, oldname); strcpy(st2, szNewDir); cmovePB.ioNamePtr = _c2pstr(st); cmovePB.ioVRefNum = 0; cmovePB.ioNewName =_c2pstr(st2); cmovePB.ioNewDirID = 0; cmovePB.ioDirID = 0; osErr = PBCatMoveSync(&cmovePB); if (osErr) { /* error occured -- map error code and return */ if (osErr == nsvErr || osErr == bdNamErr) { errno = EXDEV; _macerrno = osErr; } else _dosmaperr(osErr); return -1; } return 0; } osErr = __accesspath(szOldDir, szNewName); if (osErr != fnfErr) { /* rename the file to a temp name */ strcpy(st, szOldDir); strcpy(szT, "fnXXXXXX"); if (_mktemp(szT)!=NULL) { strcat(st, szT); fTemp = 1; } } else { *st='\0'; if (*szOldDir) { strcpy(st, szOldDir); } strcat(st, szNewName); } osErr = __srename(oldname, st); if (osErr) { _dosmaperr(osErr); return -1; } strcpy(st2, szNewDir); /* move renamed file to new dir */ cmovePB.ioNamePtr = _c2pstr(st); cmovePB.ioVRefNum = 0; cmovePB.ioNewName =_c2pstr(st2); cmovePB.ioNewDirID = 0; cmovePB.ioDirID = 0; osErr = PBCatMoveSync(&cmovePB); if (osErr) { /* error occured -- rename oldname back */ strcpy(st2, oldname); hparamBlock.ioParam.ioNamePtr = st; hparamBlock.ioParam.ioVRefNum = 0; hparamBlock.ioParam.ioMisc = _c2pstr(st2); hparamBlock.fileParam.ioDirID = 0; PBHRenameSync(&hparamBlock); if (osErr == nsvErr || osErr == bdNamErr) { errno=EXDEV; _macerrno = osErr; } else _dosmaperr(osErr); return -1; } /* rename it to the new name in new dir*/ if (fTemp) { strcpy(st, szNewDir); strcat(st, szT); osErr = __srename(st, newname); if (osErr) { _dosmaperr(osErr); remove(st); return -1; } } return 0; } void __getdirandname ( char *szdir, char *szname, const char *szpath ) { char *pch; pch = strrchr(szpath, ':'); if (pch) { strcpy(szname, pch+1); strncpy(szdir, szpath, (pch - szpath)+1); szdir[(pch-szpath)+1]='\0'; } else //no ':' { strcpy(szname, szpath); *szdir = '\0'; } } int __srename ( const char *oldname, const char *newname ) { /* ask OS to move file */ HParamBlockRec hparamBlock; char stOld[256]; char stNew[256]; OSErr osErr; strcpy(stOld, oldname); strcpy(stNew, newname); hparamBlock.ioParam.ioNamePtr = _c2pstr(stOld); hparamBlock.ioParam.ioVRefNum = 0; hparamBlock.ioParam.ioMisc = _c2pstr(stNew); hparamBlock.fileParam.ioDirID = 0; osErr = PBHRenameSync(&hparamBlock); return osErr; } int __accesspath ( const char *dirname, const char *filename ) { CInfoPBRec cinfoPB; OSErr osErr; char szBuf[256]; szBuf[0]='\0'; if (*dirname) { strcpy(szBuf, dirname); } strcat(szBuf, filename); cinfoPB.hFileInfo.ioNamePtr = _c2pstr(szBuf); cinfoPB.hFileInfo.ioFDirIndex = 0; cinfoPB.hFileInfo.ioVRefNum = 0; cinfoPB.hFileInfo.ioDirID = 0; osErr = PBGetCatInfoSync(&cinfoPB); if (osErr) { return osErr; } else { /* file or dir ? */ if (cinfoPB.hFileInfo.ioFlAttrib & 0x10) { /*dir*/ return 1; } else { return 0; } } } #endif /* _MAC */