#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>
}
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;
}
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;
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);
}
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;
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
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),
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);
#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"
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;
+}
_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