X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=ovsdb%2Fovsdb-client.c;h=bfc26538aadeda60a0f0cb3c9bb30676d19a0045;hb=65dd5d75ecc9725e0e9196ad81b42e2be3ccf212;hp=53da6ae27fe75d72aecfce2fabef8b3480867333;hpb=f125905cdd3dc0339ad968c0a70128807884b400;p=sliver-openvswitch.git diff --git a/ovsdb/ovsdb-client.c b/ovsdb/ovsdb-client.c index 53da6ae27..bfc26538a 100644 --- a/ovsdb/ovsdb-client.c +++ b/ovsdb/ovsdb-client.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2010, 2011, 2012 Nicira Networks. + * Copyright (c) 2009, 2010, 2011, 2012, 2013 Nicira, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,7 +16,6 @@ #include -#include #include #include #include @@ -39,7 +38,7 @@ #include "ovsdb-data.h" #include "ovsdb-error.h" #include "sort.h" -#include "sset.h" +#include "svec.h" #include "stream.h" #include "stream-ssl.h" #include "table.h" @@ -70,12 +69,12 @@ static bool timestamp; /* Format for table output. */ static struct table_style table_style = TABLE_STYLE_DEFAULT; -static const struct ovsdb_client_command all_commands[]; +static const struct ovsdb_client_command *get_all_commands(void); static void usage(void) NO_RETURN; static void parse_options(int argc, char *argv[]); static struct jsonrpc *open_jsonrpc(const char *server); -static void fetch_dbs(struct jsonrpc *, struct sset *dbs); +static void fetch_dbs(struct jsonrpc *, struct svec *dbs); int main(int argc, char *argv[]) @@ -93,7 +92,7 @@ main(int argc, char *argv[]) ovs_fatal(0, "missing command name; use --help for help"); } - for (command = all_commands; ; command++) { + for (command = get_all_commands(); ; command++) { if (!command->name) { VLOG_FATAL("unknown command '%s'; use --help for help", argv[optind]); @@ -118,22 +117,22 @@ main(int argc, char *argv[]) } if (command->need == NEED_DATABASE) { - struct sset dbs; + struct svec dbs; - sset_init(&dbs); + svec_init(&dbs); fetch_dbs(rpc, &dbs); if (argc - optind > command->min_args - && sset_contains(&dbs, argv[optind])) { + && svec_contains(&dbs, argv[optind])) { database = argv[optind++]; - } else if (sset_count(&dbs) == 1) { - database = xstrdup(SSET_FIRST(&dbs)); - } else if (sset_contains(&dbs, "Open_vSwitch")) { + } else if (dbs.n == 1) { + database = xstrdup(dbs.names[0]); + } else if (svec_contains(&dbs, "Open_vSwitch")) { database = "Open_vSwitch"; } else { ovs_fatal(0, "no default database for `%s' command, please " "specify a database name", command->name); } - sset_destroy(&dbs); + svec_destroy(&dbs); } else { database = NULL; } @@ -167,7 +166,7 @@ parse_options(int argc, char *argv[]) DAEMON_OPTION_ENUMS, TABLE_OPTION_ENUMS }; - static struct option long_options[] = { + static const struct option long_options[] = { {"verbose", optional_argument, NULL, 'v'}, {"help", no_argument, NULL, 'h'}, {"version", no_argument, NULL, 'V'}, @@ -371,7 +370,7 @@ fetch_schema(struct jsonrpc *rpc, const char *database) } static void -fetch_dbs(struct jsonrpc *rpc, struct sset *dbs) +fetch_dbs(struct jsonrpc *rpc, struct svec *dbs) { struct jsonrpc_msg *request, *reply; size_t i; @@ -388,11 +387,12 @@ fetch_dbs(struct jsonrpc *rpc, struct sset *dbs) const struct json *name = reply->result->u.array.elems[i]; if (name->type != JSON_STRING) { - ovs_fatal(0, "list_dbs response %zu is not string", i); + ovs_fatal(0, "list_dbs response %"PRIuSIZE" is not string", i); } - sset_add(dbs, name->u.string); + svec_add(dbs, name->u.string); } jsonrpc_msg_destroy(reply); + svec_sort(dbs); } static void @@ -400,14 +400,15 @@ do_list_dbs(struct jsonrpc *rpc, const char *database OVS_UNUSED, int argc OVS_UNUSED, char *argv[] OVS_UNUSED) { const char *db_name; - struct sset dbs; + struct svec dbs; + size_t i; - sset_init(&dbs); + svec_init(&dbs); fetch_dbs(rpc, &dbs); - SSET_FOR_EACH (db_name, &dbs) { + SVEC_FOR_EACH (i, db_name, &dbs) { puts(db_name); } - sset_destroy(&dbs); + svec_destroy(&dbs); } static void @@ -846,7 +847,7 @@ dump_table(const struct ovsdb_table_schema *ts, struct json_array *rows) struct shash *row; if (rows->elems[y]->type != JSON_OBJECT) { - ovs_fatal(0, "row %zu in table %s response is not a JSON object: " + ovs_fatal(0, "row %"PRIuSIZE" in table %s response is not a JSON object: " "%s", y, ts->name, json_to_string(rows->elems[y], 0)); } row = json_object(rows->elems[y]); @@ -855,7 +856,7 @@ dump_table(const struct ovsdb_table_schema *ts, struct json_array *rows) for (x = 0; x < n_columns; x++) { const struct json *json = shash_find_data(row, columns[x]->name); if (!json) { - ovs_fatal(0, "row %zu in table %s response lacks %s column", + ovs_fatal(0, "row %"PRIuSIZE" in table %s response lacks %s column", y, ts->name, columns[x]->name); } @@ -885,10 +886,15 @@ dump_table(const struct ovsdb_table_schema *ts, struct json_array *rows) struct cell *cell = table_add_cell(&t); cell->json = ovsdb_datum_to_json(&data[y][x], &columns[x]->type); cell->type = &columns[x]->type; + ovsdb_datum_destroy(&data[y][x], &columns[x]->type); } + free(data[y]); } table_print(&t, &table_style); table_destroy(&t); + + free(data); + free(columns); } static void @@ -939,7 +945,7 @@ do_dump(struct jsonrpc *rpc, const char *database, /* Print database contents. */ if (reply->result->type != JSON_ARRAY || reply->result->u.array.n != n_tables) { - ovs_fatal(0, "reply is not array of %zu elements: %s", + ovs_fatal(0, "reply is not array of %"PRIuSIZE" elements: %s", n_tables, json_to_string(reply->result, 0)); } for (i = 0; i < n_tables; i++) { @@ -957,6 +963,10 @@ do_dump(struct jsonrpc *rpc, const char *database, dump_table(ts, &rows->u.array); } + + jsonrpc_msg_destroy(reply); + free(tables); + ovsdb_schema_destroy(schema); } static void @@ -987,3 +997,8 @@ static const struct ovsdb_client_command all_commands[] = { { NULL, 0, 0, 0, NULL }, }; + +static const struct ovsdb_client_command *get_all_commands(void) +{ + return all_commands; +}