Tizen 2.1 base
[platform/upstream/libnl2.git] / src / nl-list-caches.c
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
15 static void print_usage(void)
16 {
17         fprintf(stderr, "Usage: nl-list-caches\n");
18         exit(1);
19 }
20
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
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
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 }