diff --git a/encfs/DirNode.cpp b/encfs/DirNode.cpp index 3612d6d..2e65f23 100644 --- a/encfs/DirNode.cpp +++ b/encfs/DirNode.cpp @@ -185,8 +185,9 @@ bool RenameOp::apply() { // rename on disk.. if (::rename(last->oldCName.c_str(), last->newCName.c_str()) == -1) { + int eno = errno; RLOG(WARNING) << "Error renaming " << last->oldCName << ": " - << strerror(errno); + << strerror(eno); dn->renameNode(last->newPName.c_str(), last->oldPName.c_str(), false); return false; } @@ -355,7 +356,8 @@ DirTraverse DirNode::openDir(const char *plaintextPath) { DIR *dir = ::opendir(cyName.c_str()); if (dir == NULL) { - VLOG(1) << "opendir error " << strerror(errno); + int eno = errno; + VLOG(1) << "opendir error " << strerror(eno); return DirTraverse(shared_ptr(), 0, std::shared_ptr()); } else { std::shared_ptr dp(dir, DirDeleter()); @@ -569,8 +571,7 @@ int DirNode::rename(const char *fromPlaintext, const char *toPlaintext) { } if (res != 0) { - VLOG(1) << "rename failed: " << strerror(errno); - res = -errno; + VLOG(1) << "rename failed: " << strerror(-res); } return res; @@ -692,7 +693,7 @@ int DirNode::unlink(const char *plaintextName) { res = ::unlink(fullName.c_str()); if (res == -1) { res = -errno; - VLOG(1) << "unlink error: " << strerror(errno); + VLOG(1) << "unlink error: " << strerror(-res); } } diff --git a/encfs/FileNode.cpp b/encfs/FileNode.cpp index 4b350ba..9d52763 100644 --- a/encfs/FileNode.cpp +++ b/encfs/FileNode.cpp @@ -140,14 +140,16 @@ int FileNode::mknod(mode_t mode, dev_t rdev, uid_t uid, gid_t gid) { if (uid != 0) { olduid = setfsuid(uid); if (olduid == -1) { - RLOG(DEBUG) << "setfsuid error: " << strerror(errno); + int eno = errno; + RLOG(DEBUG) << "setfsuid error: " << strerror(eno); return -EPERM; } } if (gid != 0) { oldgid = setfsgid(gid); if (oldgid == -1) { - RLOG(DEBUG) << "setfsgid error: " << strerror(errno); + int eno = errno; + RLOG(DEBUG) << "setfsgid error: " << strerror(eno); return -EPERM; } } @@ -165,15 +167,15 @@ int FileNode::mknod(mode_t mode, dev_t rdev, uid_t uid, gid_t gid) { else res = ::mknod(_cname.c_str(), mode, rdev); - if (olduid >= 0) setfsuid(olduid); - if (oldgid >= 0) setfsgid(oldgid); - if (res == -1) { int eno = errno; VLOG(1) << "mknod error: " << strerror(eno); res = -eno; } + if (olduid >= 0) setfsuid(olduid); + if (oldgid >= 0) setfsgid(oldgid); + return res; } diff --git a/encfs/RawFileIO.cpp b/encfs/RawFileIO.cpp index 78d1373..f28aa3f 100644 --- a/encfs/RawFileIO.cpp +++ b/encfs/RawFileIO.cpp @@ -92,13 +92,11 @@ static int open_readonly_workaround(const char *path, int flags) { memset(&stbuf, 0, sizeof(struct stat)); if (lstat(path, &stbuf) != -1) { // make sure user has read/write permission.. - chmod(path, stbuf.st_mode | 0600); - fd = ::open(path, flags); - chmod(path, stbuf.st_mode); - } else { - RLOG(INFO) << "can't stat file " << path; + if (chmod(path, stbuf.st_mode | 0600) != -1) { + fd = ::open(path, flags); + chmod(path, stbuf.st_mode); + } } - return fd; } @@ -131,10 +129,11 @@ int RawFileIO::open(int flags) { #endif int newFd = ::open(name.c_str(), finalFlags); + int eno = errno; VLOG(1) << "open file with flags " << finalFlags << ", result = " << newFd; - if ((newFd == -1) && (errno == EACCES)) { + if ((newFd == -1) && (eno == EACCES)) { VLOG(1) << "using readonly workaround for open"; newFd = open_readonly_workaround(name.c_str(), finalFlags); } @@ -152,7 +151,7 @@ int RawFileIO::open(int flags) { result = fd = newFd; } else { result = -errno; - RLOG(DEBUG) << "::open error: " << strerror(errno); + RLOG(DEBUG) << "::open error: " << strerror(-result); } } @@ -185,8 +184,9 @@ off_t RawFileIO::getSize() const { const_cast(this)->knownSize = true; return fileSize; } else { - RLOG(ERROR) << "getSize on " << name << " failed: " << strerror(errno); - return -1; + int eno = errno; + RLOG(ERROR) << "getSize on " << name << " failed: " << strerror(eno); + return -eno; } } else { return fileSize; @@ -199,8 +199,9 @@ ssize_t RawFileIO::read(const IORequest &req) const { ssize_t readSize = pread(fd, req.data, req.dataLen, req.offset); if (readSize < 0) { + readSize = -errno; RLOG(WARNING) << "read failed at offset " << req.offset << " for " - << req.dataLen << " bytes: " << strerror(errno); + << req.dataLen << " bytes: " << strerror(-readSize); } return readSize; @@ -254,9 +255,6 @@ int RawFileIO::truncate(off_t size) { if (fd >= 0 && canWrite) { res = ::ftruncate(fd, size); -#if !defined(__FreeBSD__) && !defined(__APPLE__) - ::fdatasync(fd); -#endif } else res = ::truncate(name.c_str(), size); @@ -272,6 +270,12 @@ int RawFileIO::truncate(off_t size) { knownSize = true; } +#if !defined(__FreeBSD__) && !defined(__APPLE__) + if (fd >= 0 && canWrite) { + ::fdatasync(fd); + } +#endif + return res; } diff --git a/encfs/encfs.h b/encfs/encfs.h index 2988af2..05c4fea 100644 --- a/encfs/encfs.h +++ b/encfs/encfs.h @@ -41,7 +41,8 @@ static __inline int setfsuid(uid_t uid) { uid_t olduid = geteuid(); if (seteuid(uid) != 0) { - VLOG(1) << "seteuid error: " << errno; + int eno = errno; + VLOG(1) << "seteuid error: " << strerror(eno); } return olduid; @@ -51,7 +52,8 @@ static __inline int setfsgid(gid_t gid) { gid_t oldgid = getegid(); if (setegid(gid) != 0) { - VLOG(1) << "setfsgid error: " << errno; + int eno = errno; + VLOG(1) << "setfsgid error: " << strerror(eno); } return oldgid; diff --git a/encfs/main.cpp b/encfs/main.cpp index e56b83a..ebb96bd 100644 --- a/encfs/main.cpp +++ b/encfs/main.cpp @@ -504,9 +504,10 @@ void *encfs_init(fuse_conn_info *conn) { int res = pthread_create(&ctx->monitorThread, 0, idleMonitor, (void *)ctx); if (res != 0) { + int eno = errno; RLOG(ERROR) << "error starting idle monitor thread, " "res = " - << res << ", errno = " << errno; + << res << ", " << strerror(eno); } }