[ovs-dev] [PATCH v2 1/3] unixctl: Make path to unixctl_server socket available to the client.

Aaron Conole aconole at redhat.com
Wed Aug 8 20:13:39 UTC 2018


Ben Pfaff <blp at ovn.org> writes:

> Acked-by: Alin Gabriel Serdean <aserdean at ovn.org>
> Signed-off-by: Ben Pfaff <blp at ovn.org>
> ---
>  lib/unixctl.c   | 52 ++++++++++++++++++++++++++++------------------------
>  lib/unixctl.h   |  2 ++
>  tests/daemon.at |  4 ++--
>  3 files changed, 32 insertions(+), 26 deletions(-)
>
> diff --git a/lib/unixctl.c b/lib/unixctl.c
> index bd9c1caeedef..9b3b0671f33c 100644
> --- a/lib/unixctl.c
> +++ b/lib/unixctl.c
> @@ -56,6 +56,7 @@ struct unixctl_conn {
>  struct unixctl_server {
>      struct pstream *listener;
>      struct ovs_list conns;
> +    char *path;
>  };
>  
>  static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(5, 5);
> @@ -216,48 +217,44 @@ unixctl_command_reply_error(struct unixctl_conn *conn, const char *error)
>  int
>  unixctl_server_create(const char *path, struct unixctl_server **serverp)
>  {
> -    struct unixctl_server *server;
> -    struct pstream *listener;
> -    char *punix_path;
> -    int error;
> -
>      *serverp = NULL;
>      if (path && !strcmp(path, "none")) {
>          return 0;
>      }
>  
> -    if (path) {
> -        char *abs_path;
> -        abs_path = abs_file_name(ovs_rundir(), path);
> -        punix_path = xasprintf("punix:%s", abs_path);
> -        free(abs_path);
> -    } else {
> -#ifndef _WIN32
> -        punix_path = xasprintf("punix:%s/%s.%ld.ctl", ovs_rundir(),
> -                               program_name, (long int) getpid());
> +#ifdef _WIN32
> +    enum { WINDOWS = 1 };
>  #else
> -        punix_path = xasprintf("punix:%s/%s.ctl", ovs_rundir(), program_name);
> +    enum { WINDOWS = 0 };
>  #endif
> -    }
>  
> -    error = pstream_open(punix_path, &listener, 0);
> +    long int pid = getpid();
> +    char *abs_path
> +        = (path ? abs_file_name(ovs_rundir(), path)
> +           : WINDOWS ? xasprintf("%s/%s.ctl", ovs_rundir(), program_name)
> +           : xasprintf("%s/%s.%ld.ctl", ovs_rundir(), program_name, pid));
> +
> +    struct pstream *listener;
> +    char *punix_path = xasprintf("punix:%s", abs_path);
> +    int error = pstream_open(punix_path, &listener, 0);
> +    free(punix_path);
> +
>      if (error) {
> -        ovs_error(error, "could not initialize control socket %s", punix_path);
> -        goto exit;
> +        ovs_error(error, "%s: could not initialize control socket", abs_path);
> +        free(abs_path);
> +        return error;
>      }
>  
>      unixctl_command_register("list-commands", "", 0, 0, unixctl_list_commands,
>                               NULL);
>      unixctl_command_register("version", "", 0, 0, unixctl_version, NULL);
>  
> -    server = xmalloc(sizeof *server);
> +    struct unixctl_server *server = xmalloc(sizeof *server);
>      server->listener = listener;
> +    server->path = abs_path;
>      ovs_list_init(&server->conns);
>      *serverp = server;
> -
> -exit:
> -    free(punix_path);
> -    return error;
> +    return 0;
>  }
>  
>  static void
> @@ -429,10 +426,17 @@ unixctl_server_destroy(struct unixctl_server *server)
>              kill_connection(conn);
>          }
>  
> +        free (server->path);

Just a small nit, this looks like gnu style.

>          pstream_close(server->listener);
>          free(server);
>      }
>  }
> +
> +const char *
> +unixctl_server_get_path(const struct unixctl_server *server)
> +{
> +    return server ? server->path : NULL;
> +}
>  
>  /* On POSIX based systems, connects to a unixctl server socket.  'path' should
>   * be the name of a unixctl server socket.  If it does not start with '/', it
> diff --git a/lib/unixctl.h b/lib/unixctl.h
> index ce43893c6a7d..4562dbc49113 100644
> --- a/lib/unixctl.h
> +++ b/lib/unixctl.h
> @@ -28,6 +28,8 @@ void unixctl_server_run(struct unixctl_server *);
>  void unixctl_server_wait(struct unixctl_server *);
>  void unixctl_server_destroy(struct unixctl_server *);
>  
> +const char *unixctl_server_get_path(const struct unixctl_server *);
> +
>  /* Client for Unix domain socket control connection. */
>  struct jsonrpc;
>  int unixctl_client_create(const char *path, struct jsonrpc **client);
> diff --git a/tests/daemon.at b/tests/daemon.at
> index 952d5a7c7bbe..b379fa83f9aa 100644
> --- a/tests/daemon.at
> +++ b/tests/daemon.at
> @@ -149,7 +149,7 @@ AT_SETUP([daemon --detach startup errors])
>  AT_CAPTURE_FILE([pid])
>  OVSDB_INIT([db])
>  AT_CHECK([ovsdb-server --detach --no-chdir --pidfile --unixctl=nonexistent/unixctl db], [1], [], [stderr])
> -AT_CHECK([grep 'ovsdb-server: could not initialize control socket' stderr],
> +AT_CHECK([grep 'could not initialize control socket' stderr],
>    [0], [ignore])
>  AT_CHECK([test ! -s pid])
>  AT_CLEANUP
> @@ -159,7 +159,7 @@ AT_SKIP_IF([test "$IS_WIN32" = "yes"])
>  AT_CAPTURE_FILE([pid])
>  OVSDB_INIT([db])
>  AT_CHECK([ovsdb-server --detach --no-chdir --pidfile --monitor --unixctl=nonexistent/unixctl db], [1], [], [stderr])
> -AT_CHECK([grep 'ovsdb-server: could not initialize control socket' stderr],
> +AT_CHECK([grep 'could not initialize control socket' stderr],
>    [0], [ignore])
>  AT_CHECK([test ! -s pid])
>  AT_CLEANUP


More information about the dev mailing list