0
0
Fork 0
mirror of https://github.com/matrix-construct/construct synced 2024-11-29 10:12:39 +01:00

ircd: Apply uniform info::versions for all dependency version identification.

This commit is contained in:
Jason Volk 2019-05-31 16:06:55 -07:00
parent 7d4de7ec82
commit eb73595c50
17 changed files with 247 additions and 218 deletions

View file

@ -28,13 +28,8 @@ namespace ircd::db
// db subsystem has its own logging facility // db subsystem has its own logging facility
extern struct log::log log; extern struct log::log log;
// Version information from rocksdb headers (when building ircd). // Version information from rocksdb headers and library
extern const uint version[3]; extern const info::versions version_api, version_abi;
extern const string_view version_str;
// Version of the RocksDB shared library (when running ircd).
extern const uint abi_version[3];
extern const string_view abi_version_str;
// Supported compressions (detected when running ircd) // Supported compressions (detected when running ircd)
extern std::array<std::string, 16> compressions; extern std::array<std::string, 16> compressions;

View file

@ -52,17 +52,17 @@ namespace ircd::info
extern const size_t rlimit_nofile; extern const size_t rlimit_nofile;
extern const size_t rlimit_rttime; extern const size_t rlimit_rttime;
// Host information // Host & third-party information
#ifdef HAVE_SYS_UTSNAME_H #ifdef HAVE_SYS_UTSNAME_H
extern const ::utsname utsname; extern const ::utsname utsname;
#endif #endif
extern const string_view kname;
extern const string_view kversion_str;
extern const int kversion[3];
// Third-party information extern const string_view kernel_name;
extern const int glibc_version[3]; extern const string_view kernel_release;
extern const string_view glibc_version_str; extern const versions kernel_version;
extern const versions glibc_version_api;
extern const versions glibc_version_abi;
// Primary information // Primary information
extern const string_view name; extern const string_view name;

View file

@ -29,8 +29,7 @@ namespace ircd
{ {
namespace asio = boost::asio; ///< Alias so that asio:: can be used. namespace asio = boost::asio; ///< Alias so that asio:: can be used.
extern const uint boost_version[3]; extern const info::versions boost_version_api, boost_version_abi;
extern const string_view boost_version_str;
} }
namespace ircd::ios namespace ircd::ios

View file

@ -22,7 +22,7 @@ namespace ircd::magick
struct thumbnail; struct thumbnail;
struct thumbcrop; struct thumbcrop;
std::tuple<ulong, string_view> version(); extern const info::versions version_api, version_abi;
} }
/// Composite thumbnailer to resize close to the requested dimension but /// Composite thumbnailer to resize close to the requested dimension but

View file

@ -24,7 +24,7 @@ namespace ircd::magic
string_view extensions(const mutable_buffer &out, const const_buffer &); string_view extensions(const mutable_buffer &out, const const_buffer &);
string_view description(const mutable_buffer &out, const const_buffer &); string_view description(const mutable_buffer &out, const const_buffer &);
int version(); extern const info::versions version_api, version_abi;
} }
struct ircd::magic::init struct ircd::magic::init

View file

@ -18,7 +18,7 @@ namespace ircd::nacl
struct init; struct init;
string_view version(); extern const info::versions version_api, version_abi;
} }
struct ircd::nacl::init struct ircd::nacl::init

View file

@ -55,9 +55,6 @@ namespace ircd::openssl
using EC_KEY = ::ec_key_st; using EC_KEY = ::ec_key_st;
using DH = ::dh_st; using DH = ::dh_st;
// Header version; library version
std::pair<string_view, string_view> version();
// Observers // Observers
string_view error_string(const mutable_buffer &buf, const ulong &); string_view error_string(const mutable_buffer &buf, const ulong &);
ulong peek_error(); ulong peek_error();
@ -141,6 +138,9 @@ namespace ircd::openssl
// SNI suite // SNI suite
string_view server_name(const SSL &); // provided by client string_view server_name(const SSL &); // provided by client
void server_name(SSL &, const string_view &); // set by client void server_name(SSL &, const string_view &); // set by client
// Header version; library version
extern const info::versions version_api, version_abi;
} }
/// OpenSSL BIO convenience utils and wraps; also secure file IO closures /// OpenSSL BIO convenience utils and wraps; also secure file IO closures

View file

