]> git.ipfire.org Git - thirdparty/kea.git/commitdiff
[#3506] Final improvements
authorFrancis Dupont <fdupont@isc.org>
Mon, 2 Sep 2024 13:00:15 +0000 (15:00 +0200)
committerFrancis Dupont <fdupont@isc.org>
Fri, 20 Sep 2024 12:55:54 +0000 (14:55 +0200)
changelog_unreleased/3506-unix-control-socket [new file with mode: 0644]
src/lib/config/unix_command_mgr.cc

diff --git a/changelog_unreleased/3506-unix-control-socket b/changelog_unreleased/3506-unix-control-socket
new file mode 100644 (file)
index 0000000..37773b9
--- /dev/null
@@ -0,0 +1,3 @@
+[func]         fdupont
+       Reorganized UNIX control socket code.
+       (Gitlab #3506)
index 43fc24c789aac682b3e51535629b1c0c45719109..48a0849111405124ff18b83bd131f8bfeeb036fa 100644 (file)
@@ -573,8 +573,8 @@ UnixCommandMgrImpl::openCommandSocket(const isc::data::ConstElementPtr& socket_i
 
     // First let's open lock file.
     std::string lock_name = getLockName();
-    int new_lock_fd = open(lock_name.c_str(), O_RDONLY | O_CREAT, 0600);
-    if (new_lock_fd == -1) {
+    lock_fd_ = open(lock_name.c_str(), O_RDONLY | O_CREAT, 0600);
+    if (lock_fd_ == -1) {
         std::string errmsg = strerror(errno);
         isc_throw(SocketError, "cannot create socket lockfile, "
                   << lock_name  << ", : " << errmsg);
@@ -582,10 +582,11 @@ UnixCommandMgrImpl::openCommandSocket(const isc::data::ConstElementPtr& socket_i
 
     // Try to acquire lock. If we can't somebody else is actively
     // using it.
-    int ret = flock(new_lock_fd, LOCK_EX | LOCK_NB);
+    int ret = flock(lock_fd_, LOCK_EX | LOCK_NB);
     if (ret != 0) {
         std::string errmsg = strerror(errno);
-        close(new_lock_fd);
+        close(lock_fd_);
+        lock_fd_ = -1;
         isc_throw(SocketError, "cannot lock socket lockfile, "
                   << lock_name  << ", : " << errmsg);
     }
@@ -597,12 +598,6 @@ UnixCommandMgrImpl::openCommandSocket(const isc::data::ConstElementPtr& socket_i
     LOG_INFO(command_logger, COMMAND_ACCEPTOR_START)
         .arg(socket_name_);
 
-    // Close previous lock to avoid file descriptor leak.
-    if (lock_fd_ != -1) {
-        close(lock_fd_);
-    }
-    lock_fd_ = new_lock_fd;
-
     try {
         // Start asynchronous acceptor service.
         acceptor_.reset(new UnixDomainSocketAcceptor(io_service_));
@@ -639,6 +634,10 @@ UnixCommandMgrImpl::closeCommandSocket() {
     // the server. This connection will be held until the UnixCommandMgr
     // responds to such request.
     connection_pool_.stopAll();
+    if (lock_fd_ != -1) {
+        close(lock_fd_);
+        lock_fd_ = -1;
+    }
 }
 
 void