diff options
Diffstat (limited to 'src/dumm/dumm.c')
-rw-r--r-- | src/dumm/dumm.c | 74 |
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; +} + |