All of lore.kernel.org
 help / color / mirror / Atom feed
From: Ian Campbell <Ian.Campbell@citrix.com>
To: M A Young <m.a.young@durham.ac.uk>,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Cc: Wei Liu <wei.liu2@citrix.com>,
	Stefano Stabellini <stefano.stabellini@eu.citrix.com>,
	Ian Jackson <ian.jackson@eu.citrix.com>,
	Andrew Cooper <andrew.cooper3@citrix.com>,
	xen-devel@lists.xen.org
Subject: Re: [PATCH v2] fix migration failure with xl migrate --debug
Date: Fri, 28 Nov 2014 11:49:51 +0000	[thread overview]
Message-ID: <1417175391.23604.17.camel@citrix.com> (raw)
In-Reply-To: <alpine.GSO.2.00.1411280830170.1345@algedi.dur.ac.uk>

On Fri, 2014-11-28 at 08:32 +0000, M A Young wrote:
> On Fri, 28 Nov 2014, Ian Campbell wrote:
> 
> > On Fri, 2014-11-28 at 00:28 +0000, M A Young wrote:
> >> Migrations with xl migrate --debug will fail because debugging information
> >> from the receiving process is written to the stdout channel. This channel
> >> is also used for status messages so the migration will fail as the sending
> >> process receives an unexpected message. This patch moves the debugging
> >> information to the stderr channel.
> >>
> >> Version 2 moves some output back to stdout that was accidentally moved
> >> to stderr in the first version.
> >>
> >> Signed-off-by: Michael Young <m.a.young@durham.ac.uk>
> >
> > I think you've forgotten the attachment.
> 
> Yes, I did. Here it is.

Acked-by: Ian Campbell <ian.campbell@citrix.com>

It's pretty big but a large chunk is pretty mechanical. Were you
intending this for 4.5? (Konrad CCd).

