/* --oneline: Write each command's output as a single line? */
static bool oneline;
+static void vsctl_fatal(const char *, ...) PRINTF_FORMAT(1, 2) NO_RETURN;
static char *default_db(void);
static void usage(void) NO_RETURN;
static void parse_options(int argc, char *argv[]);
}
}
if (!n_commands) {
- ovs_fatal(0, "missing command name (use --help for help)");
+ vsctl_fatal("missing command name (use --help for help)");
}
/* Now execut the commands. */
new_seqno = ovsdb_idl_get_seqno(idl);
if (new_seqno != seqno) {
if (++trials > 5) {
- ovs_fatal(0, "too many database inconsistency failures");
+ vsctl_fatal("too many database inconsistency failures");
}
do_vsctl(argc - optind, argv + optind, idl);
seqno = new_seqno;
}
}
+static void
+vsctl_fatal(const char *format, ...)
+{
+ char *message;
+ va_list args;
+
+ va_start(args, format);
+ message = xvasprintf(format, args);
+ va_end(args);
+
+ vlog_set_levels(VLM_vsctl, VLF_CONSOLE, VLL_EMER);
+ VLOG_ERR("%s", message);
+ ovs_fatal(0, "%s", message);
+}
+
static void
parse_options(int argc, char *argv[])
{
struct vsctl_port *port;
if (shash_find(&info->bridges, name)) {
- ovs_fatal(0, "%s because a bridge named %s already exists", msg, name);
+ vsctl_fatal("%s because a bridge named %s already exists",
+ msg, name);
}
port = shash_find_data(&info->ports, name);
if (port) {
- ovs_fatal(0, "%s because a port named %s already exists on bridge %s",
- msg, name, port->bridge->name);
+ vsctl_fatal("%s because a port named %s already exists on "
+ "bridge %s", msg, name, port->bridge->name);
}
iface = shash_find_data(&info->ifaces, name);
if (iface) {
- ovs_fatal(0, "%s because an interface named %s already exists "
- "on bridge %s", msg, name, iface->port->bridge->name);
+ vsctl_fatal("%s because an interface named %s already exists "
+ "on bridge %s", msg, name, iface->port->bridge->name);
}
free(msg);
{
struct vsctl_bridge *br = shash_find_data(&info->bridges, name);
if (must_exist && !br) {
- ovs_fatal(0, "no bridge named %s", name);
+ vsctl_fatal("no bridge named %s", name);
}
return br;
}
port = NULL;
}
if (must_exist && !port) {
- ovs_fatal(0, "no port named %s", name);
+ vsctl_fatal("no port named %s", name);
}
return port;
}
iface = NULL;
}
if (must_exist && !iface) {
- ovs_fatal(0, "no interface named %s", name);
+ vsctl_fatal("no interface named %s", name);
}
return iface;
}
ovs_insert_bridge(ctx->ovs, br);
} else if (ctx->argc == 3) {
- ovs_fatal(0, "'%s' comamnd takes exactly 1 or 3 arguments", ctx->argv[0]);
+ vsctl_fatal("'%s' command takes exactly 1 or 3 arguments",
+ ctx->argv[0]);
} else if (ctx->argc == 4) {
const char *parent_name = ctx->argv[2];
int vlan = atoi(ctx->argv[3]);
int64_t tag = vlan;
if (vlan < 1 || vlan > 4095) {
- ovs_fatal(0, "%s: vlan must be between 1 and 4095", ctx->argv[0]);
+ vsctl_fatal("%s: vlan must be between 1 and 4095", ctx->argv[0]);
}
parent = find_bridge(&info, parent_name, false);
if (parent && parent->vlan) {
- ovs_fatal(0, "cannot create brdige with fake bridge as parent");
+ vsctl_fatal("cannot create brdige with fake bridge as parent");
}
if (!parent) {
- ovs_fatal(0, "parent bridge %s does not exist", parent_name);
+ vsctl_fatal("parent bridge %s does not exist", parent_name);
}
br = parent->br_cfg;
if (port->bridge == bridge) {
del_port(&info, port);
} else if (port->bridge->parent == bridge) {
- ovs_fatal(0, "bridge %s does not have a port %s (although its "
- "parent bridge %s does)",
- ctx->argv[1], ctx->argv[2], bridge->parent->name);
+ vsctl_fatal("bridge %s does not have a port %s (although its "
+ "parent bridge %s does)",
+ ctx->argv[1], ctx->argv[2], bridge->parent->name);
} else {
- ovs_fatal(0, "bridge %s does not have a port %s",
- ctx->argv[1], ctx->argv[2]);
+ vsctl_fatal("bridge %s does not have a port %s",
+ ctx->argv[1], ctx->argv[2]);
}
}
}
if (!ovs) {
/* XXX it would be more user-friendly to create a record ourselves
* (while verifying that the table is empty before doing so). */
- ovs_fatal(0, "%s: database does not contain any Open vSwitch "
- "configuration", db);
+ vsctl_fatal("%s: database does not contain any Open vSwitch "
+ "configuration", db);
}
txn = ovsdb_idl_txn_create(idl);
case TXN_ABORTED:
/* Should not happen--we never call ovsdb_idl_txn_abort(). */
- ovs_fatal(0, "transaction aborted");
+ vsctl_fatal("transaction aborted");
case TXN_SUCCESS:
break;
return;
case TXN_ERROR:
- ovs_fatal(0, "transaction error");
+ vsctl_fatal("transaction error");
default:
NOT_REACHED();
break;
}
if (!shash_add_once(&ctx->options, argv[i], NULL)) {
- ovs_fatal(0, "'%s' option specified multiple times", argv[i]);
+ vsctl_fatal("'%s' option specified multiple times", argv[i]);
}
}
if (i == argc) {
- ovs_fatal(0, "missing command name");
+ vsctl_fatal("missing command name");
}
for (p = all_commands; p < &all_commands[ARRAY_SIZE(all_commands)]; p++) {
const char *s = strstr(p->options, node->name);
int end = s ? s[strlen(node->name)] : EOF;
if (end != ',' && end != ' ' && end != '\0') {
- ovs_fatal(0, "'%s' command has no '%s' option",
- argv[i], node->name);
+ vsctl_fatal("'%s' command has no '%s' option",
+ argv[i], node->name);
}
}
n_arg = argc - i - 1;
if (n_arg < p->min_args) {
- ovs_fatal(0, "'%s' command requires at least %d arguments",
- p->name, p->min_args);
+ vsctl_fatal("'%s' command requires at least %d arguments",
+ p->name, p->min_args);
} else if (n_arg > p->max_args) {
- ovs_fatal(0, "'%s' command takes at most %d arguments",
- p->name, p->max_args);
+ vsctl_fatal("'%s' command takes at most %d arguments",
+ p->name, p->max_args);
} else {
ctx->argc = n_arg + 1;
ctx->argv = &argv[i];
}
}
- ovs_fatal(0, "unknown command '%s'; use --help for help", argv[0]);
+ vsctl_fatal("unknown command '%s'; use --help for help", argv[i]);
}
static void