Added --library-versions flag to print the compile time and runtime versions of libevent, openssl and zlib. Partially implements #6384.

This commit is contained in:
Kevin Butler 2013-09-01 17:38:01 +01:00
parent 00bcc25d05
commit 6e17fa6d7b
9 changed files with 86 additions and 16 deletions

2
changes/bug6384 Normal file
View File

@ -0,0 +1,2 @@
o Minor features:
- Add support for `--library-versions` flag. Implements ticket #6384.

View File

@ -415,6 +415,14 @@ tor_check_libevent_version(const char *m, int server,
#define HEADER_VERSION _EVENT_VERSION #define HEADER_VERSION _EVENT_VERSION
#endif #endif
/** Return a string representation of the version of Libevent that was used
* at compilation time. */
const char *
tor_libevent_get_header_version_str(void)
{
return HEADER_VERSION;
}
/** See whether the headers we were built against differ from the library we /** See whether the headers we were built against differ from the library we
* linked against so much that we're likely to crash. If so, warn the * linked against so much that we're likely to crash. If so, warn the
* user. */ * user. */

View File

@ -78,6 +78,7 @@ void tor_check_libevent_version(const char *m, int server,
const char **badness_out); const char **badness_out);
void tor_check_libevent_header_compatibility(void); void tor_check_libevent_header_compatibility(void);
const char *tor_libevent_get_version_str(void); const char *tor_libevent_get_version_str(void);
const char *tor_libevent_get_header_version_str(void);
#ifdef USE_BUFFEREVENTS #ifdef USE_BUFFEREVENTS
const struct timeval *tor_libevent_get_one_tick_timeout(void); const struct timeval *tor_libevent_get_one_tick_timeout(void);

View File

@ -195,6 +195,24 @@ try_load_engine(const char *path, const char *engine)
} }
#endif #endif
static char *
parse_openssl_version_str(const char *raw_version)
{
const char *end_of_version = NULL;
/* The output should be something like "OpenSSL 1.0.0b 10 May 2012. Let's
trim that down. */
if (!strcmpstart(raw_version, "OpenSSL ")) {
raw_version += strlen("OpenSSL ");
end_of_version = strchr(raw_version, ' ');
}
if (end_of_version)
return tor_strndup(raw_version,
end_of_version-raw_version);
else
return tor_strdup(raw_version);
}
static char *crypto_openssl_version_str = NULL; static char *crypto_openssl_version_str = NULL;
/* Return a human-readable version of the run-time openssl version number. */ /* Return a human-readable version of the run-time openssl version number. */
const char * const char *
@ -202,23 +220,20 @@ crypto_openssl_get_version_str(void)
{ {
if (crypto_openssl_version_str == NULL) { if (crypto_openssl_version_str == NULL) {
const char *raw_version = SSLeay_version(SSLEAY_VERSION); const char *raw_version = SSLeay_version(SSLEAY_VERSION);
const char *end_of_version = NULL; crypto_openssl_version_str = parse_openssl_version_str(raw_version);
/* The output should be something like "OpenSSL 1.0.0b 10 May 2012. Let's
trim that down. */
if (!strcmpstart(raw_version, "OpenSSL ")) {
raw_version += strlen("OpenSSL ");
end_of_version = strchr(raw_version, ' ');
}
if (end_of_version)
crypto_openssl_version_str = tor_strndup(raw_version,
end_of_version-raw_version);
else
crypto_openssl_version_str = tor_strdup(raw_version);
} }
return crypto_openssl_version_str; return crypto_openssl_version_str;
} }
/* Return a human-readable version of the compile-time openssl version
* number. */
const char *
crypto_openssl_get_header_version_str(void)
{
//return OPENSSL_VERSION_TEXT;
return parse_openssl_version_str(OPENSSL_VERSION_TEXT);
}
/** Initialize the crypto library. Return 0 on success, -1 on failure. /** Initialize the crypto library. Return 0 on success, -1 on failure.
*/ */
int int

View File

@ -109,6 +109,7 @@ typedef struct crypto_dh_t crypto_dh_t;
/* global state */ /* global state */
const char * crypto_openssl_get_version_str(void); const char * crypto_openssl_get_version_str(void);
const char * crypto_openssl_get_header_version_str(void);
int crypto_global_init(int hardwareAccel, int crypto_global_init(int hardwareAccel,
const char *accelName, const char *accelName,
const char *accelPath); const char *accelPath);

View File

