Merge pull request #4944

1505dd3 util: set MONERO_DEFAULT_LOG_CATEGORY (moneromooo-monero)
db57374 util: use fcntl instead of flock, for compatibility (moneromooo-monero)
This commit is contained in:
luigi1111 2018-12-31 15:52:17 -06:00
commit 6e4e228461
No known key found for this signature in database
GPG Key ID: F4ACA0183641E010

View File

@ -82,6 +82,32 @@ using namespace epee;
#include <boost/asio.hpp> #include <boost/asio.hpp>
#include <openssl/sha.h> #include <openssl/sha.h>
#undef MONERO_DEFAULT_LOG_CATEGORY
#define MONERO_DEFAULT_LOG_CATEGORY "util"
namespace
{
#ifndef _WIN32
static int flock_exnb(int fd)
{
struct flock fl;
int ret;
memset(&fl, 0, sizeof(fl));
fl.l_type = F_WRLCK;
fl.l_whence = SEEK_SET;
fl.l_start = 0;
fl.l_len = 0;
ret = fcntl(fd, F_SETLK, &fl);
if (ret < 0)
MERROR("Error locking fd " << fd << ": " << errno << " (" << strerror(errno) << ")");
return ret;
}
#endif
}
namespace tools namespace tools
{ {
std::function<void(int)> signal_handler::m_handler; std::function<void(int)> signal_handler::m_handler;
@ -182,7 +208,7 @@ namespace tools
struct stat wstats = {}; struct stat wstats = {};
if (fstat(fdw, std::addressof(wstats)) == 0 && if (fstat(fdw, std::addressof(wstats)) == 0 &&
rstats.st_dev == wstats.st_dev && rstats.st_ino == wstats.st_ino && rstats.st_dev == wstats.st_dev && rstats.st_ino == wstats.st_ino &&
flock(fdw, (LOCK_EX | LOCK_NB)) == 0 && ftruncate(fdw, 0) == 0) flock_exnb(fdw) == 0 && ftruncate(fdw, 0) == 0)
{ {
std::FILE* file = fdopen(fdw, "w"); std::FILE* file = fdopen(fdw, "w");
if (file) return {file, std::move(name)}; if (file) return {file, std::move(name)};
@ -235,10 +261,10 @@ namespace tools
MERROR("Failed to open " << filename << ": " << std::error_code(GetLastError(), std::system_category())); MERROR("Failed to open " << filename << ": " << std::error_code(GetLastError(), std::system_category()));
} }
#else #else
m_fd = open(filename.c_str(), O_RDONLY | O_CREAT | O_CLOEXEC, 0666); m_fd = open(filename.c_str(), O_RDWR | O_CREAT | O_CLOEXEC, 0666);
if (m_fd != -1) if (m_fd != -1)
{ {
if (flock(m_fd, LOCK_EX | LOCK_NB) == -1) if (flock_exnb(m_fd) == -1)
{ {
MERROR("Failed to lock " << filename << ": " << std::strerror(errno)); MERROR("Failed to lock " << filename << ": " << std::strerror(errno));
close(m_fd); close(m_fd);