/* SPDX-License-Identifier: LGPL-2.1-or-later */ /* * This file is part of libmount from util-linux project. * * Copyright (C) 2008-2018 Karel Zak * * libmount is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or * (at your option) any later version. */ /** * SECTION: version-utils * @title: Version functions * @short_description: functions to get the library version. */ #include #include "mountP.h" static const char *lib_version = LIBMOUNT_VERSION; static const char *lib_features[] = { #ifdef HAVE_LIBSELINUX "selinux", #endif #ifdef HAVE_SMACK "smack", #endif #ifdef HAVE_BTRFS_SUPPORT "btrfs", #endif #ifdef USE_LIBMOUNT_SUPPORT_MTAB "mtab", #endif #ifdef USE_LIBMOUNT_SUPPORT_NAMESPACES "namespaces", #endif #if !defined(NDEBUG) "assert", /* libc assert.h stuff */ #endif "debug", /* always enabled */ NULL }; /** * mnt_parse_version_string: * @ver_string: version string (e.g "2.18.0") * * Returns: release version code. */ int mnt_parse_version_string(const char *ver_string) { const char *cp; int version = 0; assert(ver_string); for (cp = ver_string; *cp; cp++) { if (*cp == '.') continue; if (!isdigit(*cp)) break; version = (version * 10) + (*cp - '0'); } return version; } /** * mnt_get_library_version: * @ver_string: return pointer to the static library version string if not NULL * * Returns: release version number. */ int mnt_get_library_version(const char **ver_string) { if (ver_string) *ver_string = lib_version; return mnt_parse_version_string(lib_version); } /** * mnt_get_library_features: * @features: returns a pointer to the static array of strings, the array is * terminated by NULL. * * Returns: number of items in the features array not including the last NULL, * or less than zero in case of error * * Example: * * * const char **features; * * mnt_get_library_features(&features); * while (features && *features) * printf("%s\n", *features++); * * * */ int mnt_get_library_features(const char ***features) { if (!features) return -EINVAL; *features = lib_features; return ARRAY_SIZE(lib_features) - 1; } #ifdef TEST_PROGRAM static int test_version(struct libmnt_test *ts, int argc, char *argv[]) { const char *ver; const char **features; if (argc == 2) printf("Your version: %d\n", mnt_parse_version_string(argv[1])); mnt_get_library_version(&ver); printf("Library version: %s\n", ver); printf("Library API version: " LIBMOUNT_VERSION "\n"); printf("Library features:"); mnt_get_library_features(&features); while (features && *features) printf(" %s", *features++); printf("\n"); if (mnt_get_library_version(NULL) == mnt_parse_version_string(LIBMOUNT_VERSION)) return 0; return -1; } int main(int argc, char *argv[]) { struct libmnt_test ts[] = { { "--print", test_version, "print versions" }, { NULL } }; return mnt_run_test(ts, argc, argv); } #endif