Re: [RFC PATCH 01/18] qemu-storage-daemon: Add barebone tool

2019-11-13 Thread Kevin Wolf
Am 24.10.2019 um 15:50 hat Eric Blake geschrieben:
> On 10/17/19 8:01 AM, Kevin Wolf wrote:
> > This adds a new binary qemu-storage-daemon that doesn't yet do more than
> > some typical initialisation for tools and parsing the basic command
> > options --version, --help and --trace.
> > 
> > Signed-off-by: Kevin Wolf 
> > ---
> >   configure |   2 +-
> >   qemu-storage-daemon.c | 141 ++
> >   Makefile  |   1 +
> >   3 files changed, 143 insertions(+), 1 deletion(-)
> >   create mode 100644 qemu-storage-daemon.c
> > 
> > diff --git a/configure b/configure
> 
> > +++ b/qemu-storage-daemon.c
> > @@ -0,0 +1,141 @@
> > +/*
> > + * QEMU storage daemon
> > + *
> > + * Copyright (c) 2019 Kevin Wolf 
> > + *
> > + * Permission is hereby granted, free of charge, to any person obtaining a 
> > copy
> > + * of this software and associated documentation files (the "Software"), 
> > to deal
> > + * in the Software without restriction, including without limitation the 
> > rights
> > + * to use, copy, modify, merge, publish, distribute, sublicense, and/or 
> > sell
> > + * copies of the Software, and to permit persons to whom the Software is
> > + * furnished to do so, subject to the following conditions:
> > + *
> > + * The above copyright notice and this permission notice shall be included 
> > in
> > + * all copies or substantial portions of the Software.
> > + *
> > + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 
> > OR
> > + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
> > + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
> > + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR 
> > OTHER
> > + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
> > FROM,
> > + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS 
> > IN
> > + * THE SOFTWARE.
> 
> Is there an intent to license this binary as BSD (by restricting sources
> that can be linked in), or is it going to end up as GPLv2+ for other
> reasons? If the latter, would it be better to license this file GPLv2+?

The binary will be GPLv2 either way. Maybe even GPLv2+, not sure about
that.

This file copies quite a bit from qemu-img.c and vl.c, so I'm using the
same license as there. Of course, the "bug" in my patch is that I also
need to keep not only the license text, but also the actual copyright
line from there. Will fix.

> 
> > + */
> > +
> > +#include "qemu/osdep.h"
> > +
> > +#include "block/block.h"
> > +#include "crypto/init.h"
> > +
> > +#include "qapi/error.h"
> > +#include "qemu-common.h"
> > +#include "qemu-version.h"
> > +#include "qemu/config-file.h"
> > +#include "qemu/error-report.h"
> > +#include "qemu/log.h"
> > +#include "qemu/main-loop.h"
> > +#include "qemu/module.h"
> > +
> > +#include "trace/control.h"
> > +
> > +#include 
> 
> Shouldn't system headers appear right after qemu/osdep.h?

I wasn't aware of this, but CODING_STYLE.rst agrees with you.

