1/*
2 * nl-list-caches.c	List registered cache types
3 *
4 *	This library is free software; you can redistribute it and/or
5 *	modify it under the terms of the GNU Lesser General Public
6 *	License as published by the Free Software Foundation version 2.1
7 *	of the License.
8 *
9 * Copyright (c) 2003-2009 Thomas Graf <tgraf@suug.ch>
10 */
11
12#include <netlink-local.h>
13#include <netlink/cli/utils.h>
14
15static void print_usage(void)
16{
17	fprintf(stderr, "Usage: nl-list-caches\n");
18	exit(1);
19}
20
21static char *id_attr_list(struct nl_object_ops *ops, char *buf, size_t len)
22{
23	if (ops->oo_attrs2str != NULL)
24		return ops->oo_attrs2str(ops->oo_id_attrs, buf, len);
25	else {
26		memset(buf, 0, len);
27		return buf;
28	}
29}
30
31static void print(struct nl_cache_ops *ops, void *arg)
32{
33	char buf[64];
34
35	printf("%s:\n" \
36	       "    hdrsize: %d bytes\n" \
37	       "    protocol: %s\n" \
38	       "    request-update: %s\n" \
39	       "    msg-parser: %s\n",
40	       ops->co_name, ops->co_hdrsize,
41	       nl_nlfamily2str(ops->co_protocol, buf, sizeof(buf)),
42	       ops->co_request_update ? "yes" : "no",
43	       ops->co_msg_parser ? "yes" : "no");
44
45	if (ops->co_obj_ops) {
46		struct nl_object_ops *obj_ops = ops->co_obj_ops;
47		const char *dump_names[NL_DUMP_MAX+1] = {
48			"brief",
49			"detailed",
50			"stats",
51			"env",
52		};
53		int i;
54
55		printf("    cacheable object:\n" \
56		       "        name: %s:\n" \
57		       "        size: %zu bytes\n" \
58		       "        constructor: %s\n" \
59		       "        free-data: %s\n" \
60		       "        clone: %s\n" \
61		       "        compare: %s\n" \
62		       "        id attributes: %s\n" \
63		       "        dump: ",
64		       obj_ops->oo_name, obj_ops->oo_size,
65		       obj_ops->oo_constructor ? "yes" : "no",
66		       obj_ops->oo_free_data ? "yes" : "no",
67		       obj_ops->oo_clone ? "yes" : "no",
68		       obj_ops->oo_compare ? "yes" : "no",
69		       id_attr_list(obj_ops, buf, sizeof(buf)));
70
71		for (i = 0; i <= NL_DUMP_MAX; i++)
72			if (obj_ops->oo_dump[i])
73				printf("%s%s",
74				i == 0 ? "" : ", ",
75				dump_names[i]);
76
77		printf("\n");
78	}
79
80	if (ops->co_genl) {
81		struct genl_ops *genl_ops = ops->co_genl;
82
83		printf("    genl:\n" \
84		       "        name: %s\n" \
85		       "        family: %d\n" \
86		       "        id: %d\n",
87		       genl_ops->o_name, genl_ops->o_family, genl_ops->o_id);
88
89		if (genl_ops->o_ncmds) {
90			int i;
91
92			printf("        cmds:\n");
93
94			for (i = 0; i < genl_ops->o_ncmds; i++) {
95				struct genl_cmd *cmd = &genl_ops->o_cmds[i];
96
97				printf("            %s:\n"
98				       "                id: %d\n" \
99				       "                maxattr: %d\n" \
100				       "                msg-parser: %s\n" \
101				       "                attr-policy: %s\n",
102				       cmd->c_name, cmd->c_id, cmd->c_maxattr,
103				       cmd->c_msg_parser ? "yes" : "no",
104				       cmd->c_attr_policy ? "yes" : "no");
105			}
106		}
107	}
108}
109
110int main(int argc, char *argv[])
111{
112	if (argc > 1 && !strcasecmp(argv[1], "-h"))
113		print_usage();
114
115	nl_cache_ops_foreach(print, NULL);
116
117	return 0;
118}
119