diff options
Diffstat (limited to 'src/version.c')
-rw-r--r-- | src/version.c | 138 |
1 files changed, 138 insertions, 0 deletions
diff --git a/src/version.c b/src/version.c new file mode 100644 index 0000000..c921564 --- /dev/null +++ b/src/version.c @@ -0,0 +1,138 @@ +/* -*- mode: c; c-file-style: "openbsd" -*- */ +/* + * Copyright (c) 2016 Vincent Bernat <bernat@luffy.cx> + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#if HAVE_CONFIG_H +# include <config.h> +#endif + +#include <stdio.h> +#include "compat/compat.h" +#include "log.h" + +static void +version_display_array(FILE *destination, const char *prefix, const char *const *items) +{ + fprintf(destination, "%s", prefix); + size_t count = 0; + for (const char *const *p = items; *p; p++, count++) + fprintf(destination, "%s%s", count ? ", " : "", *p); + if (count == 0) + fprintf(destination, "(none)\n"); + else + fprintf(destination, "\n"); +} + +void +version_display(FILE *destination, const char *progname, int verbose) +{ + if (!verbose) { + fprintf(destination, "%s\n", PACKAGE_VERSION); + return; + } + + const char *const lldp_features[] = { +#ifdef ENABLE_LLDPMED + "LLDP-MED", +#endif +#ifdef ENABLE_DOT1 + "Dot1", +#endif +#ifdef ENABLE_DOT3 + "Dot3", +#endif +#ifdef ENABLE_CUSTOM + "Custom TLV", +#endif + NULL + }; + const char *const protocols[] = { +#ifdef ENABLE_CDP + "CDP", +#endif +#ifdef ENABLE_FDP + "FDP", +#endif +#ifdef ENABLE_EDP + "EDP", +#endif +#ifdef ENABLE_SONMP + "SONMP", +#endif + NULL + }; + const char *const output_formats[] = { "TEXT", "KV", "JSON", +#ifdef USE_XML + "XML", +#endif + NULL }; + + fprintf(destination, "%s %s\n", progname, PACKAGE_VERSION); + fprintf(destination, " Built on " BUILD_DATE "\n"); + fprintf(destination, "\n"); + + /* Features */ + if (!strcmp(progname, "lldpd")) { + version_display_array(destination, + "Additional LLDP features: ", lldp_features); + version_display_array(destination, + "Additional protocols: ", protocols); + fprintf(destination, + "SNMP support: " +#ifdef USE_SNMP + "yes\n" +#else + "no\n" +#endif + ); +#ifdef HOST_OS_LINUX + fprintf(destination, + "Old kernel support: " +# ifdef ENABLE_OLDIES + "yes" +# else + "no" +# endif + " (Linux " MIN_LINUX_KERNEL_VERSION "+)\n"); +#endif +#ifdef ENABLE_PRIVSEP + fprintf(destination, + "Privilege separation: " + "enabled\n"); + fprintf(destination, "Privilege separation user: " PRIVSEP_USER "\n"); + fprintf(destination, + "Privilege separation group: " PRIVSEP_GROUP "\n"); + fprintf(destination, + "Privilege separation chroot: " PRIVSEP_CHROOT "\n"); +#else + fprintf(destination, + "Privilege separation: " + "disabled\n"); +#endif + fprintf(destination, "Configuration directory: " SYSCONFDIR "\n"); + } + + if (!strcmp(progname, "lldpcli")) { + version_display_array(destination, + "Additional output formats: ", output_formats); + } + + fprintf(destination, "\n"); + + /* Build */ + fprintf(destination, "C compiler command: %s\n", LLDP_CC); + fprintf(destination, "Linker command: %s\n", LLDP_LD); +} |