diff options
-rw-r--r-- | tools/libxl/libxl.c | 54 | ||||
-rw-r--r-- | tools/libxl/libxl.h | 8 | ||||
-rw-r--r-- | tools/libxl/libxl.idl | 2 | ||||
-rw-r--r-- | tools/libxl/libxl_bootloader.c | 4 | ||||
-rw-r--r-- | tools/libxl/libxl_internal.c | 51 | ||||
-rw-r--r-- | tools/libxl/libxl_internal.h | 3 |
6 files changed, 68 insertions, 54 deletions
diff --git a/tools/libxl/libxl.c b/tools/libxl/libxl.c index 531590ce7a..7a02a24db7 100644 --- a/tools/libxl/libxl.c +++ b/tools/libxl/libxl.c @@ -23,7 +23,6 @@ #include <sys/stat.h> #include <fcntl.h> #include <sys/select.h> -#include <sys/mman.h> #include <sys/wait.h> #include <sys/time.h> #include <signal.h> @@ -340,9 +339,9 @@ int libxl_domain_build(libxl_ctx *ctx, libxl_domain_build_info *info, uint32_t d } ret = build_post(ctx, domid, info, state, vments, localents); out: - libxl_file_reference_unmap(ctx, &info->kernel); + libxl__file_reference_unmap(&info->kernel); if (!info->hvm) - libxl_file_reference_unmap(ctx, &info->u.pv.ramdisk); + libxl__file_reference_unmap(&info->u.pv.ramdisk); libxl_free_all(&gc); return ret; @@ -405,9 +404,9 @@ int libxl_domain_restore(libxl_ctx *ctx, libxl_domain_build_info *info, } out: - libxl_file_reference_unmap(ctx, &info->kernel); + libxl__file_reference_unmap(&info->kernel); if (!info->hvm) - libxl_file_reference_unmap(ctx, &info->u.pv.ramdisk); + libxl__file_reference_unmap(&info->u.pv.ramdisk); esave = errno; @@ -3355,47 +3354,8 @@ int libxl_tmem_freeable(libxl_ctx *ctx) return rc; } -int libxl_file_reference_map(libxl_ctx *ctx, libxl_file_reference *f) +void libxl_file_reference_destroy(libxl_file_reference *f) { - struct stat st_buf; - int ret, fd; - void *data; - - if (f->mapped) - return 0; - - fd = open(f->path, O_RDONLY); - if (f < 0) - return ERROR_FAIL; - - ret = fstat(fd, &st_buf); - if (ret < 0) - goto out; - - ret = -1; - data = mmap(NULL, st_buf.st_size, PROT_READ, MAP_PRIVATE, fd, 0); - if (data == NULL) - goto out; - - f->mapped = 1; - f->data = data; - f->size = st_buf.st_size; - - ret = 0; -out: - close(fd); - - return ret == 0 ? 0 : ERROR_FAIL; -} - -int libxl_file_reference_unmap(libxl_ctx *ctx, libxl_file_reference *f) -{ - int ret; - - if (!f->mapped) - return 0; - - ret = munmap(f->data, f->size); - - return ret == 0 ? 0 : ERROR_FAIL; + libxl__file_reference_unmap(f); + free(f->path); } diff --git a/tools/libxl/libxl.h b/tools/libxl/libxl.h index 566da1455a..ca1d71b8c6 100644 --- a/tools/libxl/libxl.h +++ b/tools/libxl/libxl.h @@ -142,10 +142,8 @@ typedef uint8_t libxl_uuid[16]; typedef uint8_t libxl_mac[6]; typedef char **libxl_string_list; -void libxl_string_list_destroy(libxl_string_list sl); typedef char **libxl_key_value_list; -void libxl_key_value_list_destroy(libxl_key_value_list kvl); typedef uint64_t *libxl_cpumap; @@ -235,8 +233,10 @@ int libxl_domain_shutdown(libxl_ctx *ctx, uint32_t domid, int req); int libxl_domain_destroy(libxl_ctx *ctx, uint32_t domid, int force); int libxl_domain_preserve(libxl_ctx *ctx, uint32_t domid, libxl_domain_create_info *info, const char *name_suffix, libxl_uuid new_uuid); -int libxl_file_reference_map(libxl_ctx *ctx, libxl_file_reference *f); -int libxl_file_reference_unmap(libxl_ctx *ctx, libxl_file_reference *f); +/* destructors for builtin data types */ +void libxl_string_list_destroy(libxl_string_list sl); +void libxl_key_value_list_destroy(libxl_key_value_list kvl); +void libxl_file_reference_destroy(libxl_file_reference *f); /* * Run the configured bootloader for a PV domain and update diff --git a/tools/libxl/libxl.idl b/tools/libxl/libxl.idl index fcbeddeb3a..f59950d3e8 100644 --- a/tools/libxl/libxl.idl +++ b/tools/libxl/libxl.idl @@ -85,7 +85,7 @@ libxl_file_reference = Struct("file_reference",[ mapped is true then the actual file may already be unlinked."""), ("mapped", integer), ("data", void), - ("size", size_t)]) + ("size", size_t)], autogenerate_destructor=False) libxl_domain_build_info = Struct("domain_build_info",[ ("max_vcpus", integer), diff --git a/tools/libxl/libxl_bootloader.c b/tools/libxl/libxl_bootloader.c index e7e88ce3d1..08d6a22274 100644 --- a/tools/libxl/libxl_bootloader.c +++ b/tools/libxl/libxl_bootloader.c @@ -279,12 +279,12 @@ static void parse_bootloader_result(libxl_ctx *ctx, if (strncmp("kernel ", o, strlen("kernel ")) == 0) { free(info->kernel.path); info->kernel.path = strdup(o + strlen("kernel ")); - libxl_file_reference_map(ctx, &info->kernel); + libxl__file_reference_map(&info->kernel); unlink(info->kernel.path); } else if (strncmp("ramdisk ", o, strlen("ramdisk ")) == 0) { free(info->u.pv.ramdisk.path); info->u.pv.ramdisk.path = strdup(o + strlen("ramdisk ")); - libxl_file_reference_map(ctx, &info->u.pv.ramdisk); + libxl__file_reference_map(&info->u.pv.ramdisk); unlink(info->u.pv.ramdisk.path); } else if (strncmp("args ", o, strlen("args ")) == 0) { free(info->u.pv.cmdline); diff --git a/tools/libxl/libxl_internal.c b/tools/libxl/libxl_internal.c index 5eb27a6f4d..05ef3e3130 100644 --- a/tools/libxl/libxl_internal.c +++ b/tools/libxl/libxl_internal.c @@ -19,6 +19,12 @@ #include <stdarg.h> #include <string.h> +#include <sys/types.h> +#include <sys/stat.h> +#include <fcntl.h> +#include <sys/mman.h> +#include <unistd.h> + #include "libxl.h" #include "libxl_internal.h" #include "libxl_utils.h" @@ -185,3 +191,48 @@ char *libxl_abs_path(libxl_gc *gc, char *s, const char *path) return libxl_sprintf(gc, "%s/%s", path, s); } + +int libxl__file_reference_map(libxl_file_reference *f) +{ + struct stat st_buf; + int ret, fd; + void *data; + + if (f->mapped) + return 0; + + fd = open(f->path, O_RDONLY); + if (f < 0) + return ERROR_FAIL; + + ret = fstat(fd, &st_buf); + if (ret < 0) + goto out; + + ret = -1; + data = mmap(NULL, st_buf.st_size, PROT_READ, MAP_PRIVATE, fd, 0); + if (data == NULL) + goto out; + + f->mapped = 1; + f->data = data; + f->size = st_buf.st_size; + + ret = 0; +out: + close(fd); + + return ret == 0 ? 0 : ERROR_FAIL; +} + +int libxl__file_reference_unmap(libxl_file_reference *f) +{ + int ret; + + if (!f->mapped) + return 0; + + ret = munmap(f->data, f->size); + + return ret == 0 ? 0 : ERROR_FAIL; +} diff --git a/tools/libxl/libxl_internal.h b/tools/libxl/libxl_internal.h index 2f81acce92..face02136c 100644 --- a/tools/libxl/libxl_internal.h +++ b/tools/libxl/libxl_internal.h @@ -274,4 +274,7 @@ struct libxl__xen_console_reader { _hidden int libxl_error_set(libxl_ctx *ctx, int code); +_hidden int libxl__file_reference_map(libxl_file_reference *f); +_hidden int libxl__file_reference_unmap(libxl_file_reference *f); + #endif |