aboutsummaryrefslogtreecommitdiffstats
path: root/src/dumm/dumm.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/dumm/dumm.c')
-rw-r--r--src/dumm/dumm.c74
1 files changed, 74 insertions, 0 deletions
diff --git a/src/dumm/dumm.c b/src/dumm/dumm.c
new file mode 100644
index 000000000..7536bce57
--- /dev/null
+++ b/src/dumm/dumm.c
@@ -0,0 +1,74 @@
+#include <sys/stat.h>
+
+#include <debug.h>
+
+#include "dumm.h"
+
+typedef struct private_dumm_t private_dumm_t;
+
+struct private_dumm_t {
+ dumm_t public;
+ linked_list_t *guests;
+};
+
+static guest_t* start_guest(private_dumm_t *this, char *name, char *kernel,
+ char *master, int mem)
+{
+ guest_t *guest;
+
+ guest = guest_create(name, kernel, master, mem);
+ if (guest)
+ {
+ if (guest->start(guest))
+ {
+ this->guests->insert_last(this->guests, guest);
+ return guest;
+ }
+ guest->destroy(guest);
+ }
+ return NULL;
+}
+
+static iterator_t* create_guest_iterator(private_dumm_t *this)
+{
+ return this->guests->create_iterator(this->guests, TRUE);
+}
+
+static void destroy(private_dumm_t *this)
+{
+ this->guests->destroy_offset(this->guests, offsetof(guest_t, destroy));
+ free(this);
+}
+
+/**
+ * check for a directory, create if it does not exist
+ */
+static bool makedir(char *dir)
+{
+ struct stat st;
+
+ if (stat(dir, &st) != 0)
+ {
+ return mkdir(dir, S_IRWXU) == 0;
+ }
+ return S_ISDIR(st.st_mode);
+}
+
+dumm_t *dumm_create()
+{
+ private_dumm_t *this = malloc_thing(private_dumm_t);
+
+ this->public.start_guest = (void*)start_guest;
+ this->public.create_guest_iterator = (void*)create_guest_iterator;
+ this->public.destroy = (void*)destroy;
+
+ if (!makedir(HOST_DIR) || !makedir(MOUNT_DIR) || !makedir(RUN_DIR))
+ {
+ free(this);
+ return NULL;
+ }
+
+ this->guests = linked_list_create();
+ return &this->public;
+}
+