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