diff --git a/include/qb/qbconfig.h.in b/include/qb/qbconfig.h.in index c1852e12e..9094dc7d9 100644 --- a/include/qb/qbconfig.h.in +++ b/include/qb/qbconfig.h.in @@ -30,7 +30,12 @@ /* 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 respectively named members of qb_version struct constant under + @c qb_ver identifier (or @c qb_ver_str equivalent of the local + upper-cased value) 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 0af7d62ed..1cb63194d 100644 --- a/include/qb/qblog.h +++ b/include/qb/qblog.h @@ -299,9 +299,11 @@ extern struct qb_log_callsite QB_ATTR_SECTION_STOP[]; #define QB_NONAPI_LOG_INIT_DATA_EXTRA_(name) \ { Dl_info work_dli; \ /* 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 bfce349fc..b02ce8db7 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); +/** Structured library versioning info */ +extern const struct qb_version { + uint8_t major; /**< Major component */ + uint8_t minor; /**< Minor component */ + uint8_t micro; /**< Micro component */ + const char *rest; /**< Rest (pertaining the mid-release-point) */ +} qb_ver; + +/** 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 1572cff5f..6ca6b1518 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 bcaed5619..4f522640e 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 712f44756..e7e1f40bf 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 6181a2594..a510bd1c9 100644 --- a/lib/util.c +++ b/lib/util.c @@ -23,6 +23,7 @@ #include "util_int.h" #include #include +#include #include #include @@ -372,3 +373,12 @@ qb_util_stopwatch_time_split_get(qb_util_stopwatch_t *sw, } return (time_start - time_end) / QB_TIME_NS_IN_USEC; } + +const struct qb_version qb_ver = { + .major = QB_VER_MAJOR, + .minor = QB_VER_MINOR, + .micro = QB_VER_MICRO, + .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 c60d6570f..d5d80890f 100644 --- a/tests/functional/log_client.c +++ b/tests/functional/log_client.c @@ -53,6 +53,11 @@ 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 consists of: %d, %d, %d, %s==\n\n", qb_ver_str, + qb_ver.major, qb_ver.minor, qb_ver.micro, qb_ver.rest); +#endif + #if 0 printf("--\n"); qb_log_callsites_dump(); diff --git a/tests/functional/log_test_client.err b/tests/functional/log_test_client.err index 19fca2c86..98df44ca7 100644 --- a/tests/functional/log_test_client.err +++ b/tests/functional/log_test_client.err @@ -1,2 +1,2 @@ -[MAIN |debug] ../log_client.c:64:hello +[MAIN |debug] ../log_client.c:69:hello [libqb|error] log_blackbox.c:196:qb_log_blackbox_print_from_file: