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