JError JDirInfo::GoTo ( const JCharacter* origDirName ) { JString dirName; if (JStringEmpty(origDirName) || !JConvertToAbsolutePath(origDirName, NULL, &dirName)) { return JBadPath(origDirName); } if (JSameDirEntry(dirName, *itsCWD)) { Update(); return JNoError(); } JAppendDirSeparator(&dirName); const JString origCWD = *itsCWD; *itsCWD = dirName; const JError err = BuildInfo(); if (err.OK()) { Broadcast(PathChanged()); } else { *itsCWD = origCWD; } return err; }
JError JDirInfo::GoUp() { JString theCWD = *itsCWD; // strip trailing slashes JStripTrailingDirSeparator(&theCWD); if (JIsRootDirectory(theCWD)) { return JNoError(); } // change directory JString newCWD, name; if (JSplitPathAndName(theCWD, &newCWD, &name)) { return GoTo(newCWD); } else { return JBadPath(theCWD); } }
JError JMkDir ( const JCharacter* dirName, const mode_t mode ) { jclear_errno(); if (mkdir(dirName, mode) == 0) { return JNoError(); } const int err = jerrno(); if (err == EEXIST) { return JDirEntryAlreadyExists(dirName); } else if (err == EFAULT) { return JSegFault(); } else if (err == EACCES) { return JAccessDenied(dirName); } else if (err == ENAMETOOLONG) { return JNameTooLong(); } else if (err == ENOENT) { return JBadPath(dirName); } else if (err == ENOTDIR) { return JComponentNotDirectory(dirName); } else if (err == ENOMEM) { return JNoKernelMemory(); } else if (err == EROFS) { return JFileSystemReadOnly(); } else if (err == ELOOP) { return JPathContainsLoop(dirName); } else if (err == ENOSPC) { return JFileSystemFull(); } else { return JUnexpectedError(err); } }
JError JRemoveDirectory ( const JCharacter* dirName ) { jclear_errno(); if (rmdir(dirName) == 0) { return JNoError(); } const int err = jerrno(); if (err == EPERM || err == EACCES) { return JAccessDenied(dirName); } else if (err == EFAULT) { return JSegFault(); } else if (err == ENAMETOOLONG) { return JNameTooLong(); } else if (err == ENOENT) { return JBadPath(dirName); } else if (err == ENOTDIR) { return JComponentNotDirectory(dirName); } else if (err == ENOTEMPTY) { return JDirectoryNotEmpty(dirName); } else if (err == EBUSY) { return JDirectoryBusy(dirName); } else if (err == ENOMEM) { return JNoKernelMemory(); } else if (err == EROFS) { return JFileSystemReadOnly(); } else if (err == ELOOP) { return JPathContainsLoop(dirName); } else { return JUnexpectedError(err); } }
JError JRemoveFile ( const JCharacter* fileName ) { jclear_errno(); if (remove(fileName) == 0) { return JNoError(); } const int err = jerrno(); if (err == EFAULT) { return JSegFault(); } else if (err == EACCES || err == EPERM) { return JAccessDenied(fileName); } else if (err == ENAMETOOLONG) { return JNameTooLong(); } else if (err == ENOENT) { return JBadPath(fileName); } else if (err == ENOTDIR) { return JComponentNotDirectory(fileName); } else if (err == EISDIR) { return JTriedToRemoveDirectory(); } else if (err == ENOMEM) { return JNoKernelMemory(); } else if (err == EROFS) { return JFileSystemReadOnly(); } else { return JUnexpectedError(err); } }
JError JChangeDirectory ( const JCharacter* dirName ) { jclear_errno(); if (chdir(dirName) == 0) { return JNoError(); } const int err = jerrno(); if (err == EPERM || err == EACCES) { return JAccessDenied(dirName); } else if (err == EFAULT) { return JSegFault(); } else if (err == ENAMETOOLONG) { return JNameTooLong(); } else if (err == ENOENT) { return JBadPath(dirName); } else if (err == ENOMEM) { return JNoKernelMemory(); } else if (err == ENOTDIR) { return JComponentNotDirectory(dirName); } else if (err == ELOOP) { return JPathContainsLoop(dirName); } else { return JUnexpectedError(err); } }
JError JCreateTempDirectory ( const JCharacter* path, const JCharacter* prefix, JString* fullName ) { JString p; if (!JStringEmpty(path)) { p = path; } else if (!JGetTempDirectory(&p)) { return JDirEntryDoesNotExist("/tmp"); } if (!JStringEmpty(prefix)) { p = JCombinePathAndName(p, prefix); } else { p = JCombinePathAndName(p, "temp_dir_"); } p += "XXXXXX"; char* s = p.AllocateCString(); jclear_errno(); char* d = mkdtemp(s); if (d != NULL) { *fullName = s; JAppendDirSeparator(fullName); delete [] s; return JNoError(); } fullName->Clear(); delete [] s; // EINVAL counts as unexpected const int err = jerrno(); if (err == EEXIST) { return JDirEntryAlreadyExists(p); } else if (err == EFAULT) { return JSegFault(); } else if (err == EACCES) { return JAccessDenied(p); } else if (err == ENAMETOOLONG) { return JNameTooLong(); } else if (err == ENOENT) { return JBadPath(p); } else if (err == ENOTDIR) { return JComponentNotDirectory(p); } else if (err == ENOMEM) { return JNoKernelMemory(); } else if (err == EROFS) { return JFileSystemReadOnly(); } else if (err == ELOOP) { return JPathContainsLoop(p); } else if (err == ENOSPC) { return JFileSystemFull(); } else { return JUnexpectedError(err); } }
JError JRenameDirEntry ( const JCharacter* oldName, const JCharacter* newName ) { if (JNameUsed(newName)) { return JDirEntryAlreadyExists(newName); } else if (JSameDirEntry(oldName, newName)) { return JNoError(); } jclear_errno(); if (rename(oldName, newName) == 0) { return JNoError(); } const int err = jerrno(); if (err == EISDIR) { return JCantRenameFileToDirectory(oldName, newName); } else if (err == EXDEV) { return JCantRenameAcrossFilesystems(); } else if (err == ENOTEMPTY) { return JCantRenameToNonemptyDirectory(); } else if (err == EEXIST) { return JDirEntryAlreadyExists(newName); } else if (err == EBUSY) { return JFileBusy(newName); } else if (err == EINVAL) { return JDirectoryCantBeOwnChild(); } else if (err == EMLINK) { return JTooManyLinks(oldName); } else if (err == ENOTDIR) { return JComponentNotDirectory(oldName, newName); } else if (err == EFAULT) { return JSegFault(); } else if (err == EACCES || err == EPERM) { return JAccessDenied(oldName, newName); } else if (err == ENAMETOOLONG) { return JNameTooLong(); } else if (err == ENOENT) { return JBadPath(oldName, newName); } else if (err == ENOMEM) { return JNoKernelMemory(); } else if (err == EROFS) { return JFileSystemReadOnly(); } else if (err == ELOOP) { return JPathContainsLoop(oldName, newName); } else if (err == ENOSPC) { return JFileSystemFull(); } else { return JUnexpectedError(err); } }
JError JCreateSymbolicLink ( const JCharacter* src, const JCharacter* dest ) { jclear_errno(); if (symlink(src, dest) == 0) { return JNoError(); } const int err = jerrno(); if (err == EPERM || err == EACCES) { return JAccessDenied(dest); } else if (err == EFAULT) { return JSegFault(); } else if (err == ENAMETOOLONG) { return JNameTooLong(); } else if (err == ENOENT) { return JBadPath(dest); } else if (err == ENOTDIR) { return JComponentNotDirectory(dest); } else if (err == ENOMEM) { return JNoKernelMemory(); } else if (err == EROFS) { return JFileSystemReadOnly(); } else if (err == EEXIST) { return JDirEntryAlreadyExists(dest); } else if (err == ELOOP) { return JPathContainsLoop(dest); } else if (err == ENOSPC) { return JFileSystemFull(); } else if (err == EIO) { return JGeneralIO(); } else { return JUnexpectedError(err); } }
JError JFOpen ( const JCharacter* fileName, const JCharacter* mode, FILE** stream ) { jclear_errno(); *stream = fopen(fileName, mode); if (*stream != NULL) { return JNoError(); } const int err = jerrno(); if (err == EINVAL) { return JInvalidOpenMode(fileName); } else if (err == EEXIST) { return JDirEntryAlreadyExists(fileName); } else if (err == EISDIR) { return JIsADirectory(); } else if (err == EACCES || err == ETXTBSY) { return JAccessDenied(fileName); } else if (err == EFAULT) { return JSegFault(); } else if (err == ENAMETOOLONG) { return JNameTooLong(); } else if (err == ENOENT) { return JBadPath(fileName); } else if (err == ENOTDIR) { return JComponentNotDirectory(fileName); } else if (err == EMFILE || err == ENFILE) { return JTooManyDescriptorsOpen(); } else if (err == ENOMEM) { return JNoKernelMemory(); } else if (err == EROFS) { return JFileSystemReadOnly(); } else if (err == ELOOP) { return JPathContainsLoop(fileName); } else if (err == ENOSPC) { return JFileSystemFull(); } else { return JUnexpectedError(err); } }