From 38cd06e54a016f6d039ff97ecffaf4c0f8eb7191 Mon Sep 17 00:00:00 2001 From: John Ralls Date: Mon, 6 Sep 2021 15:18:34 -0700 Subject: [PATCH] Remove the lock-file-link-count test from the XML backend. This was an effort of somewhat dubious value to detect if a process on another ocmputer had a hsrd-link to a lockfile on an NFS share. NFS is rarely used now and SMB doesn't support hard links so this check adds complexity with no real value. --- libgnucash/backend/xml/gnc-xml-backend.cpp | 83 ---------------------- 1 file changed, 83 deletions(-) diff --git a/libgnucash/backend/xml/gnc-xml-backend.cpp b/libgnucash/backend/xml/gnc-xml-backend.cpp index f6cb55a785..8b8a3059f1 100644 --- a/libgnucash/backend/xml/gnc-xml-backend.cpp +++ b/libgnucash/backend/xml/gnc-xml-backend.cpp @@ -669,90 +669,7 @@ GncXmlBackend::get_file_lock () return false; } - /* OK, now work around some NFS atomic lock race condition - * mumbo-jumbo. We do this by linking a unique file, and - * then examining the link count. At least that's what the - * NFS programmers guide suggests. - * Note: the "unique filename" must be unique for the - * triplet filename-host-process, otherwise accidental - * aliases can occur. - */ - - /* apparently, even this code may not work for some NFS - * implementations. In the long run, I am told that - * ftp.debian.org - * /pub/debian/dists/unstable/main/source/libs/liblockfile_0.1-6.tar.gz - * provides a better long-term solution. - */ - -#ifndef G_OS_WIN32 - auto path = m_lockfile.find_last_of('.'); - std::stringstream linkfile; - if (path != std::string::npos) - linkfile << m_lockfile.substr(0, path); - else - linkfile << m_lockfile; - linkfile << "." << gethostid() << "." << getpid() << ".LNK"; - rc = link (m_lockfile.c_str(), linkfile.str().c_str()); - if (rc) - { - /* If hard links aren't supported, just allow the lock. */ - if (errno == EPERM || errno == ENOSYS -# ifdef EOPNOTSUPP - || errno == EOPNOTSUPP -# endif -# ifdef ENOTSUP - || errno == ENOTSUP -# endif - ) - { - return true; - } - - /* Otherwise, something else is wrong. */ - set_error(ERR_BACKEND_LOCKED); - g_unlink (linkfile.str().c_str()); - close (m_lockfd); - m_lockfd = -1; - g_unlink (m_lockfile.c_str()); - m_lockfile.clear(); - return false; - } - - rc = g_stat (m_lockfile.c_str(), &statbuf); - if (rc) - { - /* oops .. stat failed! This can't happen! */ - set_error(ERR_BACKEND_LOCKED); - std::string msg{"Failed to stat lockfile "}; - set_message(msg + m_lockfile); - g_unlink (linkfile.str().c_str()); - close (m_lockfd); - m_lockfd = -1; - g_unlink (m_lockfile.c_str()); - m_lockfile.clear(); - return false; - } - - if (statbuf.st_nlink != 2) - { - set_error(ERR_BACKEND_LOCKED); - g_unlink (linkfile.str().c_str()); - close (m_lockfd); - m_lockfd = -1; - g_unlink (m_lockfile.c_str()); - m_lockfile.clear(); - return false; - } - - m_linkfile = linkfile.str(); - return true; - -#else /* ifndef G_OS_WIN32 */ - /* On windows, there is no NFS and the open(,O_CREAT | O_EXCL) - is sufficient for locking. */ return true; -#endif /* ifndef G_OS_WIN32 */ } bool