X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=lib%2Funixctl.c;h=70785682731fcbdd30401cad9913ec0a2c79eea2;hb=4488d4ddb0458c188e6172b5d75736c0fb952e45;hp=8565e5882f685675a4d980ad32ab8bf88a689572;hpb=8ca79daaa04ca3d5edcacf84646d953569f55cb6;p=sliver-openvswitch.git diff --git a/lib/unixctl.c b/lib/unixctl.c index 8565e5882..707856827 100644 --- a/lib/unixctl.c +++ b/lib/unixctl.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, 2009 Nicira Networks. + * Copyright (c) 2008, 2009, 2010 Nicira Networks. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -34,6 +34,7 @@ #include "poll-loop.h" #include "shash.h" #include "socket-util.h" +#include "svec.h" #include "util.h" #ifndef SCM_CREDENTIALS @@ -77,16 +78,28 @@ static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(5, 5); static struct shash commands = SHASH_INITIALIZER(&commands); static void -unixctl_help(struct unixctl_conn *conn, const char *args UNUSED, - void *aux UNUSED) +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; + size_t i; ds_put_cstr(&ds, "The available commands are:\n"); + + svec_init(&names); SHASH_FOR_EACH (node, &commands) { - ds_put_format(&ds, "\t%s\n", node->name); + svec_add(&names, node->name); + } + svec_sort(&names); + + SVEC_FOR_EACH (i, name, &names) { + ds_put_format(&ds, "\t%s\n", name); } + svec_destroy(&names); + unixctl_command_reply(conn, 214, ds_cstr(&ds)); ds_destroy(&ds); } @@ -170,7 +183,7 @@ unixctl_command_reply(struct unixctl_conn *conn, * A program that (optionally) daemonizes itself should call this function * *after* daemonization, so that the socket name contains the pid of the * daemon instead of the pid of the program that exited. (Otherwise, - * "ovs-appctl --target .pid" will fail.) + * "ovs-appctl --target=" will fail.) * * Returns 0 if successful, otherwise a positive errno value. If successful, * sets '*serverp' to the new unixctl_server, otherwise to NULL. */ @@ -186,11 +199,7 @@ unixctl_server_create(const char *path, struct unixctl_server **serverp) list_init(&server->conns); if (path) { - if (path[0] == '/') { - server->path = xstrdup(path); - } else { - server->path = xasprintf("%s/%s", ovs_rundir, path); - } + server->path = abs_file_name(ovs_rundir, path); } else { server->path = xasprintf("%s/%s.%ld.ctl", ovs_rundir, program_name, (long int) getpid()); @@ -200,22 +209,21 @@ unixctl_server_create(const char *path, struct unixctl_server **serverp) NULL); if (server->fd < 0) { error = -server->fd; - fprintf(stderr, "Could not initialize control socket %s (%s)\n", - server->path, strerror(error)); + ovs_error(error, "could not initialize control socket %s", + server->path); goto error; } if (chmod(server->path, S_IRUSR | S_IWUSR) < 0) { error = errno; - fprintf(stderr, "Failed to chmod control socket %s (%s)\n", - server->path, strerror(error)); + ovs_error(error, "failed to chmod control socket %s", server->path); goto error; } if (listen(server->fd, 10) < 0) { error = errno; - fprintf(stderr, "Failed to listen on control socket %s (%s)\n", - server->path, strerror(error)); + ovs_error(error, "Failed to listen on control socket %s", + server->path); goto error; } @@ -448,7 +456,7 @@ unixctl_server_destroy(struct unixctl_server *server) /* Connects to a Vlog server socket. 'path' should be the name of a Vlog * server socket. If it does not start with '/', it will be prefixed with - * ovs_rundir (e.g. /var/run). + * ovs_rundir (e.g. /var/run/openvswitch). * * Returns 0 if successful, otherwise a positive errno value. If successful, * sets '*clientp' to the new unixctl_client, otherwise to NULL. */ @@ -462,11 +470,7 @@ unixctl_client_create(const char *path, struct unixctl_client **clientp) /* Determine location. */ client = xmalloc(sizeof *client); - if (path[0] == '/') { - client->connect_path = xstrdup(path); - } else { - client->connect_path = xasprintf("%s/%s", ovs_rundir, path); - } + client->connect_path = abs_file_name(ovs_rundir, path); client->bind_path = xasprintf("/tmp/vlog.%ld.%d", (long int) getpid(), counter++);