Print this page
4770 soconfig(1M) needs an option to print the in-kernel socket configuration table
@@ -18,10 +18,11 @@
*
* CDDL HEADER END
*/
/*
* Copyright (c) 1995, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright 2015 Nexenta Systems, Inc. All rights reserved.
*/
#include <ctype.h>
#include <dirent.h>
#include <errno.h>
@@ -52,10 +53,13 @@
* registers
*
* soconfig <fam> <type> <protocol>
* deregisters
*
+ * soconfig -l
+ * print the in-kernel socket configuration table
+ *
* Filter Operations (Consolidation Private):
*
* soconfig -F <name> <modname> {auto [top | bottom | before:filter |
* after:filter] | prog} <fam>:<type>:<proto>,...
* configure filter
@@ -77,10 +81,12 @@
static void usage(void);
static int parse_filter_params(int argc, char **argv);
+static int print_socktable();
+
int
main(argc, argv)
int argc;
char *argv[];
{
@@ -92,10 +98,15 @@
#if !defined(TEXT_DOMAIN)
#define TEXT_DOMAIN "SYS_TEST"
#endif
(void) textdomain(TEXT_DOMAIN);
+ if (argc == 1 && strcmp(argv[0], "-l") == 0) {
+ ret = print_socktable();
+ exit(ret);
+ }
+
if (argc >= 2 && strcmp(argv[0], "-F") == 0) {
argc--; argv++;
ret = parse_filter_params(argc, argv);
exit(ret);
}
@@ -126,11 +137,12 @@
{
fprintf(stderr, gettext(
"Usage: soconfig -d <dir>\n"
"\tsoconfig -f <file>\n"
"\tsoconfig <fam> <type> <protocol> <path|module>\n"
- "\tsoconfig <fam> <type> <protocol>\n"));
+ "\tsoconfig <fam> <type> <protocol>\n"
+ "\tsoconfig -l\n"));
}
/*
* Parse all files in the given directory.
*/
@@ -573,5 +585,61 @@
return (1);
}
free(socktuples);
return (0);
}
+
+/*
+ * Print the in-kernel socket configuration table
+ */
+
+static int
+print_socktable()
+{
+ sockconfig_socktable_t sc_table;
+ int i;
+
+ (void) memset(&sc_table, 0, sizeof (sockconfig_socktable_t));
+
+ /* get number of entries */
+ if (_sockconfig(SOCKCONFIG_GET_SOCKTABLE, &sc_table) == -1) {
+ fprintf(stderr,
+ gettext("cannot get in-kernel socket table: %s\n"),
+ strerror(errno));
+ return (-1);
+ }
+ if (sc_table.num_of_entries == 0)
+ return (0);
+
+ sc_table.st_entries = calloc(sc_table.num_of_entries,
+ sizeof (sockconfig_socktable_entry_t));
+ if (sc_table.st_entries == NULL) {
+ fprintf(stderr, gettext("out of memory\n"));
+ return (-1);
+ }
+
+ /* get socket table entries */
+ if (_sockconfig(SOCKCONFIG_GET_SOCKTABLE, &sc_table) == -1) {
+ fprintf(stderr,
+ gettext("cannot get in-kernel socket table: %s\n"),
+ strerror(errno));
+ return (-1);
+ }
+
+ printf("%6s %4s %5s %15s %15s %6s %6s\n",
+ "FAMILY", "TYPE", "PROTO", "STRDEV", "SOCKMOD",
+ "REFS", "FLAGS");
+ for (i = 0; i < sc_table.num_of_entries; i++) {
+ printf("%6u %4u %5u %15s %15s %6u %#6x\n",
+ sc_table.st_entries[i].se_family,
+ sc_table.st_entries[i].se_type,
+ sc_table.st_entries[i].se_protocol,
+ (strcmp(sc_table.st_entries[i].se_modname,
+ "socktpi") == 0) ?
+ sc_table.st_entries[i].se_strdev : "-",
+ sc_table.st_entries[i].se_modname,
+ sc_table.st_entries[i].se_refcnt,
+ sc_table.st_entries[i].se_flags);
+ }
+ free(sc_table.st_entries);
+ return (0);
+}