From: Krzysztof Jackiewicz Date: Mon, 3 Nov 2014 09:20:33 +0000 (+0100) Subject: Lock file operations fixed in listener X-Git-Tag: accepted/tizen/common/20150416.164946~80 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=58b92a0f5adcbee925f3dad999cf55c8b5e795c3;hp=414843221f0392502f777513bfa3b810fee462af;p=platform%2Fcore%2Fsecurity%2Fkey-manager.git Lock file operations fixed in listener Change-Id: If94b0167477306d1af4ea5c60a8b17d83fe13b39 --- diff --git a/src/listener/listener-daemon.cpp b/src/listener/listener-daemon.cpp index e5f4839..e283269 100644 --- a/src/listener/listener-daemon.cpp +++ b/src/listener/listener-daemon.cpp @@ -24,11 +24,13 @@ namespace { const char* const CKM_LOCK = "/var/run/key-manager.pid"; +const char* const LISTENER_LOCK = "/var/run/key-manager-listener.pid"; }; void daemonize() { // Let's operate in background + int fd; int result = fork(); if (result < 0){ SLOG(LOG_ERROR, CKM_LISTENER_TAG, "%s", "Error in fork!"); @@ -66,27 +68,33 @@ void daemonize() // Let's change current directory if (-1 == chdir("/")) { - SLOG(LOG_ERROR, CKM_LISTENER_TAG, "%s", "Error in chdir!"); + SLOG(LOG_ERROR, CKM_LISTENER_TAG, "Error in chdir!"); exit(1); } // Let's create lock file - result = open("/tmp/ckm-listener.lock", O_RDWR | O_CREAT, 0640); - if (result < 0) { - SLOG(LOG_ERROR, CKM_LISTENER_TAG, "%s", "Error in opening lock file!"); + fd = TEMP_FAILURE_RETRY(creat(LISTENER_LOCK, 0640)); + if (fd < 0) { + SLOG(LOG_ERROR, CKM_LISTENER_TAG, "Error in opening lock file!"); exit(1); } - if (lockf(result, F_TLOCK, 0) < 0) { - SLOG(LOG_ERROR, CKM_LISTENER_TAG, "%s", "Daemon already working!"); - exit(0); + if (lockf(fd, F_TLOCK, 0) < 0) { + if (errno == EACCES || errno == EAGAIN) { + SLOG(LOG_ERROR, CKM_LISTENER_TAG, "Daemon already working!"); + exit(0); + } + SLOG(LOG_ERROR, CKM_LISTENER_TAG, "lockf failed with error: %s" , strerror(errno)); + exit(1); } - char str[100]; - sprintf(str, "%d\n", getpid()); - result = write(result, str, strlen(str)); + std::string pid = std::to_string(getpid()); + if (TEMP_FAILURE_RETRY(write(fd, pid.c_str(), pid.size())) <= 0) { + SLOG(LOG_ERROR, CKM_LISTENER_TAG, "Failed to write lock file. Error: %s", strerror(errno)); + exit(1); + } - SLOG(LOG_DEBUG, CKM_LISTENER_TAG, "%s", str); + SLOG(LOG_DEBUG, CKM_LISTENER_TAG, "%s", pid.c_str()); } bool isCkmRunning()