95877b0e29
Signed-off-by: Jan Pokorný <jpokorny@redhat.com>
190 lines
7.4 KiB
Diff
190 lines
7.4 KiB
Diff
From d24e62a6b144a0532b1e472744ebbb13aa0221c4 Mon Sep 17 00:00:00 2001
|
|
From: =?UTF-8?q?Jan=20Pokorn=C3=BD?= <jpokorny@redhat.com>
|
|
Date: Fri, 6 Oct 2017 17:17:26 +0200
|
|
Subject: [PATCH 6/6] Low: fix internal object symbol's leak & expose run-time
|
|
lib version
|
|
MIME-Version: 1.0
|
|
Content-Type: text/plain; charset=UTF-8
|
|
Content-Transfer-Encoding: 8bit
|
|
|
|
The object in question has never been published through the header file,
|
|
hence it's presumably safe to make it static as it's meant to be.
|
|
|
|
On the other hand, QB_LOG_INIT_DATA macro from qblog.h has already
|
|
started to depend on that symbol so as to locate the library handle
|
|
for libqb itself correctly. This is trivially fixed by finally exposing
|
|
library versioning info in run-time through objects identified by the
|
|
compile-time/static counterparts from qbconfig.h header file, with
|
|
lower-casing applied on originally upper-cased macro identifiers.
|
|
Better than to roll out a futile data object serving as an artificial
|
|
anchor for the above purpose, and this was a while due, afterall.
|
|
|
|
In turn, also bump "current" and "age" of fields of the libtool's
|
|
"-version-info" versioning system.
|
|
|
|
Signed-off-by: Jan Pokorný <jpokorny@redhat.com>
|
|
---
|
|
include/qb/qbconfig.h.in | 5 ++++-
|
|
include/qb/qblog.h | 8 +++++---
|
|
include/qb/qbutil.h | 11 +++++++++++
|
|
lib/Makefile.am | 2 +-
|
|
lib/log.c | 10 ++++++----
|
|
lib/log_format.c | 2 +-
|
|
lib/util.c | 7 +++++++
|
|
tests/functional/log_client.c | 4 ++++
|
|
tests/functional/log_client.err | 2 +-
|
|
9 files changed, 40 insertions(+), 11 deletions(-)
|
|
|
|
diff --git a/include/qb/qbconfig.h.in b/include/qb/qbconfig.h.in
|
|
index c1852e1..1b92794 100644
|
|
--- a/include/qb/qbconfig.h.in
|
|
+++ b/include/qb/qbconfig.h.in
|
|
@@ -30,7 +30,10 @@
|
|
/* Enabling code using __attribute__((section)) */
|
|
#undef QB_HAVE_ATTRIBUTE_SECTION
|
|
|
|
-/* versioning info: MAJOR, MINOR, MICRO, and REST components */
|
|
+/* versioning info: MAJOR, MINOR, MICRO, and REST components;
|
|
+ note that static compile-time info is not that useful as consulting
|
|
+ the lower-cased counterparts directly from libqb in run-time
|
|
+ (see qbutil.h), but that was only introduced after v1.0.2 */
|
|
#undef QB_VER_MAJOR
|
|
#undef QB_VER_MINOR
|
|
#undef QB_VER_MICRO
|
|
diff --git a/include/qb/qblog.h b/include/qb/qblog.h
|
|
index 9474c16..56fdd6a 100644
|
|
--- a/include/qb/qblog.h
|
|
+++ b/include/qb/qblog.h
|
|
@@ -293,9 +293,11 @@ extern struct qb_log_callsite QB_ATTR_SECTION_STOP[];
|
|
#else
|
|
#define QB_NONAPI_LOG_INIT_DATA_EXTRA_ \
|
|
/* libqb sanity (locating libqb by it's relatively unique \
|
|
- -- and currently only such per-linkage global one -- \
|
|
- non-functional symbol, due to possible confusion otherwise) */ \
|
|
- if (dladdr(dlsym(RTLD_DEFAULT, "facilitynames"), &work_dli) \
|
|
+ non-functional symbols -- the two are mutually exclusive, the \
|
|
+ ordinarily latter was introduced by accident, the former is \
|
|
+ intentional -- due to possible confusion otherwise) */ \
|
|
+ if ((dladdr(dlsym(RTLD_DEFAULT, "qb_ver_str"), &work_dli) \
|
|
+ || dladdr(dlsym(RTLD_DEFAULT, "facilitynames"), &work_dli)) \
|
|
&& (work_handle = dlopen(work_dli.dli_fname, \
|
|
RTLD_LOCAL|RTLD_LAZY)) != NULL) { \
|
|
work_s1 = (struct qb_log_callsite *) \
|
|
diff --git a/include/qb/qbutil.h b/include/qb/qbutil.h
|
|
index bfce349..a03bdf8 100644
|
|
--- a/include/qb/qbutil.h
|
|
+++ b/include/qb/qbutil.h
|
|
@@ -289,6 +289,17 @@ uint64_t
|
|
qb_util_stopwatch_time_split_get(qb_util_stopwatch_t *sw,
|
|
uint32_t receint, uint32_t older);
|
|
|
|
+/** Major component of the library version */
|
|
+extern const uint8_t qb_ver_major;
|
|
+/** Minor component of the library version */
|
|
+extern const uint8_t qb_ver_minor;
|
|
+/** Micro component of the library version */
|
|
+extern const uint8_t qb_ver_micro;
|
|
+/** Rest (pertaining the mid-release-point) component of the library version */
|
|
+extern const char *const qb_ver_rest;
|
|
+/** Complete library versioning info as a string */
|
|
+extern const char *const qb_ver_str;
|
|
+
|
|
/* *INDENT-OFF* */
|
|
#ifdef __cplusplus
|
|
}
|
|
diff --git a/lib/Makefile.am b/lib/Makefile.am
|
|
index ff5b3b4..a428975 100644
|
|
--- a/lib/Makefile.am
|
|
+++ b/lib/Makefile.am
|
|
@@ -30,7 +30,7 @@ AM_CPPFLAGS = -I$(top_builddir)/include -I$(top_srcdir)/include
|
|
|
|
lib_LTLIBRARIES = libqb.la
|
|
|
|
-libqb_la_LDFLAGS = -version-info 18:2:18
|
|
+libqb_la_LDFLAGS = -version-info 19:0:19
|
|
|
|
source_to_lint = util.c hdb.c ringbuffer.c ringbuffer_helper.c \
|
|
array.c loop.c loop_poll.c loop_job.c \
|
|
diff --git a/lib/log.c b/lib/log.c
|
|
index e4b77d5..df5ce5c 100644
|
|
--- a/lib/log.c
|
|
+++ b/lib/log.c
|
|
@@ -892,10 +892,12 @@ qb_log_init(const char *name, int32_t facility, uint8_t priority)
|
|
#ifdef QB_HAVE_ATTRIBUTE_SECTION
|
|
/* sanity check that target chain supplied QB_ATTR_SECTION_ST{ART,OP}
|
|
symbols and hence the local references to them are not referencing
|
|
- the proper libqb's ones (locating libqb-self by it's relatively
|
|
- unique -- and currently only such per-linkage global one --
|
|
- non-functional symbol, due to possible confusion otherwise) */
|
|
- if (dladdr(dlsym(RTLD_DEFAULT, "facilitynames"), &work_dli)
|
|
+ the proper libqb's ones (locating libqb by it's relatively unique
|
|
+ non-functional symbols -- the two are mutually exclusive, the
|
|
+ ordinarily latter was introduced by accident, the former is
|
|
+ intentional -- due to possible confusion otherwise) */
|
|
+ if ((dladdr(dlsym(RTLD_DEFAULT, "qb_ver_str"), &work_dli)
|
|
+ || dladdr(dlsym(RTLD_DEFAULT, "facilitynames"), &work_dli))
|
|
&& (work_handle = dlopen(work_dli.dli_fname,
|
|
RTLD_LOCAL|RTLD_LAZY)) != NULL) {
|
|
work_s1 = (struct qb_log_callsite *)
|
|
diff --git a/lib/log_format.c b/lib/log_format.c
|
|
index 712f447..e7e1f40 100644
|
|
--- a/lib/log_format.c
|
|
+++ b/lib/log_format.c
|
|
@@ -49,7 +49,7 @@ static struct syslog_names prioritynames[] = {
|
|
{NULL, -1}
|
|
};
|
|
|
|
-struct syslog_names facilitynames[] = {
|
|
+static struct syslog_names facilitynames[] = {
|
|
{"auth", LOG_AUTH},
|
|
#if defined(LOG_AUTHPRIV)
|
|
{"authpriv", LOG_AUTHPRIV},
|
|
diff --git a/lib/util.c b/lib/util.c
|
|
index 6181a25..4693e58 100644
|
|
--- a/lib/util.c
|
|
+++ b/lib/util.c
|
|
@@ -23,6 +23,7 @@
|
|
#include "util_int.h"
|
|
#include <pthread.h>
|
|
#include <sys/stat.h>
|
|
+#include <qb/qbconfig.h>
|
|
#include <qb/qbdefs.h>
|
|
#include <qb/qbutil.h>
|
|
|
|
@@ -372,3 +373,9 @@ qb_util_stopwatch_time_split_get(qb_util_stopwatch_t *sw,
|
|
}
|
|
return (time_start - time_end) / QB_TIME_NS_IN_USEC;
|
|
}
|
|
+
|
|
+const uint8_t qb_ver_major = QB_VER_MAJOR;
|
|
+const uint8_t qb_ver_minor = QB_VER_MINOR;
|
|
+const uint8_t qb_ver_micro = QB_VER_MICRO;
|
|
+const char *const qb_ver_rest = QB_VER_REST;
|
|
+const char *const qb_ver_str = QB_VER_STR;
|
|
diff --git a/tests/functional/log_client.c b/tests/functional/log_client.c
|
|
index aa6ebe1..3612dab 100644
|
|
--- a/tests/functional/log_client.c
|
|
+++ b/tests/functional/log_client.c
|
|
@@ -53,6 +53,10 @@ main(int32_t argc, char *argv[])
|
|
qb_log_tags_stringify_fn_set(my_tags_stringify);
|
|
qb_log_format_set(QB_LOG_STDERR, "[%5g|%p] %f:%l:%b");
|
|
|
|
+#if 0
|
|
+ printf("\n==%s==\n\n", qb_ver_str);
|
|
+#endif
|
|
+
|
|
#if 0
|
|
printf("--\n");
|
|
qb_log_callsites_dump();
|
|
diff --git a/tests/functional/log_client.err b/tests/functional/log_client.err
|
|
index 0ae7665..c9c955c 100644
|
|
--- a/tests/functional/log_client.err
|
|
+++ b/tests/functional/log_client.err
|
|
@@ -1,2 +1,2 @@
|
|
-[MAIN |debug] ../log_client.c:63:hello
|
|
+[MAIN |debug] ../log_client.c:67:hello
|
|
[libqb|error] log_blackbox.c:196:qb_log_blackbox_print_from_file: No such file or directory (2)
|
|
--
|
|
2.14.2
|
|
|