/* * nl-list-caches.c List registered cache types * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation version 2.1 * of the License. * * Copyright (c) 2003-2009 Thomas Graf <tgraf@suug.ch> */ #include <netlink-local.h> #include <netlink/cli/utils.h> static void print_usage(void) { fprintf(stderr, "Usage: nl-list-caches\n"); exit(1); } static char *id_attr_list(struct nl_object_ops *ops, char *buf, size_t len) { if (ops->oo_attrs2str != NULL) return ops->oo_attrs2str(ops->oo_id_attrs, buf, len); else { memset(buf, 0, len); return buf; } } static void print(struct nl_cache_ops *ops, void *arg) { char buf[64]; printf("%s:\n" \ " hdrsize: %d bytes\n" \ " protocol: %s\n" \ " request-update: %s\n" \ " msg-parser: %s\n", ops->co_name, ops->co_hdrsize, nl_nlfamily2str(ops->co_protocol, buf, sizeof(buf)), ops->co_request_update ? "yes" : "no", ops->co_msg_parser ? "yes" : "no"); if (ops->co_obj_ops) { struct nl_object_ops *obj_ops = ops->co_obj_ops; const char *dump_names[NL_DUMP_MAX+1] = { "brief", "detailed", "stats", "env", }; int i; printf(" cacheable object:\n" \ " name: %s:\n" \ " size: %zu bytes\n" \ " constructor: %s\n" \ " free-data: %s\n" \ " clone: %s\n" \ " compare: %s\n" \ " id attributes: %s\n" \ " dump: ", obj_ops->oo_name, obj_ops->oo_size, obj_ops->oo_constructor ? "yes" : "no", obj_ops->oo_free_data ? "yes" : "no", obj_ops->oo_clone ? "yes" : "no", obj_ops->oo_compare ? "yes" : "no", id_attr_list(obj_ops, buf, sizeof(buf))); for (i = 0; i <= NL_DUMP_MAX; i++) if (obj_ops->oo_dump[i]) printf("%s%s", i == 0 ? "" : ", ", dump_names[i]); printf("\n"); } if (ops->co_genl) { struct genl_ops *genl_ops = ops->co_genl; printf(" genl:\n" \ " name: %s\n" \ " family: %d\n" \ " id: %d\n", genl_ops->o_name, genl_ops->o_family, genl_ops->o_id); if (genl_ops->o_ncmds) { int i; printf(" cmds:\n"); for (i = 0; i < genl_ops->o_ncmds; i++) { struct genl_cmd *cmd = &genl_ops->o_cmds[i]; printf(" %s:\n" " id: %d\n" \ " maxattr: %d\n" \ " msg-parser: %s\n" \ " attr-policy: %s\n", cmd->c_name, cmd->c_id, cmd->c_maxattr, cmd->c_msg_parser ? "yes" : "no", cmd->c_attr_policy ? "yes" : "no"); } } } } int main(int argc, char *argv[]) { if (argc > 1 && !strcasecmp(argv[1], "-h")) print_usage(); nl_cache_ops_foreach(print, NULL); return 0; }