@ -92,47 +92,30 @@ namespace ircd::db
static void init_directory(); static void init_directory();
} }
decltype(ircd::db::version) decltype(ircd::db::version_api)
ircd::db::version ircd::db::version_api
{ {
ROCKSDB_MAJOR, "RocksDB", info::versions::API, 0,
ROCKSDB_MINOR, {
ROCKSDB_PATCH ROCKSDB_MAJOR, ROCKSDB_MINOR, ROCKSDB_PATCH,
},
// version string generator
[](auto &version, const auto &buf)
{
::snprintf(data(buf), size(buf), "%ld.%ld.%ld",
version[0],
version[1],
version[2]);
}
}; };
char ircd_db_version_str_buf[64]; decltype(ircd::db::version_abi)
decltype(ircd::db::version_str) ircd::db::version_abi
ircd::db::version_str
(
ircd_db_version_str_buf,
::snprintf(ircd_db_version_str_buf, sizeof(ircd_db_version_str_buf),
"%u.%u.%u",
version[0],
version[1],
version[2])
);
decltype(ircd::db::abi_version)
ircd::db::abi_version
{ {
//TODO: Get lib version. "RocksDB", info::versions::ABI, 0, {0}, "<unknown>" //TODO: get this
0,
0,
0,
}; };
char ircd_db_abi_version_str_buf[64];
decltype(ircd::db::abi_version_str)
ircd::db::abi_version_str
(
ircd_db_abi_version_str_buf,
::snprintf(ircd_db_abi_version_str_buf, sizeof(ircd_db_abi_version_str_buf),
"%u.%u.%u",
abi_version[0],
abi_version[1],
abi_version[2])
);
// //
// init::init // init::init
// //

View file

