From 460a6daa8b951833ad9f4a8338079a1393b4b952 Mon Sep 17 00:00:00 2001 From: Remi Gacogne Date: Thu, 14 Sep 2023 15:01:56 +0200 Subject: [PATCH] auth: Properly record coverage data when exiting --- pdns/Makefile.am | 1 + pdns/auth-main.cc | 15 +++++++++++++++ pdns/coverage.cc | 48 +++++++++++++++++++++++++++++++++++++++++++++++ pdns/coverage.hh | 27 ++++++++++++++++++++++++++ 4 files changed, 91 insertions(+) create mode 100644 pdns/coverage.cc create mode 100644 pdns/coverage.hh diff --git a/pdns/Makefile.am b/pdns/Makefile.am index b22bcfdc3cc8..75e0fa213f22 100644 --- a/pdns/Makefile.am +++ b/pdns/Makefile.am @@ -211,6 +211,7 @@ pdns_server_SOURCES = \ circular_buffer.hh \ comment.hh \ communicator.cc communicator.hh \ + coverage.cc coverage.hh \ credentials.cc credentials.hh \ dbdnsseckeeper.cc \ digests.hh \ diff --git a/pdns/auth-main.cc b/pdns/auth-main.cc index e3d4b39b097f..559e1f29c358 100644 --- a/pdns/auth-main.cc +++ b/pdns/auth-main.cc @@ -53,6 +53,7 @@ #endif #include "auth-main.hh" +#include "coverage.hh" #include "secpoll-auth.hh" #include "dynhandler.hh" #include "dnsseckeeper.hh" @@ -1183,6 +1184,14 @@ static void tbhandler(int num) } #endif +#ifdef COVERAGE +static void sigTermHandler([[maybe_unused]] int signal) +{ + pdns::coverage::dumpCoverageData(); + _exit(EXIT_SUCCESS); +} +#endif /* COVERAGE */ + //! The main function of pdns, the pdns process int main(int argc, char** argv) { @@ -1282,6 +1291,12 @@ int main(int argc, char** argv) cerr << "Um, we did get here!" << endl; } +#ifdef COVERAGE + if (!::arg().mustDo("guardian") && !::arg().mustDo("daemon")) { + signal(SIGTERM, sigTermHandler); + } +#endif + // we really need to do work - either standalone or as an instance #if defined(__GLIBC__) && !defined(__UCLIBC__) diff --git a/pdns/coverage.cc b/pdns/coverage.cc new file mode 100644 index 000000000000..71fcda4b0749 --- /dev/null +++ b/pdns/coverage.cc @@ -0,0 +1,48 @@ +/* + * This file is part of PowerDNS or dnsdist. + * Copyright -- PowerDNS.COM B.V. and its contributors + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * In addition, for the avoidance of any doubt, permission is granted to + * link this program with OpenSSL and to (re)distribute the binaries + * produced as the result of such linking. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ +#include "config.h" +#include "coverage.hh" + +#ifdef COVERAGE +extern "C" +{ + //NOLINTNEXTLINE(bugprone-reserved-identifier): not ours + void __gcov_dump(void); +#ifdef CLANG_COVERAGE + //NOLINTNEXTLINE(bugprone-reserved-identifier): not ours + int __llvm_profile_write_file(void); +#endif /* CLANG_COVERAGE */ +} +#endif /* COVERAGE */ + +namespace pdns::coverage +{ +void dumpCoverageData() +{ +#ifdef COVERAGE + __gcov_dump(); +#ifdef CLANG_COVERAGE + __llvm_profile_write_file(); +#endif /* CLANG_COVERAGE */ +#endif /* COVERAGE */ +} +} diff --git a/pdns/coverage.hh b/pdns/coverage.hh new file mode 100644 index 000000000000..960f28c8ddbe --- /dev/null +++ b/pdns/coverage.hh @@ -0,0 +1,27 @@ +/* + * This file is part of PowerDNS or dnsdist. + * Copyright -- PowerDNS.COM B.V. and its contributors + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * In addition, for the avoidance of any doubt, permission is granted to + * link this program with OpenSSL and to (re)distribute the binaries + * produced as the result of such linking. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ +#pragma once + +namespace pdns::coverage +{ +void dumpCoverageData(); +}