lib: add "show modules" CLI command

(for simplicity, this is stuffed in with memory_vty.c)

Signed-off-by: David Lamparter <equinox@opensourcerouting.org>
This commit is contained in:
David Lamparter 2017-02-12 23:23:02 +01:00
parent 30771d65b2
commit b249c083d5
2 changed files with 101 additions and 18 deletions

View file

@ -1354,13 +1354,49 @@ int main(void);
AC_DEFINE_UNQUOTED(AS_TR_CPP(SNMP_${SNMP_METHOD}),,SNMP method to interface with snmpd) AC_DEFINE_UNQUOTED(AS_TR_CPP(SNMP_${SNMP_METHOD}),,SNMP method to interface with snmpd)
fi fi
dnl ------ dnl ---------------
dnl dlopen dnl dlopen & dlinfo
dnl ------ dnl ---------------
AC_SEARCH_LIBS(dlopen, [dl dld], [], [ AC_SEARCH_LIBS(dlopen, [dl dld], [], [
AC_MSG_ERROR([unable to find the dlopen()]) AC_MSG_ERROR([unable to find the dlopen()])
]) ])
AC_CHECK_HEADERS([link.h])
AC_MSG_CHECKING([for dlinfo(RTLD_DI_ORIGIN)])
AC_LINK_IFELSE([AC_LANG_PROGRAM([[
#include <stdlib.h>
#ifdef HAVE_LINK_H
#include <link.h>
#endif
#include <dlfcn.h>
]], [[
char origin[1];
dlinfo (NULL, RTLD_DI_ORIGIN, &origin);
]])], [
AC_MSG_RESULT(yes)
AC_DEFINE(HAVE_DLINFO_ORIGIN, 1, [Have dlinfo RTLD_DI_ORIGIN])
], [
AC_MSG_RESULT(no)
])
AC_MSG_CHECKING([for dlinfo(RTLD_DI_LINKMAP)])
AC_LINK_IFELSE([AC_LANG_PROGRAM([[
#include <stdlib.h>
#ifdef HAVE_LINK_H
#include <link.h>
#endif
#include <dlfcn.h>
]], [[
struct link_map *lm = NULL;
dlinfo (NULL, RTLD_DI_LINKMAP, &lm);
]])], [
AC_MSG_RESULT(yes)
AC_DEFINE(HAVE_DLINFO_LINKMAP, 1, [Have dlinfo RTLD_DI_LINKMAP])
], [
AC_MSG_RESULT(no)
])
dnl --------------------------- dnl ---------------------------
dnl sockaddr and netinet checks dnl sockaddr and netinet checks

View file

@ -1,23 +1,22 @@
/* /*
* Memory management routine * Memory and dynamic module VTY routine
*
* Copyright (C) 1998 Kunihiro Ishiguro * Copyright (C) 1998 Kunihiro Ishiguro
* Copyright (C) 2016-2017 David Lamparter for NetDEF, Inc.
* *
* This file is part of GNU Zebra. * This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the Free
* Software Foundation; either version 2 of the License, or (at your option)
* any later version.
* *
* GNU Zebra is free software; you can redistribute it and/or modify it * This program is distributed in the hope that it will be useful, but WITHOUT
* under the terms of the GNU General Public License as published by the * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* Free Software Foundation; either version 2, or (at your option) any * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* later version. * more details.
* *
* GNU Zebra is distributed in the hope that it will be useful, but * You should have received a copy of the GNU General Public License along with
* WITHOUT ANY WARRANTY; without even the implied warranty of * this program; if not, write to the Free Software Foundation, Inc., 59 Temple
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Place, Suite 330, Boston, MA 02111-1307 USA
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with GNU Zebra; see the file COPYING. If not, write to the Free
* Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
* 02111-1307, USA.
*/ */
#include <zebra.h> #include <zebra.h>
@ -25,9 +24,12 @@
#if (defined(GNU_LINUX) && defined(HAVE_MALLINFO)) #if (defined(GNU_LINUX) && defined(HAVE_MALLINFO))
#include <malloc.h> #include <malloc.h>
#endif /* HAVE_MALLINFO */ #endif /* HAVE_MALLINFO */
#include <dlfcn.h>
#include <link.h>
#include "log.h" #include "log.h"
#include "memory.h" #include "memory.h"
#include "module.h"
#include "memory_vty.h" #include "memory_vty.h"
/* Looking up memory status from vty interface. */ /* Looking up memory status from vty interface. */
@ -110,10 +112,55 @@ DEFUN (show_memory,
return CMD_SUCCESS; return CMD_SUCCESS;
} }
DEFUN (show_modules,
show_modules_cmd,
"show modules",
"Show running system information\n"
"Loaded modules\n")
{
struct frrmod_runtime *plug = frrmod_list;
vty_out (vty, "%-12s %-25s %s%s%s",
"Plugin Name", "Version", "Description",
VTY_NEWLINE, VTY_NEWLINE);
while (plug)
{
const struct frrmod_info *i = plug->info;
vty_out (vty, "%-12s %-25s %s%s", i->name, i->version, i->description,
VTY_NEWLINE);
if (plug->dl_handle)
{
#ifdef HAVE_DLINFO_ORIGIN
char origin[MAXPATHLEN] = "";
dlinfo (plug->dl_handle, RTLD_DI_ORIGIN, &origin);
# ifdef HAVE_DLINFO_LINKMAP
const char *name;
struct link_map *lm = NULL;
dlinfo (plug->dl_handle, RTLD_DI_LINKMAP, &lm);
if (lm)
{
name = strrchr(lm->l_name, '/');
name = name ? name + 1 : lm->l_name;
vty_out (vty, "\tfrom: %s/%s%s", origin, name, VTY_NEWLINE);
}
# else
vty_out (vty, "\tfrom: %s %s", origin, plug->load_name, VTY_NEWLINE);
# endif
#else
vty_out (vty, "\tfrom: %s%s", plug->load_name, VTY_NEWLINE);
#endif
}
plug = plug->next;
}
return CMD_SUCCESS;
}
void void
memory_init (void) memory_init (void)
{ {
install_element (VIEW_NODE, &show_memory_cmd); install_element (VIEW_NODE, &show_memory_cmd);
install_element (VIEW_NODE, &show_modules_cmd);
} }
/* Stats querying from users */ /* Stats querying from users */