dpif-linux: Make dpif_linux_port_query_by_name() query only one datapath.
[sliver-openvswitch.git] / lib / unixctl.c
index c333c54..d75166f 100644 (file)
@@ -48,6 +48,7 @@ COVERAGE_DEFINE(unixctl_received);
 COVERAGE_DEFINE(unixctl_replied);
 \f
 struct unixctl_command {
+    const char *args;
     unixctl_cb_func *cb;
     void *aux;
 };
@@ -85,36 +86,45 @@ unixctl_help(struct unixctl_conn *conn, const char *args OVS_UNUSED,
              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);
+    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_sort(&names);
-
-    SVEC_FOR_EACH (i, name, &names) {
-        ds_put_format(&ds, "\t%s\n", name);
-    }
-    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);
@@ -205,7 +215,8 @@ unixctl_server_create(const char *path, struct unixctl_server **serverp)
         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);