[Qemu-devel] [PATCH 1/3] two new file wrappers

2013-02-26 Thread jschopp
These patches implement asn1 ber visitors for encoding and decoding data.
References: <20130226230354.982917...@linux.vnet.ibm.com>
Content-Disposition: inline; filename=qemu_file_bits.diff

Signed-off-by: Stefan Berger 
Signed-off-by: Joel Schopp 
---
 include/migration/qemu-file.h |4 
 qemu-file.c   |   33 -
 2 files changed, 36 insertions(+), 1 deletion(-)

Index: b/qemu-file.c
===
--- a/qemu-file.c
+++ b/qemu-file.c
@@ -367,7 +367,7 @@ static void qemu_file_set_error(QEMUFile
 /** Flushes QEMUFile buffer
  *
  */
-static int qemu_fflush(QEMUFile *f)
+int qemu_fflush(QEMUFile *f)
 {
 int ret = 0;
 
@@ -668,3 +668,34 @@ uint64_t qemu_get_be64(QEMUFile *f)
 v |= qemu_get_be32(f);
 return v;
 }
+
+int qemu_read_bytes(QEMUFile *f, uint8_t *buf, int size)
+{
+if (qemu_file_get_error(f)) {
+return -1;
+}
+return qemu_get_buffer(f, buf, size);
+}
+
+int qemu_peek_bytes(QEMUFile *f, uint8_t *buf, int size, size_t offset)
+{
+if (qemu_file_get_error(f)) {
+return -1;
+}
+return qemu_peek_buffer(f, buf, size, offset);
+}
+
+int qemu_write_bytes(QEMUFile *f, const uint8_t *buf, int size)
+{
+if (qemu_file_get_error(f)) {
+return -1;
+}
+
+qemu_put_buffer(f, buf, size);
+
+if (qemu_file_get_error(f)) {
+return -1;
+}
+
+return size;
+}
Index: b/include/migration/qemu-file.h
===
--- a/include/migration/qemu-file.h
+++ b/include/migration/qemu-file.h
@@ -79,11 +79,15 @@ QEMUFile *qemu_fdopen(int fd, const char
 QEMUFile *qemu_fopen_socket(int fd);
 QEMUFile *qemu_popen(FILE *popen_file, const char *mode);
 QEMUFile *qemu_popen_cmd(const char *command, const char *mode);
+int qemu_fflush(QEMUFile *f);
 int qemu_get_fd(QEMUFile *f);
 int qemu_fclose(QEMUFile *f);
 int64_t qemu_ftell(QEMUFile *f);
 void qemu_put_buffer(QEMUFile *f, const uint8_t *buf, int size);
 void qemu_put_byte(QEMUFile *f, int v);
+int qemu_read_bytes(QEMUFile *f, uint8_t *buf, int size);
+int qemu_peek_bytes(QEMUFile *f, uint8_t *buf, int size, size_t offset);
+int qemu_write_bytes(QEMUFile *f, const uint8_t *buf, int size);
 
 static inline void qemu_put_ubyte(QEMUFile *f, unsigned int v)
 {




[Qemu-devel] [PATCH 3/3] asn1 visitor tests

2013-02-26 Thread jschopp
These patches implement asn1 ber visitors for encoding and decoding data.
References: <20130226230354.982917...@linux.vnet.ibm.com>
Content-Disposition: inline; filename=asn1_tests.diff

Signed-off-by: Stefan Berger 
Signed-off-by: Joel Schopp 
---
 tests/Makefile   |   12 +
 tests/test-ber-visitor.c |  518 +++
 2 files changed, 530 insertions(+)

Index: b/tests/test-ber-visitor.c
===
--- /dev/null
+++ b/tests/test-ber-visitor.c
@@ -0,0 +1,518 @@
+/*
+ * BER Output Visitor unit-tests.
+ *
+ * Copyright (C) 2011 Red Hat Inc.
+ * Copyright (C) 2011 IBM Corporation
+ *
+ * Authors:
+ *  Luiz Capitulino 
+ *  Stefan Berger 
+ *
+ * This work is licensed under the terms of the GNU GPL, version 2 or later.
+ * See the COPYING file in the top-level directory.
+ */
+
+#include 
+
+#include "qemu-common.h"
+#include "ber/ber-output-visitor.h"
+#include "ber/ber-input-visitor.h"
+#include "hw/hw.h"
+#include "include/qapi/visitor.h"
+
+
+typedef struct TestInputOutputVisitorData {
+QEMUFile *qoutfile;
+BEROutputVisitor *bov;
+Visitor *ov;
+
+QEMUFile *qinfile;
+BERInputVisitor *biv;
+Visitor *iv;
+} TestInputOutputVisitor;
+
+static void visitor_output_setup(TestInputOutputVisitor *data,
+ BERTypePC ber_type_pc)
+{
+data->qoutfile = qemu_bufopen("w", NULL);
+
+data->bov = ber_output_visitor_new(data->qoutfile, ber_type_pc);
+g_assert(data->bov != NULL);
+
+data->ov = ber_output_get_visitor(data->bov);
+g_assert(data->ov != NULL);
+}
+
+static void visitor_output_setup_primitive(TestInputOutputVisitor *data,
+   const void *unused)
+{
+visitor_output_setup(data, BER_TYPE_PRIMITIVE);
+}
+
+static void visitor_output_setup_constructed(TestInputOutputVisitor *data,
+ const void *unused)
+{
+visitor_output_setup(data, BER_TYPE_CONSTRUCTED);
+}
+
+static void visitor_input_setup(TestInputOutputVisitor *data)
+{
+const QEMUSizedBuffer *qsb = qemu_buf_get(data->qoutfile);
+QEMUSizedBuffer *new_qsb = qsb_clone(qsb);
+g_assert(new_qsb != NULL);
+
+data->qinfile = qemu_bufopen("r", new_qsb);
+g_assert(data->qinfile != NULL);
+
+data->biv = ber_input_visitor_new(data->qinfile, ~0);
+g_assert(data->biv != NULL);
+
+data->iv = ber_input_get_visitor(data->biv);
+g_assert(data->iv != NULL);
+}
+
+static void visitor_output_teardown(TestInputOutputVisitor *data,
+const void *unused)
+{
+ber_output_visitor_cleanup(data->bov);
+data->bov = NULL;
+data->ov = NULL;
+
+ber_input_visitor_cleanup(data->biv);
+data->biv = NULL;
+data->iv = NULL;
+
+if (data->qinfile) {
+qemu_fclose(data->qinfile);
+}
+if (data->qoutfile) {
+qemu_fclose(data->qoutfile);
+}
+}
+
+static void test_visitor_out_int(TestInputOutputVisitor *data,
+ const void *unused)
+{
+int64_t value_in = -42, value_out = 0;
+Error *errp = NULL;
+
+visit_type_int(data->ov, &value_in, NULL, &errp);
+g_assert(error_is_set(&errp) == 0);
+
+visitor_input_setup(data);
+
+visit_type_int(data->iv, &value_out, NULL, &errp);
+g_assert_cmpint(value_out, ==, -42);
+}
+
+static void test_visitor_out_bool(TestInputOutputVisitor *data,
+  const void *unused)
+{
+Error *errp = NULL;
+bool value_in = true, value_out = false;
+
+visit_type_bool(data->ov, &value_in, NULL, &errp);
+g_assert(error_is_set(&errp) == 0);
+
+visitor_input_setup(data);
+
+visit_type_bool(data->iv, &value_out, NULL, &errp);
+g_assert_cmpint(value_out, ==, true);
+
+}
+
+static void test_visitor_out_string(TestInputOutputVisitor *data,
+const void *unused)
+{
+char *string_in = (char *) "Q E M U", *string_out = NULL;
+Error *errp = NULL;
+
+visit_type_str(data->ov, &string_in, NULL, &errp);
+g_assert(error_is_set(&errp) == 0);
+
+visitor_input_setup(data);
+
+visit_type_str(data->iv, &string_out, NULL, &errp);
+
+g_assert_cmpstr(string_out, ==, string_in);
+g_free(string_out);
+}
+
+static void test_visitor_out_no_string(TestInputOutputVisitor *data,
+   const void *unused)
+{
+char *string_in = NULL, *string_out = NULL;
+Error *errp = NULL;
+
+/* A null string should return "" */
+visit_type_str(data->ov, &string_in, NULL, &errp);
+g_assert(error_is_set(&errp) == 0);
+g_assert(qsb_get_length(qemu_buf_get(data->qoutfile)) == 2);
+
+visitor_input_setup(data);
+
+visit_type_str(data->iv, &string_out, NULL, &errp);
+g_assert_cmpstr(string_out, ==, "");
+
+g_free(string_out);
+}
+
+typedef struct SimpleStruct {
+int64_t integer;
+bool boolean;
+char *

[Qemu-devel] [PATCH 0/3] Implement and test asn1 ber visitors

2013-02-26 Thread jschopp
These patches implement asn1 ber visitors for encoding and decoding data.

These depend on the previously posted patch 
"Move File operations to qemu-file.c".  These seem useful on their own so I 
thought I'd post them now so others can use them.  I plan to post an nvram
implementation shortly that requires these to function.