/*
- * Copyright (c) 2008, 2009, 2010 Nicira Networks.
+ * Copyright (c) 2008, 2009, 2010, 2011 Nicira Networks.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
#endif
VLOG_DEFINE_THIS_MODULE(unixctl);
+
+COVERAGE_DEFINE(unixctl_received);
+COVERAGE_DEFINE(unixctl_replied);
\f
struct unixctl_command {
+ const char *args;
unixctl_cb_func *cb;
void *aux;
};
void *aux OVS_UNUSED)
{
struct ds ds = DS_EMPTY_INITIALIZER;
- struct shash_node *node;
- struct svec names;
- const char *name;
+ const struct shash_node **nodes = shash_sort(&commands);
size_t i;
ds_put_cstr(&ds, "The available commands are:\n");
- svec_init(&names);
- SHASH_FOR_EACH (node, &commands) {
- svec_add(&names, node->name);
- }
- svec_sort(&names);
-
- SVEC_FOR_EACH (i, name, &names) {
- ds_put_format(&ds, "\t%s\n", name);
+ for (i = 0; i < shash_count(&commands); i++) {
+ const struct shash_node *node = nodes[i];
+ const struct unixctl_command *command = node->data;
+
+ ds_put_format(&ds, " %-23s%s\n", node->name, command->args);
}
- svec_destroy(&names);
+ free(nodes);
unixctl_command_reply(conn, 214, ds_cstr(&ds));
ds_destroy(&ds);
}
+static void
+unixctl_version(struct unixctl_conn *conn, const char *args OVS_UNUSED,
+ void *aux OVS_UNUSED)
+{
+ unixctl_command_reply(conn, 200, get_program_version());
+}
+
void
-unixctl_command_register(const char *name, unixctl_cb_func *cb, void *aux)
+unixctl_command_register(const char *name, const char *args,
+ unixctl_cb_func *cb, void *aux)
{
struct unixctl_command *command;
+ struct unixctl_command *lookup = shash_find_data(&commands, name);
+
+ assert(!lookup || lookup->cb == cb);
+
+ if (lookup) {
+ return;
+ }
- assert(!shash_find_data(&commands, name)
- || shash_find_data(&commands, name) == cb);
command = xmalloc(sizeof *command);
+ command->args = args;
command->cb = cb;
command->aux = aux;
shash_add(&commands, name, command);
return 0;
}
- unixctl_command_register("help", unixctl_help, NULL);
+ unixctl_command_register("help", "", unixctl_help, NULL);
+ unixctl_command_register("version", "", unixctl_version, NULL);
server = xmalloc(sizeof *server);
list_init(&server->conns);
if (error) {
VLOG_WARN("error reading reply from %s: %s",
client->connect_path,
- (error == EOF ? "unexpected end of file"
- : strerror(error)));
+ ovs_retval_to_string(error));
goto error;
}