diff options
author | tlh20@elite.cl.cam.ac.uk <tlh20@elite.cl.cam.ac.uk> | 2003-05-06 09:36:15 +0000 |
---|---|---|
committer | tlh20@elite.cl.cam.ac.uk <tlh20@elite.cl.cam.ac.uk> | 2003-05-06 09:36:15 +0000 |
commit | fd347f1b55d1a77969f2624f0063152568dabab0 (patch) | |
tree | e90591937b99940e1237421f9a6e047d5dbca521 /tools/internal/xi_create.c | |
parent | 5379a4b2d0213f3a323dc6c0340845b6353cd273 (diff) | |
download | xen-fd347f1b55d1a77969f2624f0063152568dabab0.tar.gz xen-fd347f1b55d1a77969f2624f0063152568dabab0.tar.bz2 xen-fd347f1b55d1a77969f2624f0063152568dabab0.zip |
bitkeeper revision 1.206 (3eb7820fjxOimwW6NMSeo6KyAdqZUQ)
Many files:
new file
domctl, xi_ tools, updated domain builder, /proc/xeno/domains
Diffstat (limited to 'tools/internal/xi_create.c')
-rw-r--r-- | tools/internal/xi_create.c | 98 |
1 files changed, 98 insertions, 0 deletions
diff --git a/tools/internal/xi_create.c b/tools/internal/xi_create.c new file mode 100644 index 0000000000..5162e27bba --- /dev/null +++ b/tools/internal/xi_create.c @@ -0,0 +1,98 @@ +/* + * XenoDomainBuilder, copyright (c) Boris Dragovic, bd240@cl.cam.ac.uk + * This code is released under terms and conditions of GNU GPL :). + * Usage: <executable> <mem_kb> <os image> <num_vifs> + */ + +#include <unistd.h> +#include <stdio.h> +#include <errno.h> +#include <fcntl.h> +#include <sys/mman.h> +#include <sys/types.h> +#include <sys/stat.h> +#include <stdlib.h> + +#include "hypervisor_defs.h" +#include "dom0_ops.h" +#include "dom0_defs.h" +#include "mem_defs.h" + +/***********************************************************************/ + +static char *argv0 = "internal_domain_create"; + +static void ERROR (char *message) +{ + fprintf (stderr, "%s: %s\n", argv0, message); + exit (-1); +} + +static void PERROR (char *message) +{ + fprintf (stderr, "%s: %s (%s)\n", argv0, message, sys_errlist[errno]); + exit (-1); +} + +/***********************************************************************/ + +static dom0_newdomain_t * create_new_domain(long req_mem, char *name) +{ + dom0_newdomain_t * dom_data; + char cmd_path[MAX_PATH]; + char dom_id_path[MAX_PATH]; + dom0_op_t dop; + int cmd_fd; + int id_fd; + + /* open the /proc command interface */ + sprintf(cmd_path, "%s%s%s%s", "/proc/", PROC_XENO_ROOT, "/", PROC_CMD); + cmd_fd = open(cmd_path, O_WRONLY); + if(cmd_fd < 0){ + PERROR ("Could not open PROC_CMD interface"); + return 0; + } + + dop.cmd = DOM0_CREATEDOMAIN; + dop.u.newdomain.memory_kb = req_mem; + strncpy (dop.u.newdomain.name, name, MAX_DOMAIN_NAME - 1); + dop.u.newdomain.name[MAX_DOMAIN_NAME - 1] = 0; + + write(cmd_fd, &dop, sizeof(dom0_op_t)); + close(cmd_fd); + + sprintf(dom_id_path, "%s%s%s%s", "/proc/", PROC_XENO_ROOT, "/", + PROC_DOM_DATA); + while((id_fd = open(dom_id_path, O_RDONLY)) < 0) continue; + dom_data = (dom0_newdomain_t *)malloc(sizeof(dom0_newdomain_t)); + read(id_fd, dom_data, sizeof(dom0_newdomain_t)); + close(id_fd); + + return dom_data; +} + +/***********************************************************************/ + +int main(int argc, char **argv) +{ + dom0_newdomain_t * dom_data; + + if (argv[0] != NULL) + { + argv0 = argv[0]; + } + + if(argc != 3) + { + fprintf (stderr, "Usage: %s <kbytes-mem> <domain-name>\n", argv0); + return -1; + } + + if(!(dom_data = create_new_domain(atol(argv[1]), argv[2]))) + { + return -1; + } + + fprintf (stdout, "%d\n", dom_data -> domain); + return 0; +} |