From patchwork Thu Sep 15 21:11:09 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sage Weil X-Patchwork-Id: 114836 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [140.186.70.17]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPS id BF140B6F80 for ; Fri, 16 Sep 2011 07:11:47 +1000 (EST) Received: from localhost ([::1]:38948 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1R4JDl-0001lQ-1Q for incoming@patchwork.ozlabs.org; Thu, 15 Sep 2011 17:11:45 -0400 Received: from eggs.gnu.org ([140.186.70.92]:49888) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1R4JD8-00086Y-R4 for qemu-devel@nongnu.org; Thu, 15 Sep 2011 17:11:07 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1R4JD5-0006eo-CS for qemu-devel@nongnu.org; Thu, 15 Sep 2011 17:11:06 -0400 Received: from cobra.newdream.net ([66.33.216.30]:46101) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1R4JD5-0006eJ-3r for qemu-devel@nongnu.org; Thu, 15 Sep 2011 17:11:03 -0400 Received: from flak.ops.newdream.net (aon.hq.newdream.net [64.111.111.107]) by cobra.newdream.net (Postfix) with ESMTPA id B30A3BC89C; Thu, 15 Sep 2011 14:16:56 -0700 (PDT) From: Sage Weil To: qemu-devel@nongnu.org, ceph-devel@vger.kernel.org Date: Thu, 15 Sep 2011 14:11:09 -0700 Message-Id: <1316121071-7690-3-git-send-email-sage@newdream.net> X-Mailer: git-send-email 1.7.2.5 In-Reply-To: <1316121071-7690-1-git-send-email-sage@newdream.net> References: <1316121071-7690-1-git-send-email-sage@newdream.net> X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.6 (newer, 3) X-Received-From: 66.33.216.30 Cc: Sage Weil Subject: [Qemu-devel] [PATCH 2/4] rbd: allow escaping in config string 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 The config string is variously delimited by =, @, and /, depending on the field. Allow these characters to be escaped by preceeding them with \. Signed-off-by: Sage Weil --- block/rbd.c | 29 +++++++++++++++++++++++++++-- 1 files changed, 27 insertions(+), 2 deletions(-) diff --git a/block/rbd.c b/block/rbd.c index f64b2e0..43f0e63 100644 --- a/block/rbd.c +++ b/block/rbd.c @@ -104,8 +104,15 @@ static int qemu_rbd_next_tok(char *dst, int dst_len, *p = NULL; if (delim != '\0') { - end = strchr(src, delim); - if (end) { + for (end = src; *end; ++end) { + if (*end == delim) { + break; + } + if (*end == '\\') { + end++; + } + } + if (*end == delim) { *p = end + 1; *end = '\0'; } @@ -124,6 +131,19 @@ static int qemu_rbd_next_tok(char *dst, int dst_len, return 0; } +static void qemu_rbd_unescape(char *src) +{ + char *p; + + for (p = src; *src; ++src, ++p) { + if (*src == '\\') { + src++; + } + *p = *src; + } + *p = '\0'; +} + static int qemu_rbd_parsename(const char *filename, char *pool, int pool_len, char *snap, int snap_len, @@ -148,6 +168,7 @@ static int qemu_rbd_parsename(const char *filename, ret = -EINVAL; goto done; } + qemu_rbd_unescape(pool); if (strchr(p, '@')) { ret = qemu_rbd_next_tok(name, name_len, p, '@', "object name", &p); @@ -155,9 +176,11 @@ static int qemu_rbd_parsename(const char *filename, goto done; } ret = qemu_rbd_next_tok(snap, snap_len, p, ':', "snap name", &p); + qemu_rbd_unescape(snap); } else { ret = qemu_rbd_next_tok(name, name_len, p, ':', "object name", &p); } + qemu_rbd_unescape(name); if (ret < 0 || !p) { goto done; } @@ -213,6 +236,7 @@ static int qemu_rbd_set_conf(rados_t cluster, const char *conf) if (ret < 0) { break; } + qemu_rbd_unescape(name); if (!p) { error_report("conf option %s has no value", name); @@ -225,6 +249,7 @@ static int qemu_rbd_set_conf(rados_t cluster, const char *conf) if (ret < 0) { break; } + qemu_rbd_unescape(value); if (strcmp(name, "conf") == 0) { ret = rados_conf_read_file(cluster, value);