@ -68,6 +68,22 @@ is_gzip_supported(void)
return gzip_is_supported; return gzip_is_supported;
} }
/** Return a string representation of the version of the currently running
* version of zlib. */
const char *
tor_zlib_get_version_str(void)
{
return zlibVersion();
}
/** Return a string representation of the version of the version of zlib
* used at compilation. */
const char *
tor_zlib_get_header_version_str(void)
{
return ZLIB_VERSION;
}
/** Return the 'bits' value to tell zlib to use <b>method</b>.*/ /** Return the 'bits' value to tell zlib to use <b>method</b>.*/
static INLINE int static INLINE int
method_bits(compress_method_t method) method_bits(compress_method_t method)

View File

@ -32,6 +32,12 @@ tor_gzip_uncompress(char **out, size_t *out_len,
int is_gzip_supported(void); int is_gzip_supported(void);
const char *
tor_zlib_get_version_str(void);
const char *
tor_zlib_get_header_version_str(void);
compress_method_t detect_compression_method(const char *in, size_t in_len); compress_method_t detect_compression_method(const char *in, size_t in_len);
/** Return values from tor_zlib_process; see that function's documentation for /** Return values from tor_zlib_process; see that function's documentation for

View File

@ -46,6 +46,7 @@
#include "statefile.h" #include "statefile.h"
#include "transports.h" #include "transports.h"
#include "ext_orport.h" #include "ext_orport.h"
#include "torgzip.h"
#ifdef _WIN32 #ifdef _WIN32
#include <shlobj.h> #include <shlobj.h>
#endif #endif
@ -3816,6 +3817,7 @@ options_init_from_torrc(int argc, char **argv)
printf("Tor version %s.\n",get_version()); printf("Tor version %s.\n",get_version());
exit(0); exit(0);
} }
if (argc > 1 && (!strcmp(argv[1],"--digests"))) { if (argc > 1 && (!strcmp(argv[1],"--digests"))) {
printf("Tor version %s.\n",get_version()); printf("Tor version %s.\n",get_version());
printf("%s", libor_get_digests()); printf("%s", libor_get_digests());
@ -3823,6 +3825,22 @@ options_init_from_torrc(int argc, char **argv)
exit(0); exit(0);
} }
if (argc > 1 && (!strcmp(argv[1],"--library-versions"))) {
printf("Tor version %s. \n", get_version());
printf("Library versions\tCompiled\t\tRuntime\n");
printf("Libevent\t\t%-15s\t\t%s\n",
tor_libevent_get_header_version_str(),
tor_libevent_get_version_str());
printf("OpenSSL \t\t%-15s\t\t%s\n",
crypto_openssl_get_header_version_str(),
crypto_openssl_get_version_str());
printf("Zlib \t\t%-15s\t\t%s\n",
tor_zlib_get_header_version_str(),
tor_zlib_get_version_str());
//TODO: Hex versions?
exit(0);
}
/* Go through command-line variables */ /* Go through command-line variables */
if (!global_cmdline_options) { if (!global_cmdline_options) {
/* Or we could redo the list every time we pass this place. /* Or we could redo the list every time we pass this place.

View File

@ -2343,6 +2343,8 @@ tor_init(int argc, char *argv[])
/* --version implies --quiet */ /* --version implies --quiet */
if (!strcmp(argv[i], "--version")) if (!strcmp(argv[i], "--version"))
quiet = 2; quiet = 2;
if (!strcmp(argv[i], "--library-versions"))
quiet = 2;
} }
/* give it somewhere to log to initially */ /* give it somewhere to log to initially */
switch (quiet) { switch (quiet) {
@ -2365,11 +2367,12 @@ tor_init(int argc, char *argv[])
#else #else
""; "";
#endif #endif
log_notice(LD_GENERAL, "Tor v%s %srunning on %s with Libevent %s " log_notice(LD_GENERAL, "Tor v%s %srunning on %s with Libevent %s, "
"and OpenSSL %s.", version, bev_str, "OpenSSL %s and Zlib %s.", version, bev_str,
get_uname(), get_uname(),
tor_libevent_get_version_str(), tor_libevent_get_version_str(),
crypto_openssl_get_version_str()); crypto_openssl_get_version_str(),
tor_zlib_get_version_str());
log_notice(LD_GENERAL, "Tor can't help you if you use it wrong! " log_notice(LD_GENERAL, "Tor can't help you if you use it wrong! "
"Learn how to be safe at " "Learn how to be safe at "