> Use stderr for debugging messages for xl migrate --debug as stdout is used
> for status messages.
> 
> --- xen-4.5.0-rc1/tools/libxl/xl_cmdimpl.c.orig 2014-10-24 15:22:40.000000000 +0100
> +++ xen-4.5.0-rc1/tools/libxl/xl_cmdimpl.c      2014-11-26 22:41:41.697043321 +0000
> @@ -380,10 +380,10 @@
>  }
>  static void printf_info(enum output_format output_format,
>                          int domid,
> -                        libxl_domain_config *d_config)
> +                        libxl_domain_config *d_config, FILE *fh)
>  {
>      if (output_format == OUTPUT_FORMAT_SXP)
> -        return printf_info_sexp(domid, d_config);
> +        return printf_info_sexp(domid, d_config, fh);
>  
>      const char *buf;
>      libxl_yajl_length len = 0;
> @@ -404,7 +404,7 @@
>      if (s != yajl_gen_status_ok)
>          goto out;
>  
> -    puts(buf);
> +    fputs(buf, fh);
>  
>  out:
>      yajl_gen_free(hand);
> @@ -413,7 +413,13 @@
>          fprintf(stderr,
>                  "unable to format domain config as JSON (YAJL:%d)\n", s);
>  
> -    if (ferror(stdout) || fflush(stdout)) { perror("stdout"); exit(-1); }
> +    if (ferror(fh) || fflush(fh)) {
> +        if (fh == stdout)
> +            perror("stdout");
> +        else
> +            perror("stderr");
> +        exit(-1);
> +    }
>  }
>  
>  static int do_daemonize(char *name)
> @@ -2423,7 +2429,7 @@
>      }
>  
>      if (!dom_info->quiet)
> -        printf("Parsing config from %s\n", config_source);
> +        fprintf(stderr, "Parsing config from %s\n", config_source);
>  
>      if (config_in_json) {
>          libxl_domain_config_from_json(ctx, &d_config,
> @@ -2451,7 +2457,7 @@
>      }
>  
>      if (debug || dom_info->dryrun)
> -        printf_info(default_output_format, -1, &d_config);
> +        printf_info(default_output_format, -1, &d_config, stderr);
>  
>      ret = 0;
>      if (dom_info->dryrun)
> @@ -3403,7 +3409,7 @@
>          if (default_output_format == OUTPUT_FORMAT_JSON)
>              s = printf_info_one_json(hand, info[i].domid, &d_config);
>          else
> -            printf_info_sexp(info[i].domid, &d_config);
> +            printf_info_sexp(info[i].domid, &d_config, stdout);
>          libxl_domain_config_dispose(&d_config);
>          if (s != yajl_gen_status_ok)
>              goto out;
> @@ -4725,7 +4731,7 @@
>      parse_config_data(filename, config_data, config_len, &d_config);
>  
>      if (debug || dryrun_only)
> -        printf_info(default_output_format, -1, &d_config);
> +        printf_info(default_output_format, -1, &d_config, stdout);
>  
>      if (!dryrun_only) {
>          fprintf(stderr, "setting dom%d configuration\n", domid);
> --- xen-4.5.0-rc1/tools/libxl/xl_sxp.c.orig     2014-10-24 15:22:40.000000000 +0100
> +++ xen-4.5.0-rc1/tools/libxl/xl_sxp.c  2014-11-26 22:30:58.416394082 +0000
> @@ -30,7 +30,7 @@
>  /* In general you should not add new output to this function since it
>   * is intended only for legacy use.
>   */
> -void printf_info_sexp(int domid, libxl_domain_config *d_config)
> +void printf_info_sexp(int domid, libxl_domain_config *d_config, FILE *fh)
>  {
>      int i;
>      libxl_dominfo info;
> @@ -38,195 +38,195 @@
>      libxl_domain_create_info *c_info = &d_config->c_info;
>      libxl_domain_build_info *b_info = &d_config->b_info;
>  
> -    printf("(domain\n\t(domid %d)\n", domid);
> -    printf("\t(create_info)\n");
> -    printf("\t(hvm %d)\n", c_info->type == LIBXL_DOMAIN_TYPE_HVM);
> -    printf("\t(hap %s)\n", libxl_defbool_to_string(c_info->hap));
> -    printf("\t(oos %s)\n", libxl_defbool_to_string(c_info->oos));
> -    printf("\t(ssidref %d)\n", c_info->ssidref);
> -    printf("\t(name %s)\n", c_info->name);
> +    fprintf(fh, "(domain\n\t(domid %d)\n", domid);
> +    fprintf(fh, "\t(create_info)\n");
> +    fprintf(fh, "\t(hvm %d)\n", c_info->type == LIBXL_DOMAIN_TYPE_HVM);
> +    fprintf(fh, "\t(hap %s)\n", libxl_defbool_to_string(c_info->hap));
> +    fprintf(fh, "\t(oos %s)\n", libxl_defbool_to_string(c_info->oos));
> +    fprintf(fh, "\t(ssidref %d)\n", c_info->ssidref);
> +    fprintf(fh, "\t(name %s)\n", c_info->name);
>  
>      /* retrieve the UUID from dominfo, since it is probably generated
>       * during parsing and thus does not match the real one
>       */
>      if (libxl_domain_info(ctx, &info, domid) == 0) {
> -        printf("\t(uuid " LIBXL_UUID_FMT ")\n", LIBXL_UUID_BYTES(info.uuid));
> +        fprintf(fh, "\t(uuid " LIBXL_UUID_FMT ")\n", LIBXL_UUID_BYTES(info.uuid));
>      } else {
> -        printf("\t(uuid <unknown>)\n");
> +        fprintf(fh, "\t(uuid <unknown>)\n");
>      }
>      if (c_info->pool_name)
> -        printf("\t(cpupool %s)\n", c_info->pool_name);
> +        fprintf(fh, "\t(cpupool %s)\n", c_info->pool_name);
>      if (c_info->xsdata)
> -        printf("\t(xsdata contains data)\n");
> +        fprintf(fh, "\t(xsdata contains data)\n");
>      else
> -        printf("\t(xsdata (null))\n");
> +        fprintf(fh, "\t(xsdata (null))\n");
>      if (c_info->platformdata)
> -        printf("\t(platformdata contains data)\n");
> +        fprintf(fh, "\t(platformdata contains data)\n");
>      else
> -        printf("\t(platformdata (null))\n");
> +        fprintf(fh, "\t(platformdata (null))\n");
>  
>  
> -    printf("\t(build_info)\n");
> -    printf("\t(max_vcpus %d)\n", b_info->max_vcpus);
> -    printf("\t(tsc_mode %s)\n", libxl_tsc_mode_to_string(b_info->tsc_mode));
> -    printf("\t(max_memkb %"PRId64")\n", b_info->max_memkb);
> -    printf("\t(target_memkb %"PRId64")\n", b_info->target_memkb);
> -    printf("\t(nomigrate %s)\n",
> +    fprintf(fh, "\t(build_info)\n");
> +    fprintf(fh, "\t(max_vcpus %d)\n", b_info->max_vcpus);
> +    fprintf(fh, "\t(tsc_mode %s)\n", libxl_tsc_mode_to_string(b_info->tsc_mode));
> +    fprintf(fh, "\t(max_memkb %"PRId64")\n", b_info->max_memkb);
> +    fprintf(fh, "\t(target_memkb %"PRId64")\n", b_info->target_memkb);
> +    fprintf(fh, "\t(nomigrate %s)\n",
>             libxl_defbool_to_string(b_info->disable_migrate));
>  
>      if (c_info->type == LIBXL_DOMAIN_TYPE_PV && b_info->u.pv.bootloader) {
> -        printf("\t(bootloader %s)\n", b_info->u.pv.bootloader);
> +        fprintf(fh, "\t(bootloader %s)\n", b_info->u.pv.bootloader);
>          if (b_info->u.pv.bootloader_args) {
> -            printf("\t(bootloader_args");
> +            fprintf(fh, "\t(bootloader_args");
>              for (i=0; b_info->u.pv.bootloader_args[i]; i++)
> -                printf(" %s", b_info->u.pv.bootloader_args[i]);
> -            printf(")\n");
> +                fprintf(fh, " %s", b_info->u.pv.bootloader_args[i]);
> +            fprintf(fh, ")\n");
>          }
>      }
>  
> -    printf("\t(image\n");
> +    fprintf(fh, "\t(image\n");
>      switch (c_info->type) {
>      case LIBXL_DOMAIN_TYPE_HVM:
> -        printf("\t\t(hvm\n");
> -        printf("\t\t\t(firmware %s)\n", b_info->u.hvm.firmware);
> -        printf("\t\t\t(video_memkb %"PRId64")\n", b_info->video_memkb);
> -        printf("\t\t\t(shadow_memkb %"PRId64")\n", b_info->shadow_memkb);
> -        printf("\t\t\t(pae %s)\n", libxl_defbool_to_string(b_info->u.hvm.pae));
> -        printf("\t\t\t(apic %s)\n",
> +        fprintf(fh, "\t\t(hvm\n");
> +        fprintf(fh, "\t\t\t(firmware %s)\n", b_info->u.hvm.firmware);
> +        fprintf(fh, "\t\t\t(video_memkb %"PRId64")\n", b_info->video_memkb);
> +        fprintf(fh, "\t\t\t(shadow_memkb %"PRId64")\n", b_info->shadow_memkb);
> +        fprintf(fh, "\t\t\t(pae %s)\n", libxl_defbool_to_string(b_info->u.hvm.pae));
> +        fprintf(fh, "\t\t\t(apic %s)\n",
>                 libxl_defbool_to_string(b_info->u.hvm.apic));
> -        printf("\t\t\t(acpi %s)\n",
> +        fprintf(fh, "\t\t\t(acpi %s)\n",
>                 libxl_defbool_to_string(b_info->u.hvm.acpi));
> -        printf("\t\t\t(nx %s)\n", libxl_defbool_to_string(b_info->u.hvm.nx));
> -        printf("\t\t\t(viridian %s)\n",
> +        fprintf(fh, "\t\t\t(nx %s)\n", libxl_defbool_to_string(b_info->u.hvm.nx));
> +        fprintf(fh, "\t\t\t(viridian %s)\n",
>                 libxl_defbool_to_string(b_info->u.hvm.viridian));
> -        printf("\t\t\t(hpet %s)\n",
> +        fprintf(fh, "\t\t\t(hpet %s)\n",
>                 libxl_defbool_to_string(b_info->u.hvm.hpet));
> -        printf("\t\t\t(vpt_align %s)\n",
> +        fprintf(fh, "\t\t\t(vpt_align %s)\n",
>                 libxl_defbool_to_string(b_info->u.hvm.vpt_align));
> -        printf("\t\t\t(timer_mode %s)\n",
> +        fprintf(fh, "\t\t\t(timer_mode %s)\n",
>                 libxl_timer_mode_to_string(b_info->u.hvm.timer_mode));
> -        printf("\t\t\t(nestedhvm %s)\n",
> +        fprintf(fh, "\t\t\t(nestedhvm %s)\n",
>                 libxl_defbool_to_string(b_info->u.hvm.nested_hvm));
> -        printf("\t\t\t(stdvga %s)\n", b_info->u.hvm.vga.kind ==
> +        fprintf(fh, "\t\t\t(stdvga %s)\n", b_info->u.hvm.vga.kind ==
>                                        LIBXL_VGA_INTERFACE_TYPE_STD ?
>                                        "True" : "False");
> -        printf("\t\t\t(vnc %s)\n",
> +        fprintf(fh, "\t\t\t(vnc %s)\n",
>                 libxl_defbool_to_string(b_info->u.hvm.vnc.enable));
> -        printf("\t\t\t(vnclisten %s)\n", b_info->u.hvm.vnc.listen);
> -        printf("\t\t\t(vncdisplay %d)\n", b_info->u.hvm.vnc.display);
> -        printf("\t\t\t(vncunused %s)\n",
> +        fprintf(fh, "\t\t\t(vnclisten %s)\n", b_info->u.hvm.vnc.listen);
> +        fprintf(fh, "\t\t\t(vncdisplay %d)\n", b_info->u.hvm.vnc.display);
> +        fprintf(fh, "\t\t\t(vncunused %s)\n",
>                 libxl_defbool_to_string(b_info->u.hvm.vnc.findunused));
> -        printf("\t\t\t(keymap %s)\n", b_info->u.hvm.keymap);
> -        printf("\t\t\t(sdl %s)\n",
> +        fprintf(fh, "\t\t\t(keymap %s)\n", b_info->u.hvm.keymap);
> +        fprintf(fh, "\t\t\t(sdl %s)\n",
>                 libxl_defbool_to_string(b_info->u.hvm.sdl.enable));
> -        printf("\t\t\t(opengl %s)\n",
> +        fprintf(fh, "\t\t\t(opengl %s)\n",
>                 libxl_defbool_to_string(b_info->u.hvm.sdl.opengl));
> -        printf("\t\t\t(nographic %s)\n",
> +        fprintf(fh, "\t\t\t(nographic %s)\n",
>                 libxl_defbool_to_string(b_info->u.hvm.nographic));
> -        printf("\t\t\t(spice %s)\n",
> +        fprintf(fh, "\t\t\t(spice %s)\n",
>                 libxl_defbool_to_string(b_info->u.hvm.spice.enable));
> -        printf("\t\t\t(spiceport %d)\n", b_info->u.hvm.spice.port);
> -        printf("\t\t\t(spicetls_port %d)\n", b_info->u.hvm.spice.tls_port);
> -        printf("\t\t\t(spicehost %s)\n", b_info->u.hvm.spice.host);
> -        printf("\t\t\t(spicedisable_ticketing %s)\n",
> +        fprintf(fh, "\t\t\t(spiceport %d)\n", b_info->u.hvm.spice.port);
> +        fprintf(fh, "\t\t\t(spicetls_port %d)\n", b_info->u.hvm.spice.tls_port);
> +        fprintf(fh, "\t\t\t(spicehost %s)\n", b_info->u.hvm.spice.host);
> +        fprintf(fh, "\t\t\t(spicedisable_ticketing %s)\n",
>                 libxl_defbool_to_string(b_info->u.hvm.spice.disable_ticketing));
> -        printf("\t\t\t(spiceagent_mouse %s)\n",
> +        fprintf(fh, "\t\t\t(spiceagent_mouse %s)\n",
>                 libxl_defbool_to_string(b_info->u.hvm.spice.agent_mouse));
>  
> -        printf("\t\t\t(device_model %s)\n", b_info->device_model ? : "default");
> -        printf("\t\t\t(gfx_passthru %s)\n",
> +        fprintf(fh, "\t\t\t(device_model %s)\n", b_info->device_model ? : "default");
> +        fprintf(fh, "\t\t\t(gfx_passthru %s)\n",
>                 libxl_defbool_to_string(b_info->u.hvm.gfx_passthru));
> -        printf("\t\t\t(serial %s)\n", b_info->u.hvm.serial);
> -        printf("\t\t\t(boot %s)\n", b_info->u.hvm.boot);
> -        printf("\t\t\t(usb %s)\n", libxl_defbool_to_string(b_info->u.hvm.usb));
> -        printf("\t\t\t(usbdevice %s)\n", b_info->u.hvm.usbdevice);
> -        printf("\t\t)\n");
> +        fprintf(fh, "\t\t\t(serial %s)\n", b_info->u.hvm.serial);
> +        fprintf(fh, "\t\t\t(boot %s)\n", b_info->u.hvm.boot);
> +        fprintf(fh, "\t\t\t(usb %s)\n", libxl_defbool_to_string(b_info->u.hvm.usb));
> +        fprintf(fh, "\t\t\t(usbdevice %s)\n", b_info->u.hvm.usbdevice);
> +        fprintf(fh, "\t\t)\n");
>          break;
>      case LIBXL_DOMAIN_TYPE_PV:
> -        printf("\t\t(linux %d)\n", 0);
> -        printf("\t\t\t(kernel %s)\n", b_info->kernel);
> -        printf("\t\t\t(cmdline %s)\n", b_info->cmdline);
> -        printf("\t\t\t(ramdisk %s)\n", b_info->ramdisk);
> -        printf("\t\t\t(e820_host %s)\n",
> +        fprintf(fh, "\t\t(linux %d)\n", 0);
> +        fprintf(fh, "\t\t\t(kernel %s)\n", b_info->kernel);
> +        fprintf(fh, "\t\t\t(cmdline %s)\n", b_info->cmdline);
> +        fprintf(fh, "\t\t\t(ramdisk %s)\n", b_info->ramdisk);
> +        fprintf(fh, "\t\t\t(e820_host %s)\n",
>                 libxl_defbool_to_string(b_info->u.pv.e820_host));
> -        printf("\t\t)\n");
> +        fprintf(fh, "\t\t)\n");
>          break;
>      default:
>          fprintf(stderr, "Unknown domain type %d\n", c_info->type);
>          exit(1);
>      }
> -    printf("\t)\n");
> +    fprintf(fh, "\t)\n");
>  
>      for (i = 0; i < d_config->num_disks; i++) {
> -        printf("\t(device\n");
> -        printf("\t\t(tap\n");
> -        printf("\t\t\t(backend_domid %d)\n", d_config->disks[i].backend_domid);
> -        printf("\t\t\t(frontend_domid %d)\n", domid);
> -        printf("\t\t\t(physpath %s)\n", d_config->disks[i].pdev_path);
> -        printf("\t\t\t(phystype %d)\n", d_config->disks[i].backend);
> -        printf("\t\t\t(virtpath %s)\n", d_config->disks[i].vdev);
> -        printf("\t\t\t(unpluggable %d)\n", d_config->disks[i].removable);
> -        printf("\t\t\t(readwrite %d)\n", d_config->disks[i].readwrite);
> -        printf("\t\t\t(is_cdrom %d)\n", d_config->disks[i].is_cdrom);
> -        printf("\t\t)\n");
> -        printf("\t)\n");
> +        fprintf(fh, "\t(device\n");
> +        fprintf(fh, "\t\t(tap\n");
> +        fprintf(fh, "\t\t\t(backend_domid %d)\n", d_config->disks[i].backend_domid);
> +        fprintf(fh, "\t\t\t(frontend_domid %d)\n", domid);
> +        fprintf(fh, "\t\t\t(physpath %s)\n", d_config->disks[i].pdev_path);
> +        fprintf(fh, "\t\t\t(phystype %d)\n", d_config->disks[i].backend);
> +        fprintf(fh, "\t\t\t(virtpath %s)\n", d_config->disks[i].vdev);
> +        fprintf(fh, "\t\t\t(unpluggable %d)\n", d_config->disks[i].removable);
> +        fprintf(fh, "\t\t\t(readwrite %d)\n", d_config->disks[i].readwrite);
> +        fprintf(fh, "\t\t\t(is_cdrom %d)\n", d_config->disks[i].is_cdrom);
> +        fprintf(fh, "\t\t)\n");
> +        fprintf(fh, "\t)\n");
>      }
>  
>      for (i = 0; i < d_config->num_nics; i++) {
> -        printf("\t(device\n");
> -        printf("\t\t(vif\n");
> +        fprintf(fh, "\t(device\n");
> +        fprintf(fh, "\t\t(vif\n");
>          if (d_config->nics[i].ifname)
> -            printf("\t\t\t(vifname %s)\n", d_config->nics[i].ifname);
> -        printf("\t\t\t(backend_domid %d)\n", d_config->nics[i].backend_domid);
> -        printf("\t\t\t(frontend_domid %d)\n", domid);
> -        printf("\t\t\t(devid %d)\n", d_config->nics[i].devid);
> -        printf("\t\t\t(mtu %d)\n", d_config->nics[i].mtu);
> -        printf("\t\t\t(model %s)\n", d_config->nics[i].model);
> -        printf("\t\t\t(mac %02x%02x%02x%02x%02x%02x)\n",
> +            fprintf(fh, "\t\t\t(vifname %s)\n", d_config->nics[i].ifname);
> +        fprintf(fh, "\t\t\t(backend_domid %d)\n", d_config->nics[i].backend_domid);
> +        fprintf(fh, "\t\t\t(frontend_domid %d)\n", domid);
> +        fprintf(fh, "\t\t\t(devid %d)\n", d_config->nics[i].devid);
> +        fprintf(fh, "\t\t\t(mtu %d)\n", d_config->nics[i].mtu);
> +        fprintf(fh, "\t\t\t(model %s)\n", d_config->nics[i].model);
> +        fprintf(fh, "\t\t\t(mac %02x%02x%02x%02x%02x%02x)\n",
>                 d_config->nics[i].mac[0], d_config->nics[i].mac[1],
>                 d_config->nics[i].mac[2], d_config->nics[i].mac[3],
>                 d_config->nics[i].mac[4], d_config->nics[i].mac[5]);
> -        printf("\t\t)\n");
> -        printf("\t)\n");
> +        fprintf(fh, "\t\t)\n");
> +        fprintf(fh, "\t)\n");
>      }
>  
>      for (i = 0; i < d_config->num_pcidevs; i++) {
> -        printf("\t(device\n");
> -        printf("\t\t(pci\n");
> -        printf("\t\t\t(pci dev %04x:%02x:%02x.%01x@%02x)\n",
> +        fprintf(fh, "\t(device\n");
> +        fprintf(fh, "\t\t(pci\n");
> +        fprintf(fh, "\t\t\t(pci dev %04x:%02x:%02x.%01x@%02x)\n",
>                 d_config->pcidevs[i].domain, d_config->pcidevs[i].bus,
>                 d_config->pcidevs[i].dev, d_config->pcidevs[i].func,
>                 d_config->pcidevs[i].vdevfn);
> -        printf("\t\t\t(opts msitranslate %d power_mgmt %d)\n",
> +        fprintf(fh, "\t\t\t(opts msitranslate %d power_mgmt %d)\n",
>                 d_config->pcidevs[i].msitranslate,
>                 d_config->pcidevs[i].power_mgmt);
> -        printf("\t\t)\n");
> -        printf("\t)\n");
> +        fprintf(fh, "\t\t)\n");
> +        fprintf(fh, "\t)\n");
>      }
>  
>      for (i = 0; i < d_config->num_vfbs; i++) {
> -        printf("\t(device\n");
> -        printf("\t\t(vfb\n");
> -        printf("\t\t\t(backend_domid %d)\n", d_config->vfbs[i].backend_domid);
> -        printf("\t\t\t(frontend_domid %d)\n", domid);
> -        printf("\t\t\t(devid %d)\n", d_config->vfbs[i].devid);
> -        printf("\t\t\t(vnc %s)\n",
> +        fprintf(fh, "\t(device\n");
> +        fprintf(fh, "\t\t(vfb\n");
> +        fprintf(fh, "\t\t\t(backend_domid %d)\n", d_config->vfbs[i].backend_domid);
> +        fprintf(fh, "\t\t\t(frontend_domid %d)\n", domid);
> +        fprintf(fh, "\t\t\t(devid %d)\n", d_config->vfbs[i].devid);
> +        fprintf(fh, "\t\t\t(vnc %s)\n",
>                 libxl_defbool_to_string(d_config->vfbs[i].vnc.enable));
> -        printf("\t\t\t(vnclisten %s)\n", d_config->vfbs[i].vnc.listen);
> -        printf("\t\t\t(vncdisplay %d)\n", d_config->vfbs[i].vnc.display);
> -        printf("\t\t\t(vncunused %s)\n",
> +        fprintf(fh, "\t\t\t(vnclisten %s)\n", d_config->vfbs[i].vnc.listen);
> +        fprintf(fh, "\t\t\t(vncdisplay %d)\n", d_config->vfbs[i].vnc.display);
> +        fprintf(fh, "\t\t\t(vncunused %s)\n",
>                 libxl_defbool_to_string(d_config->vfbs[i].vnc.findunused));
> -        printf("\t\t\t(keymap %s)\n", d_config->vfbs[i].keymap);
> -        printf("\t\t\t(sdl %s)\n",
> +        fprintf(fh, "\t\t\t(keymap %s)\n", d_config->vfbs[i].keymap);
> +        fprintf(fh, "\t\t\t(sdl %s)\n",
>                 libxl_defbool_to_string(d_config->vfbs[i].sdl.enable));
> -        printf("\t\t\t(opengl %s)\n",
> +        fprintf(fh, "\t\t\t(opengl %s)\n",
>                 libxl_defbool_to_string(d_config->vfbs[i].sdl.opengl));
> -        printf("\t\t\t(display %s)\n", d_config->vfbs[i].sdl.display);
> -        printf("\t\t\t(xauthority %s)\n", d_config->vfbs[i].sdl.xauthority);
> -        printf("\t\t)\n");
> -        printf("\t)\n");
> +        fprintf(fh, "\t\t\t(display %s)\n", d_config->vfbs[i].sdl.display);
> +        fprintf(fh, "\t\t\t(xauthority %s)\n", d_config->vfbs[i].sdl.xauthority);
> +        fprintf(fh, "\t\t)\n");
> +        fprintf(fh, "\t)\n");
>      }
> -    printf(")\n");
> +    fprintf(fh, ")\n");
>  }
>  
>  
> --- xen-4.5.0-rc1/tools/libxl/xl.h.orig 2014-10-24 15:22:40.000000000 +0100
> +++ xen-4.5.0-rc1/tools/libxl/xl.h      2014-11-26 22:30:58.416394082 +0000
> @@ -186,7 +186,7 @@
>  };
>  extern enum output_format default_output_format;
>  
> -extern void printf_info_sexp(int domid, libxl_domain_config *d_config);
> +extern void printf_info_sexp(int domid, libxl_domain_config *d_config, FILE *fh);
>  
>  #define XL_GLOBAL_CONFIG XEN_CONFIG_DIR "/xl.conf"
>  #define XL_LOCK_FILE XEN_LOCK_DIR "/xl"

  reply	other threads:[~2014-11-28 11:49 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-11-28  0:28 [PATCH v2] fix migration failure with xl migrate --debug M A Young
2014-11-28  8:27 ` Ian Campbell
2014-11-28  8:32   ` M A Young
2014-11-28 11:49     ` Ian Campbell [this message]
2014-11-28 11:52       ` Ian Jackson
2014-12-01 20:25         ` Konrad Rzeszutek Wilk
2014-12-02 15:36           ` Ian Campbell

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1417175391.23604.17.camel@citrix.com \
    --to=ian.campbell@citrix.com \
    --cc=andrew.cooper3@citrix.com \
    --cc=ian.jackson@eu.citrix.com \
    --cc=konrad.wilk@oracle.com \
    --cc=m.a.young@durham.ac.uk \
    --cc=stefano.stabellini@eu.citrix.com \
    --cc=wei.liu2@citrix.com \
    --cc=xen-devel@lists.xen.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.