X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=utilities%2Fovs-vsctl.c;h=d09cf7460b0f645f8cd94e50f644962d34ae7fb9;hb=9a3f4a496f9772b65562044f722536cd6270f698;hp=043530280365450075297a4dfe4db735560ab382;hpb=6b7b9d34c0eab9871cf6284c41108a84129817f3;p=openvswitch diff --git a/utilities/ovs-vsctl.c b/utilities/ovs-vsctl.c index 04353028..d09cf746 100644 --- a/utilities/ovs-vsctl.c +++ b/utilities/ovs-vsctl.c @@ -1305,12 +1305,11 @@ add_port(struct vsctl_context *ctx, get_info(ctx->ovs, &info); if (may_exist) { - struct vsctl_port *port; + struct vsctl_port *vsctl_port; - port = find_port(&info, port_name, false); - if (port) { + vsctl_port = find_port(&info, port_name, false); + if (vsctl_port) { struct svec want_names, have_names; - size_t i; svec_init(&want_names); for (i = 0; i < n_ifaces; i++) { @@ -1319,15 +1318,16 @@ add_port(struct vsctl_context *ctx, svec_sort(&want_names); svec_init(&have_names); - for (i = 0; i < port->port_cfg->n_interfaces; i++) { - svec_add(&have_names, port->port_cfg->interfaces[i]->name); + for (i = 0; i < vsctl_port->port_cfg->n_interfaces; i++) { + svec_add(&have_names, + vsctl_port->port_cfg->interfaces[i]->name); } svec_sort(&have_names); - if (strcmp(port->bridge->name, br_name)) { + if (strcmp(vsctl_port->bridge->name, br_name)) { char *command = vsctl_context_to_string(ctx); vsctl_fatal("\"%s\" but %s is actually attached to bridge %s", - command, port_name, port->bridge->name); + command, port_name, vsctl_port->bridge->name); } if (!svec_equal(&want_names, &have_names)) { @@ -1975,6 +1975,28 @@ get_column(const struct vsctl_table_class *table, const char *column_name, } } +static struct uuid * +create_symbol(struct ovsdb_symbol_table *symtab, const char *id, bool *newp) +{ + struct ovsdb_symbol *symbol; + + if (id[0] != '@') { + vsctl_fatal("row id \"%s\" does not begin with \"@\"", id); + } + + if (newp) { + *newp = ovsdb_symbol_table_get(symtab, id) == NULL; + } + + symbol = ovsdb_symbol_table_insert(symtab, id); + if (symbol->used) { + vsctl_fatal("row id \"%s\" may only be specified on one --id option", + id); + } + symbol->used = true; + return &symbol->uuid; +} + static char * missing_operator_error(const char *arg, const char **allowed_operators, size_t n_allowed) @@ -2142,6 +2164,7 @@ error: static void cmd_get(struct vsctl_context *ctx) { + const char *id = shash_find_data(&ctx->options, "--id"); bool if_exists = shash_find(&ctx->options, "--if-exists"); const char *table_name = ctx->argv[1]; const char *record_id = ctx->argv[2]; @@ -2152,6 +2175,15 @@ cmd_get(struct vsctl_context *ctx) table = get_table(table_name); row = must_get_row(ctx, table, record_id); + if (id) { + bool new; + + *create_symbol(ctx->symtab, id, &new) = row->uuid; + if (!new) { + vsctl_fatal("row id \"%s\" specified on \"get\" command was used " + "before it was defined", id); + } + } for (i = 3; i < ctx->argc; i++) { const struct ovsdb_idl_column *column; const struct ovsdb_datum *datum; @@ -2453,24 +2485,7 @@ cmd_create(struct vsctl_context *ctx) const struct uuid *uuid; int i; - if (id) { - struct ovsdb_symbol *symbol; - - if (id[0] != '@') { - vsctl_fatal("row id \"%s\" does not begin with \"@\"", id); - } - - symbol = ovsdb_symbol_table_insert(ctx->symtab, id); - if (symbol->used) { - vsctl_fatal("row id \"%s\" may only be used to insert a single " - "row", id); - } - symbol->used = true; - - uuid = &symbol->uuid; - } else { - uuid = NULL; - } + uuid = id ? create_symbol(ctx->symtab, id, NULL) : NULL; table = get_table(table_name); row = ovsdb_idl_txn_insert(ctx->txn, table->class, uuid); @@ -2767,8 +2782,8 @@ do_vsctl(const char *args, struct vsctl_command *commands, size_t n_commands, ds_chomp(ds, '\n'); for (j = 0; j < ds->length; j++) { - int c = ds->string[j]; - switch (c) { + int ch = ds->string[j]; + switch (ch) { case '\n': fputs("\\n", stdout); break; @@ -2778,7 +2793,7 @@ do_vsctl(const char *args, struct vsctl_command *commands, size_t n_commands, break; default: - putchar(c); + putchar(ch); } } putchar('\n'); @@ -2796,8 +2811,6 @@ do_vsctl(const char *args, struct vsctl_command *commands, size_t n_commands, if (wait_for_reload && status != TXN_UNCHANGED) { for (;;) { - const struct ovsrec_open_vswitch *ovs; - ovsdb_idl_run(idl); OVSREC_OPEN_VSWITCH_FOR_EACH (ovs, idl) { if (ovs->cur_cfg >= next_cfg) { @@ -2867,7 +2880,7 @@ static const struct vsctl_command_syntax all_commands[] = { {"emer-reset", 0, 0, cmd_emer_reset, NULL, ""}, /* Parameter commands. */ - {"get", 3, INT_MAX, cmd_get, NULL, "--if-exists"}, + {"get", 2, INT_MAX, cmd_get, NULL, "--if-exists,--id="}, {"list", 1, INT_MAX, cmd_list, NULL, ""}, {"set", 3, INT_MAX, cmd_set, NULL, ""}, {"add", 4, INT_MAX, cmd_add, NULL, ""},