int __cdecl _mkdir ( const char *path ) { /* ask OS to create directory */ HParamBlockRec hparamBlock; char st[256]; OSErr osErr; if (!*path) { errno = ENOENT; return -1; } strcpy(st, path); hparamBlock.fileParam.ioNamePtr = _c2pstr(st); hparamBlock.fileParam.ioVRefNum = 0; hparamBlock.fileParam.ioDirID = 0; osErr = PBDirCreateSync(&hparamBlock); if (osErr) { /* error occured -- map error code and return */ _dosmaperr(osErr); return -1; } return 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 __cdecl _rmdir ( const char *path ) { ParamBlockRec parm; HParamBlockRec hparm; OSErr osErr; char stPath[256]; if (!*path || strlen(path) > 255) { errno = ENOENT; return -1; } strcpy(stPath, path); _c2pstr(stPath); memset(&hparm, '\0', sizeof(HParamBlockRec)); hparm.fileParam.ioNamePtr = stPath; /* hparm.fileParam.ioVRefNum = 0; */ /* hparm.fileParam.ioFDirIndex = 0; */ if ((osErr = PBHGetFInfoSync(&hparm)) == fnfErr) { memset(&parm, '\0', sizeof(ParamBlockRec)); parm.fileParam.ioNamePtr = stPath; /* parm.fileParam.ioVRefNum = 0; */ osErr = PBDeleteSync(&parm); } else if (!osErr) { osErr = fnfErr; /* Can't rmdir a file */ } if (osErr) { /* error occured -- map error code and return */ _dosmaperr(osErr); return -1; } return 0; }
int __cdecl _chdir ( const char *path ) { WDPBRec wdPB; char st[256]; OSErr osErr; ParamBlockRec parm; if (!*path) { errno = ENOENT; return -1; } strcpy(st, path); wdPB.ioNamePtr = _c2pstr(st); wdPB.ioVRefNum = 0; wdPB.ioWDDirID = 0; osErr = PBHSetVolSync(&wdPB); if (osErr) { /* error occured -- map error code and return */ _dosmaperr(osErr); return -1; } osErr = PBHGetVolSync(&wdPB); if (osErr) { /* error occured -- map error code and return */ _dosmaperr(osErr); return -1; } CurDirStore = wdPB.ioWDDirID; SFSaveDisk = wdPB.ioWDVRefNum; memset(&parm, 0, sizeof(ParamBlockRec)); osErr = PBSetVolSync(&parm); return 0; }
int _CALLTYPE1 _unlink ( const char *path ) { ParamBlockRec parm; OSErr osErr; char stPath[256]; if (!*path || strlen(path) > 255) { errno = ENOENT; return -1; } strcpy(stPath, path); _c2pstr(stPath); memset(&parm, '\0', sizeof(ParamBlockRec)); parm.fileParam.ioNamePtr = stPath; /* parm.fileParam.ioVRefNum = 0; */ /* parm.fileParam.ioFDirIndex = 0; */ if (!(osErr = PBGetFInfoSync(&parm))) /* Make sure it's not a dir */ { memset(&parm, '\0', sizeof(ParamBlockRec)); parm.ioParam.ioNamePtr = stPath; /* parm.ioParam.ioVRefNum = 0; */ osErr = PBDeleteSync(&parm); } if (osErr) { /* error occured -- map error code and return */ _dosmaperr(osErr); return -1; } return 0; }
int __cdecl _chmod ( const char *path, int mode ) { HParamBlockRec hparamBlock; char szPath[256]; OSErr osErr; if (!*path) { errno = ENOENT; return -1; } strcpy(szPath, path); hparamBlock.fileParam.ioNamePtr = _c2pstr(szPath); hparamBlock.fileParam.ioVRefNum = 0; hparamBlock.fileParam.ioDirID = 0; if (mode & _S_IWRITE) { /* clear read only/locked bit */ osErr = PBHRstFLockSync(&hparamBlock); } else { /* set read only/locked bit */ osErr = PBHSetFLockSync(&hparamBlock); } if (osErr) { _dosmaperr(osErr); return -1; } return 0; }
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; } } }
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; }