[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH 1/3] libxenlight: Clean up logging arrangements
* Introduce new variants of the logging functions which include errno values (converted using strerror) in the messages passed to the application's logging callback. * Use the new errno-including logging functions everywhere where appropriate. In general, xc_... functions return errno values or 0; xs_... functions return 0 or -1 (or some such) setting errno. * When libxl_xs_get_dompath fails, do not treat it as an allocation error. It isn't: it usually means xenstored failed. * Remove many spurious \n's from log messages. (The applications log callback is expected to add a \n if it wants to do that, so libxl's logging functions should be passes strings without \n.) Signed-off-by: Ian Jackson <Ian.Jackson@xxxxxxxxxxxxx> --- tools/libxl/libxl.c | 91 +++++++++++++++++++++++------------------ tools/libxl/libxl_device.c | 27 +++++++++---- tools/libxl/libxl_dom.c | 11 +++-- tools/libxl/libxl_exec.c | 2 +- tools/libxl/libxl_internal.c | 39 +++++++++++++++--- tools/libxl/libxl_internal.h | 11 ++++- tools/libxl/libxl_xshelp.c | 5 ++ 7 files changed, 124 insertions(+), 62 deletions(-) diff --git a/tools/libxl/libxl.c b/tools/libxl/libxl.c index 69690e4..5e2f23b 100644 --- a/tools/libxl/libxl.c +++ b/tools/libxl/libxl.c @@ -106,14 +106,17 @@ int libxl_domain_make(struct libxl_ctx *ctx, libxl_domain_create_info *info, ret = xc_domain_create(ctx->xch, info->ssidref, handle, flags, domid); if (ret < 0) { - XL_LOG(ctx, XL_LOG_ERROR, "domain creation fail: %d", ret); + XL_LOG_ERRNOVAL(ctx, XL_LOG_ERROR, ret, "domain creation fail"); return ERROR_FAIL; } dom_path = libxl_xs_get_dompath(ctx, *domid); + if (!dom_path) + return ERROR_FAIL; + vm_path = libxl_sprintf(ctx, "/vm/%s", uuid_string); vss_path = libxl_sprintf(ctx, "/vss/%s", uuid_string); - if (!dom_path || !vm_path || !vss_path) { + if (!vm_path || !vss_path) { XL_LOG(ctx, XL_LOG_ERROR, "cannot allocate create paths"); return ERROR_FAIL; } @@ -326,6 +329,9 @@ int libxl_domain_shutdown(struct libxl_ctx *ctx, uint32_t domid, int req) return ERROR_INVAL; dom_path = libxl_xs_get_dompath(ctx, domid); + if (!dom_path) + return ERROR_FAIL; + shutdown_path = libxl_sprintf(ctx, "%s/control/shutdown", dom_path); xs_write(ctx->xsh, XBT_NULL, shutdown_path, req_table[req], strlen(req_table[req])); @@ -347,20 +353,21 @@ static int libxl_destroy_device_model(struct libxl_ctx *ctx, uint32_t domid) pid = libxl_xs_read(ctx, XBT_NULL, libxl_sprintf(ctx, "/local/domain/%d/image/device-model-pid", domid)); if (!pid) { - XL_LOG(ctx, XL_LOG_ERROR, "Couldn't find device model's pid\n"); + XL_LOG_ERRNO(ctx, XL_LOG_ERROR, "Couldn't find device model's pid"); return -1; } xs_rm(ctx->xsh, XBT_NULL, libxl_sprintf(ctx, "/local/domain/0/device-model/%d", domid)); ret = kill(atoi(pid), SIGHUP); if (ret < 0 && errno == ESRCH) { - XL_LOG(ctx, XL_LOG_DEBUG, "Device Model already exited\n"); + XL_LOG(ctx, XL_LOG_DEBUG, "Device Model already exited"); ret = 0; } else if (ret == 0) { - XL_LOG(ctx, XL_LOG_DEBUG, "Device Model signaled\n"); + XL_LOG(ctx, XL_LOG_DEBUG, "Device Model signaled"); ret = 0; } else { - XL_LOG(ctx, XL_LOG_ERROR, "kill %d returned %d errno=%d\n", atoi(pid), ret, errno); + XL_LOG_ERRNO(ctx, XL_LOG_ERROR, "failed to kill Device Model [%d]", + atoi(pid)); } return ret; } @@ -369,38 +376,40 @@ int libxl_domain_destroy(struct libxl_ctx *ctx, uint32_t domid, int force) { char *dom_path, vm_path[41]; xen_uuid_t *uuid; + int rc; dom_path = libxl_xs_get_dompath(ctx, domid); - if (!dom_path) { - XL_LOG(ctx, XL_LOG_ERROR, "dompath doesn't exist for %d\n", domid); + if (!dom_path) return -1; - } + if (libxl_domid_to_uuid(ctx, &uuid, domid) < 0) { - XL_LOG(ctx, XL_LOG_ERROR, "failed ot get uuid for %d\n", domid); + XL_LOG(ctx, XL_LOG_ERROR, "failed ot get uuid for %d", domid); return -1; } if (libxl_device_pci_shutdown(ctx, domid) < 0) - XL_LOG(ctx, XL_LOG_ERROR, "pci shutdown failed for domid %d\n", domid); + XL_LOG(ctx, XL_LOG_ERROR, "pci shutdown failed for domid %d", domid); xs_write(ctx->xsh, XBT_NULL, libxl_sprintf(ctx, "/local/domain/0/device-model/%d/command", domid), "shutdown", strlen("shutdown")); - if (xc_domain_pause(ctx->xch, domid) < 0) { - XL_LOG(ctx, XL_LOG_ERROR, "xc_domain_pause failed for %d\n", domid); + rc = xc_domain_pause(ctx->xch, domid); + if (rc < 0) { + XL_LOG_ERRNOVAL(ctx, XL_LOG_ERROR, rc, "xc_domain_pause failed for %d", domid); return -1; } - if (xc_domain_destroy(ctx->xch, domid) < 0) { - XL_LOG(ctx, XL_LOG_ERROR, "xc_domain_destroy failed for %d\n", domid); + rc = xc_domain_destroy(ctx->xch, domid); + if (rc < 0) { + XL_LOG_ERRNOVAL(ctx, XL_LOG_ERROR, rc, "xc_domain_destroy failed for %d", domid); return -1; } if (libxl_devices_destroy(ctx, domid, force) < 0) - XL_LOG(ctx, XL_LOG_ERROR, "libxl_destroy_devices failed for %d\n", domid); + XL_LOG(ctx, XL_LOG_ERROR, "libxl_destroy_devices failed for %d", domid); if (libxl_destroy_device_model(ctx, domid) < 0) - XL_LOG(ctx, XL_LOG_ERROR, "libxl_destroy_device_model failed for %d\n", domid); + XL_LOG(ctx, XL_LOG_ERROR, "libxl_destroy_device_model failed for %d", domid); if (!xs_rm(ctx->xsh, XBT_NULL, dom_path)) - XL_LOG(ctx, XL_LOG_ERROR, "xs_rm failed for %s\n", dom_path); + XL_LOG_ERRNO(ctx, XL_LOG_ERROR, "xs_rm failed for %s", dom_path); snprintf(vm_path, sizeof(vm_path), "/vm/%s", libxl_uuid_to_string(ctx, uuid)); if (!xs_rm(ctx->xsh, XBT_NULL, vm_path)) - XL_LOG(ctx, XL_LOG_ERROR, "xs_rm failed for %s\n", vm_path); + XL_LOG_ERRNO(ctx, XL_LOG_ERROR, "xs_rm failed for %s", vm_path); return 0; } @@ -524,6 +533,8 @@ int libxl_create_device_model(struct libxl_ctx *ctx, return ERROR_FAIL; dom_path = libxl_xs_get_dompath(ctx, info->domid); + if (!dom_path) + return ERROR_FAIL; path = libxl_sprintf(ctx, "/local/domain/0/device-model/%d", info->domid); xs_mkdir(ctx->xsh, XBT_NULL, path); @@ -1017,7 +1028,7 @@ static int libxl_create_pci_backend(struct libxl_ctx *ctx, uint32_t domid, libxl if (!back) return ERROR_NOMEM; - XL_LOG(ctx, XL_LOG_DEBUG, "Creating pci backend\n"); + XL_LOG(ctx, XL_LOG_DEBUG, "Creating pci backend"); /* add pci device */ device.backend_devid = 0; @@ -1088,7 +1099,7 @@ static int libxl_device_pci_add_xenstore(struct libxl_ctx *ctx, uint32_t domid, if (!back) return ERROR_NOMEM; - XL_LOG(ctx, XL_LOG_DEBUG, "Adding new pci device to xenstore\n"); + XL_LOG(ctx, XL_LOG_DEBUG, "Adding new pci device to xenstore"); num = atoi(num_devs); flexarray_set(back, boffset++, libxl_sprintf(ctx, "key-%d", num)); flexarray_set(back, boffset++, libxl_sprintf(ctx, PCI_BDF, pcidev->domain, pcidev->bus, pcidev->dev, pcidev->func)); @@ -1140,7 +1151,7 @@ static int libxl_device_pci_remove_xenstore(struct libxl_ctx *ctx, uint32_t domi if (!is_hvm(ctx, domid)) { if (libxl_wait_for_backend(ctx, be_path, "4") < 0) { - XL_LOG(ctx, XL_LOG_DEBUG, "pci backend at %s is not ready\n"); + XL_LOG(ctx, XL_LOG_DEBUG, "pci backend at %s is not ready"); return -1; } } @@ -1154,7 +1165,7 @@ static int libxl_device_pci_remove_xenstore(struct libxl_ctx *ctx, uint32_t domi } } if (i == num) { - XL_LOG(ctx, XL_LOG_ERROR, "Couldn't find the device on xenstore\n"); + XL_LOG(ctx, XL_LOG_ERROR, "Couldn't find the device on xenstore"); return -1; } @@ -1196,7 +1207,7 @@ int libxl_device_pci_add(struct libxl_ctx *ctx, uint32_t domid, libxl_device_pci snprintf(path, sizeof(path), "/local/domain/0/device-model/%d/command", domid); xs_write(ctx->xsh, XBT_NULL, path, "pci-ins", strlen("pci-ins")); if (libxl_wait_for_device_model(ctx, domid, "pci-inserted") < 0) - XL_LOG(ctx, XL_LOG_ERROR, "Device Model didn't respond in time\n"); + XL_LOG(ctx, XL_LOG_ERROR, "Device Model didn't respond in time"); snprintf(path, sizeof(path), "/local/domain/0/device-model/%d/parameter", domid); vdevfn = libxl_xs_read(ctx, XBT_NULL, path); sscanf(vdevfn + 2, "%x", &pcidev->vdevfn); @@ -1211,22 +1222,22 @@ int libxl_device_pci_add(struct libxl_ctx *ctx, uint32_t domid, libxl_device_pci int i; if (f == NULL) { - XL_LOG(ctx, XL_LOG_ERROR, "Couldn't open %s\n", sysfs_path); + XL_LOG_ERRNO(ctx, XL_LOG_ERROR, "Couldn't open %s", sysfs_path); return -1; } for (i = 0; i < PROC_PCI_NUM_RESOURCES; i++) { - fscanf(f, "0x%x 0x%x 0x%x\n", &start, &end, &flags); + fscanf(f, "0x%x 0x%x 0x%x", &start, &end, &flags); size = end - start + 1; if (start) { if (flags & PCI_BAR_IO) { rc = xc_domain_ioport_permission(ctx->xch, domid, start, size, 1); if (rc < 0) - XL_LOG(ctx, XL_LOG_ERROR, "Error: xc_domain_ioport_permission error 0x%x/0x%x: %d\n", start, size, rc); + XL_LOG_ERRNOVAL(ctx, XL_LOG_ERROR, rc, "Error: xc_domain_ioport_permission error 0x%x/0x%x", start, size); } else { rc = xc_domain_iomem_permission(ctx->xch, domid, start>>XC_PAGE_SHIFT, (size+(XC_PAGE_SIZE-1))>>XC_PAGE_SHIFT, 1); if (rc < 0) - XL_LOG(ctx, XL_LOG_ERROR, "Error: xc_domain_iomem_permission error 0x%x/0x%x: %d\n", start, size, rc); + XL_LOG_ERRNOVAL(ctx, XL_LOG_ERROR, rc, "Error: xc_domain_iomem_permission error 0x%x/0x%x", start, size); } } } @@ -1235,25 +1246,25 @@ int libxl_device_pci_add(struct libxl_ctx *ctx, uint32_t domid, libxl_device_pci pcidev->bus, pcidev->dev, pcidev->func); f = fopen(sysfs_path, "r"); if (f == NULL) { - XL_LOG(ctx, XL_LOG_ERROR, "Couldn't open %s\n", sysfs_path); + XL_LOG_ERRNO(ctx, XL_LOG_ERROR, "Couldn't open %s", sysfs_path); goto out; } fscanf(f, "%u", &irq); if (irq) { rc = xc_physdev_map_pirq(ctx->xch, domid, irq, &irq); if (rc < 0) { - XL_LOG(ctx, XL_LOG_ERROR, "Error: xc_physdev_map_pirq irq=%d: %d\n", irq, rc); + XL_LOG_ERRNOVAL(ctx, XL_LOG_ERROR, rc, "Error: xc_physdev_map_pirq irq=%d", irq); } rc = xc_domain_irq_permission(ctx->xch, domid, irq, 1); if (rc < 0) { - XL_LOG(ctx, XL_LOG_ERROR, "Error: xc_domain_irq_permission irq=%d: %d\n", irq, rc); + XL_LOG_ERRNOVAL(ctx, XL_LOG_ERROR, rc, "Error: xc_domain_irq_permission irq=%d", irq); } } fclose(f); } out: if ((rc = xc_assign_device(ctx->xch, domid, pcidev->value)) < 0) - XL_LOG(ctx, XL_LOG_ERROR, "Error: xc_assign_device error %d\n", rc); + XL_LOG_ERRNOVAL(ctx, XL_LOG_ERROR, rc, "xc_assign_device failed"); libxl_device_pci_add_xenstore(ctx, domid, pcidev); return 0; @@ -1280,7 +1291,7 @@ int libxl_device_pci_remove(struct libxl_ctx *ctx, uint32_t domid, libxl_device_ snprintf(path, sizeof(path), "/local/domain/0/device-model/%d/command", domid); xs_write(ctx->xsh, XBT_NULL, path, "pci-rem", strlen("pci-rem")); if (libxl_wait_for_device_model(ctx, domid, "pci-removed") < 0) { - XL_LOG(ctx, XL_LOG_ERROR, "Device Model didn't respond in time\n"); + XL_LOG(ctx, XL_LOG_ERROR, "Device Model didn't respond in time"); return -1; } snprintf(path, sizeof(path), "/local/domain/0/device-model/%d/state", domid); @@ -1294,7 +1305,7 @@ int libxl_device_pci_remove(struct libxl_ctx *ctx, uint32_t domid, libxl_device_ int i; if (f == NULL) { - XL_LOG(ctx, XL_LOG_ERROR, "Couldn't open %s\n", sysfs_path); + XL_LOG_ERRNO(ctx, XL_LOG_ERROR, "Couldn't open %s", sysfs_path); goto skip1; } for (i = 0; i < PROC_PCI_NUM_RESOURCES; i++) { @@ -1304,12 +1315,12 @@ int libxl_device_pci_remove(struct libxl_ctx *ctx, uint32_t domid, libxl_device_ if (flags & PCI_BAR_IO) { rc = xc_domain_ioport_permission(ctx->xch, domid, start, size, 0); if (rc < 0) - XL_LOG(ctx, XL_LOG_ERROR, "Error: xc_domain_ioport_permission error 0x%x/0x%x: %d\n", start, size, rc); + XL_LOG_ERRNOVAL(ctx, XL_LOG_ERROR, rc, "xc_domain_ioport_permission error 0x%x/0x%x", start, size); } else { rc = xc_domain_iomem_permission(ctx->xch, domid, start>>XC_PAGE_SHIFT, (size+(XC_PAGE_SIZE-1))>>XC_PAGE_SHIFT, 0); if (rc < 0) - XL_LOG(ctx, XL_LOG_ERROR, "Error: xc_domain_iomem_permission error 0x%x/0x%x: %d\n", start, size, rc); + XL_LOG_ERRNOVAL(ctx, XL_LOG_ERROR, rc, "xc_domain_iomem_permission error 0x%x/0x%x", start, size); } } } @@ -1319,18 +1330,18 @@ skip1: pcidev->bus, pcidev->dev, pcidev->func); f = fopen(sysfs_path, "r"); if (f == NULL) { - XL_LOG(ctx, XL_LOG_ERROR, "Couldn't open %s\n", sysfs_path); + XL_LOG_ERRNO(ctx, XL_LOG_ERROR, "Couldn't open %s", sysfs_path); goto out; } fscanf(f, "%u", &irq); if (irq) { rc = xc_physdev_unmap_pirq(ctx->xch, domid, irq); if (rc < 0) { - XL_LOG(ctx, XL_LOG_ERROR, "Error: xc_physdev_map_pirq irq=%d: %d\n", irq, rc); + XL_LOG_ERRNOVAL(ctx, XL_LOG_ERROR, rc, "xc_physdev_map_pirq irq=%d", irq); } rc = xc_domain_irq_permission(ctx->xch, domid, irq, 0); if (rc < 0) { - XL_LOG(ctx, XL_LOG_ERROR, "Error: xc_domain_irq_permission irq=%d: %d\n", irq, rc); + XL_LOG_ERRNOVAL(ctx, XL_LOG_ERROR, rc, "xc_domain_irq_permission irq=%d", irq); } } fclose(f); @@ -1341,7 +1352,7 @@ out: libxl_device_pci_flr(ctx, pcidev->domain, pcidev->bus, pcidev->dev, pcidev->func); if ((rc = xc_deassign_device(ctx->xch, domid, pcidev->value)) < 0) - XL_LOG(ctx, XL_LOG_ERROR, "Error: xc_deassign_device error %d\n", rc); + XL_LOG_ERRNOVAL(ctx, XL_LOG_ERROR, rc, "xc_deassign_device failed"); return 0; } diff --git a/tools/libxl/libxl_device.c b/tools/libxl/libxl_device.c index eee0a40..82a2a30 100644 --- a/tools/libxl/libxl_device.c +++ b/tools/libxl/libxl_device.c @@ -92,7 +92,7 @@ retry_transaction: if (errno == EAGAIN) goto retry_transaction; else - XL_LOG(ctx, XL_LOG_ERROR, "xs transaction failed errno=%d\n", errno); + XL_LOG_ERRNO(ctx, XL_LOG_ERROR, "xs transaction failed"); } return 0; } @@ -213,7 +213,7 @@ int libxl_devices_destroy(struct libxl_ctx *ctx, uint32_t domid, int force) path = libxl_sprintf(ctx, "/local/domain/%d/device", domid); l1 = libxl_xs_directory(ctx, XBT_NULL, path, &num1); if (!l1) { - XL_LOG(ctx, XL_LOG_ERROR, "%s is empty\n", path); + XL_LOG(ctx, XL_LOG_ERROR, "%s is empty", path); return -1; } for (i = 0; i < num1; i++) { @@ -248,7 +248,7 @@ int libxl_devices_destroy(struct libxl_ctx *ctx, uint32_t domid, int force) if (!state || atoi(state) == 6) { xs_unwatch(ctx->xsh, l1[0], l1[1]); xs_rm(ctx->xsh, XBT_NULL, l1[1]); - XL_LOG(ctx, XL_LOG_DEBUG, "Destroyed device backend at %s\n", l1[1]); + XL_LOG(ctx, XL_LOG_DEBUG, "Destroyed device backend at %s", l1[1]); n_watches--; } } @@ -267,15 +267,20 @@ int libxl_devices_destroy(struct libxl_ctx *ctx, uint32_t domid, int force) int libxl_device_pci_flr(struct libxl_ctx *ctx, unsigned int domain, unsigned int bus, unsigned int dev, unsigned int func) { + char *do_flr= "/sys/bus/pci/drivers/pciback/do_flr"; FILE *fd; - fd = fopen("/sys/bus/pci/drivers/pciback/do_flr", "w"); + fd = fopen(do_flr, "w"); if (fd != NULL) { fprintf(fd, PCI_BDF, domain, bus, dev, func); fclose(fd); return 0; } - XL_LOG(ctx, XL_LOG_ERROR, "Pciback doesn't support do_flr, cannot flr the device\n"); + if (errno == ENOENT) { + XL_LOG(ctx, XL_LOG_ERROR, "Pciback doesn't support do_flr, cannot flr the device"); + } else { + XL_LOG_ERRNO(ctx, XL_LOG_ERROR, "Failed to access pciback path %s", do_flr); + } return -1; } @@ -303,7 +308,7 @@ int libxl_wait_for_device_model(struct libxl_ctx *ctx, uint32_t domid, char *sta } } } - XL_LOG(ctx, XL_LOG_ERROR, "Device Model not ready\n"); + XL_LOG(ctx, XL_LOG_ERROR, "Device Model not ready"); return -1; } @@ -317,7 +322,13 @@ int libxl_wait_for_backend(struct libxl_ctx *ctx, char *be_path, char *state) while (watchdog > 0) { p = xs_read(ctx->xsh, XBT_NULL, path, &len); if (p == NULL) { - XL_LOG(ctx, XL_LOG_ERROR, "Backend %s does not exist\n", be_path); + if (errno == ENOENT) { + XL_LOG(ctx, XL_LOG_ERROR, "Backend %s does not exist", + be_path); + } else { + XL_LOG_ERRNO(ctx, XL_LOG_ERROR, "Failed to access backend %s", + be_path); + } return -1; } else { if (!strcmp(p, state)) { @@ -328,7 +339,7 @@ int libxl_wait_for_backend(struct libxl_ctx *ctx, char *be_path, char *state) } } } - XL_LOG(ctx, XL_LOG_ERROR, "Backend %s not ready\n", be_path); + XL_LOG(ctx, XL_LOG_ERROR, "Backend %s not ready", be_path); return -1; } diff --git a/tools/libxl/libxl_dom.c b/tools/libxl/libxl_dom.c index a98daee..eaea6f3 100644 --- a/tools/libxl/libxl_dom.c +++ b/tools/libxl/libxl_dom.c @@ -83,6 +83,9 @@ int build_post(struct libxl_ctx *ctx, uint32_t domid, ents[9] = libxl_sprintf(ctx, "%lu", state->store_mfn); dom_path = libxl_xs_get_dompath(ctx, domid); + if (!dom_path) + return ERROR_FAIL; + vm_path = xs_read(ctx->xsh, XBT_NULL, libxl_sprintf(ctx, "%s/vm", dom_path), NULL); retry_transaction: t = xs_transaction_start(ctx->xsh); @@ -107,7 +110,7 @@ int build_pv(struct libxl_ctx *ctx, uint32_t domid, dom = xc_dom_allocate(info->u.pv.cmdline, info->u.pv.features); if (!dom) { - XL_LOG(ctx, XL_LOG_ERROR, "xc_dom_allocate failed: %d", dom); + XL_LOG_ERRNOVAL(ctx, XL_LOG_ERROR, dom, "xc_dom_allocate failed"); return -1; } if ((ret = xc_dom_linux_build(ctx->xch, dom, domid, info->max_memkb / 1024, @@ -115,7 +118,7 @@ int build_pv(struct libxl_ctx *ctx, uint32_t domid, state->store_port, &state->store_mfn, state->console_port, &state->console_mfn)) != 0) { xc_dom_release(dom); - XL_LOG(ctx, XL_LOG_ERROR, "xc_dom_linux_build failed: %d", ret); + XL_LOG_ERRNOVAL(ctx, XL_LOG_ERROR, ret, "xc_dom_linux_build failed"); return -2; } xc_dom_release(dom); @@ -129,7 +132,7 @@ int build_hvm(struct libxl_ctx *ctx, uint32_t domid, ret = xc_hvm_build(ctx->xch, domid, info->max_memkb / 1024, info->kernel); if (ret) { - XL_LOG(ctx, XL_LOG_ERROR, "hvm building failed: %d", ret); + XL_LOG_ERRNOVAL(ctx, XL_LOG_ERROR, ret, "hvm building failed"); return ERROR_FAIL; } ret = hvm_build_set_params(ctx->xch, domid, info->u.hvm.apic, info->u.hvm.acpi, @@ -137,7 +140,7 @@ int build_hvm(struct libxl_ctx *ctx, uint32_t domid, info->max_vcpus, state->store_port, &state->store_mfn); if (ret) { - XL_LOG(ctx, XL_LOG_ERROR, "hvm build set params failed: %d", ret); + XL_LOG_ERRNOVAL(ctx, XL_LOG_ERROR, ret, "hvm build set params failed"); return ERROR_FAIL; } xc_cpuid_apply_policy(ctx->xch, domid); diff --git a/tools/libxl/libxl_exec.c b/tools/libxl/libxl_exec.c index 8d7928b..8a589b6 100644 --- a/tools/libxl/libxl_exec.c +++ b/tools/libxl/libxl_exec.c @@ -28,7 +28,7 @@ int libxl_exec(struct libxl_ctx *ctx, int stdinfd, int stdoutfd, int stderrfd, pid = fork(); if (pid == -1) { - XL_LOG(ctx, XL_LOG_ERROR, "fork failed"); + XL_LOG_ERRNO(ctx, XL_LOG_ERROR, "fork failed"); return -1; } if (pid == 0) { diff --git a/tools/libxl/libxl_internal.c b/tools/libxl/libxl_internal.c index 407cf22..7ba0c97 100644 --- a/tools/libxl/libxl_internal.c +++ b/tools/libxl/libxl_internal.c @@ -146,14 +146,41 @@ char *libxl_dirname(struct libxl_ctx *ctx, const char *s) return ptr; } -void xl_log(struct libxl_ctx *ctx, int loglevel, const char *file, int line, const char *func, char *fmt, ...) +void xl_logv(struct libxl_ctx *ctx, int loglevel, int errnoval, + const char *file, int line, const char *func, + char *fmt, va_list ap) { - va_list ap; + char *enomem = "[out of memory formatting log message]"; char *s; - va_start(ap, fmt); - vasprintf(&s, fmt, ap); - va_end(ap); + int rc; + + rc = vasprintf(&s, fmt, ap); + if (rc<0) { s = enomem; goto x; } + + if (errnoval >= 0) { + char *errstr, *snew; + errstr = strerror(errnoval); + if (errstr) + rc = asprintf(&snew, "%s: %s", s, errstr); + else + rc = asprintf(&snew, "%s: unknown error number %d", s, errnoval); + free(s); + if (rc<0) { s = enomem; goto x; } + s = snew; + } + x: ctx->log_callback(ctx->log_userdata, loglevel, file, line, func, s); - free(s); + if (s != enomem) + free(s); +} + +void xl_log(struct libxl_ctx *ctx, int loglevel, int errnoval, + const char *file, int line, + const char *func, char *fmt, ...) +{ + va_list ap; + va_start(ap, fmt); + xl_logv(ctx, loglevel, errnoval, file, line, func, fmt, ap); + va_end(ap); } diff --git a/tools/libxl/libxl_internal.h b/tools/libxl/libxl_internal.h index d6835be..046e51d 100644 --- a/tools/libxl/libxl_internal.h +++ b/tools/libxl/libxl_internal.h @@ -37,9 +37,13 @@ #define XL_LOGGING_ENABLED #ifdef XL_LOGGING_ENABLED -#define XL_LOG(ctx, loglevel, _f, _a...) xl_log(ctx, loglevel, __FILE__, __LINE__, __func__, _f, ##_a) +#define XL_LOG(ctx, loglevel, _f, _a...) xl_log(ctx, loglevel, -1, __FILE__, __LINE__, __func__, _f, ##_a) +#define XL_LOG_ERRNO(ctx, loglevel, _f, _a...) xl_log(ctx, loglevel, errno, __FILE__, __LINE__, __func__, _f, ##_a) +#define XL_LOG_ERRNOVAL(ctx, errnoval, loglevel, _f, _a...) xl_log(ctx, loglevel, errnoval, __FILE__, __LINE__, __func__, _f, ##_a) #else #define XL_LOG(ctx, loglevel, _f, _a...) +#define XL_LOG_ERRNO(ctx, loglevel, _f, _a...) +#define XL_LOG_ERRNOVAL(ctx, loglevel, errnoval, _f, _a...) #endif #define XL_LOG_DEBUG 3 @@ -47,7 +51,8 @@ #define XL_LOG_WARNING 1 #define XL_LOG_ERROR 0 -void xl_log(struct libxl_ctx *ctx, int loglevel, const char *file, int line, const char *func, char *fmt, ...); +void xl_logv(struct libxl_ctx *ctx, int errnoval, int loglevel, const char *file, int line, const char *func, char *fmt, va_list al); +void xl_log(struct libxl_ctx *ctx, int errnoval, int loglevel, const char *file, int line, const char *func, char *fmt, ...); struct libxl_domain_build_state_ { uint32_t store_port; @@ -97,7 +102,7 @@ int libxl_xs_writev(struct libxl_ctx *ctx, xs_transaction_t t, char *dir, char **kvs); int libxl_xs_write(struct libxl_ctx *ctx, xs_transaction_t t, char *path, char *fmt, ...); -char *libxl_xs_get_dompath(struct libxl_ctx *ctx, uint32_t domid); +char *libxl_xs_get_dompath(struct libxl_ctx *ctx, uint32_t domid); // logs errs char *libxl_xs_read(struct libxl_ctx *ctx, xs_transaction_t t, char *path); char **libxl_xs_directory(struct libxl_ctx *ctx, xs_transaction_t t, char *path, unsigned int *nb); diff --git a/tools/libxl/libxl_xshelp.c b/tools/libxl/libxl_xshelp.c index 6286d02..f59eee7 100644 --- a/tools/libxl/libxl_xshelp.c +++ b/tools/libxl/libxl_xshelp.c @@ -95,6 +95,11 @@ char * libxl_xs_read(struct libxl_ctx *ctx, xs_transaction_t t, char *path) char *libxl_xs_get_dompath(struct libxl_ctx *ctx, uint32_t domid) { char *s = xs_get_domain_path(ctx->xsh, domid); + if (!s) { + XL_LOG_ERRNO(ctx, XL_LOG_ERROR, "failed to get dompath for %lu", + domid); + return NULL; + } libxl_ptr_add(ctx, s); return s; } -- 1.5.6.5 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |