From 8172214fa00b1ee701269dd5b62dba3dfcfcb2a4 Mon Sep 17 00:00:00 2001 From: Vincent Bernat Date: Mon, 7 Jan 2013 12:26:25 +0100 Subject: [PATCH] lldpd: remove uncleaned control socket when noone is listening --- NEWS | 5 +++++ src/daemon/lldpd.c | 26 ++++++++++++++++++++++---- 2 files changed, 27 insertions(+), 4 deletions(-) diff --git a/NEWS b/NEWS index ef9a49fc..924a7b0a 100644 --- a/NEWS +++ b/NEWS @@ -1,3 +1,8 @@ +lldpd (0.7.1) + * Features + + Upstart support. + + Remove Unix socket when there is no process listening. + lldpd (0.7.0) * Global changes: + FreeBSD support. diff --git a/src/daemon/lldpd.c b/src/daemon/lldpd.c index 3038e608..27a80a7c 100644 --- a/src/daemon/lldpd.c +++ b/src/daemon/lldpd.c @@ -1188,11 +1188,29 @@ lldpd_main(int argc, char *argv[]) gid = group->gr_gid; /* Create and setup socket */ + int retry = 1; log_debug("main", "creating control socket"); - if ((ctl = ctl_create(LLDPD_CTL_SOCKET)) == -1) { - log_warn ("main", "unable to create control socket"); - log_warnx("main", "If another instance is running, please stop it."); - log_warnx("main", "Otherwise, remove " LLDPD_CTL_SOCKET); + while ((ctl = ctl_create(LLDPD_CTL_SOCKET)) == -1) { + if (retry-- && errno == EADDRINUSE) { + /* Check if a daemon is really listening */ + int tfd; + log_info("main", "unable to create control socket because it already exists"); + log_info("main", "check if another instance is running"); + if ((tfd = ctl_connect(LLDPD_CTL_SOCKET)) != -1) { + /* Another instance is running */ + close(tfd); + log_warnx("main", "another instance is running, please stop it"); + fatalx("giving up"); + } else if (errno == ECONNREFUSED) { + /* Nobody is listening */ + log_info("main", "old control socket is present, clean it"); + ctl_cleanup(LLDPD_CTL_SOCKET); + continue; + } + log_warn("main", "cannot determine if another daemon is already running"); + fatalx("giving up"); + } + log_warn("main", "unable to create control socket"); fatalx("giving up"); } if (chown(LLDPD_CTL_SOCKET, uid, gid) == -1) -- 2.39.5