Exposed the mutli-overlay functionality in the ruby bindings.

Overlays can be added to individual guests (which overlays exactly the
supplied directory) or to all guests (which overlays a subdirectory
with the guest's name to each guest).

The template functionality is provided as before.
This commit is contained in:
Tobias Brunner
2010-10-12 15:03:37 +02:00
parent f29396b87e
commit 9b0847dd9a
3 changed files with 71 additions and 8 deletions
+65 -3
View File
@@ -1,5 +1,5 @@
/*
* Copyright (C) 2008 Tobias Brunner
* Copyright (C) 2008-2009 Tobias Brunner
* Copyright (C) 2008 Martin Willi
* Hochschule fuer Technik Rapperswil
*
@@ -85,6 +85,38 @@ static void sigchld_handler(int signal, siginfo_t *info, void* ptr)
enumerator->destroy(enumerator);
}
/**
* Global Dumm bindings
*/
static VALUE dumm_add_overlay(VALUE class, VALUE dir)
{
if (!dumm->add_overlay(dumm, StringValuePtr(dir)))
{
rb_raise(rb_eRuntimeError, "loading overlay failed");
}
return class;
}
static VALUE dumm_del_overlay(VALUE class, VALUE dir)
{
return dumm->del_overlay(dumm, StringValuePtr(dir)) ? Qtrue : Qfalse;
}
static VALUE dumm_pop_overlay(VALUE class)
{
return dumm->pop_overlay(dumm) ? Qtrue : Qfalse;
}
static void dumm_init()
{
rbm_dumm = rb_define_module("Dumm");
rb_define_module_function(rbm_dumm, "add_overlay", dumm_add_overlay, 1);
rb_define_module_function(rbm_dumm, "del_overlay", dumm_del_overlay, 1);
rb_define_module_function(rbm_dumm, "pop_overlay", dumm_pop_overlay, 0);
}
/**
* Guest bindings
*/
@@ -330,6 +362,34 @@ static VALUE guest_delete(VALUE self)
return Qnil;
}
static VALUE guest_add_overlay(VALUE self, VALUE dir)
{
guest_t *guest;
Data_Get_Struct(self, guest_t, guest);
if (!guest->add_overlay(guest, StringValuePtr(dir)))
{
rb_raise(rb_eRuntimeError, "loading overlay failed");
}
return self;
}
static VALUE guest_del_overlay(VALUE self, VALUE dir)
{
guest_t *guest;
Data_Get_Struct(self, guest_t, guest);
return guest->del_overlay(guest, StringValuePtr(dir)) ? Qtrue : Qfalse;
}
static VALUE guest_pop_overlay(VALUE self)
{
guest_t *guest;
Data_Get_Struct(self, guest_t, guest);
return guest->pop_overlay(guest) ? Qtrue : Qfalse;
}
static void guest_init()
{
rbc_guest = rb_define_class_under(rbm_dumm , "Guest", rb_cObject);
@@ -354,6 +414,9 @@ static void guest_init()
rb_define_method(rbc_guest, "include?", guest_find_iface, 1);
rb_define_method(rbc_guest, "iface?", guest_find_iface, 1);
rb_define_method(rbc_guest, "delete", guest_delete, 0);
rb_define_method(rbc_guest, "add_overlay", guest_add_overlay, 1);
rb_define_method(rbc_guest, "del_overlay", guest_del_overlay, 1);
rb_define_method(rbc_guest, "pop_overlay", guest_pop_overlay, 0);
}
/**
@@ -711,8 +774,7 @@ void Init_dumm()
dumm = dumm_create(NULL);
rbm_dumm = rb_define_module("Dumm");
dumm_init();
guest_init();
bridge_init();
iface_init();
+3 -3
View File
@@ -1,5 +1,5 @@
=begin
Copyright (C) 2008 Tobias Brunner
Copyright (C) 2008-2009 Tobias Brunner
Hochschule fuer Technik Rapperswil
This program is free software; you can redistribute it and/or modify it
@@ -38,11 +38,11 @@ module Dumm
end
end
# unload templates, reset all guests and delete bridges
# unload template/overlays, reset all guests and delete bridges
def reset
Template.unload
Guest.each { |guest|
guest.reset if guest.running?
guest.reset
}
Bridge.each { |bridge|
bridge.delete
+3 -2
View File
@@ -1,5 +1,5 @@
=begin
Copyright (C) 2008 Tobias Brunner
Copyright (C) 2008-2009 Tobias Brunner
Hochschule fuer Technik Rapperswil
This program is free software; you can redistribute it and/or modify it
@@ -33,8 +33,9 @@ module Dumm
self[id]
end
# delete all interfaces
# remove all overlays, delete all interfaces
def reset
while pop_overlay; end
each {|i|
i.delete
}