This is an automated email from the ASF dual-hosted git repository.

cmcfarlen pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/trafficserver.git


The following commit(s) were added to refs/heads/master by this push:
     new 2344ea4ad5 Cleanup AppVersionInfo and turn it into a singleton (#10712)
2344ea4ad5 is described below

commit 2344ea4ad5f05f932132587ddcad654d16134f7b
Author: Chris McFarlen <ch...@mcfarlen.us>
AuthorDate: Tue Nov 7 10:03:07 2023 -0600

    Cleanup AppVersionInfo and turn it into a singleton (#10712)
    
    * Cleanup AppVersionInfo and turn it into a singleton
    
    * move version back to tscore
---
 include/iocore/eventsystem/EventSystem.h           |  1 +
 include/records/RecCore.h                          |  2 +-
 include/tscore/Version.h                           | 54 +++++++++++++++++++++-
 src/api/CMakeLists.txt                             |  8 ++--
 src/api/InkAPI.cc                                  |  6 +--
 src/api/{ => unit_tests}/test_Metrics.cc           |  0
 src/iocore/cache/CacheVC.cc                        |  2 +-
 src/iocore/cache/unit_tests/stub.cc                |  4 --
 src/proxy/http/unit_tests/unit_test_main.cc        |  4 --
 src/proxy/http2/test_HPACK.cc                      |  6 +--
 src/proxy/logging/LogAccess.cc                     | 13 +++---
 src/proxy/logging/LogStandalone.cc                 | 30 ++++++------
 .../logging/unit-tests/benchmark_LogObject.cc      |  1 -
 src/records/P_RecCore.cc                           |  6 ++-
 src/tests/CMakeLists.txt                           |  2 +-
 src/traffic_cache_tool/CMakeLists.txt              |  2 +-
 src/traffic_crashlog/traffic_crashlog.cc           |  7 ++-
 src/traffic_ctl/CMakeLists.txt                     |  2 +-
 src/traffic_logcat/logcat.cc                       |  5 +-
 src/traffic_logstats/logstats.cc                   |  4 +-
 src/traffic_quic/traffic_quic.cc                   |  5 +-
 src/traffic_server/Crash.cc                        |  4 +-
 src/traffic_server/traffic_server.cc               | 39 ++++++++--------
 src/traffic_top/traffic_top.cc                     |  3 +-
 src/traffic_via/CMakeLists.txt                     |  2 +-
 src/traffic_via/traffic_via.cc                     | 10 ++--
 src/tscore/ArgParser.cc                            |  5 +-
 src/tscore/CMakeLists.txt                          |  4 +-
 src/tscore/Regression.cc                           |  4 +-
 src/tscore/Version.cc                              | 31 +++++++++++++
 src/tscore/ink_args.cc                             |  4 +-
 src/tscore/unit_tests/test_Version.cc              |  8 ++--
 tools/jtest/jtest.cc                               |  6 +--
 33 files changed, 174 insertions(+), 110 deletions(-)

diff --git a/include/iocore/eventsystem/EventSystem.h 
b/include/iocore/eventsystem/EventSystem.h
index dae0387965..9e80c8ee49 100644
--- a/include/iocore/eventsystem/EventSystem.h
+++ b/include/iocore/eventsystem/EventSystem.h
@@ -25,6 +25,7 @@
 #pragma once
 #define _I_EventSystem_h
 
+#include "tscore/Version.h"
 #include "tscore/ink_platform.h"
 #include "ts/apidefs.h"
 
diff --git a/include/records/RecCore.h b/include/records/RecCore.h
index f938e1c61e..981be93fff 100644
--- a/include/records/RecCore.h
+++ b/include/records/RecCore.h
@@ -83,7 +83,7 @@ RecErrT _RecRegisterStatFloat(RecT rec_type, const char 
*name, RecFloat data_def
 #define RecRegisterStatFloat(rec_type, name, data_default, persist_type) \
   _RecRegisterStatFloat((rec_type), (name), (data_default), 
REC_PERSISTENCE_TYPE(persist_type))
 
-RecErrT _RecRegisterStatString(RecT rec_type, const char *name, RecString 
data_default, RecPersistT persist_type);
+RecErrT _RecRegisterStatString(RecT rec_type, const char *name, RecStringConst 
data_default, RecPersistT persist_type);
 #define RecRegisterStatString(rec_type, name, data_default, persist_type) \
   _RecRegisterStatString((rec_type), (name), (data_default), 
REC_PERSISTENCE_TYPE(persist_type))
 
diff --git a/include/tscore/Version.h b/include/tscore/Version.h
index 7f89f9cfc9..215e7003ea 100644
--- a/include/tscore/Version.h
+++ b/include/tscore/Version.h
@@ -135,7 +135,7 @@ ModuleVersion::check(ModuleVersion const &that)
 
 class AppVersionInfo
 {
-public:
+private:
   int defined;
   char PkgStr[128];
   char AppStr[128];
@@ -148,7 +148,59 @@ public:
   char BldCompileFlagsStr[128];
   char FullVersionInfoStr[256];
 
+public:
   AppVersionInfo();
   void setup(const char *pkg_name, const char *app_name, const char 
*app_version, const char *build_date, const char *build_time,
              const char *build_machine, const char *build_person, const char 
*build_cflags);
+  void setup(const char *app_name);
+
+  const char *
+  package() const
+  {
+    return PkgStr;
+  }
+  const char *
+  application() const
+  {
+    return AppStr;
+  }
+  const char *
+  version() const
+  {
+    return VersionStr;
+  }
+  const char *
+  build_number() const
+  {
+    return BldNumStr;
+  }
+  const char *
+  build_time() const
+  {
+    return BldTimeStr;
+  }
+  const char *
+  build_date() const
+  {
+    return BldDateStr;
+  }
+  const char *
+  build_machine() const
+  {
+    return BldMachineStr;
+  }
+  const char *
+  build_person() const
+  {
+    return BldPersonStr;
+  }
+  const char *
+  full_version() const
+  {
+    return FullVersionInfoStr;
+  }
+
+  static const AppVersionInfo &get_version();
+  static const AppVersionInfo &setup_version(const char *name);
+  static void print_version();
 };
diff --git a/src/api/CMakeLists.txt b/src/api/CMakeLists.txt
index 8027734fa7..5821347b02 100644
--- a/src/api/CMakeLists.txt
+++ b/src/api/CMakeLists.txt
@@ -55,9 +55,11 @@ if(APPLE)
 endif()
 
 if(BUILD_TESTING)
-  add_executable(test_Metrics test_Metrics.cc)
+  add_executable(test_ApiCore
+    unit_tests/test_Metrics.cc
+  )
 
-  target_link_libraries(test_Metrics PRIVATE tsapicore tscore catch2::catch2)
+  target_link_libraries(test_ApiCore PRIVATE tsapicore tscore catch2::catch2)
 
-  add_test(NAME test_Metrics COMMAND $<TARGET_FILE:test_Metrics>)
+  add_test(NAME test_ApiCore COMMAND $<TARGET_FILE:test_ApiCore>)
 endif()
diff --git a/src/api/InkAPI.cc b/src/api/InkAPI.cc
index 6df0578053..9965733d3d 100644
--- a/src/api/InkAPI.cc
+++ b/src/api/InkAPI.cc
@@ -32,10 +32,10 @@
 #include "tscore/Encoding.h"
 #include "tscore/PluginUserArgs.h"
 #include "tscore/Layout.h"
-#include "tscore/Version.h"
 #include "tscore/Diags.h"
 #include "api/Metrics.h"
 
+#include "tscore/Version.h"
 #include "api/InkAPIInternal.h"
 #include "proxy/logging/Log.h"
 #include "proxy/hdrs/URL.h"
@@ -106,8 +106,6 @@
   _HDR.m_http = (HTTPHdrImpl *)_OBJ_PTR;                \
   _HDR.m_mime = _HDR.m_http->m_fields_impl;
 
-extern AppVersionInfo appVersionInfo;
-
 /** Reservation for a user arg.
  */
 struct UserArg {
@@ -1398,7 +1396,7 @@ api_init()
     global_config_cbs = new ConfigUpdateCbTable;
 
     // Setup the version string for returning to plugins
-    ink_strlcpy(traffic_server_version, appVersionInfo.VersionStr, 
sizeof(traffic_server_version));
+    ink_strlcpy(traffic_server_version, 
AppVersionInfo::get_version().version(), sizeof(traffic_server_version));
     // Extract the elements.
     // coverity[secure_coding]
     if (sscanf(traffic_server_version, "%d.%d.%d", &ts_major_version, 
&ts_minor_version, &ts_patch_version) != 3) {
diff --git a/src/api/test_Metrics.cc b/src/api/unit_tests/test_Metrics.cc
similarity index 100%
rename from src/api/test_Metrics.cc
rename to src/api/unit_tests/test_Metrics.cc
diff --git a/src/iocore/cache/CacheVC.cc b/src/iocore/cache/CacheVC.cc
index 8a48b7330a..b749c4a35a 100644
--- a/src/iocore/cache/CacheVC.cc
+++ b/src/iocore/cache/CacheVC.cc
@@ -42,6 +42,7 @@
 #if DEBUG
 #include "api/Metrics.h"
 #endif
+#include "tscore/Version.h"
 
 // inkevent
 #include "iocore/eventsystem/Continuation.h"
@@ -55,7 +56,6 @@
 #include "tscpp/api/HttpStatus.h"
 
 // tscore
-#include "tscore/Version.h"
 #include "tscore/ink_assert.h"
 #include "tscore/ink_hrtime.h"
 #include "tscore/Ptr.h"
diff --git a/src/iocore/cache/unit_tests/stub.cc 
b/src/iocore/cache/unit_tests/stub.cc
index 57a95f9313..66c5d50def 100644
--- a/src/iocore/cache/unit_tests/stub.cc
+++ b/src/iocore/cache/unit_tests/stub.cc
@@ -27,10 +27,6 @@
 
 #include "proxy/HttpAPIHooks.h"
 
-#include "tscore/Version.h"
-
-AppVersionInfo appVersionInfo;
-
 void
 HttpHookState::init(TSHttpHookID id, HttpAPIHooks const *global, HttpAPIHooks 
const *ssn, HttpAPIHooks const *txn)
 {
diff --git a/src/proxy/http/unit_tests/unit_test_main.cc 
b/src/proxy/http/unit_tests/unit_test_main.cc
index 9947204d4e..41a6800593 100644
--- a/src/proxy/http/unit_tests/unit_test_main.cc
+++ b/src/proxy/http/unit_tests/unit_test_main.cc
@@ -24,7 +24,3 @@
 #define CATCH_CONFIG_MAIN
 
 #include "catch.hpp"
-
-#include "tscore/Version.h"
-
-AppVersionInfo appVersionInfo;
diff --git a/src/proxy/http2/test_HPACK.cc b/src/proxy/http2/test_HPACK.cc
index 894bc9992c..8760d95819 100644
--- a/src/proxy/http2/test_HPACK.cc
+++ b/src/proxy/http2/test_HPACK.cc
@@ -37,8 +37,6 @@ const static int MAX_TABLE_SIZE          = 4096;
 
 using namespace std;
 
-AppVersionInfo appVersionInfo;
-
 static int cmd_disable_freelist = 0;
 static char cmd_input_dir[512]  = "";
 static char cmd_output_dir[512] = "";
@@ -396,8 +394,8 @@ REGRESSION_TEST(HPACK_Encoding)(RegressionTest *t, int /* 
atype ATS_UNUSED */, i
 int
 main(int argc, const char **argv)
 {
-  appVersionInfo.setup(PACKAGE_NAME, "test_HPACK", PACKAGE_VERSION, __DATE__, 
__TIME__, BUILD_MACHINE, BUILD_PERSON, "");
-  process_args(&appVersionInfo, argument_descriptions, 
countof(argument_descriptions), argv);
+  auto &version = AppVersionInfo::setup_version("test_HPACK");
+  process_args(&version, argument_descriptions, 
countof(argument_descriptions), argv);
 
   ink_freelist_init_ops(cmd_disable_freelist, cmd_disable_pfreelist);
 
diff --git a/src/proxy/logging/LogAccess.cc b/src/proxy/logging/LogAccess.cc
index f6de3290fa..069a3a79e9 100644
--- a/src/proxy/logging/LogAccess.cc
+++ b/src/proxy/logging/LogAccess.cc
@@ -24,6 +24,7 @@
 
 #include "proxy/logging/LogAccess.h"
 
+#include "tscore/Version.h"
 #include "proxy/http/HttpSM.h"
 #include "proxy/hdrs/MIME.h"
 #include "iocore/utils/Machine.h"
@@ -31,8 +32,6 @@
 #include "proxy/logging/LogBuffer.h"
 #include "tscore/Encoding.h"
 
-extern AppVersionInfo appVersionInfo;
-
 char INVALID_STR[] = "!INVALID_STR!";
 
 #define HIDDEN_CONTENT_TYPE     "@Content-Type"
@@ -1462,9 +1461,10 @@ LogAccess::marshal_proxy_provided_cert(char *buf)
 int
 LogAccess::marshal_version_build_number(char *buf)
 {
-  int len = LogAccess::strlen(appVersionInfo.BldNumStr);
+  auto &version = AppVersionInfo::get_version();
+  int len       = LogAccess::strlen(version.build_number());
   if (buf) {
-    marshal_str(buf, appVersionInfo.BldNumStr, len);
+    marshal_str(buf, version.build_number(), len);
   }
   return len;
 }
@@ -1475,9 +1475,10 @@ LogAccess::marshal_version_build_number(char *buf)
 int
 LogAccess::marshal_version_string(char *buf)
 {
-  int len = LogAccess::strlen(appVersionInfo.VersionStr);
+  auto &version = AppVersionInfo::get_version();
+  int len       = LogAccess::strlen(version.version());
   if (buf) {
-    marshal_str(buf, appVersionInfo.VersionStr, len);
+    marshal_str(buf, version.version(), len);
   }
   return len;
 }
diff --git a/src/proxy/logging/LogStandalone.cc 
b/src/proxy/logging/LogStandalone.cc
index 2c0cd5407d..c1523f57fe 100644
--- a/src/proxy/logging/LogStandalone.cc
+++ b/src/proxy/logging/LogStandalone.cc
@@ -27,6 +27,7 @@
 
  ***************************************************************************/
 
+#include "tscore/Version.h"
 #include "tscore/ink_platform.h"
 #include "tscore/ink_lockfile.h"
 #include "tscore/ink_sys_control.h"
@@ -47,7 +48,6 @@ static char error_tags[1024]  = "";
 static char action_tags[1024] = "";
 
 static DiagsConfig *diagsConfig = nullptr;
-AppVersionInfo appVersionInfo;
 
 /*-------------------------------------------------------------------------
   init_system
@@ -57,7 +57,7 @@ AppVersionInfo appVersionInfo;
 static void
 logging_crash_handler(int signo, siginfo_t *info, void *ptr)
 {
-  signal_format_siginfo(signo, info, appVersionInfo.AppStr);
+  signal_format_siginfo(signo, info, 
AppVersionInfo::get_version().application());
   signal_crash_handler(signo, info, ptr);
 }
 
@@ -68,8 +68,9 @@ init_system(bool notify_syslog)
 
   signal_register_crash_handler(logging_crash_handler);
   if (notify_syslog) {
-    syslog(LOG_NOTICE, "NOTE: --- %s Starting ---", appVersionInfo.AppStr);
-    syslog(LOG_NOTICE, "NOTE: %s Version: %s", appVersionInfo.AppStr, 
appVersionInfo.FullVersionInfoStr);
+    auto &version = AppVersionInfo::get_version();
+    syslog(LOG_NOTICE, "NOTE: --- %s Starting ---", version.application());
+    syslog(LOG_NOTICE, "NOTE: %s Version: %s", version.application(), 
version.full_version());
   }
 }
 
@@ -89,19 +90,14 @@ initialize_process_manager()
   //
   // Define version info records
   //
-  RecRegisterStatString(RECT_PROCESS, "proxy.process.version.server.short", 
appVersionInfo.VersionStr, RECP_NON_PERSISTENT);
-  RecRegisterStatString(RECT_PROCESS, "proxy.process.version.server.long", 
appVersionInfo.FullVersionInfoStr, RECP_NON_PERSISTENT);
-  RecRegisterStatString(RECT_PROCESS, 
"proxy.process.version.server.build_number", appVersionInfo.BldNumStr, 
RECP_NON_PERSISTENT);
-  RecRegisterStatString(RECT_PROCESS, 
"proxy.process.version.server.build_time", appVersionInfo.BldTimeStr, 
RECP_NON_PERSISTENT);
-  RecRegisterStatString(RECT_PROCESS, 
"proxy.process.version.server.build_date", appVersionInfo.BldDateStr, 
RECP_NON_PERSISTENT);
-  RecRegisterStatString(RECT_PROCESS, 
"proxy.process.version.server.build_machine", appVersionInfo.BldMachineStr,
-                        RECP_NON_PERSISTENT);
-  RecRegisterStatString(RECT_PROCESS, 
"proxy.process.version.server.build_person", appVersionInfo.BldPersonStr,
-                        RECP_NON_PERSISTENT);
-  //    RecRegisterStatString(RECT_PROCESS,
-  //                         
"proxy.process.version.server.build_compile_flags",
-  //                         appVersionInfo.BldCompileFlagsStr,
-  //                         RECP_NON_PERSISTENT);
+  auto &version = AppVersionInfo::get_version();
+  RecRegisterStatString(RECT_PROCESS, "proxy.process.version.server.short", 
version.version(), RECP_NON_PERSISTENT);
+  RecRegisterStatString(RECT_PROCESS, "proxy.process.version.server.long", 
version.full_version(), RECP_NON_PERSISTENT);
+  RecRegisterStatString(RECT_PROCESS, 
"proxy.process.version.server.build_number", version.build_number(), 
RECP_NON_PERSISTENT);
+  RecRegisterStatString(RECT_PROCESS, 
"proxy.process.version.server.build_time", version.build_time(), 
RECP_NON_PERSISTENT);
+  RecRegisterStatString(RECT_PROCESS, 
"proxy.process.version.server.build_date", version.build_date(), 
RECP_NON_PERSISTENT);
+  RecRegisterStatString(RECT_PROCESS, 
"proxy.process.version.server.build_machine", version.build_machine(), 
RECP_NON_PERSISTENT);
+  RecRegisterStatString(RECT_PROCESS, 
"proxy.process.version.server.build_person", version.build_person(), 
RECP_NON_PERSISTENT);
 }
 
 /*-------------------------------------------------------------------------
diff --git a/src/proxy/logging/unit-tests/benchmark_LogObject.cc 
b/src/proxy/logging/unit-tests/benchmark_LogObject.cc
index c0753c9a8c..f30877ee0e 100644
--- a/src/proxy/logging/unit-tests/benchmark_LogObject.cc
+++ b/src/proxy/logging/unit-tests/benchmark_LogObject.cc
@@ -60,7 +60,6 @@ benchmark_LogObject_LDADD = \
 #include <condition_variable>
 #include <chrono>
 
-AppVersionInfo appVersionInfo;
 static char bind_stdout[512] = "";
 static char bind_stderr[512] = "";
 
diff --git a/src/records/P_RecCore.cc b/src/records/P_RecCore.cc
index 98c4d3218d..a256dda123 100644
--- a/src/records/P_RecCore.cc
+++ b/src/records/P_RecCore.cc
@@ -35,6 +35,7 @@
 #include "swoc/bwf_std.h"
 
 #include <fstream>
+#include <iterator>
 
 //-------------------------------------------------------------------------
 // RecRegisterStatXXX
@@ -66,8 +67,11 @@ _RecRegisterStatFloat(RecT rec_type, const char *name, 
RecFloat data_default, Re
 }
 
 RecErrT
-_RecRegisterStatString(RecT rec_type, const char *name, RecString 
data_default, RecPersistT persist_type)
+_RecRegisterStatString(RecT rec_type, const char *name, RecStringConst 
data_in, RecPersistT persist_type)
 {
+  // NOTE(cmcfarlen): RecRegisterState calls RecDataSet which call strdup on 
the string data.
+  // therefore, this const cast will not be modified nor escape the stack past 
here.
+  char *data_default = const_cast<char *>(data_in);
   REC_REGISTER_STAT_XXX(rec_string, RECD_STRING);
 }
 
diff --git a/src/tests/CMakeLists.txt b/src/tests/CMakeLists.txt
index 7220f20fbf..4993cb9697 100644
--- a/src/tests/CMakeLists.txt
+++ b/src/tests/CMakeLists.txt
@@ -134,7 +134,7 @@ add_net_test(
 )
 set(LIBINKNET_UNIT_TEST_DIR "${CMAKE_SOURCE_DIR}/src/iocore/net/unit_tests")
 target_compile_definitions(test_net PRIVATE 
LIBINKNET_UNIT_TEST_DIR=${LIBINKNET_UNIT_TEST_DIR})
-target_link_libraries(test_net PRIVATE hdrs proxy)
+target_link_libraries(test_net PRIVATE hdrs proxy ts::tsapicore)
 
 add_stubbed_test(EventSystem ${CMAKE_SOURCE_DIR}/src/iocore/net/NetVCTest.cc 
${CMAKE_SOURCE_DIR}/src/iocore/eventsystem/unit_tests/test_EventSystem.cc)
 target_link_libraries(EventSystem PRIVATE ts::inknet)
diff --git a/src/traffic_cache_tool/CMakeLists.txt 
b/src/traffic_cache_tool/CMakeLists.txt
index 3fb0c79a25..18e8ba6a68 100644
--- a/src/traffic_cache_tool/CMakeLists.txt
+++ b/src/traffic_cache_tool/CMakeLists.txt
@@ -17,5 +17,5 @@
 
 add_executable(traffic_cache_tool CacheDefs.cc CacheTool.cc CacheScan.cc)
 
-target_link_libraries(traffic_cache_tool PRIVATE ts::tscore libswoc)
+target_link_libraries(traffic_cache_tool PRIVATE ts::tscore libswoc 
ts::tsapicore)
 install(TARGETS traffic_cache_tool)
diff --git a/src/traffic_crashlog/traffic_crashlog.cc 
b/src/traffic_crashlog/traffic_crashlog.cc
index 8cd218b5c5..3b922a0386 100644
--- a/src/traffic_crashlog/traffic_crashlog.cc
+++ b/src/traffic_crashlog/traffic_crashlog.cc
@@ -43,7 +43,6 @@ static char *user         = nullptr;
 // If pid_t is not sizeof(int), we will have to jiggle argument parsing.
 extern char __pid_size_static_assert[sizeof(pid_t) == sizeof(int) ? 0 : -1];
 
-static AppVersionInfo appVersionInfo;
 static const ArgumentDescription argument_descriptions[] = {
   {"target", '-', "Target process ID",                         "I",  
&target_pid,   nullptr, nullptr},
   {"host",   '-', "Host triplet for the process being logged", "S*", 
&host_triplet, nullptr, nullptr},
@@ -141,10 +140,10 @@ main(int /* argc ATS_UNUSED */, const char **argv)
 
   DiagsPtr::set(new Diags("traffic_crashlog", "" /* tags */, "" /* actions */, 
new BaseLogFile("stderr")));
 
-  appVersionInfo.setup(PACKAGE_NAME, "traffic_crashlog", PACKAGE_VERSION, 
__DATE__, __TIME__, BUILD_MACHINE, BUILD_PERSON, "");
+  auto &version = AppVersionInfo::setup_version("traffic_crashlog");
 
   // Process command line arguments and dump into variables
-  process_args(&appVersionInfo, argument_descriptions, 
countof(argument_descriptions), argv);
+  process_args(&version, argument_descriptions, 
countof(argument_descriptions), argv);
 
   // XXX This is a hack. traffic_manager starts traffic_server with the euid 
of the admin user. We are still
   // privileged, but won't be able to open files in /proc or ptrace the 
target. This really should be fixed
@@ -182,7 +181,7 @@ main(int /* argc ATS_UNUSED */, const char **argv)
       facility = LOG_DAEMON;
     }
 
-    openlog(appVersionInfo.AppStr, LOG_PID | LOG_NDELAY | LOG_NOWAIT, 
facility);
+    openlog(version.application(), LOG_PID | LOG_NDELAY | LOG_NOWAIT, 
facility);
     diags()->config.outputs[DL_Debug].to_syslog     = true;
     diags()->config.outputs[DL_Status].to_syslog    = true;
     diags()->config.outputs[DL_Note].to_syslog      = true;
diff --git a/src/traffic_ctl/CMakeLists.txt b/src/traffic_ctl/CMakeLists.txt
index 2a9de7847c..d49c7f030d 100644
--- a/src/traffic_ctl/CMakeLists.txt
+++ b/src/traffic_ctl/CMakeLists.txt
@@ -20,6 +20,6 @@ add_executable(
               ${CMAKE_SOURCE_DIR}/src/shared/rpc/IPCSocketClient.cc
 )
 
-target_link_libraries(traffic_ctl ts::tscore libswoc yaml-cpp::yaml-cpp)
+target_link_libraries(traffic_ctl ts::tscore libswoc yaml-cpp::yaml-cpp 
ts::tsapicore)
 
 install(TARGETS traffic_ctl)
diff --git a/src/traffic_logcat/logcat.cc b/src/traffic_logcat/logcat.cc
index 9b5d05c748..0344a087c4 100644
--- a/src/traffic_logcat/logcat.cc
+++ b/src/traffic_logcat/logcat.cc
@@ -21,6 +21,7 @@
   limitations under the License.
  */
 
+#include "tscore/Version.h"
 #include "tscore/ink_platform.h"
 #include "tscore/ink_args.h"
 #include "tscore/Layout.h"
@@ -255,7 +256,7 @@ main(int /* argc ATS_UNUSED */, const char *argv[])
 
   // build the application information structure
   //
-  appVersionInfo.setup(PACKAGE_NAME, PROGRAM_NAME, PACKAGE_VERSION, __DATE__, 
__TIME__, BUILD_MACHINE, BUILD_PERSON, "");
+  auto &version = AppVersionInfo::setup_version(PROGRAM_NAME);
 
   runroot_handler(argv);
   // Before accessing file system initialize Layout engine
@@ -263,7 +264,7 @@ main(int /* argc ATS_UNUSED */, const char *argv[])
   // process command-line arguments
   //
   output_file[0] = 0;
-  process_args(&appVersionInfo, argument_descriptions, 
countof(argument_descriptions), argv);
+  process_args(&version, argument_descriptions, 
countof(argument_descriptions), argv);
 
   // check that only one of the -o and -a options was specified
   //
diff --git a/src/traffic_logstats/logstats.cc b/src/traffic_logstats/logstats.cc
index 7eed350794..8894e6d1ac 100644
--- a/src/traffic_logstats/logstats.cc
+++ b/src/traffic_logstats/logstats.cc
@@ -661,7 +661,7 @@ void
 CommandLineArgs::parse_arguments(const char **argv)
 {
   // process command-line arguments
-  process_args(&appVersionInfo, argument_descriptions, 
countof(argument_descriptions), argv, USAGE_LINE);
+  process_args(&AppVersionInfo::get_version(), argument_descriptions, 
countof(argument_descriptions), argv, USAGE_LINE);
 
   // Process as "CGI" ?
   if (strstr(argv[0], ".cgi") || cgi) {
@@ -2434,7 +2434,7 @@ main(int /* argc ATS_UNUSED */, const char *argv[])
   struct flock lck;
 
   // build the application information structure
-  appVersionInfo.setup(PACKAGE_NAME, PROGRAM_NAME, PACKAGE_VERSION, __DATE__, 
__TIME__, BUILD_MACHINE, BUILD_PERSON, "");
+  AppVersionInfo::setup_version(PROGRAM_NAME);
 
   runroot_handler(argv);
   // Before accessing file system initialize Layout engine
diff --git a/src/traffic_quic/traffic_quic.cc b/src/traffic_quic/traffic_quic.cc
index edc1df799f..033ec417ea 100644
--- a/src/traffic_quic/traffic_quic.cc
+++ b/src/traffic_quic/traffic_quic.cc
@@ -56,8 +56,7 @@ main(int argc, const char **argv)
   Layout::create();
 
   // Set up the application version info
-  AppVersionInfo appVersionInfo;
-  appVersionInfo.setup(PACKAGE_NAME, "traffic_quic", PACKAGE_VERSION, 
__DATE__, __TIME__, BUILD_MACHINE, BUILD_PERSON, "");
+  auto &version = AppVersionInfo::setup_version("traffic_quic");
 
   QUICClientConfig config;
 
@@ -79,7 +78,7 @@ main(int argc, const char **argv)
   };
 
   // Process command line arguments and dump into variables
-  process_args(&appVersionInfo, argument_descriptions, 
countof(argument_descriptions), argv);
+  process_args(&version, argument_descriptions, 
countof(argument_descriptions), argv);
 
   if (config.http3) {
     config.http0_9 = false;
diff --git a/src/traffic_server/Crash.cc b/src/traffic_server/Crash.cc
index ccfc2e73d3..5879bfa8ca 100644
--- a/src/traffic_server/Crash.cc
+++ b/src/traffic_server/Crash.cc
@@ -36,8 +36,6 @@
 
 static constexpr int NO_FD = swoc::file::NO_FD;
 
-extern AppVersionInfo appVersionInfo;
-
 static pid_t crash_logger_pid = -1;
 static int crash_logger_fd    = NO_FD;
 
@@ -171,6 +169,6 @@ crash_logger_invoke(int signo, siginfo_t *info, void *ctx)
   }
 
   // Log the signal, dump a stack trace and core.
-  signal_format_siginfo(signo, info, appVersionInfo.AppStr); // XXX Add 
timestamp ...
+  signal_format_siginfo(signo, info, 
AppVersionInfo::get_version().application()); // XXX Add timestamp ...
   signal_crash_handler(signo, info, ctx);
 }
diff --git a/src/traffic_server/traffic_server.cc 
b/src/traffic_server/traffic_server.cc
index 6c4fbf5741..1e66c85cfb 100644
--- a/src/traffic_server/traffic_server.cc
+++ b/src/traffic_server/traffic_server.cc
@@ -30,6 +30,7 @@
 
  ****************************************************************************/
 
+#include "tscore/Version.h"
 #include "swoc/swoc_file.h"
 
 #include "tscore/ink_platform.h"
@@ -195,8 +196,6 @@ static int cmd_block = 0;
 // -1: cache is already initialized, don't delay.
 static int delay_listen_for_cache = 0;
 
-AppVersionInfo appVersionInfo; // Build info for this application
-
 static ArgumentDescription argument_descriptions[] = {
   {"net_threads",       'n', "Number of Net Threads",                          
                                                     "I",     
&num_of_net_threads,             "PROXY_NET_THREADS",       nullptr},
   {"udp_threads",       'U', "Number of UDP Threads",                          
                                                     "I",     
&num_of_udp_threads,             "PROXY_UDP_THREADS",       nullptr},
@@ -583,7 +582,8 @@ proxy_signal_handler(int signo, siginfo_t *info, void *ctx)
     return;
   }
 
-  signal_format_siginfo(signo, info, appVersionInfo.AppStr);
+  auto &version = AppVersionInfo::get_version();
+  signal_format_siginfo(signo, info, version.application());
 
 #if TS_HAS_PROFILER
   HeapProfilerDump("/tmp/ts_end.hprof");
@@ -607,8 +607,9 @@ init_system()
   signal_register_default_handler(proxy_signal_handler);
   signal_register_crash_handler(signal_crash_handler);
 
-  syslog(LOG_NOTICE, "NOTE: --- %s Starting ---", appVersionInfo.AppStr);
-  syslog(LOG_NOTICE, "NOTE: %s Version: %s", appVersionInfo.AppStr, 
appVersionInfo.FullVersionInfoStr);
+  auto &version = AppVersionInfo::get_version();
+  syslog(LOG_NOTICE, "NOTE: --- %s Starting ---", version.application());
+  syslog(LOG_NOTICE, "NOTE: %s Version: %s", version.application(), 
version.full_version());
 
   //
   // Delimit file Descriptors
@@ -679,15 +680,14 @@ initialize_process_manager()
   //
   // Define version info records
   //
-  RecRegisterStatString(RECT_PROCESS, "proxy.process.version.server.short", 
appVersionInfo.VersionStr, RECP_NON_PERSISTENT);
-  RecRegisterStatString(RECT_PROCESS, "proxy.process.version.server.long", 
appVersionInfo.FullVersionInfoStr, RECP_NON_PERSISTENT);
-  RecRegisterStatString(RECT_PROCESS, 
"proxy.process.version.server.build_number", appVersionInfo.BldNumStr, 
RECP_NON_PERSISTENT);
-  RecRegisterStatString(RECT_PROCESS, 
"proxy.process.version.server.build_time", appVersionInfo.BldTimeStr, 
RECP_NON_PERSISTENT);
-  RecRegisterStatString(RECT_PROCESS, 
"proxy.process.version.server.build_date", appVersionInfo.BldDateStr, 
RECP_NON_PERSISTENT);
-  RecRegisterStatString(RECT_PROCESS, 
"proxy.process.version.server.build_machine", appVersionInfo.BldMachineStr,
-                        RECP_NON_PERSISTENT);
-  RecRegisterStatString(RECT_PROCESS, 
"proxy.process.version.server.build_person", appVersionInfo.BldPersonStr,
-                        RECP_NON_PERSISTENT);
+  auto &version = AppVersionInfo::get_version();
+  RecRegisterStatString(RECT_PROCESS, "proxy.process.version.server.short", 
version.version(), RECP_NON_PERSISTENT);
+  RecRegisterStatString(RECT_PROCESS, "proxy.process.version.server.long", 
version.full_version(), RECP_NON_PERSISTENT);
+  RecRegisterStatString(RECT_PROCESS, 
"proxy.process.version.server.build_number", version.build_number(), 
RECP_NON_PERSISTENT);
+  RecRegisterStatString(RECT_PROCESS, 
"proxy.process.version.server.build_time", version.build_time(), 
RECP_NON_PERSISTENT);
+  RecRegisterStatString(RECT_PROCESS, 
"proxy.process.version.server.build_date", version.build_date(), 
RECP_NON_PERSISTENT);
+  RecRegisterStatString(RECT_PROCESS, 
"proxy.process.version.server.build_machine", version.build_machine(), 
RECP_NON_PERSISTENT);
+  RecRegisterStatString(RECT_PROCESS, 
"proxy.process.version.server.build_person", version.build_person(), 
RECP_NON_PERSISTENT);
 }
 
 extern void initializeRegistry();
@@ -1590,13 +1590,14 @@ chdir_root()
 {
   std::string prefix = Layout::get()->prefix;
 
+  auto &version = AppVersionInfo::get_version();
   if (chdir(prefix.c_str()) < 0) {
-    fprintf(stderr, "%s: unable to change to root directory \"%s\" [%d 
'%s']\n", appVersionInfo.AppStr, prefix.c_str(), errno,
+    fprintf(stderr, "%s: unable to change to root directory \"%s\" [%d 
'%s']\n", version.application(), prefix.c_str(), errno,
             strerror(errno));
-    fprintf(stderr, "%s: please correct the path or set the TS_ROOT 
environment variable\n", appVersionInfo.AppStr);
+    fprintf(stderr, "%s: please correct the path or set the TS_ROOT 
environment variable\n", version.application());
     ::exit(1);
   } else {
-    printf("%s: using root directory '%s'\n", appVersionInfo.AppStr, 
prefix.c_str());
+    printf("%s: using root directory '%s'\n", version.application(), 
prefix.c_str());
   }
 }
 
@@ -1779,7 +1780,7 @@ main(int /* argc ATS_UNUSED */, const char **argv)
   pcre_free   = ats_free;
 
   // Define the version info
-  appVersionInfo.setup(PACKAGE_NAME, "traffic_server", PACKAGE_VERSION, 
__DATE__, __TIME__, BUILD_MACHINE, BUILD_PERSON, "");
+  auto &version = AppVersionInfo::setup_version("traffic_server");
 
   runroot_handler(argv);
   // Before accessing file system initialize Layout engine
@@ -1791,7 +1792,7 @@ main(int /* argc ATS_UNUSED */, const char **argv)
   std::sort(argument_descriptions, argument_descriptions + 
countof(argument_descriptions),
             [](ArgumentDescription const &a, ArgumentDescription const &b) { 
return 0 > strcasecmp(a.name, b.name); });
 
-  process_args(&appVersionInfo, argument_descriptions, 
countof(argument_descriptions), argv);
+  process_args(&version, argument_descriptions, 
countof(argument_descriptions), argv);
   command_flag  = command_flag || *command_string;
   command_index = find_cmd_index(command_string);
   command_valid = command_flag && command_index >= 0;
diff --git a/src/traffic_top/traffic_top.cc b/src/traffic_top/traffic_top.cc
index 2395c9ac88..645512dc83 100644
--- a/src/traffic_top/traffic_top.cc
+++ b/src/traffic_top/traffic_top.cc
@@ -389,8 +389,7 @@ main(int argc, const char **argv)
   bool absolute  = false;
   string url;
 
-  AppVersionInfo version;
-  version.setup(PACKAGE_NAME, "traffic_top", PACKAGE_VERSION, __DATE__, 
__TIME__, BUILD_MACHINE, BUILD_PERSON, "");
+  auto &version = AppVersionInfo::setup_version("traffic_top");
 
   const ArgumentDescription argument_descriptions[] = {
     {"sleep", 's', "Sets the delay between updates (in seconds)", "I", 
&sleep_time, nullptr, nullptr},
diff --git a/src/traffic_via/CMakeLists.txt b/src/traffic_via/CMakeLists.txt
index 7bff76bc0e..54d62a8177 100644
--- a/src/traffic_via/CMakeLists.txt
+++ b/src/traffic_via/CMakeLists.txt
@@ -16,7 +16,7 @@
 #######################
 
 add_executable(traffic_via traffic_via.cc)
-target_link_libraries(traffic_via ts::tscore libswoc)
+target_link_libraries(traffic_via ts::tscore libswoc ts::tsapicore)
 install(TARGETS traffic_via)
 
 if(BUILD_TESTING)
diff --git a/src/traffic_via/traffic_via.cc b/src/traffic_via/traffic_via.cc
index 4cfb57ad86..7bf905c14c 100644
--- a/src/traffic_via/traffic_via.cc
+++ b/src/traffic_via/traffic_via.cc
@@ -39,8 +39,6 @@
 
 #define SUBSTRING_VECTOR_COUNT 30 // Should be multiple of 3
 
-static AppVersionInfo appVersionInfo;
-
 struct VIA {
   VIA(const char *t) : title(t) {}
   ~VIA() { delete next; }
@@ -105,7 +103,7 @@ detailViaLookup(char flag)
     break;
   default:
     viaTable = nullptr;
-    fprintf(stderr, "%s: %s: %c\n", appVersionInfo.AppStr, "Invalid VIA header 
character", flag);
+    fprintf(stderr, "%s: %s: %c\n", 
AppVersionInfo::get_version().application(), "Invalid VIA header character", 
flag);
     break;
   }
 
@@ -176,7 +174,7 @@ standardViaLookup(char flag)
     break;
   default:
     viaTable = nullptr;
-    fprintf(stderr, "%s: %s: %c\n", appVersionInfo.AppStr, "Invalid VIA header 
character", flag);
+    fprintf(stderr, "%s: %s: %c\n", 
AppVersionInfo::get_version().application(), "Invalid VIA header character", 
flag);
     break;
   }
 
@@ -307,7 +305,7 @@ main(int /* argc ATS_UNUSED */, const char **argv)
   bool opStatus;
 
   // build the application information structure
-  appVersionInfo.setup(PACKAGE_NAME, "traffic_via", PACKAGE_VERSION, __DATE__, 
__TIME__, BUILD_MACHINE, BUILD_PERSON, "");
+  auto &version = AppVersionInfo::setup_version("traffic_via");
 
   /* see 'ink_args.h' for meanings of the various fields */
   ArgumentDescription argument_descriptions[] = {
@@ -315,7 +313,7 @@ main(int /* argc ATS_UNUSED */, const char **argv)
     HELP_ARGUMENT_DESCRIPTION(),
   };
 
-  process_args(&appVersionInfo, argument_descriptions, 
countof(argument_descriptions), argv);
+  process_args(&version, argument_descriptions, 
countof(argument_descriptions), argv);
 
   for (unsigned i = 0; i < n_file_arguments; ++i) {
     if (strcmp(file_arguments[i], "-") == 0) {
diff --git a/src/tscore/ArgParser.cc b/src/tscore/ArgParser.cc
index a4dfc0e4f2..7d221f9468 100644
--- a/src/tscore/ArgParser.cc
+++ b/src/tscore/ArgParser.cc
@@ -125,9 +125,8 @@ void
 ArgParser::Command::version_message() const
 {
   // unified version message of ATS
-  AppVersionInfo appVersionInfo;
-  appVersionInfo.setup(PACKAGE_NAME, _name.c_str(), PACKAGE_VERSION, __DATE__, 
__TIME__, BUILD_MACHINE, BUILD_PERSON, "");
-  ink_fputln(stdout, appVersionInfo.FullVersionInfoStr);
+  AppVersionInfo::setup_version(_name.c_str());
+  AppVersionInfo::print_version();
   exit(0);
 }
 
diff --git a/src/tscore/CMakeLists.txt b/src/tscore/CMakeLists.txt
index 811b89dcf5..a5a771a17f 100644
--- a/src/tscore/CMakeLists.txt
+++ b/src/tscore/CMakeLists.txt
@@ -111,7 +111,7 @@ else()
   target_sources(tscore PRIVATE HKDF_openssl.cc)
 endif()
 
-target_link_libraries(tscore PUBLIC OpenSSL::Crypto PCRE::PCRE libswoc 
yaml-cpp::yaml-cpp resolv::resolv)
+target_link_libraries(tscore PUBLIC OpenSSL::Crypto PCRE::PCRE libswoc 
yaml-cpp::yaml-cpp resolv::resolv ts::tsapicore)
 
 if(TS_USE_POSIX_CAP)
   target_link_libraries(tscore PUBLIC cap::cap)
@@ -153,7 +153,6 @@ if(BUILD_TESTING)
     unit_tests/test_Regex.cc
     unit_tests/test_Throttler.cc
     unit_tests/test_Tokenizer.cc
-    unit_tests/test_Version.cc
     unit_tests/test_arena.cc
     unit_tests/test_ink_inet.cc
     unit_tests/test_ink_memory.cc
@@ -161,6 +160,7 @@ if(BUILD_TESTING)
     unit_tests/test_layout.cc
     unit_tests/test_scoped_resource.cc
     unit_tests/unit_test_main.cc
+    unit_tests/test_Version.cc
   )
   target_link_libraries(
     test_tscore
diff --git a/src/tscore/Regression.cc b/src/tscore/Regression.cc
index ea6be2798b..5657c7a8f7 100644
--- a/src/tscore/Regression.cc
+++ b/src/tscore/Regression.cc
@@ -222,9 +222,7 @@ RegressionTest::main(int /* argc */, const char **argv, int 
level)
     {"regression_list", 'l', "List Regression Tests",              "T",    
&regression_list,  "PROXY_REGRESSION_LIST", nullptr},
   };
 
-  AppVersionInfo version;
-
-  version.setup(PACKAGE_NAME, progname(argv[0]), PACKAGE_VERSION, __DATE__, 
__TIME__, BUILD_MACHINE, BUILD_PERSON, "");
+  auto &version = AppVersionInfo::setup_version(progname(argv[0]));
 
   process_args(&version, argument_descriptions, 
countof(argument_descriptions), argv);
 
diff --git a/src/tscore/Version.cc b/src/tscore/Version.cc
index 48ad137c0c..e3af3041c9 100644
--- a/src/tscore/Version.cc
+++ b/src/tscore/Version.cc
@@ -24,6 +24,7 @@
 #include "tscore/ink_platform.h"
 #include "tscore/Version.h"
 #include "tscore/ink_string.h"
+#include "tscore/ink_file.h"
 
 AppVersionInfo::AppVersionInfo()
 {
@@ -126,3 +127,33 @@ AppVersionInfo::setup(const char *pkg_name, const char 
*app_name, const char *ap
 
   defined = 1;
 }
+
+void
+AppVersionInfo::setup(const char *name)
+{
+  setup(PACKAGE_NAME, name, PACKAGE_VERSION, __DATE__, __TIME__, 
BUILD_MACHINE, BUILD_PERSON, "");
+}
+
+static AppVersionInfo appVersionInfo;
+
+const AppVersionInfo &
+AppVersionInfo::get_version()
+{
+  if (!appVersionInfo.defined) {
+    appVersionInfo.setup("<unknown>");
+  }
+  return appVersionInfo;
+}
+
+const AppVersionInfo &
+AppVersionInfo::setup_version(const char *name)
+{
+  appVersionInfo.setup(name);
+  return appVersionInfo;
+}
+
+void
+AppVersionInfo::print_version()
+{
+  ink_fputln(stdout, get_version().FullVersionInfoStr);
+}
diff --git a/src/tscore/ink_args.cc b/src/tscore/ink_args.cc
index 66fc5c8819..dcee7c4205 100644
--- a/src/tscore/ink_args.cc
+++ b/src/tscore/ink_args.cc
@@ -80,7 +80,7 @@ process_arg(const AppVersionInfo *appinfo, const 
ArgumentDescription *argument_d
   const char *arg = nullptr;
 
   if (arg_is_version_flag(&argument_descriptions[i])) {
-    ink_fputln(stdout, appinfo->FullVersionInfoStr);
+    ink_fputln(stdout, appinfo->full_version());
     exit(0);
   }
 
@@ -207,7 +207,7 @@ process_args_ex(const AppVersionInfo *appinfo, const 
ArgumentDescription *argume
   //
   // Grab Command Line Arguments
   //
-  program_name = appinfo->AppStr;
+  program_name = appinfo->application();
   while (*++argv) {
     // Hack for supporting '-' as a file argument.
     if (strcmp(*argv, "-") == 0) {
diff --git a/src/tscore/unit_tests/test_Version.cc 
b/src/tscore/unit_tests/test_Version.cc
index 6b4a3fa512..1c043810c0 100644
--- a/src/tscore/unit_tests/test_Version.cc
+++ b/src/tscore/unit_tests/test_Version.cc
@@ -51,15 +51,15 @@ TEST_CASE("AppVersionInfo", "[libts][version]")
     // If not empty BUILD_NUMBER overrides any result, in this case run only
     // this test (the rest will always fail).
     info.setup("Apache Traffic Server", "traffic_server", "5.2.1", 
bench[0][0], bench[0][1], "build_slave", "builder", "");
-    if (0 != std::strcmp(info.BldNumStr, bench[0][2])) {
-      std::printf(errMsgFormat, bench[0][2], info.BldNumStr);
+    if (0 != std::strcmp(info.build_number(), bench[0][2])) {
+      std::printf(errMsgFormat, bench[0][2], info.build_number());
       CHECK(false);
     }
   } else {
     for (int i = 1; i < benchSize; i++) {
       info.setup("Apache Traffic Server", "traffic_server", "5.2.1", 
bench[i][0], bench[i][1], "build_slave", "builder", "");
-      if (0 != std::strcmp(info.BldNumStr, bench[i][2])) {
-        std::printf(errMsgFormat, bench[i][2], info.BldNumStr);
+      if (0 != std::strcmp(info.build_number(), bench[i][2])) {
+        std::printf(errMsgFormat, bench[i][2], info.build_number());
         CHECK(false);
       }
     }
diff --git a/tools/jtest/jtest.cc b/tools/jtest/jtest.cc
index 3e5a3d8d82..0268cbb124 100644
--- a/tools/jtest/jtest.cc
+++ b/tools/jtest/jtest.cc
@@ -110,8 +110,6 @@
 #define JTEST_DONE 0
 #define JTEST_CONT 1
 
-static AppVersionInfo appVersionInfo;
-
 static const char *hexdigits      = "0123456789ABCDEFabcdef";
 static const char *dontunescapify = "#;/?+=&:@%";
 static const char *dontescapify   = "#;/?+=&:@~.-_%";
@@ -3633,7 +3631,7 @@ get_defered_urls(FILE *fp)
 int
 main(int argc __attribute__((unused)), const char *argv[])
 {
-  appVersionInfo.setup(PACKAGE_NAME, "jtest", PACKAGE_VERSION, __DATE__, 
__TIME__, BUILD_MACHINE, BUILD_PERSON, "");
+  auto &version = AppVersionInfo::setup_version("jtest");
 
   /* for QA -- we want to be able to tail an output file
    * during execution "nohup jtest -P pxy -p prt &"
@@ -3642,7 +3640,7 @@ main(int argc __attribute__((unused)), const char *argv[])
 
   fd = (FD *)malloc(MAXFDS * sizeof(FD));
   memset(static_cast<void *>(fd), 0, MAXFDS * sizeof(FD));
-  process_args(&appVersionInfo, argument_descriptions, 
n_argument_descriptions, argv);
+  process_args(&version, argument_descriptions, n_argument_descriptions, argv);
 
   if (!drand_seed) {
     ts::Random::seed((long)time(nullptr));


Reply via email to