Re: [libvirt] [PATCH 2/4 v2] conf: Parse and format disk wwn

2012-09-03 Thread Osier Yang

On 2012年08月31日 22:37, Eric Blake wrote:

On 08/31/2012 04:10 AM, Osier Yang wrote:

Validates the wwn while parsing, error out if it's malformed.

* src/util/util.h: Declare virValidateWWN
* src/util/util.c: Implement virValidateWWN
* src/libvirt_private.syms: Export virValidateWWN.
* src/conf/domain_conf.h: New member 'wwn' for disk def.
* src/conf/domain_conf.c: Parse and format diskwwn



+#define WWN_REG_PATTERN[0-9a-zA-Z]{16}
+bool
+virValidateWWN(const char *wwn) {
+regex_t re;
+int err;
+char error[100];
+
+if ((err = regcomp(re, WWN_REG_PATTERN, REG_EXTENDED)) != 0)


Do we really need regcomp() for this?  I'm thinking it's much faster to
just do something like:

for (i = 0; wwn[i]; i++)
 if (!c_isxdigit(wwn[i]))
 break;
if (i != 16 || wwn[i])
 // error, return false;
return true;



Which is more compat, I posted a v3, thanks.

Regards,
Osier

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list

[libvirt] [PATCH 2/4 v2] conf: Parse and format disk wwn

2012-08-31 Thread Osier Yang
Validates the wwn while parsing, error out if it's malformed.

* src/util/util.h: Declare virValidateWWN
* src/util/util.c: Implement virValidateWWN
* src/libvirt_private.syms: Export virValidateWWN.
* src/conf/domain_conf.h: New member 'wwn' for disk def.
* src/conf/domain_conf.c: Parse and format disk wwn
---
 src/conf/domain_conf.c   |   12 +++-
 src/conf/domain_conf.h   |1 +
 src/libvirt_private.syms |1 +
 src/util/util.c  |   24 
 src/util/util.h  |2 ++
 5 files changed, 39 insertions(+), 1 deletions(-)

diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index 554298d..df6599a 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -950,6 +950,7 @@ void virDomainDiskDefFree(virDomainDiskDefPtr def)
 VIR_FREE(def-mirror);
 VIR_FREE(def-mirrorFormat);
 VIR_FREE(def-auth.username);
+VIR_FREE(def-wwn);
 if (def-auth.secretType == VIR_DOMAIN_DISK_SECRET_TYPE_USAGE)
 VIR_FREE(def-auth.secret.usage);
 virStorageEncryptionFree(def-encryption);
@@ -3353,7 +3354,6 @@ cleanup:
 goto cleanup;
 }
 
-
 /* Parse the XML definition for a disk
  * @param node XML nodeset to parse for disk definition
  */
