+
+#include <stdarg.h>
+#include <stdio.h>
+#include <unistd.h>
+#include <inttypes.h>
+
+static unsigned char buf0[1024];
+static unsigned char buf1[1024] = {4, 0, 0, 2};
const
+
+
+static int qbi_print_test(struct QBlockInfoImage *info)
+{
+ printf("name:%s, protocol %d, format %d, virt_size %" PRId64 " "
+ " allocated_size %" PRId64
+ " encrypt %d, backing file %s.\n",
+ info->filename, info->protocol, info->format, info->virt_size,
+ info->allocated_size,
+ info->encrypt, info->backing_filename);
+ return 0;
The return value does not seem useful, just make the function return void.
+}
+
+
+int main(int argc, char **argv)
+{
+ struct QBlockState *qbs = NULL;
+ struct QBlockOptionOpen *qboo = NULL;
+ struct QBlockOptionCreate *qboc = NULL;
+ struct QBlockInfoImage *qbi = NULL;
+ char *filename1, *filename2;
+ int ret, err_no;
+ const char *err_msg = NULL;
+
+ int i;
+ unsigned long op_size = 512;
+ unsigned long op_start = 1024;
+
+ if (argc < 3) {
+ printf("usage: libqblock-test [filename1] [filename2].\n");
fprintf(stderr,
+ return 0;
return 1;
+ }
+ filename1 = argv[1];
+ printf("qemu test, file name1 is %s.\n", filename1);
+ filename2 = argv[2];
+ printf("qemu test, file name2 is %s.\n", filename2);
QEMU libblock-test, just print both file names together.
+
+ libqblock_init();
+
+ ret = qb_state_new(&qbs);
+ if (ret < 0) {
+ goto free;
+ }
+
+ ret = qb_oc_new(&qboc, QB_FMT_QCOW);
+ if (ret < 0) {
+ goto free;
+ }
+
+ qboc->o_loc.filename = filename1;
+ qboc->o_loc.protocol = QB_PROTO_FILE;
+ qboc->o_fmt.fmt_type = QB_FMT_QCOW;
+ qboc->o_fmt.fmt_op.o_qcow.virt_size = 128 * 1024 * 1024;
A smaller file should be enough for the tests.
+
+ ret = qb_create(qbs, qboc);
+ if (ret < 0) {
+ printf("failed to create image, ret is %d.\n", ret);
+ if (ret == QB_ERR_INTERNAL_ERR) {
+ err_msg = qb_error_get_detail(qbs, &err_no);
+ printf("errno is %d, msg is %s.\n", err_no, err_msg);
+ }
This snippet is repeated below, please refactor. Error messages should
go to stderr.
+ goto free;
+ }
+
+ qboc->o_loc.filename = filename2;
+ qboc->o_loc.protocol = QB_PROTO_FILE;
+ qboc->o_fmt.fmt_type = QB_FMT_QCOW2;
+ qboc->o_fmt.fmt_op.o_qcow2.backing_file = filename1;
+
+ ret = qb_create(qbs, qboc);
+ if (ret < 0) {
+ printf("failed to create image, ret is %d.\n", ret);
+ if (ret == QB_ERR_INTERNAL_ERR) {
+ err_msg = qb_error_get_detail(qbs, &err_no);
+ printf("errno is %d, msg is %s.\n", err_no, err_msg);
+ }
+ goto free;
+ }
+
+ ret = qb_oo_new(&qboo);
+ if (ret < 0) {
+ goto unlink;
+ }
+
+ qboo->o_loc.filename = filename2;
+ qboo->o_loc.protocol = QB_PROTO_FILE;
+ qboo->o_fmt_type = QB_FMT_QCOW2;
+ qboo->o_flag = LIBQBLOCK_O_RDWR;
+
+ ret = qb_open(qbs, qboo);
+ if (ret < 0) {
+ printf("failed to open image, ret is %d.\n", ret);
+ if (ret == QB_ERR_INTERNAL_ERR) {
+ err_msg = qb_error_get_detail(qbs, &err_no);
+ printf("errno is %d, msg is %s.\n", err_no, err_msg);
+ }
+ goto unlink;
+ }
+
+ ret = qb_write(qbs, buf1, op_size, op_start);
+ if (ret < 0) {
+ printf("failed to write image, ret is %d.\n", ret);
+ if (ret == QB_ERR_INTERNAL_ERR) {
+ err_msg = qb_error_get_detail(qbs, &err_no);
+ printf("errno is %d, msg is %s.\n", err_no, err_msg);
+ }
+ goto close;
+ }
+ ret = qb_read(qbs, buf0, op_size, op_start);
+ if (ret < 0) {
+ printf("failed to read image, ret is %d.\n", ret);
+ if (ret == QB_ERR_INTERNAL_ERR) {
+ err_msg = qb_error_get_detail(qbs, &err_no);
+ printf("errno is %d, msg is %s.\n", err_no, err_msg);
+ }
+ goto close;
+ }
+
+ for (i = 0; i < op_size; i++) {
+ if (buf0[i] != buf1[i]) {
Just use memcmp().
+ printf("mismatch found at %d.\n", i);
+ break;
+ }
+ }
+
+ /* check backing chain */
+ ret = qb_infoimage_get(qbs, &qbi);
+ if (ret < 0) {
+ printf("failed to get image info, ret is %d.\n", ret);
+ if (ret == QB_ERR_INTERNAL_ERR) {
+ err_msg = qb_error_get_detail(qbs, &err_no);
+ printf("errno is %d, msg is %s.\n", err_no, err_msg);
+ }
+ goto close;
+ }
+ qbi_print_test(qbi);
+
+ while (qbi->backing_filename != NULL) {
+ qb_close(qbs);
+ qboo->o_loc.filename = qbi->backing_filename;
+ qboo->o_loc.protocol = QB_PROTO_FILE;
+ qboo->o_fmt_type = QB_FMT_NONE;
+ qboo->o_flag = 0;
+ ret = qb_open(qbs, qboo);
+ if (ret < 0) {
+ printf("failed to open back image %s, ret is %d.\n",
+ qbi->backing_filename, ret);
+ if (ret == QB_ERR_INTERNAL_ERR) {
+ err_msg = qb_error_get_detail(qbs, &err_no);
+ printf("errno is %d, msg is %s.\n", err_no, err_msg);
+ }
+ goto close;
+ }
+ qb_infoimage_free(&qbi);
+ ret = qb_infoimage_get(qbs, &qbi);
+ if (ret < 0) {
+ printf("failed to get image info, ret is %d.\n", ret);
+ if (ret == QB_ERR_INTERNAL_ERR) {
+ err_msg = qb_error_get_detail(qbs, &err_no);
+ printf("errno is %d, msg is %s.\n", err_no, err_msg);
+ }
+ goto close;
+ }
+ qbi_print_test(qbi);
+ }
+
+ printf("test done.\n");
+
+ close:
+ qb_close(qbs);
+ unlink:
+ unlink(filename1);
+ unlink(filename2);
+ free:
+ if (qbs != NULL) {
+ qb_state_free(&qbs);
+ }
+ if (qboo != NULL) {
+ qb_oo_free(&qboo);
+ }
+ if (qboc != NULL) {
+ qb_oc_free(&qboc);
+ }
+ if (qbi != NULL) {
+ qb_infoimage_free(&qbi);
+ }
+ return 0;
Please exit with nonzero value if there has been any errors.
+}
--
1.7.1