diff --git a/src/csync_lock.c b/src/csync_lock.c index 7a47b7600..c8a30baca 100644 --- a/src/csync_lock.c +++ b/src/csync_lock.c @@ -126,12 +126,21 @@ static pid_t _csync_lock_read(const char *lockfile) { ssize_t rc; int fd; pid_t pid; + mbchar_t *wlockfile; /* Read PID from existing lock */ #ifdef _WIN32 - _fmode = _O_BINARY; + _fmode = _O_BINARY; #endif - if ((fd = open(lockfile, O_RDONLY)) < 0) { + + wlockfile = c_utf8_to_locale(lockfile); + if (wlockfile == NULL) { + return -1; + } + + fd = _topen(wlockfile, O_RDONLY); + c_free_locale_string(wlockfile); + if (fd < 0) { return -1; } @@ -159,15 +168,18 @@ static pid_t _csync_lock_read(const char *lockfile) { /* Check if process is still alive */ if (kill(pid, 0) < 0 && errno == ESRCH) { - /* Process is dead. Remove stale lock. */ - if (unlink(lockfile) < 0) { - strerror_r(errno, errbuf, sizeof(errbuf)); - CSYNC_LOG(CSYNC_LOG_PRIORITY_ERROR, - "Unable to remove stale lock %s - %s", - lockfile, - errbuf); - } - return -1; + /* Process is dead. Remove stale lock. */ + wlockfile = c_utf8_to_locale(lockfile); + + if (_tunlink(wlockfile) < 0) { + strerror_r(errno, errbuf, sizeof(errbuf)); + CSYNC_LOG(CSYNC_LOG_PRIORITY_ERROR, + "Unable to remove stale lock %s - %s", + lockfile, + errbuf); + } + c_free_locale_string(wlockfile); + return -1; } return pid; @@ -187,16 +199,21 @@ int csync_lock(const char *lockfile) { void csync_lock_remove(const char *lockfile) { char errbuf[256] = {0}; + mbchar_t *wlockfile; + /* You can't remove the lock if it is from another process */ if (_csync_lock_read(lockfile) == getpid()) { + wlockfile = c_utf8_to_locale(lockfile); + CSYNC_LOG(CSYNC_LOG_PRIORITY_DEBUG, "Removing lock file: %s", lockfile); - if (unlink(lockfile) < 0) { + if (_tunlink(wlockfile) < 0) { strerror_r(errno, errbuf, sizeof(errbuf)); CSYNC_LOG(CSYNC_LOG_PRIORITY_ERROR, "Unable to remove lock %s - %s", lockfile, errbuf); } + c_free_locale_string(wlockfile); } }