@@ -3402,6 +3402,7 @@ virDomainDiskDefParseXML(virCapsPtr caps,
 char *authUUID = NULL;
 char *usageType = NULL;
 char *tray = NULL;
+char *wwn = NULL;
 
 if (VIR_ALLOC(def)  0) {
 virReportOOMError();
@@ -3704,6 +3705,12 @@ virDomainDiskDefParseXML(virCapsPtr caps,
 } else if (!serial 
xmlStrEqual(cur-name, BAD_CAST serial)) {
 serial = (char *)xmlNodeGetContent(cur);
+} else if (!wwn 
+   xmlStrEqual(cur-name, BAD_CAST wwn)) {
+wwn = (char *)xmlNodeGetContent(cur);
+
+if (!virValidateWWN(wwn))
+goto error;
 } else if (xmlStrEqual(cur-name, BAD_CAST boot)) {
 /* boot is parsed as part of virDomainDeviceInfoParseXML */
 }
@@ -4000,6 +4007,8 @@ virDomainDiskDefParseXML(virCapsPtr caps,
 encryption = NULL;
 def-serial = serial;
 serial = NULL;
+def-wwn = wwn;
+wwn = NULL;
 
 if (!def-driverType 
 caps-defaultDiskDriverType 
@@ -11561,6 +11570,7 @@ virDomainDiskDefFormat(virBufferPtr buf,
 if (def-transient)
 virBufferAddLit(buf,   transient/\n);
 virBufferEscapeString(buf,   serial%s/serial\n, def-serial);
+virBufferEscapeString(buf,   wwn%s/wwn\n, def-wwn);
 if (def-encryption) {
 virBufferAdjustIndent(buf, 6);
 if (virStorageEncryptionFormat(buf, def-encryption)  0)
diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
index dfdae49..3b335a0 100644
--- a/src/conf/domain_conf.h
+++ b/src/conf/domain_conf.h
@@ -571,6 +571,7 @@ struct _virDomainDiskDef {
 virDomainBlockIoTuneInfo blkdeviotune;
 
 char *serial;
+char *wwn;
 int cachemode;
 int error_policy;  /* enum virDomainDiskErrorPolicy */
 int rerror_policy; /* enum virDomainDiskErrorPolicy */
diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
index 27eb43e..a0675f4 100644
--- a/src/libvirt_private.syms
+++ b/src/libvirt_private.syms
@@ -1240,6 +1240,7 @@ virStrToLong_ull;
 virStrcpy;
 virStrncpy;
 virTrimSpaces;
+virValidateWWN;
 virVasprintf;
 
 
diff --git a/src/util/util.c b/src/util/util.c
index 91eab72..682a504 100644
--- a/src/util/util.c
+++ b/src/util/util.c
@@ -45,6 +45,7 @@
 #include termios.h
 #include pty.h
 #include locale.h
+#include regex.h
 
 #if HAVE_LIBDEVMAPPER_H
 # include libdevmapper.h
@@ -3052,3 +3053,26 @@ bool virIsDevMapperDevice(const char *dev_name 
ATTRIBUTE_UNUSED)
 return false;
 }
 #endif
+
+#define WWN_REG_PATTERN[0-9a-zA-Z]{16}
+bool
+virValidateWWN(const char *wwn) {
+regex_t re;
+int err;
+char error[100];
+
+if ((err = regcomp(re, WWN_REG_PATTERN, REG_EXTENDED)) != 0)
+goto fail;
+
+if ((err = regexec(re, wwn, 0, NULL, 0)) != 0)
+goto fail;
+
+regfree(re);
+return true;
+
+fail:
+regerror(err, re, error, sizeof(error));
+virReportError(VIR_ERR_INTERNAL_ERROR,
+   _(Malformed wwn: %s), error);
+return false;
+}
diff --git a/src/util/util.h b/src/util/util.h
index a5d892d..0c0efad 100644
--- a/src/util/util.h
+++ b/src/util/util.h
@@ -277,4 +277,6 @@ int virBuildPathInternal(char **path, ...) 
ATTRIBUTE_SENTINEL;
 
 bool virIsDevMapperDevice(const char *dev_name) ATTRIBUTE_NONNULL(1);
 
+bool virValidateWWN(const char *wwn);
+
 #endif /* __VIR_UTIL_H__ */
-- 
1.7.7.3

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list


Re: [libvirt] [PATCH 2/4 v2] conf: Parse and format disk wwn

2012-08-31 Thread Osier Yang

On 2012年08月31日 19:10, Osier Yang wrote:

Validates the wwn while parsing, error out if it's malformed.

* src/util/util.h: Declare virValidateWWN
* src/util/util.c: Implement virValidateWWN
* src/libvirt_private.syms: Export virValidateWWN.
* src/conf/domain_conf.h: New member 'wwn' for disk def.
* src/conf/domain_conf.c: Parse and format diskwwn
---


I made a memory leak in this patch, will squash the follow
diff in if pushing.

diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index df6599a..40353a4 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -4063,6 +4063,7 @@ cleanup:
 VIR_FREE(copy_on_read);
 VIR_FREE(devaddr);
 VIR_FREE(serial);
+VIR_FREE(wwn);
 virStorageEncryptionFree(encryption);
 VIR_FREE(startupPolicy);

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list

Re: [libvirt] [PATCH 2/4 v2] conf: Parse and format disk wwn

2012-08-31 Thread Eric Blake
On 08/31/2012 04:10 AM, Osier Yang wrote:
 Validates the wwn while parsing, error out if it's malformed.
 
 * src/util/util.h: Declare virValidateWWN
 * src/util/util.c: Implement virValidateWWN
 * src/libvirt_private.syms: Export virValidateWWN.
 * src/conf/domain_conf.h: New member 'wwn' for disk def.
 * src/conf/domain_conf.c: Parse and format disk wwn

 +#define WWN_REG_PATTERN[0-9a-zA-Z]{16}
 +bool
 +virValidateWWN(const char *wwn) {
 +regex_t re;
 +int err;
 +char error[100];
 +
 +if ((err = regcomp(re, WWN_REG_PATTERN, REG_EXTENDED)) != 0)

Do we really need regcomp() for this?  I'm thinking it's much faster to
just do something like:

for (i = 0; wwn[i]; i++)
if (!c_isxdigit(wwn[i]))
break;
if (i != 16 || wwn[i])
// error, return false;
return true;

-- 
-- 
Eric Blake   ebl...@redhat.com+1-919-301-3266
Libvirt virtualization library http://libvirt.org



signature.asc
Description: OpenPGP digital signature
--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list