lsirq: add new command

Signed-off-by: Karel Zak <kzak@redhat.com>
This commit is contained in:
Karel Zak 2020-03-06 16:21:10 +01:00
parent cb267d2a29
commit a0f62b0b20
8 changed files with 207 additions and 4 deletions

1
.gitignore vendored
View File

@ -115,6 +115,7 @@ ylwrap
/losetup
/lsblk
/lsipc
/lsirq
/lscpu
/lslocks
/lslogins

View File

@ -1768,14 +1768,28 @@ AC_ARG_ENABLE([ipcs],
UL_BUILD_INIT([ipcs])
AM_CONDITIONAL([BUILD_IPCS], [test "x$build_ipcs" = xyes])
AC_ARG_ENABLE([irqtop],
AS_HELP_STRING([--disable-irqtop], [do not build irqtop]),
[], [UL_DEFAULT_ENABLE([irqtop], [yes])]
)
UL_BUILD_INIT([irqtop])
UL_REQUIRES_LINUX([irqtop])
UL_REQUIRES_BUILD([irqtop], [libsmartcols])
UL_REQUIRES_HAVE([irqtop], [open_memstream], [open_memstream function])
UL_REQUIRES_HAVE([irqtop], [ncursesw,slang,ncurses], [ncursesw, ncurses or slang library])
AM_CONDITIONAL([BUILD_IRQTOP], [test "x$build_irqtop" = xyes])
AC_ARG_ENABLE([lsirq],
AS_HELP_STRING([--disable-lsirq], [do not build lsirq]),
[], [UL_DEFAULT_ENABLE([lsirq], [yes])]
)
UL_BUILD_INIT([lsirq])
UL_REQUIRES_LINUX([lsirq])
UL_REQUIRES_BUILD([lsirq], [libsmartcols])
AM_CONDITIONAL([BUILD_LSIRQ], [test "x$build_lsirq" = xyes])
UL_BUILD_INIT([choom], [check])
UL_REQUIRES_LINUX([choom])
AM_CONDITIONAL([BUILD_CHOOM], [test "x$build_choom" = xyes])

View File

@ -61,6 +61,16 @@ irqtop_LDADD = $(LDADD) libcommon.la $(NCURSES_LIBS) $(REALTIME_LIBS) libsmartco
irqtop_CFLAGS = $(AM_CFLAGS) $(NCURSES_CFLAGS) -I$(ul_libsmartcols_incdir)
endif
if BUILD_LSIRQ
usrbin_exec_PROGRAMS += lsirq
dist_man_MANS += sys-utils/lsirq.1
lsirq_SOURCES = sys-utils/lsirq.c \
sys-utils/irq-common.c \
sys-utils/irq-common.h
lsirq_LDADD = $(LDADD) libcommon.la libsmartcols.la
lsirq_CFLAGS = $(AM_CFLAGS) -I$(ul_libsmartcols_incdir)
endif
if BUILD_LSIPC
usrbin_exec_PROGRAMS += lsipc
dist_man_MANS += sys-utils/lsipc.1

View File

@ -85,12 +85,15 @@ static inline const struct colinfo *get_column_info(
return &infos[get_column_id(out, num)];
}
void irq_print_columns(FILE *f)
void irq_print_columns(FILE *f, int nodelta)
{
size_t i;
for (i = 0; i < ARRAY_SIZE(infos); i++)
for (i = 0; i < ARRAY_SIZE(infos); i++) {
if (nodelta && i == COL_DELTA)
continue;
fprintf(f, " %-5s %s\n", infos[i].name, _(infos[i].help));
}
}
static struct libscols_table *new_scols_table(struct irq_output *out)

View File

@ -48,7 +48,7 @@ struct irq_output {
int irq_column_name_to_id(char const *const name, size_t const namesz);
void free_irqstat(struct irq_stat *stat);
void irq_print_columns(FILE *f);
void irq_print_columns(FILE *f, int nodelta);
void set_sort_func_by_name(struct irq_output *out, const char *name);
void set_sort_func_by_key(struct irq_output *out, const char c);

View File

@ -232,7 +232,7 @@ static void __attribute__((__noreturn__)) usage(void)
fputs(_(" q Q quit program\n"), stdout);
fputs(USAGE_COLUMNS, stdout);
irq_print_columns(stdout);
irq_print_columns(stdout, 0);
printf(USAGE_MAN_TAIL("irqtop(1)"));
exit(EXIT_SUCCESS);

47
sys-utils/lsirq.1 Normal file
View File

@ -0,0 +1,47 @@
.TH IRQTOP "1" "February 2020" "util-linux" "User Commands"
.SH NAME
lsirq \- utility to display kernel interrupt information
.SH SYNOPSIS
.B lsirq
[options]
.SH DESCRIPTION
Display kernel interrupt counter information.
.PP
The default output is subject to change. So whenever possible,
you should avoid using default outputs in your scripts. Always
explicitly define expected columns by using \fB\-\-output\fR.
.SH OPTIONS
.TP
.BR \-o , " \-\-output " \fIlist\fP
Specify which output columns to print. Use \fB\-\-help\fR to get a list of all supported columns.
The default list of columns may be extended if list is specified in the format +list.
.TP
.BR \-s , " \-\-sort " \fIcolumn\fP
Specify sort criteria by column name. See \fB\-\-help\fR output to get column
names.
.TP
.BR \-J , " \-\-json
Update interrupt output every
.TP
.BR \-V ", " \-\-version
Display version information and exit.
.TP
.BR \-h ,\ \-\-help
Display help text and exit.
.SH AUTHORS
.MT pizhenwei@\:bytedance.com
Zhenwei Pi
.ME
.br
.MT kerolasa@\:iki.fi
Sami Kerola
.ME
.br
.MT kzak@\:redhat.com
Karel Zak
.ME
.SH AVAILABILITY
The example command is part of the util-linux package and is available from
.UR https://\:www.kernel.org\:/pub\:/linux\:/utils\:/util-linux/
Linux Kernel Archive
.UE .

128
sys-utils/lsirq.c Normal file
View File

@ -0,0 +1,128 @@
/*
* lsirq - utility to display kernel interrupt information.
*
* Copyright (C) 2019 zhenwei pi <pizhenwei@bytedance.com>
* Copyright (C) 2020 Karel Zak <kzak@redhat.com>
*
* This library 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.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include <ctype.h>
#include <errno.h>
#include <getopt.h>
#include <limits.h>
#include <locale.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <unistd.h>
#include <libsmartcols.h>
#include "closestream.h"
#include "strutils.h"
#include "xalloc.h"
#include "irq-common.h"
static int print_irq_data(struct irq_output *out)
{
struct libscols_table *table;
table = get_scols_table(out, NULL, NULL);
if (!table)
return -1;
scols_print_table(table);
scols_unref_table(table);
return 0;
}
static void __attribute__((__noreturn__)) usage(void)
{
fputs(USAGE_HEADER, stdout);
printf(_(" %s [options]\n"), program_invocation_short_name);
fputs(USAGE_SEPARATOR, stdout);
puts(_("Utility to display kernel interrupt information."));
fputs(USAGE_OPTIONS, stdout);
fputs(_(" -J, --json use JSON output format\n"), stdout);
fputs(_(" -o, --output <list> define which output columns to use\n"), stdout);
fputs(_(" -s, --sort <column> specify sort column\n"), stdout);
fputs(USAGE_SEPARATOR, stdout);
printf(USAGE_HELP_OPTIONS(22));
fputs(USAGE_COLUMNS, stdout);
irq_print_columns(stdout, 1);
printf(USAGE_MAN_TAIL("lsirq(1)"));
exit(EXIT_SUCCESS);
}
int main(int argc, char **argv)
{
struct irq_output out = {
.ncolumns = 0
};
static const struct option longopts[] = {
{"sort", required_argument, NULL, 's'},
{"output", required_argument, NULL, 'o'},
{"json", no_argument, NULL, 'J'},
{"help", no_argument, NULL, 'h'},
{"version", no_argument, NULL, 'V'},
{NULL, 0, NULL, 0}
};
int c;
const char *outarg = NULL;
setlocale(LC_ALL, "");
while ((c = getopt_long(argc, argv, "o:s:hJV", longopts, NULL)) != -1) {
switch (c) {
case 'J':
out.json = 1;
break;
case 'o':
outarg = optarg;
break;
case 's':
set_sort_func_by_name(&out, optarg);
break;
case 'V':
print_version(EXIT_SUCCESS);
case 'h':
usage();
default:
errtryhelp(EXIT_FAILURE);
}
}
/* default */
if (!out.ncolumns) {
out.columns[out.ncolumns++] = COL_IRQ;
out.columns[out.ncolumns++] = COL_TOTAL;
out.columns[out.ncolumns++] = COL_NAME;
}
/* add -o [+]<list> to putput */
if (outarg && string_add_to_idarray(outarg, out.columns,
ARRAY_SIZE(out.columns),
&out.ncolumns,
irq_column_name_to_id) < 0)
exit(EXIT_FAILURE);
return print_irq_data(&out) == 0 ? EXIT_SUCCESS : EXIT_FAILURE;
}