> > +
> > +static void help(void)
> > +{
> > +printf(
> > +"Usage: %s [options]\n"
> > +"QEMU storage daemon\n"
> > +"\n"
> > +"  -h, --help display this help and exit\n"
> > +"  -T, --trace [[enable=]][,events=][,file=]\n"
> > +" specify tracing options\n"
> > +"  -V, --version  output version information and exit\n"
> > +"\n"
> > +QEMU_HELP_BOTTOM "\n",
> > +error_get_progname());
> > +}
> > +
> > +static int process_options(int argc, char *argv[], Error **errp)
> > +{
> > +int c;
> > +char *trace_file = NULL;
> > +int ret = -EINVAL;
> > +
> > +static const struct option long_options[] = {
> > +{"help", no_argument, 0, 'h'},
> > +{"version", no_argument, 0, 'V'},
> > +{"trace", required_argument, NULL, 'T'},
> 
> I find it harder to maintain lists of options (which will get longer over
> time) when the order of the struct...
> 
> > +{0, 0, 0, 0}
> > +};
> > +
> > +while ((c = getopt_long(argc, argv, ":hT:V", long_options, NULL)) != 
> > -1) {
> 
> ...the order of the short options...
> 
> > +switch (c) {
> > +case '?':
> > +error_setg(errp, "Unknown option '%s'", argv[optind - 1]);
> > +goto out;
> > +case ':':
> > +error_setg(errp, "Missing option argument for '%s'",
> > +   argv[optind - 1]);
> > +goto out;
> > +case 'h':
> > +help();
> > +exit(EXIT_SUCCESS);
> > +case 'V':
> > +printf("qemu-storage-daemon version "
> > +   QEMU_FULL_VERSION "\n" QEMU_COPYRIGHT "\n");
> > +exit(EXIT_SUCCESS);
> > +case 'T':
> > +g_free(trace_file);
> > +trace_file = trace_opt_parse(optarg);
> > +break;
> 
> ...and the order of the case statements are not identical. Case-insensitive
> alp

Re: [RFC PATCH 01/18] qemu-storage-daemon: Add barebone tool

2019-11-07 Thread Markus Armbruster
In addition to Eric's review:

Kevin Wolf  writes:

> This adds a new binary qemu-storage-daemon that doesn't yet do more than
> some typical initialisation for tools and parsing the basic command
> options --version, --help and --trace.
>
> Signed-off-by: Kevin Wolf 
> ---
>  configure |   2 +-
>  qemu-storage-daemon.c | 141 ++
>  Makefile  |   1 +
>  3 files changed, 143 insertions(+), 1 deletion(-)
>  create mode 100644 qemu-storage-daemon.c
>
> diff --git a/configure b/configure
> index 08ca4bcb46..bb3d55fb25 100755
> --- a/configure
> +++ b/configure
> @@ -6034,7 +6034,7 @@ tools=""
>  if test "$want_tools" = "yes" ; then
>tools="qemu-img\$(EXESUF) qemu-io\$(EXESUF) qemu-edid\$(EXESUF) $tools"
>if [ "$linux" = "yes" -o "$bsd" = "yes" -o "$solaris" = "yes" ] ; then
> -tools="qemu-nbd\$(EXESUF) $tools"
> +tools="qemu-nbd\$(EXESUF) qemu-storage-daemon\$(EXESUF) $tools"
>fi
>if [ "$ivshmem" = "yes" ]; then
>  tools="ivshmem-client\$(EXESUF) ivshmem-server\$(EXESUF) $tools"
> diff --git a/qemu-storage-daemon.c b/qemu-storage-daemon.c
> new file mode 100644
> index 00..a251dc255c
> --- /dev/null
> +++ b/qemu-storage-daemon.c
> @@ -0,0 +1,141 @@
> +/*
> + * QEMU storage daemon
> + *
> + * Copyright (c) 2019 Kevin Wolf 
> + *
> + * Permission is hereby granted, free of charge, to any person obtaining a 
> copy
> + * of this software and associated documentation files (the "Software"), to 
> deal
> + * in the Software without restriction, including without limitation the 
> rights
> + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
> + * copies of the Software, and to permit persons to whom the Software is
> + * furnished to do so, subject to the following conditions:
> + *
> + * The above copyright notice and this permission notice shall be included in
> + * all copies or substantial portions of the Software.
> + *
> + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
> + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
> + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
> + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
> + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
> FROM,
> + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
> + * THE SOFTWARE.
> + */

Standard request for new code: please make this GPLv2+, or tell us why
it has to be something else.

> +
> +#include "qemu/osdep.h"
> +
> +#include "block/block.h"
> +#include "crypto/init.h"
> +
> +#include "qapi/error.h"
> +#include "qemu-common.h"
> +#include "qemu-version.h"
> +#include "qemu/config-file.h"
> +#include "qemu/error-report.h"
> +#include "qemu/log.h"
> +#include "qemu/main-loop.h"
> +#include "qemu/module.h"
> +
> +#include "trace/control.h"
> +
> +#include 
> +
> +static void help(void)
> +{
> +printf(
> +"Usage: %s [options]\n"
> +"QEMU storage daemon\n"
> +"\n"
> +"  -h, --help display this help and exit\n"
> +"  -T, --trace [[enable=]][,events=][,file=]\n"
> +" specify tracing options\n"
> +"  -V, --version  output version information and exit\n"
> +"\n"
> +QEMU_HELP_BOTTOM "\n",
> +error_get_progname());
> +}
> +
> +static int process_options(int argc, char *argv[], Error **errp)
> +{
> +int c;
> +char *trace_file = NULL;
> +int ret = -EINVAL;
> +
> +static const struct option long_options[] = {
> +{"help", no_argument, 0, 'h'},

You initialize member int *flag with 0 here, 

> +{"version", no_argument, 0, 'V'},
> +{"trace", required_argument, NULL, 'T'},

... and with NULL here.  Recommend to pick one and stick to it.

> +{0, 0, 0, 0}

{0} or {} would do.

> +};
> +
> +while ((c = getopt_long(argc, argv, ":hT:V", long_options, NULL)) != -1) 
> {
> +switch (c) {
> +case '?':
> +error_setg(errp, "Unknown option '%s'", argv[optind - 1]);
> +goto out;
> +case ':':
> +error_setg(errp, "Missing option argument for '%s'",
> +   argv[optind - 1]);
> +goto out;
> +case 'h':
> +help();
> +exit(EXIT_SUCCESS);
> +case 'V':
> +printf("qemu-storage-daemon version "
> +   QEMU_FULL_VERSION "\n" QEMU_COPYRIGHT "\n");
> +exit(EXIT_SUCCESS);
> +case 'T':
> +g_free(trace_file);
> +trace_file = trace_opt_parse(optarg);

This is QemuOpts below the hood.  Fact, not criticism :)

> +break;
> +}

Suggest (your preferred variation of) default: assert(0) to catch
omissions.

> +}
> +if (optind != argc) {
> +error_setg(errp, "Unexpected argument: %s", argv[optind]);
> +goto out;
> +}
> +
> +if (!trace_init_bac

Re: [RFC PATCH 01/18] qemu-storage-daemon: Add barebone tool

2019-11-06 Thread Max Reitz
On 17.10.19 15:01, Kevin Wolf wrote:
> This adds a new binary qemu-storage-daemon that doesn't yet do more than
> some typical initialisation for tools and parsing the basic command
> options --version, --help and --trace.
> 
> Signed-off-by: Kevin Wolf 
> ---
>  configure |   2 +-
>  qemu-storage-daemon.c | 141 ++
>  Makefile  |   1 +
>  3 files changed, 143 insertions(+), 1 deletion(-)
>  create mode 100644 qemu-storage-daemon.c
> 
> diff --git a/configure b/configure
> index 08ca4bcb46..bb3d55fb25 100755
> --- a/configure
> +++ b/configure
> @@ -6034,7 +6034,7 @@ tools=""
>  if test "$want_tools" = "yes" ; then
>tools="qemu-img\$(EXESUF) qemu-io\$(EXESUF) qemu-edid\$(EXESUF) $tools"
>if [ "$linux" = "yes" -o "$bsd" = "yes" -o "$solaris" = "yes" ] ; then
> -tools="qemu-nbd\$(EXESUF) $tools"
> +tools="qemu-nbd\$(EXESUF) qemu-storage-daemon\$(EXESUF) $tools"
>fi
>if [ "$ivshmem" = "yes" ]; then
>  tools="ivshmem-client\$(EXESUF) ivshmem-server\$(EXESUF) $tools"
> diff --git a/qemu-storage-daemon.c b/qemu-storage-daemon.c
> new file mode 100644
> index 00..a251dc255c
> --- /dev/null
> +++ b/qemu-storage-daemon.c
> @@ -0,0 +1,141 @@
> +/*
> + * QEMU storage daemon
> + *
> + * Copyright (c) 2019 Kevin Wolf 
> + *
> + * Permission is hereby granted, free of charge, to any person obtaining a 
> copy
> + * of this software and associated documentation files (the "Software"), to 
> deal
> + * in the Software without restriction, including without limitation the 
> rights
> + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
> + * copies of the Software, and to permit persons to whom the Software is
> + * furnished to do so, subject to the following conditions:
> + *
> + * The above copyright notice and this permission notice shall be included in
> + * all copies or substantial portions of the Software.
> + *
> + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
> + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
> + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
> + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
> + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
> FROM,
> + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
> + * THE SOFTWARE.
> + */
> +
> +#include "qemu/osdep.h"
> +
> +#include "block/block.h"
> +#include "crypto/init.h"
> +
> +#include "qapi/error.h"
> +#include "qemu-common.h"
> +#include "qemu-version.h"
> +#include "qemu/config-file.h"
> +#include "qemu/error-report.h"
> +#include "qemu/log.h"
> +#include "qemu/main-loop.h"
> +#include "qemu/module.h"
> +
> +#include "trace/control.h"
> +
> +#include 
> +
> +static void help(void)
> +{
> +printf(
> +"Usage: %s [options]\n"
> +"QEMU storage daemon\n"
> +"\n"
> +"  -h, --help display this help and exit\n"
> +"  -T, --trace [[enable=]][,events=][,file=]\n"
> +" specify tracing options\n"
> +"  -V, --version  output version information and exit\n"
> +"\n"
> +QEMU_HELP_BOTTOM "\n",
> +error_get_progname());
> +}
> +
> +static int process_options(int argc, char *argv[], Error **errp)
> +{
> +int c;
> +char *trace_file = NULL;
> +int ret = -EINVAL;
> +
> +static const struct option long_options[] = {
> +{"help", no_argument, 0, 'h'},
> +{"version", no_argument, 0, 'V'},
> +{"trace", required_argument, NULL, 'T'},
> +{0, 0, 0, 0}
> +};
> +
> +while ((c = getopt_long(argc, argv, ":hT:V", long_options, NULL)) != -1) 
> {
> +switch (c) {
> +case '?':
> +error_setg(errp, "Unknown option '%s'", argv[optind - 1]);
> +goto out;

Am I doing something wrong or is optind really not updated when '?' is
returned?

Because I’m getting this:

$ ./qemu-storage-daemon -42
qemu-storage-daemon: Unknown option './qemu-storage-daemon'

But OTOH I also get:

$ ./qemu-img create -42
qemu-img: unrecognized option 'create'
Try 'qemu-img --help' for more information

So, uh, well.

Max



signature.asc
Description: OpenPGP digital signature


Re: [RFC PATCH 01/18] qemu-storage-daemon: Add barebone tool

2019-10-24 Thread Eric Blake

On 10/17/19 8:01 AM, Kevin Wolf wrote:

This adds a new binary qemu-storage-daemon that doesn't yet do more than
some typical initialisation for tools and parsing the basic command
options --version, --help and --trace.

Signed-off-by: Kevin Wolf 
---
  configure |   2 +-
  qemu-storage-daemon.c | 141 ++
  Makefile  |   1 +
  3 files changed, 143 insertions(+), 1 deletion(-)
  create mode 100644 qemu-storage-daemon.c

diff --git a/configure b/configure



+++ b/qemu-storage-daemon.c
@@ -0,0 +1,141 @@
+/*
+ * QEMU storage daemon
+ *
+ * Copyright (c) 2019 Kevin Wolf 
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to 
deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.


Is there an intent to license this binary as BSD (by restricting sources 
that can be linked in), or is it going to end up as GPLv2+ for other 
reasons? If the latter, would it be better to license this file GPLv2+?




+ */
+
+#include "qemu/osdep.h"
+
+#include "block/block.h"
+#include "crypto/init.h"
+
+#include "qapi/error.h"
+#include "qemu-common.h"
+#include "qemu-version.h"
+#include "qemu/config-file.h"
+#include "qemu/error-report.h"
+#include "qemu/log.h"
+#include "qemu/main-loop.h"
+#include "qemu/module.h"
+
+#include "trace/control.h"
+
+#include 


Shouldn't system headers appear right after qemu/osdep.h?


+
+static void help(void)
+{
+printf(
+"Usage: %s [options]\n"
+"QEMU storage daemon\n"
+"\n"
+"  -h, --help display this help and exit\n"
+"  -T, --trace [[enable=]][,events=][,file=]\n"
+" specify tracing options\n"
+"  -V, --version  output version information and exit\n"
+"\n"
+QEMU_HELP_BOTTOM "\n",
+error_get_progname());
+}
+
+static int process_options(int argc, char *argv[], Error **errp)
+{
+int c;
+char *trace_file = NULL;
+int ret = -EINVAL;
+
+static const struct option long_options[] = {
+{"help", no_argument, 0, 'h'},
+{"version", no_argument, 0, 'V'},
+{"trace", required_argument, NULL, 'T'},


I find it harder to maintain lists of options (which will get longer 
over time) when the order of the struct...



+{0, 0, 0, 0}
+};
+
+while ((c = getopt_long(argc, argv, ":hT:V", long_options, NULL)) != -1) {


...the order of the short options...


+switch (c) {
+case '?':
+error_setg(errp, "Unknown option '%s'", argv[optind - 1]);
+goto out;
+case ':':
+error_setg(errp, "Missing option argument for '%s'",
+   argv[optind - 1]);
+goto out;
+case 'h':
+help();
+exit(EXIT_SUCCESS);
+case 'V':
+printf("qemu-storage-daemon version "
+   QEMU_FULL_VERSION "\n" QEMU_COPYRIGHT "\n");
+exit(EXIT_SUCCESS);
+case 'T':
+g_free(trace_file);
+trace_file = trace_opt_parse(optarg);
+break;


...and the order of the case statements are not identical. 
Case-insensitive alphabetical may be easiest (matching your shortopt 
ordering of ":hT:V").



+}
+}
+if (optind != argc) {
+error_setg(errp, "Unexpected argument: %s", argv[optind]);
+goto out;
+}
+
+if (!trace_init_backends()) {
+error_setg(errp, "Could not initialize trace backends");
+goto out;
+}
+trace_init_file(trace_file);
+qemu_set_log(LOG_TRACE);
+
+ret = 0;
+out:
+g_free(trace_file);


Mark trace_file as g_auto, and you can avoid the out: label altogether.


+return ret;
+}
+
+int main(int argc, char *argv[])
+{
+Error *local_err = NULL;
+int ret;
+
+#ifdef CONFIG_POSIX
+signal(SIGPIPE, SIG_IGN);
+#endif
+
+error_init(argv[0]);
+qemu_init_exec_dir(argv[0]);
+
+module_call_init(MODULE_INIT_QOM);
+module_call_init(MODULE_INIT_TRACE);
+qemu_add_opts(&qemu_trace_opts);
+qcrypto_init(&error_fatal);
+bdr

[RFC PATCH 01/18] qemu-storage-daemon: Add barebone tool

2019-10-17 Thread Kevin Wolf
This adds a new binary qemu-storage-daemon that doesn't yet do more than
some typical initialisation for tools and parsing the basic command
options --version, --help and --trace.

Signed-off-by: Kevin Wolf 
---
 configure |   2 +-
 qemu-storage-daemon.c | 141 ++
 Makefile  |   1 +
 3 files changed, 143 insertions(+), 1 deletion(-)
 create mode 100644 qemu-storage-daemon.c

diff --git a/configure b/configure
index 08ca4bcb46..bb3d55fb25 100755
--- a/configure
+++ b/configure
@@ -6034,7 +6034,7 @@ tools=""
 if test "$want_tools" = "yes" ; then
   tools="qemu-img\$(EXESUF) qemu-io\$(EXESUF) qemu-edid\$(EXESUF) $tools"
   if [ "$linux" = "yes" -o "$bsd" = "yes" -o "$solaris" = "yes" ] ; then
-tools="qemu-nbd\$(EXESUF) $tools"
+tools="qemu-nbd\$(EXESUF) qemu-storage-daemon\$(EXESUF) $tools"
   fi
   if [ "$ivshmem" = "yes" ]; then
 tools="ivshmem-client\$(EXESUF) ivshmem-server\$(EXESUF) $tools"
diff --git a/qemu-storage-daemon.c b/qemu-storage-daemon.c
new file mode 100644
index 00..a251dc255c
--- /dev/null
+++ b/qemu-storage-daemon.c
@@ -0,0 +1,141 @@
+/*
+ * QEMU storage daemon
+ *
+ * Copyright (c) 2019 Kevin Wolf 
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to 
deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+#include "qemu/osdep.h"
+
+#include "block/block.h"
+#include "crypto/init.h"
+
+#include "qapi/error.h"
+#include "qemu-common.h"
+#include "qemu-version.h"
+#include "qemu/config-file.h"
+#include "qemu/error-report.h"
+#include "qemu/log.h"
+#include "qemu/main-loop.h"
+#include "qemu/module.h"
+
+#include "trace/control.h"
+
+#include 
+
+static void help(void)
+{
+printf(
+"Usage: %s [options]\n"
+"QEMU storage daemon\n"
+"\n"
+"  -h, --help display this help and exit\n"
+"  -T, --trace [[enable=]][,events=][,file=]\n"
+" specify tracing options\n"
+"  -V, --version  output version information and exit\n"
+"\n"
+QEMU_HELP_BOTTOM "\n",
+error_get_progname());
+}
+
+static int process_options(int argc, char *argv[], Error **errp)
+{
+int c;
+char *trace_file = NULL;
+int ret = -EINVAL;
+
+static const struct option long_options[] = {
+{"help", no_argument, 0, 'h'},
+{"version", no_argument, 0, 'V'},
+{"trace", required_argument, NULL, 'T'},
+{0, 0, 0, 0}
+};
+
+while ((c = getopt_long(argc, argv, ":hT:V", long_options, NULL)) != -1) {
+switch (c) {
+case '?':
+error_setg(errp, "Unknown option '%s'", argv[optind - 1]);
+goto out;
+case ':':
+error_setg(errp, "Missing option argument for '%s'",
+   argv[optind - 1]);
+goto out;
+case 'h':
+help();
+exit(EXIT_SUCCESS);
+case 'V':
+printf("qemu-storage-daemon version "
+   QEMU_FULL_VERSION "\n" QEMU_COPYRIGHT "\n");
+exit(EXIT_SUCCESS);
+case 'T':
+g_free(trace_file);
+trace_file = trace_opt_parse(optarg);
+break;
+}
+}
+if (optind != argc) {
+error_setg(errp, "Unexpected argument: %s", argv[optind]);
+goto out;
+}
+
+if (!trace_init_backends()) {
+error_setg(errp, "Could not initialize trace backends");
+goto out;
+}
+trace_init_file(trace_file);
+qemu_set_log(LOG_TRACE);
+
+ret = 0;
+out:
+g_free(trace_file);
+return ret;
+}
+
+int main(int argc, char *argv[])
+{
+Error *local_err = NULL;
+int ret;
+
+#ifdef CONFIG_POSIX
+signal(SIGPIPE, SIG_IGN);
+#endif
+
+error_init(argv[0]);
+qemu_init_exec_dir(argv[0]);
+
+module_call_init(MODULE_INIT_QOM);
+module_call_init(MODULE_INIT_TRACE);
+qemu_add_opts(&qemu_trace_opts);
+qcrypto_init(&error_fatal);
+bdrv_init();
+
+if (qemu_init_main_loop(&local_err)) {
+error_report_err(local_err);
+