From patchwork Mon Aug 6 21:45:51 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ben Pfaff X-Patchwork-Id: 954250 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=openvswitch.org (client-ip=140.211.169.12; helo=mail.linuxfoundation.org; envelope-from=ovs-dev-bounces@openvswitch.org; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=ovn.org Received: from mail.linuxfoundation.org (mail.linuxfoundation.org [140.211.169.12]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 41krnZ0Pyhz9s4c for ; Tue, 7 Aug 2018 07:46:26 +1000 (AEST) Received: from mail.linux-foundation.org (localhost [127.0.0.1]) by mail.linuxfoundation.org (Postfix) with ESMTP id 50A14DE1; Mon, 6 Aug 2018 21:46:05 +0000 (UTC) X-Original-To: dev@openvswitch.org Delivered-To: ovs-dev@mail.linuxfoundation.org Received: from smtp1.linuxfoundation.org (smtp1.linux-foundation.org [172.17.192.35]) by mail.linuxfoundation.org (Postfix) with ESMTPS id 7DCBDDDE for ; Mon, 6 Aug 2018 21:46:04 +0000 (UTC) X-Greylist: domain auto-whitelisted by SQLgrey-1.7.6 Received: from relay2-d.mail.gandi.net (relay2-d.mail.gandi.net [217.70.183.194]) by smtp1.linuxfoundation.org (Postfix) with ESMTPS id 8EC71735 for ; Mon, 6 Aug 2018 21:46:03 +0000 (UTC) X-Originating-IP: 208.91.3.26 Received: from sigabrt.benpfaff.org (unknown [208.91.3.26]) (Authenticated sender: blp@ovn.org) by relay2-d.mail.gandi.net (Postfix) with ESMTPSA id EA91840005; Mon, 6 Aug 2018 21:45:59 +0000 (UTC) From: Ben Pfaff To: dev@openvswitch.org Date: Mon, 6 Aug 2018 14:45:51 -0700 Message-Id: <20180806214553.28185-2-blp@ovn.org> X-Mailer: git-send-email 2.16.1 In-Reply-To: <20180806214553.28185-1-blp@ovn.org> References: <20180806214553.28185-1-blp@ovn.org> X-Spam-Status: No, score=-2.6 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_LOW autolearn=ham version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on smtp1.linux-foundation.org Cc: Ben Pfaff , Alin Gabriel Serdean Subject: [ovs-dev] [PATCH v3 1/3] unixctl: Make path to unixctl_server socket available to the client. X-BeenThere: ovs-dev@openvswitch.org X-Mailman-Version: 2.1.12 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Sender: ovs-dev-bounces@openvswitch.org Errors-To: ovs-dev-bounces@openvswitch.org Acked-by: Alin Gabriel Serdean Acked-by: Mark Michelson Signed-off-by: Ben Pfaff --- 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); 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