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
print_usage(void)15 static void print_usage(void)
16 {
17 fprintf(stderr, "Usage: nl-list-caches\n");
18 exit(1);
19 }
20
id_attr_list(struct nl_object_ops * ops,char * buf,size_t len)21 static 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
print(struct nl_cache_ops * ops,void * arg)31 static 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
main(int argc,char * argv[])110 int 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