@ -37,8 +37,8 @@ decltype(ircd::fs::support_pwritev2)
ircd::fs::support_pwritev2 ircd::fs::support_pwritev2
{ {
#if defined(HAVE_PWRITEV2) #if defined(HAVE_PWRITEV2)
info::kversion[0] >= 4 && info::kernel_version[0] >= 4 &&
info::kversion[1] >= 6 info::kernel_version[1] >= 6
#else #else
false false
#endif #endif
@ -48,8 +48,8 @@ decltype(ircd::fs::support_sync)
ircd::fs::support_sync ircd::fs::support_sync
{ {
#if defined(HAVE_PWRITEV2) && defined(RWF_SYNC) #if defined(HAVE_PWRITEV2) && defined(RWF_SYNC)
info::kversion[0] >= 4 && info::kernel_version[0] >= 4 &&
info::kversion[1] >= 7 info::kernel_version[1] >= 7
#else #else
false false
#endif #endif
@ -59,8 +59,8 @@ decltype(ircd::fs::support_dsync)
ircd::fs::support_dsync ircd::fs::support_dsync
{ {
#if defined(HAVE_PWRITEV2) && defined(RWF_DSYNC) #if defined(HAVE_PWRITEV2) && defined(RWF_DSYNC)
info::kversion[0] >= 4 && info::kernel_version[0] >= 4 &&
info::kversion[1] >= 7 info::kernel_version[1] >= 7
#else #else
false false
#endif #endif
@ -70,8 +70,8 @@ decltype(ircd::fs::support_hipri)
ircd::fs::support_hipri ircd::fs::support_hipri
{ {
#if defined(HAVE_PWRITEV2) && defined(RWF_HIPRI) #if defined(HAVE_PWRITEV2) && defined(RWF_HIPRI)
info::kversion[0] >= 4 && info::kernel_version[0] >= 4 &&
info::kversion[1] >= 6 info::kernel_version[1] >= 6
#else #else
false false
#endif #endif
@ -81,8 +81,8 @@ decltype(ircd::fs::support_nowait)
ircd::fs::support_nowait ircd::fs::support_nowait
{ {
#if defined(HAVE_PWRITEV2) && defined(RWF_NOWAIT) #if defined(HAVE_PWRITEV2) && defined(RWF_NOWAIT)
info::kversion[0] >= 4 && info::kernel_version[0] >= 4 &&
info::kversion[1] >= 14 info::kernel_version[1] >= 14
#else #else
false false
#endif #endif
@ -92,8 +92,8 @@ decltype(ircd::fs::support_append)
ircd::fs::support_append ircd::fs::support_append
{ {
#if defined(HAVE_PWRITEV2) && defined(RWF_APPEND) #if defined(HAVE_PWRITEV2) && defined(RWF_APPEND)
info::kversion[0] >= 4 && info::kernel_version[0] >= 4 &&
info::kversion[1] >= 16 info::kernel_version[1] >= 16
#else #else
false false
#endif #endif
@ -103,8 +103,8 @@ decltype(ircd::fs::support_rwh_write_life)
ircd::fs::support_rwh_write_life ircd::fs::support_rwh_write_life
{ {
#if defined(HAVE_FCNTL_H) && defined(F_SET_FILE_RW_HINT) #if defined(HAVE_FCNTL_H) && defined(F_SET_FILE_RW_HINT)
info::kversion[0] >= 4 && info::kernel_version[0] >= 4 &&
info::kversion[1] >= 13 info::kernel_version[1] >= 13
#else #else
false false
#endif #endif
@ -1024,9 +1024,9 @@ ircd::fs::ircd_fs_append__resolve()
{ {
log, support_append? log::DEBUG : log::DWARNING, log, support_append? log::DEBUG : log::DWARNING,
"This host '%s %s' %s the RWF_APPEND flag to pwritev2(2).", "This host '%s %s' %s the RWF_APPEND flag to pwritev2(2).",
info::kname, info::kernel_name,
info::kversion_str, string_view{info::kernel_version},
support_append? "SUPPORTS"_sv : "DOES NOT SUPPORT"_sv support_append? "SUPPORTS"_sv : "DOES NOT SUPPORT"_sv,
}; };
return support_append? _append__rwf : _append__no_rwf; return support_append? _append__rwf : _append__no_rwf;
@ -1202,8 +1202,8 @@ ircd::fs::ircd_fs_write_pwritev__resolve()
{ {
log, support_pwritev2? log::DEBUG : log::DWARNING, log, support_pwritev2? log::DEBUG : log::DWARNING,
"This host '%s %s' %s the pwritev2(2) system call.", "This host '%s %s' %s the pwritev2(2) system call.",
info::kname, info::kernel_name,
info::kversion_str, string_view{info::kernel_version},
support_pwritev2? "SUPPORTS"_sv : "DOES NOT SUPPORT"_sv support_pwritev2? "SUPPORTS"_sv : "DOES NOT SUPPORT"_sv
}; };
@ -1432,16 +1432,16 @@ decltype(ircd::fs::aio::support_fsync)
extern __attribute__((weak)) extern __attribute__((weak))
ircd::fs::aio::support_fsync ircd::fs::aio::support_fsync
{ {
info::kversion[0] >= 4 && info::kernel_version[0] >= 4 &&
info::kversion[1] >= 18 info::kernel_version[1] >= 18
}; };
decltype(ircd::fs::aio::support_fdsync) decltype(ircd::fs::aio::support_fdsync)
extern __attribute__((weak)) extern __attribute__((weak))
ircd::fs::aio::support_fdsync ircd::fs::aio::support_fdsync
{ {
info::kversion[0] >= 4 && info::kernel_version[0] >= 4 &&
info::kversion[1] >= 18 info::kernel_version[1] >= 18
}; };
decltype(ircd::fs::aio::MAX_EVENTS) decltype(ircd::fs::aio::MAX_EVENTS)

View file

@ -33,8 +33,8 @@ ircd::fs::aio::support
decltype(ircd::fs::aio::support_fsync) decltype(ircd::fs::aio::support_fsync)
ircd::fs::aio::support_fsync ircd::fs::aio::support_fsync
{ {
info::kversion[0] >= 4 && info::kernel_version[0] >= 4 &&
info::kversion[1] >= 18 info::kernel_version[1] >= 18
}; };
/// True if IOCB_CMD_FDSYNC is supported by AIO. If this is false then /// True if IOCB_CMD_FDSYNC is supported by AIO. If this is false then
@ -42,8 +42,8 @@ ircd::fs::aio::support_fsync
decltype(ircd::fs::aio::support_fdsync) decltype(ircd::fs::aio::support_fdsync)
ircd::fs::aio::support_fdsync ircd::fs::aio::support_fdsync
{ {
info::kversion[0] >= 4 && info::kernel_version[0] >= 4 &&
info::kversion[1] >= 18 info::kernel_version[1] >= 18
}; };
decltype(ircd::fs::aio::MAX_EVENTS) decltype(ircd::fs::aio::MAX_EVENTS)

View file

@ -45,19 +45,28 @@ ircd::info::dump()
RB_DEBUG_LEVEL? "(DEBUG MODE)" : "" RB_DEBUG_LEVEL? "(DEBUG MODE)" : ""
}; };
// This message flashes information about our dependencies which are being // This message flashes information about our API dependencies from compile time.
// assumed for this execution.
log::info log::info
{ {
"%s. glibc %s. boost %s. RocksDB %s. SpiderMonkey %s. sodium %s. %s. libmagic %d.", "API: glibc %s. boost %s. RocksDB %s. sodium %s. %s. magic %ld.",
PACKAGE_STRING, string_view{glibc_version_api},
glibc_version_str, string_view{boost_version_api},
boost_version_str, string_view{db::version_api},
db::version_str, string_view{nacl::version_api},
js::version(js::ver::IMPLEMENTATION), string_view{openssl::version_api},
nacl::version(), long(magic::version_api),
openssl::version().second, };
magic::version()
// This message flashes information about our ABI dependencies on this system.
log::debug
{
"ABI: glibc %s. boost %s. RocksDB %s. sodium %s. %s. magic %ld.",
string_view{glibc_version_abi},
string_view{boost_version_abi},
string_view{db::version_abi},
string_view{nacl::version_abi},
string_view{openssl::version_abi},
long(magic::version_abi),
}; };
// This message flashes posix information about the system and platform IRCd // This message flashes posix information about the system and platform IRCd
@ -226,26 +235,6 @@ ircd_name
// Third party dependency information // Third party dependency information
// //
decltype(ircd::info::glibc_version)
ircd::info::glibc_version
{
__GNU_LIBRARY__,
__GLIBC__,
__GLIBC_MINOR__,
};
char ircd_info_glibc_version_str_buf[32];
decltype(ircd::info::glibc_version_str)
ircd::info::glibc_version_str
(
ircd_info_glibc_version_str_buf,
::snprintf(ircd_info_glibc_version_str_buf, sizeof(ircd_info_glibc_version_str_buf),
"%d.%d.%d",
glibc_version[0],
glibc_version[1],
glibc_version[2])
);
// //
// Host information // Host information
// //
@ -260,44 +249,77 @@ ircd::info::utsname{[]
}()}; }()};
#endif #endif
decltype(ircd::info::kname) // kernel
ircd::info::kname
decltype(ircd::info::kernel_name)
ircd::info::kernel_name
{ {
#ifdef HAVE_SYS_UTSNAME_H #ifdef HAVE_SYS_UTSNAME_H
utsname.sysname utsname.sysname
#endif #endif
}; };
decltype(ircd::info::kversion_str) decltype(ircd::info::kernel_release)
ircd::info::kversion_str ircd::info::kernel_release
{ {
#ifdef HAVE_SYS_UTSNAME_H #ifdef HAVE_SYS_UTSNAME_H
utsname.release utsname.release
#endif #endif
}; };
decltype(ircd::info::kversion) decltype(ircd::info::kernel_version)
ircd::info::kversion ircd::info::kernel_version
{ {
[] // major "kernel", versions::ABI, 0,
{ {
const auto str(split(kversion_str, '.').first); [] // major
return try_lex_cast<int>(str)? {
lex_cast<int>(str): const auto str(split(kernel_release, '.').first);
0; return try_lex_cast<int>(str)?
}(), lex_cast<int>(str):
0;
}(),
[] // minor [] // minor
{
auto str(split(kernel_release, '.').second);
str = split(str, '.').first;
return try_lex_cast<int>(str)?
lex_cast<int>(str):
0;
}(),
0 // patch
},
utsname.release
};
// libc
decltype(ircd::info::glibc_version_api)
ircd::info::glibc_version_api
{
"glibc", versions::API, 0,
{ {
auto str(split(kversion_str, '.').second); __GNU_LIBRARY__,
str = split(str, '.').first; __GLIBC__,
return try_lex_cast<int>(str)? __GLIBC_MINOR__,
lex_cast<int>(str): },
0;
}(),
// patch [](auto &that, const auto &buf)
0 {
::snprintf(data(buf), size(buf), "%ld.%ld.%ld",
that.semantic[0],
that.semantic[1],
that.semantic[2]);
}
};
decltype(ircd::info::glibc_version_abi)
ircd::info::glibc_version_abi
{
"glibc", versions::ABI, 0, {0}, "<unknown>" //TODO: get this.
}; };
// //

View file

@ -10,27 +10,6 @@
#include <ircd/asio.h> #include <ircd/asio.h>
/// Boost version indicator for compiled header files.
decltype(ircd::boost_version)
ircd::boost_version
{
BOOST_VERSION / 100000,
BOOST_VERSION / 100 % 1000,
BOOST_VERSION % 100,
};
char ircd_boost_version_str_buf[32];
decltype(ircd::boost_version_str)
ircd::boost_version_str
(
ircd_boost_version_str_buf,
::snprintf(ircd_boost_version_str_buf, sizeof(ircd_boost_version_str_buf),
"%u.%u.%u",
boost_version[0],
boost_version[1],
boost_version[2])
);
/// Record of the ID of the thread static initialization took place on. /// Record of the ID of the thread static initialization took place on.
decltype(ircd::ios::static_thread_id) decltype(ircd::ios::static_thread_id)
ircd::ios::static_thread_id ircd::ios::static_thread_id
@ -45,6 +24,36 @@ ircd::ios::main_thread_id;
decltype(ircd::ios::user) decltype(ircd::ios::user)
ircd::ios::user; ircd::ios::user;
decltype(ircd::boost_version_api)
ircd::boost_version_api
{
"boost", info::versions::API, BOOST_VERSION,
{
BOOST_VERSION / 100000,
BOOST_VERSION / 100 % 1000,
BOOST_VERSION % 100,
},
// Version string generator since boost doesn't provide any strings.
[](auto &version, const auto &buf)
{
::snprintf(data(buf), size(buf), "%ld.%ld.%ld",
version[0],
version[1],
version[2]);
}
};
decltype(ircd::boost_version_abi)
ircd::boost_version_abi
{
"boost", info::versions::ABI, 0, {0}, "<unknown>" //TODO: get this
};
//
// init
//
void void
ircd::ios::init(asio::io_context &user) ircd::ios::init(asio::io_context &user)
{ {

View file

@ -26,6 +26,18 @@ namespace ircd::magic
static void version_check(); static void version_check();
} }
decltype(ircd::magic::version_api)
ircd::magic::version_api
{
"magic", info::versions::API, MAGIC_VERSION
};
decltype(ircd::magic::version_abi)
ircd::magic::version_abi
{
"magic", info::versions::ABI, ::magic_version()
};
ircd::magic::init::init() ircd::magic::init::init()
{ {
version_check(); version_check();
@ -158,22 +170,16 @@ ircd::magic::throw_on_error(const magic_t &cookie)
assert(magic_errno(cookie) == 0); assert(magic_errno(cookie) == 0);
} }
int
ircd::magic::version()
{
return ::magic_version();
}
void void
ircd::magic::version_check() ircd::magic::version_check()
{ {
if(likely(MAGIC_VERSION == version())) if(likely(MAGIC_VERSION == ::magic_version()))
return; return;
log::warning log::warning
{ {
"Linked libmagic version %d is not the compiled magic.h version %d.\n", "Linked libmagic version %d is not the compiled magic.h version %d.\n",
version(), ::magic_version(),
MAGIC_VERSION MAGIC_VERSION
}; };
} }

View file

@ -48,6 +48,18 @@ namespace ircd::openssl
// openssl.h // openssl.h
// //
decltype(ircd::openssl::version_api)
ircd::openssl::version_api
{
"OpenSSL", info::versions::API, OPENSSL_VERSION_NUMBER, {0}, OPENSSL_VERSION_TEXT
};
decltype(ircd::openssl::version_abi)
ircd::openssl::version_abi
{
"OpenSSL", info::versions::ABI, long(::SSLeay()), {0}, ::SSLeay_version(SSLEAY_VERSION)
};
// //
// SNI // SNI
// //
@ -1245,15 +1257,6 @@ ircd::openssl::error_string(const mutable_buffer &buf,
return { data(buf), strnlen(data(buf), size(buf)) }; return { data(buf), strnlen(data(buf), size(buf)) };
} }
std::pair<ircd::string_view, ircd::string_view>
ircd::openssl::version()
{
return
{
OPENSSL_VERSION_TEXT, SSLeay_version(SSLEAY_VERSION)
};
}
// //
// bio // bio
// //
@ -1601,13 +1604,12 @@ const
ircd::openssl::init::init() ircd::openssl::init::init()
{ {
const auto v(version()); if(long(version_api) != long(version_abi))
if(v.first != v.second)
log::warning log::warning
{ {
"Linked OpenSSL version '%s' is not the compiled OpenSSL version '%s'", "Linked OpenSSL version '%s' is not the compiled OpenSSL version '%s'",
v.first, string_view{version_api},
v.second string_view{version_abi},
}; };
OPENSSL_init(); OPENSSL_init();

View file

@ -29,11 +29,33 @@ struct throw_on_error
// ircd/nacl.h // ircd/nacl.h
// //
ircd::string_view decltype(ircd::nacl::version_api)
ircd::nacl::version() ircd::nacl::version_api
{ {
return ::sodium_version_string(); "sodium", info::versions::API, 0,
} {
SODIUM_LIBRARY_VERSION_MAJOR,
SODIUM_LIBRARY_VERSION_MINOR,
0
},
SODIUM_VERSION_STRING,
};
decltype(ircd::nacl::version_abi)
ircd::nacl::version_abi
{
"sodium", info::versions::ABI, 0,
{
::sodium_library_version_major(),
::sodium_library_version_minor(),
0
},
::sodium_version_string(),
};
//
// init
//
ircd::nacl::init::init() ircd::nacl::init::init()
{ {

View file

@ -643,16 +643,6 @@ console_cmd__version(opt &out, const string_view &line)
out << "info::server_agent " << info::server_agent << std::endl; out << "info::server_agent " << info::server_agent << std::endl;
out << std::endl; out << std::endl;
out << "info::kname " << info::kname << std::endl;
out << "info::kversion_str " << info::kversion_str << std::endl;
out << "info::glibc_version_str " << info::glibc_version_str << std::endl;
out << "ircd::boost_version_str " << ircd::boost_version_str << std::endl;
out << "db::version_str " << db::version_str << std::endl;
out << "nacl::version " << nacl::version() << std::endl;
out << "openssl::version " << openssl::version().second << std::endl;
out << "magic::version " << magic::version() << std::endl;
out << std::endl;
out << "VERSION " << VERSION << std::endl; out << "VERSION " << VERSION << std::endl;
out << std::endl; out << std::endl;

View file

@ -80,6 +80,24 @@ ircd::magick::yield_interval
{ "default", 768L }, { "default", 768L },
}; };
decltype(ircd::magick::version_api)
ircd::magick::version_api
{
"magick", info::versions::API, MagickLibVersion, {0}, MagickLibVersionText
};
decltype(ircd::magick::version_abi)
ircd::magick::version_abi
{
"magick", info::versions::ABI, 0, {0}, []
(auto &version, const auto &buf)
{
ulong monotonic(0);
strlcpy(buf, ::GetMagickVersion(&monotonic));
version.monotonic = monotonic;
}
};
// //
// init // init
// //
@ -87,26 +105,21 @@ ircd::magick::yield_interval
void void
ircd::magick::init() ircd::magick::init()
{ {
const auto version log::info
{ {
magick::version() log, "Initializing Magick Library version API:%lu [%s] ABI:%lu [%s]",
long(version_api),
string_view{version_api},
long(version_abi),
string_view{version_abi},
}; };
log::debug if(long(version_api) != long(version_abi))
{
log, "Initializing Magick Library version inc:%lu [%s] lib:%lu [%s]",
ulong(MagickLibVersion),
MagickLibVersionText,
std::get<0>(version),
std::get<1>(version),
};
if(std::get<0>(version) != ulong(MagickLibVersion))
log::warning log::warning
{ {
log, "Magick Library version mismatch headers:%lu library:%lu", log, "Magick Library version mismatch headers:%lu library:%lu",
ulong(MagickLibVersion), long(version_api),
std::get<0>(version), long(version_abi),
}; };
::MagickAllocFunctions(handle_free, handle_malloc, handle_realloc); ::MagickAllocFunctions(handle_free, handle_malloc, handle_realloc);
@ -144,18 +157,6 @@ ircd::magick::fini()
::DestroyMagick(); ::DestroyMagick();
} }
std::tuple<ulong, ircd::string_view>
ircd::magick::version()
{
ulong number(0);
const char *const string
{
::GetMagickVersion(&number)
};
return { number, string };
}
// //
// thumbcrop // thumbcrop
// //