Catch errors on datadir lock and pidfile delete
Prevents bad permissions (or other fs related problems) from resulting in hard crashes with cryptic messages on startup and shutdown.
This commit is contained in:
parent
2cc1372190
commit
ffdda4e8a7
1 changed files with 14 additions and 4 deletions
10
src/init.cpp
10
src/init.cpp
|
@ -187,7 +187,11 @@ void Shutdown()
|
||||||
pwalletMain->Flush(true);
|
pwalletMain->Flush(true);
|
||||||
#endif
|
#endif
|
||||||
#ifndef WIN32
|
#ifndef WIN32
|
||||||
|
try {
|
||||||
boost::filesystem::remove(GetPidFile());
|
boost::filesystem::remove(GetPidFile());
|
||||||
|
} catch (const boost::filesystem::filesystem_error& e) {
|
||||||
|
LogPrintf("%s: Unable to remove pidfile: %s\n", __func__, e.what());
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
UnregisterAllValidationInterfaces();
|
UnregisterAllValidationInterfaces();
|
||||||
#ifdef ENABLE_WALLET
|
#ifdef ENABLE_WALLET
|
||||||
|
@ -862,9 +866,15 @@ bool AppInit2(boost::thread_group& threadGroup)
|
||||||
boost::filesystem::path pathLockFile = GetDataDir() / ".lock";
|
boost::filesystem::path pathLockFile = GetDataDir() / ".lock";
|
||||||
FILE* file = fopen(pathLockFile.string().c_str(), "a"); // empty lock file; created if it doesn't exist.
|
FILE* file = fopen(pathLockFile.string().c_str(), "a"); // empty lock file; created if it doesn't exist.
|
||||||
if (file) fclose(file);
|
if (file) fclose(file);
|
||||||
|
|
||||||
|
try {
|
||||||
static boost::interprocess::file_lock lock(pathLockFile.string().c_str());
|
static boost::interprocess::file_lock lock(pathLockFile.string().c_str());
|
||||||
if (!lock.try_lock())
|
if (!lock.try_lock())
|
||||||
return InitError(strprintf(_("Cannot obtain a lock on data directory %s. Bitcoin Core is probably already running."), strDataDir));
|
return InitError(strprintf(_("Cannot obtain a lock on data directory %s. Bitcoin Core is probably already running."), strDataDir));
|
||||||
|
} catch(const boost::interprocess::interprocess_exception& e) {
|
||||||
|
return InitError(strprintf(_("Cannot obtain a lock on data directory %s. Bitcoin Core is probably already running.") + " %s.", strDataDir, e.what()));
|
||||||
|
}
|
||||||
|
|
||||||
#ifndef WIN32
|
#ifndef WIN32
|
||||||
CreatePidFile(GetPidFile(), getpid());
|
CreatePidFile(GetPidFile(), getpid());
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in a new issue