From patchwork Thu Mar 7 06:32:10 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Doug Goldstein X-Patchwork-Id: 225745 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPS id BB7112C0385 for ; Thu, 7 Mar 2013 17:32:48 +1100 (EST) Received: from localhost ([::1]:45329 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1UDUNi-0001ph-W1 for incoming@patchwork.ozlabs.org; Thu, 07 Mar 2013 01:32:47 -0500 Received: from eggs.gnu.org ([208.118.235.92]:55268) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1UDUNL-0001mC-MR for qemu-devel@nongnu.org; Thu, 07 Mar 2013 01:32:26 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1UDUNG-0002pa-Ju for qemu-devel@nongnu.org; Thu, 07 Mar 2013 01:32:23 -0500 Received: from mail-ye0-f176.google.com ([209.85.213.176]:62741) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1UDUNG-0002pR-Ez for qemu-devel@nongnu.org; Thu, 07 Mar 2013 01:32:18 -0500 Received: by mail-ye0-f176.google.com with SMTP id m9so11364yen.7 for ; Wed, 06 Mar 2013 22:32:18 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20120113; h=x-received:from:to:cc:subject:date:message-id:x-mailer:in-reply-to :references:x-gm-message-state; bh=jHgZQsyrEKxtzXJy9XVRwyOp9IWhPLIrsRkza4952u4=; b=AOpM69cPu3fVH5z9bFK4sUGFBRe0Ez8lNHTzDuZJOGcWk48jcmyM6oy/zOBH8ntfRX JpF47K2SHIEXZrXQDHybPJHJY5xW6BGvRhk24PSEoH7gMFeNTA+4yR99S8kCkNli5rdN qK5VRZZutDJm4lkdqRSqlrNpEQYmHAXq8ZFVNzp10S4YBauBx/8Av35Jmp1FI3pZhnF4 jlRLbOWBZxJx8MOEvwvjMl1PG1PKYUV+BrTDi1VmjIffLM9oH3+12ZwckNQwgmTPUPKN aU5cSV/cAp3rozXS2jlohjxTUYPXOZ6pPOCbnEKo2arSKCyRgxOHBHWZ9bw0VrKxAvaW OGwA== X-Received: by 10.236.160.7 with SMTP id t7mr22774681yhk.173.1362637937809; Wed, 06 Mar 2013 22:32:17 -0800 (PST) Received: from localhost.localdomain (c-68-62-173-137.hsd1.al.comcast.net. [68.62.173.137]) by mx.google.com with ESMTPS id n2sm558609yhm.1.2013.03.06.22.32.17 (version=TLSv1.2 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Wed, 06 Mar 2013 22:32:17 -0800 (PST) From: Doug Goldstein To: qemu-devel@nongnu.org Date: Thu, 7 Mar 2013 00:32:10 -0600 Message-Id: <1362637930-8499-3-git-send-email-cardoe@cardoe.com> X-Mailer: git-send-email 1.7.12.4 In-Reply-To: <1362637930-8499-1-git-send-email-cardoe@cardoe.com> References: <1362207528-27804-1-git-send-email-cardoe@cardoe.com> <1362637930-8499-1-git-send-email-cardoe@cardoe.com> X-Gm-Message-State: ALoCoQnexPNORRYuRyEE4CnFI0XMa2MPFL1Z53ugL2duRqeaGbxVDqDV0rBXEiSJK5Uffu26qgvR X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x [fuzzy] X-Received-From: 209.85.213.176 Cc: Anthony Liguori , Corey Bryant , Doug Goldstein , Richa Marwaha Subject: [Qemu-devel] [PATCHv3 2/2] bridge helper: support conf dirs X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Allow the bridge helper to take a config directory rather than having to specify every file in the directory manually via an include statement. Signed-off-by: Doug Goldstein CC: Anthony Liguori CC: Richa Marwaha CC: Corey Bryant TO: qemu-devel@nongnu.org --- qemu-bridge-helper.c | 55 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) diff --git a/qemu-bridge-helper.c b/qemu-bridge-helper.c index 95486e7..cebfcf8 100644 --- a/qemu-bridge-helper.c +++ b/qemu-bridge-helper.c @@ -16,6 +16,7 @@ #include "config-host.h" #include +#include #include #include #include @@ -70,12 +71,28 @@ static void usage(void) "Usage: qemu-bridge-helper [--use-vnet] --br=bridge --fd=unixfd\n"); } +static int filter_bridge_conf_dir(const struct dirent *entry) +{ + ssize_t len = strlen(entry->d_name); + + /* We only want files ending in .conf */ + if (len > 5 && + strcmp(".conf", &entry->d_name[len-5]) == 0) { + return 1; + } + + return 0; +} + static int parse_acl_file(const char *filename, ACLList *acl_list) { FILE *f; char line[4096]; int ret = -EINVAL; ACLRule *acl_rule; + struct dirent **include_list = NULL; + int i, include_count = 0; + char *conf_file; f = fopen(filename, "r"); if (f == NULL) { @@ -137,6 +154,37 @@ static int parse_acl_file(const char *filename, ACLList *acl_list) snprintf(acl_rule->iface, IFNAMSIZ, "%s", arg); } QSIMPLEQ_INSERT_TAIL(acl_list, acl_rule, entry); + } else if (strcmp(cmd, "includedir") == 0) { + include_count = scandir(arg, &include_list, + filter_bridge_conf_dir, alphasort); + if (include_count < 0) { + ret = -errno; + fprintf(stderr, "Unable to retrieve conf files from '%s': %s\n", + arg, strerror(errno)); + goto failure; + } + + for (i = 0; i < include_count; i++) { + if (asprintf(&conf_file, "%s/%s", arg, + include_list[i]->d_name) < 0) { + fprintf(stderr, "Failed to allocate memory for " + "file path: %s/%s\n", + arg, include_list[i]->d_name); + ret = -ENOMEM; + goto failure; + } + + /* ignore errors like 'include' cmd */ + parse_acl_file(conf_file, acl_list); + + free(conf_file); + free(include_list[i]); + include_list[i] = NULL; + } + free(include_list); + include_list = NULL; + include_count = 0; + } else if (strcmp(cmd, "include") == 0) { /* ignore errors */ parse_acl_file(arg, acl_list); @@ -152,6 +200,13 @@ static int parse_acl_file(const char *filename, ACLList *acl_list) failure: fclose(f); + if (include_list) { + for (i = 0; i < include_count; i++) { + free(include_list[i]); + } + free(include_list); + } + return ret; }