Added support for multiple overlays to guests (replaces the template functionality).

Compared to a template an overlay is an arbitrary directory, not the
parent directory of a directory with the guest's name.
This commit is contained in:
Tobias Brunner
2010-10-12 15:03:26 +02:00
parent 4542920a3e
commit 0dbbd47fe7
2 changed files with 47 additions and 25 deletions
+27 -20
View File
@@ -1,5 +1,5 @@
/* /*
* Copyright (C) 2008 Tobias Brunner * Copyright (C) 2008-2009 Tobias Brunner
* Copyright (C) 2007 Martin Willi * Copyright (C) 2007 Martin Willi
* Hochschule fuer Technik Rapperswil * Hochschule fuer Technik Rapperswil
* *
@@ -297,37 +297,42 @@ static bool start(private_guest_t *this, invoke_function_t invoke, void* data,
} }
/** /**
* Implementation of guest_t.load_template. * Implementation of guest_t.add_overlay.
*/ */
static bool load_template(private_guest_t *this, char *path) static bool add_overlay(private_guest_t *this, char *path)
{ {
char dir[PATH_MAX];
size_t len;
if (path == NULL) if (path == NULL)
{
return this->cowfs->set_overlay(this->cowfs, NULL);
}
len = snprintf(dir, sizeof(dir), "%s/%s", path, this->name);
if (len < 0 || len >= sizeof(dir))
{ {
return FALSE; return FALSE;
} }
if (access(dir, F_OK) != 0)
if (access(path, F_OK) != 0)
{ {
if (!mkdir_p(dir, PERME)) if (!mkdir_p(path, PERME))
{ {
DBG1(DBG_LIB, "creating overlay for guest '%s' failed: %m", DBG1(DBG_LIB, "creating overlay for guest '%s' failed: %m",
this->name); this->name);
return FALSE; return FALSE;
} }
} }
if (!this->cowfs->set_overlay(this->cowfs, dir))
{ return this->cowfs->add_overlay(this->cowfs, path);
return FALSE; }
}
return TRUE; /**
* Implementation of guest_t.del_overlay.
*/
static bool del_overlay(private_guest_t *this, char *path)
{
return this->cowfs->del_overlay(this->cowfs, path);
}
/**
* Implementation of guest_t.pop_overlay.
*/
static bool pop_overlay(private_guest_t *this)
{
return this->cowfs->pop_overlay(this->cowfs);
} }
/** /**
@@ -567,7 +572,9 @@ static private_guest_t *guest_create_generic(char *parent, char *name,
this->public.create_iface_enumerator = (enumerator_t*(*)(guest_t*))create_iface_enumerator; this->public.create_iface_enumerator = (enumerator_t*(*)(guest_t*))create_iface_enumerator;
this->public.start = (void*)start; this->public.start = (void*)start;
this->public.stop = (void*)stop; this->public.stop = (void*)stop;
this->public.load_template = (bool(*)(guest_t*, char *path))load_template; this->public.add_overlay = (bool(*)(guest_t*,char*))add_overlay;
this->public.del_overlay = (bool(*)(guest_t*,char*))del_overlay;
this->public.pop_overlay = (bool(*)(guest_t*))pop_overlay;
this->public.exec = (int(*)(guest_t*, void(*cb)(void*,char*,size_t),void*,char*,...))exec; this->public.exec = (int(*)(guest_t*, void(*cb)(void*,char*,size_t),void*,char*,...))exec;
this->public.exec_str = (int(*)(guest_t*, void(*cb)(void*,char*),bool,void*,char*,...))exec_str; this->public.exec_str = (int(*)(guest_t*, void(*cb)(void*,char*),bool,void*,char*,...))exec_str;
this->public.sigchild = (void(*)(guest_t*))sigchild; this->public.sigchild = (void(*)(guest_t*))sigchild;
+20 -5
View File
@@ -1,5 +1,5 @@
/* /*
* Copyright (C) 2008 Tobias Brunner * Copyright (C) 2008-2009 Tobias Brunner
* Copyright (C) 2007 Martin Willi * Copyright (C) 2007 Martin Willi
* Hochschule fuer Technik Rapperswil * Hochschule fuer Technik Rapperswil
* *
@@ -134,12 +134,27 @@ struct guest_t {
enumerator_t* (*create_iface_enumerator)(guest_t *this); enumerator_t* (*create_iface_enumerator)(guest_t *this);
/** /**
* Set the template COWFS overlay to use. * Adds a COWFS overlay. The directory is created if it does not exist.
* *
* @param parent parent directory where template diff should point to * @param dir directory where overlay diff should point to
* @return FALSE if failed * @return FALSE, if failed
*/ */
bool (*load_template)(guest_t *this, char *parent); bool (*add_overlay)(guest_t *this, char *dir);
/**
* Removes the specified COWFS overlay.
*
* @param dir directory where overlay diff points to
* @return FALSE, if no found
*/
bool (*del_overlay)(guest_t *this, char *dir);
/**
* Removes the latest COWFS overlay.
*
* @return FALSE, if no overlay was found
*/
bool (*pop_overlay)(guest_t *this);
/** /**
* Execute a command on the guests mconsole. * Execute a command on the guests mconsole.