144d362409d5469aed47d19e7908d19bd194493aThomas Graf/*
244d362409d5469aed47d19e7908d19bd194493aThomas Graf * nl-list-caches.c	List registered cache types
344d362409d5469aed47d19e7908d19bd194493aThomas Graf *
444d362409d5469aed47d19e7908d19bd194493aThomas Graf *	This library is free software; you can redistribute it and/or
544d362409d5469aed47d19e7908d19bd194493aThomas Graf *	modify it under the terms of the GNU Lesser General Public
644d362409d5469aed47d19e7908d19bd194493aThomas Graf *	License as published by the Free Software Foundation version 2.1
744d362409d5469aed47d19e7908d19bd194493aThomas Graf *	of the License.
844d362409d5469aed47d19e7908d19bd194493aThomas Graf *
98808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf * Copyright (c) 2003-2009 Thomas Graf <tgraf@suug.ch>
1044d362409d5469aed47d19e7908d19bd194493aThomas Graf */
1144d362409d5469aed47d19e7908d19bd194493aThomas Graf
12ff05f2ffc3caea6c59b6c940aa80e1314783a070Thomas Graf#include <netlink-local.h>
138808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf#include <netlink/cli/utils.h>
1444d362409d5469aed47d19e7908d19bd194493aThomas Graf
1544d362409d5469aed47d19e7908d19bd194493aThomas Grafstatic void print_usage(void)
1644d362409d5469aed47d19e7908d19bd194493aThomas Graf{
1744d362409d5469aed47d19e7908d19bd194493aThomas Graf	fprintf(stderr, "Usage: nl-list-caches\n");
1844d362409d5469aed47d19e7908d19bd194493aThomas Graf	exit(1);
1944d362409d5469aed47d19e7908d19bd194493aThomas Graf}
2044d362409d5469aed47d19e7908d19bd194493aThomas Graf
2144d362409d5469aed47d19e7908d19bd194493aThomas Grafstatic char *id_attr_list(struct nl_object_ops *ops, char *buf, size_t len)
2244d362409d5469aed47d19e7908d19bd194493aThomas Graf{
2344d362409d5469aed47d19e7908d19bd194493aThomas Graf	if (ops->oo_attrs2str != NULL)
2444d362409d5469aed47d19e7908d19bd194493aThomas Graf		return ops->oo_attrs2str(ops->oo_id_attrs, buf, len);
2544d362409d5469aed47d19e7908d19bd194493aThomas Graf	else {
2644d362409d5469aed47d19e7908d19bd194493aThomas Graf		memset(buf, 0, len);
2744d362409d5469aed47d19e7908d19bd194493aThomas Graf		return buf;
2844d362409d5469aed47d19e7908d19bd194493aThomas Graf	}
2944d362409d5469aed47d19e7908d19bd194493aThomas Graf}
3044d362409d5469aed47d19e7908d19bd194493aThomas Graf
3144d362409d5469aed47d19e7908d19bd194493aThomas Grafstatic void print(struct nl_cache_ops *ops, void *arg)
3244d362409d5469aed47d19e7908d19bd194493aThomas Graf{
3344d362409d5469aed47d19e7908d19bd194493aThomas Graf	char buf[64];
3444d362409d5469aed47d19e7908d19bd194493aThomas Graf
3544d362409d5469aed47d19e7908d19bd194493aThomas Graf	printf("%s:\n" \
3644d362409d5469aed47d19e7908d19bd194493aThomas Graf	       "    hdrsize: %d bytes\n" \
3744d362409d5469aed47d19e7908d19bd194493aThomas Graf	       "    protocol: %s\n" \
3844d362409d5469aed47d19e7908d19bd194493aThomas Graf	       "    request-update: %s\n" \
3944d362409d5469aed47d19e7908d19bd194493aThomas Graf	       "    msg-parser: %s\n",
4044d362409d5469aed47d19e7908d19bd194493aThomas Graf	       ops->co_name, ops->co_hdrsize,
4144d362409d5469aed47d19e7908d19bd194493aThomas Graf	       nl_nlfamily2str(ops->co_protocol, buf, sizeof(buf)),
4244d362409d5469aed47d19e7908d19bd194493aThomas Graf	       ops->co_request_update ? "yes" : "no",
4344d362409d5469aed47d19e7908d19bd194493aThomas Graf	       ops->co_msg_parser ? "yes" : "no");
4444d362409d5469aed47d19e7908d19bd194493aThomas Graf
4544d362409d5469aed47d19e7908d19bd194493aThomas Graf	if (ops->co_obj_ops) {
4644d362409d5469aed47d19e7908d19bd194493aThomas Graf		struct nl_object_ops *obj_ops = ops->co_obj_ops;
4744d362409d5469aed47d19e7908d19bd194493aThomas Graf		const char *dump_names[NL_DUMP_MAX+1] = {
4844d362409d5469aed47d19e7908d19bd194493aThomas Graf			"brief",
4944d362409d5469aed47d19e7908d19bd194493aThomas Graf			"detailed",
5044d362409d5469aed47d19e7908d19bd194493aThomas Graf			"stats",
5144d362409d5469aed47d19e7908d19bd194493aThomas Graf			"env",
5244d362409d5469aed47d19e7908d19bd194493aThomas Graf		};
5344d362409d5469aed47d19e7908d19bd194493aThomas Graf		int i;
5444d362409d5469aed47d19e7908d19bd194493aThomas Graf
5544d362409d5469aed47d19e7908d19bd194493aThomas Graf		printf("    cacheable object:\n" \
5644d362409d5469aed47d19e7908d19bd194493aThomas Graf		       "        name: %s:\n" \
57936c9844b0ff4aab06301f18fe31e08b1818d0a2Patrick McHardy		       "        size: %zu bytes\n" \
5844d362409d5469aed47d19e7908d19bd194493aThomas Graf		       "        constructor: %s\n" \
5944d362409d5469aed47d19e7908d19bd194493aThomas Graf		       "        free-data: %s\n" \
6044d362409d5469aed47d19e7908d19bd194493aThomas Graf		       "        clone: %s\n" \
6144d362409d5469aed47d19e7908d19bd194493aThomas Graf		       "        compare: %s\n" \
6244d362409d5469aed47d19e7908d19bd194493aThomas Graf		       "        id attributes: %s\n" \
6344d362409d5469aed47d19e7908d19bd194493aThomas Graf		       "        dump: ",
6444d362409d5469aed47d19e7908d19bd194493aThomas Graf		       obj_ops->oo_name, obj_ops->oo_size,
6544d362409d5469aed47d19e7908d19bd194493aThomas Graf		       obj_ops->oo_constructor ? "yes" : "no",
6644d362409d5469aed47d19e7908d19bd194493aThomas Graf		       obj_ops->oo_free_data ? "yes" : "no",
6744d362409d5469aed47d19e7908d19bd194493aThomas Graf		       obj_ops->oo_clone ? "yes" : "no",
6844d362409d5469aed47d19e7908d19bd194493aThomas Graf		       obj_ops->oo_compare ? "yes" : "no",
6944d362409d5469aed47d19e7908d19bd194493aThomas Graf		       id_attr_list(obj_ops, buf, sizeof(buf)));
7044d362409d5469aed47d19e7908d19bd194493aThomas Graf
7144d362409d5469aed47d19e7908d19bd194493aThomas Graf		for (i = 0; i <= NL_DUMP_MAX; i++)
7244d362409d5469aed47d19e7908d19bd194493aThomas Graf			if (obj_ops->oo_dump[i])
7344d362409d5469aed47d19e7908d19bd194493aThomas Graf				printf("%s%s",
7444d362409d5469aed47d19e7908d19bd194493aThomas Graf				i == 0 ? "" : ", ",
7544d362409d5469aed47d19e7908d19bd194493aThomas Graf				dump_names[i]);
7644d362409d5469aed47d19e7908d19bd194493aThomas Graf
7744d362409d5469aed47d19e7908d19bd194493aThomas Graf		printf("\n");
7844d362409d5469aed47d19e7908d19bd194493aThomas Graf	}
7944d362409d5469aed47d19e7908d19bd194493aThomas Graf
8044d362409d5469aed47d19e7908d19bd194493aThomas Graf	if (ops->co_genl) {
8144d362409d5469aed47d19e7908d19bd194493aThomas Graf		struct genl_ops *genl_ops = ops->co_genl;
8244d362409d5469aed47d19e7908d19bd194493aThomas Graf
8344d362409d5469aed47d19e7908d19bd194493aThomas Graf		printf("    genl:\n" \
8444d362409d5469aed47d19e7908d19bd194493aThomas Graf		       "        name: %s\n" \
8544d362409d5469aed47d19e7908d19bd194493aThomas Graf		       "        family: %d\n" \
8644d362409d5469aed47d19e7908d19bd194493aThomas Graf		       "        id: %d\n",
8744d362409d5469aed47d19e7908d19bd194493aThomas Graf		       genl_ops->o_name, genl_ops->o_family, genl_ops->o_id);
8844d362409d5469aed47d19e7908d19bd194493aThomas Graf
8944d362409d5469aed47d19e7908d19bd194493aThomas Graf		if (genl_ops->o_ncmds) {
9044d362409d5469aed47d19e7908d19bd194493aThomas Graf			int i;
9144d362409d5469aed47d19e7908d19bd194493aThomas Graf
9244d362409d5469aed47d19e7908d19bd194493aThomas Graf			printf("        cmds:\n");
9344d362409d5469aed47d19e7908d19bd194493aThomas Graf
9444d362409d5469aed47d19e7908d19bd194493aThomas Graf			for (i = 0; i < genl_ops->o_ncmds; i++) {
9544d362409d5469aed47d19e7908d19bd194493aThomas Graf				struct genl_cmd *cmd = &genl_ops->o_cmds[i];
9644d362409d5469aed47d19e7908d19bd194493aThomas Graf
9744d362409d5469aed47d19e7908d19bd194493aThomas Graf				printf("            %s:\n"
9844d362409d5469aed47d19e7908d19bd194493aThomas Graf				       "                id: %d\n" \
9944d362409d5469aed47d19e7908d19bd194493aThomas Graf				       "                maxattr: %d\n" \
10044d362409d5469aed47d19e7908d19bd194493aThomas Graf				       "                msg-parser: %s\n" \
10144d362409d5469aed47d19e7908d19bd194493aThomas Graf				       "                attr-policy: %s\n",
10244d362409d5469aed47d19e7908d19bd194493aThomas Graf				       cmd->c_name, cmd->c_id, cmd->c_maxattr,
10344d362409d5469aed47d19e7908d19bd194493aThomas Graf				       cmd->c_msg_parser ? "yes" : "no",
10444d362409d5469aed47d19e7908d19bd194493aThomas Graf				       cmd->c_attr_policy ? "yes" : "no");
10544d362409d5469aed47d19e7908d19bd194493aThomas Graf			}
10644d362409d5469aed47d19e7908d19bd194493aThomas Graf		}
10744d362409d5469aed47d19e7908d19bd194493aThomas Graf	}
10844d362409d5469aed47d19e7908d19bd194493aThomas Graf}
10944d362409d5469aed47d19e7908d19bd194493aThomas Graf
11044d362409d5469aed47d19e7908d19bd194493aThomas Grafint main(int argc, char *argv[])
11144d362409d5469aed47d19e7908d19bd194493aThomas Graf{
11244d362409d5469aed47d19e7908d19bd194493aThomas Graf	if (argc > 1 && !strcasecmp(argv[1], "-h"))
11344d362409d5469aed47d19e7908d19bd194493aThomas Graf		print_usage();
11444d362409d5469aed47d19e7908d19bd194493aThomas Graf
115d36d396fd0ae94aa2269546a02b5973b4ec27775Thomas Graf	nl_cache_ops_foreach(print, NULL);
11644d362409d5469aed47d19e7908d19bd194493aThomas Graf
11744d362409d5469aed47d19e7908d19bd194493aThomas Graf	return 0;
11844d362409d5469aed47d19e7908d19bd194493aThomas Graf}
119