From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) by passt.top (Postfix) with ESMTP id A2CCD5A005E for ; Wed, 15 Feb 2023 07:57:26 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1676444245; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=86edpAEQk5b8bVgjrBfssr+kDXErHyHFgO9vPl4rWgk=; b=Ke48yspwxQQoazsu12xqmmEoZQyhtvsjnLDqyZCiFlnaNP6ASJY5uWUGPOfxw11w5hddJu qUvHkuWTP3wC4STo8YGO7FHAYKXtKA599knuxQBwjqL570nFCNfPB7eat0DWaaYN0Uzvwi 3Gblu9wKUZm2h/qHuZQPew2h4ZrvvHk= Received: from mimecast-mx02.redhat.com (mimecast-mx02.redhat.com [66.187.233.88]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-615-uJEUcnkpO02-287cOKawqg-1; Wed, 15 Feb 2023 01:57:24 -0500 X-MC-Unique: uJEUcnkpO02-287cOKawqg-1 Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.rdu2.redhat.com [10.11.54.2]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id DDA3385CCE0 for ; Wed, 15 Feb 2023 06:57:23 +0000 (UTC) Received: from vhost3.router.laine.org (unknown [10.2.16.34]) by smtp.corp.redhat.com (Postfix) with ESMTP id C96D04010D5F for ; Wed, 15 Feb 2023 06:57:23 +0000 (UTC) From: Laine Stump To: passt-dev@passt.top Subject: [PATCH v3 1/9] log to stderr until process is daemonized, even if a logfile is set Date: Wed, 15 Feb 2023 01:57:15 -0500 Message-Id: <20230215065723.108696-2-laine@redhat.com> In-Reply-To: <20230215065723.108696-1-laine@redhat.com> References: <20230215065723.108696-1-laine@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 3.1 on 10.11.54.2 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: 8bit Content-Type: text/plain; charset="US-ASCII"; x-default=true Message-ID-Hash: RLARCGPHKDV32R5A2BYTCHV2HD5PC7GQ X-Message-ID-Hash: RLARCGPHKDV32R5A2BYTCHV2HD5PC7GQ X-MailFrom: laine@redhat.com X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; emergency; loop; banned-address; member-moderation; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; digests; suspicious-header X-Mailman-Version: 3.3.3 Precedence: list List-Id: Development discussion and patches for passt Archived-At: Archived-At: List-Archive: List-Archive: List-Help: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: Once a logfile (specified on the commandline) is opened, the logging functions will stop sending error logs to stderr, which is annoying if passt has been started by another process that wants to collect error messages from stderr so it can report why passt failed to start. It would be much nicer if passt continued sending all log messages to stderr until it daemonizes itself (at which point the process that started passt can assume that it was started successfully). The system logmask is set to LOG_EMERG when the process starts, and we're already using that to do "special" logging during the period from process start until the log level requested on the commandline is processed (setting the logmask to something else). This period *almost* matches with "the time before the process is daemonized"; if we just delay setting the logmask a tiny bit, then it will match exactly, and we can use it to determine if we need to send log messages to stderr even when a logfile has been specified and opened. This patch delays the setting of logmask until immediately before the call to __daemon(). It also modifies logfn() slightly, so that it will log to stderr any time logmask is LOG_EMERG, even if a logfile has been opened. Signed-off-by: Laine Stump --- log.c | 4 ++-- passt.c | 17 ++++++++++------- 2 files changed, 12 insertions(+), 9 deletions(-) diff --git a/log.c b/log.c index 468c730..6dc6673 100644 --- a/log.c +++ b/log.c @@ -66,8 +66,8 @@ void name(const char *format, ...) { \ va_end(args); \ } \ \ - if ((setlogmask(0) & LOG_MASK(LOG_DEBUG) || \ - setlogmask(0) == LOG_MASK(LOG_EMERG)) && log_file == -1) { \ + if ((setlogmask(0) & LOG_MASK(LOG_DEBUG) && log_file == -1) || \ + setlogmask(0) == LOG_MASK(LOG_EMERG)) { \ va_start(args, format); \ (void)vfprintf(stderr, format, args); \ va_end(args); \ diff --git a/passt.c b/passt.c index d957e14..1228e5b 100644 --- a/passt.c +++ b/passt.c @@ -246,13 +246,6 @@ int main(int argc, char **argv) if (c.stderr || isatty(fileno(stdout))) __openlog(log_name, LOG_PERROR, LOG_DAEMON); - if (c.debug) - __setlogmask(LOG_UPTO(LOG_DEBUG)); - else if (c.quiet) - __setlogmask(LOG_UPTO(LOG_ERR)); - else - __setlogmask(LOG_UPTO(LOG_INFO)); - quit_fd = pasta_netns_quit_init(&c); tap_sock_init(&c); @@ -296,6 +289,16 @@ int main(int argc, char **argv) exit(EXIT_FAILURE); } + /* once the logmask != LOG_EMERG, we will no longer + * log to stderr if there is a logfile specified + */ + if (c.debug) + __setlogmask(LOG_UPTO(LOG_DEBUG)); + else if (c.quiet) + __setlogmask(LOG_UPTO(LOG_ERR)); + else + __setlogmask(LOG_UPTO(LOG_INFO)); + if (!c.foreground) __daemon(pidfile_fd, devnull_fd); else -- 2.39.1