From patchwork Fri Apr 13 17:26:48 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ben Pfaff X-Patchwork-Id: 898034 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 40N4WF5qr9z9s0t for ; Sat, 14 Apr 2018 03:28:41 +1000 (AEST) Received: from mail.linux-foundation.org (localhost [127.0.0.1]) by mail.linuxfoundation.org (Postfix) with ESMTP id 6B590DE6; Fri, 13 Apr 2018 17:27:12 +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 EC763D8D for ; Fri, 13 Apr 2018 17:27:07 +0000 (UTC) X-Greylist: domain auto-whitelisted by SQLgrey-1.7.6 Received: from relay1-d.mail.gandi.net (relay1-d.mail.gandi.net [217.70.183.193]) by smtp1.linuxfoundation.org (Postfix) with ESMTPS id 54F28673 for ; Fri, 13 Apr 2018 17:27:06 +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 relay1-d.mail.gandi.net (Postfix) with ESMTPSA id E86AD240003; Fri, 13 Apr 2018 19:27:04 +0200 (CEST) From: Ben Pfaff To: dev@openvswitch.org Date: Fri, 13 Apr 2018 10:26:48 -0700 Message-Id: <20180413172655.31638-4-blp@ovn.org> X-Mailer: git-send-email 2.16.1 In-Reply-To: <20180413172655.31638-1-blp@ovn.org> References: <20180413172655.31638-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 Subject: [ovs-dev] [PATCH 04/11] socket-util: New function inet_parse_address(). 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 This will acquire its first user in an upcoming commit. Signed-off-by: Ben Pfaff --- lib/socket-util.c | 26 ++++++++++++++++++++++++++ lib/socket-util.h | 2 ++ 2 files changed, 28 insertions(+) diff --git a/lib/socket-util.c b/lib/socket-util.c index b36de371baa1..2d893bc9feb6 100644 --- a/lib/socket-util.c +++ b/lib/socket-util.c @@ -698,6 +698,32 @@ error: return -error; } +/* Parses 'target', which may be an IPv4 address or an IPv6 address + * enclosed in square brackets. + * + * On success, returns true and stores the parsed remote address into '*ss'. + * On failure, logs an error, stores zeros into '*ss', and returns false. */ +bool +inet_parse_address(const char *target_, struct sockaddr_storage *ss) +{ + char *target = xstrdup(target_); + char *p = target; + char *host = inet_parse_token(&p); + bool ok = false; + if (!host) { + VLOG_ERR("%s: host must be specified", target_); + } else if (p && p[strspn(p, " \t\r\n")] != '\0') { + VLOG_ERR("%s: unexpected characters follow host", target_); + } else { + ok = parse_sockaddr_components(ss, host, NULL, 0, target_); + } + if (!ok) { + memset(ss, 0, sizeof *ss); + } + free(target); + return ok; +} + int read_fully(int fd, void *p_, size_t size, size_t *bytes_read) { diff --git a/lib/socket-util.h b/lib/socket-util.h index d8c6f082c8cf..b1eca88eb131 100644 --- a/lib/socket-util.h +++ b/lib/socket-util.h @@ -58,6 +58,8 @@ int inet_open_passive(int style, const char *target, int default_port, struct sockaddr_storage *ssp, uint8_t dscp, bool kernel_print_port); +bool inet_parse_address(const char *target, struct sockaddr_storage *); + int read_fully(int fd, void *, size_t, size_t *bytes_read); int write_fully(int fd, const void *, size_t, size_t *bytes_written);