JError JCreatePipe ( int fd[2] ) { jclear_errno(); if (pipe(fd) == 0) { return JNoError(); } const int err = jerrno(); if (err == EFAULT) { return JSegFault(); } else if (err == EMFILE || err == ENFILE) { return JTooManyDescriptorsOpen(); } else { return JUnexpectedError(err); } }
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 JGetSymbolicLinkTarget ( const char* linkFullName, JString* targetFullName ) { const JSize kBufferSize = 10000; char buf[ kBufferSize ]; const long linkNameSize = readlink(linkFullName, buf, kBufferSize-1); if (linkNameSize != -1) { targetFullName->Set(buf, linkNameSize); return JNoError(); } targetFullName->Clear(); const int err = jerrno(); if (err == ENOTDIR) { return JComponentNotDirectory(linkFullName); } else if (err == ENAMETOOLONG) { return JNameTooLong(); } else if (err == ENOENT) { return JDirEntryDoesNotExist(linkFullName); } else if (err == EPERM || err == EACCES) { return JAccessDenied(linkFullName); } else if (err == ELOOP) { return JTooManyLinks(linkFullName); } else if (err == EINVAL) { return JNotSymbolicLink(linkFullName); } else if (err == EIO) { return JGeneralIO(); } else if (err == EFAULT) { return JSegFault(); } else if (err == ENOMEM) { return JNoKernelMemory(); } 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 JSetPermissions ( const JCharacter* name, const mode_t perms ) { jclear_errno(); if (chmod(name, perms) == 0) { return JNoError(); } const int err = jerrno(); if (err == EPERM || err == EACCES) { return JAccessDenied(name); } else if (err == EROFS) { return JFileSystemReadOnly(); } else if (err == EFAULT) { return JSegFault(); } else if (err == ENAMETOOLONG) { return JNameTooLong(); } else if (err == ENOENT) { return JDirEntryDoesNotExist(name); } else if (err == ENOMEM) { return JNoKernelMemory(); } else if (err == ENOTDIR) { return JComponentNotDirectory(name); } else if (err == ELOOP) { return JPathContainsLoop(name); } 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); } }