vbox: improve BFE argument handling

This commit is contained in:
Christian Helmuth 2014-04-16 17:19:22 +02:00
parent 2c7c814e19
commit 3d274366ab

View File

@ -36,6 +36,29 @@ void operator delete(void * p) {
Genode::env()->heap()->free(p, 0); Genode::env()->heap()->free(p, 0);
} }
namespace {
template <int MAX_ARGS>
struct Args
{
int argc = 0;
char *argv[MAX_ARGS] = { };
struct Too_many_arguments { };
void add(char const *arg)
{
/* argv[MAX_ARGS - 1] must be unused and set to 0 */
if (argc >= MAX_ARGS - 1)
throw Too_many_arguments();
/* XXX yes const-casting hurts but main() needs char** */
argv[argc++] = const_cast<char *>(arg);
}
};
} /* unnamed namespace */
extern "C" { extern "C" {
/* string conversion function currently does not convert ... */ /* string conversion function currently does not convert ... */
@ -124,15 +147,14 @@ int nanosleep(const struct timespec *req, struct timespec *rem) {
/* main function of VBox is in Frontends/VBoxBFE/VBoxBFE.cpp */ /* main function of VBox is in Frontends/VBoxBFE/VBoxBFE.cpp */
extern "C" DECLEXPORT(int) TrustedMain (int argc, char **argv, char **envp); extern "C" DECLEXPORT(int) TrustedMain (int argc, char **argv, char **envp);
int main(int, char **) int main()
{ {
static char c_mem[16]; static char c_mem[16];
static char c_type[4]; static char c_type[4];
static char c_file[128]; static char c_file[128];
static bool bOverlay = false; static bool bOverlay = false;
int argc = 9; static Args<64> args;
char * argv[argc + 1];
/* request max available memory */ /* request max available memory */
size_t vm_size = Genode::env()->ram_session()->avail(); size_t vm_size = Genode::env()->ram_session()->avail();
@ -164,51 +186,41 @@ int main(int, char **)
return 2; return 2;
} }
argv[0] = (char *)"virtualbox"; args.add("virtualbox");
argv[1] = (char *)"-m"; args.add("-m");
Genode::snprintf(c_mem, sizeof(c_mem), "%u", vm_size / 1024 / 1024); Genode::snprintf(c_mem, sizeof(c_mem), "%u", vm_size / 1024 / 1024);
argv[2] = c_mem; args.add(c_mem);
argv[3] = (char *)"-boot"; args.add("-boot");
if (!Genode::strcmp(c_type, "iso")) { if (!Genode::strcmp(c_type, "iso")) {
argv[4] = (char *)"d"; args.add("d");
argv[5] = (char *)"-cdrom"; args.add("-cdrom");
} else } else
if (!Genode::strcmp(c_type, "vdi")) { if (!Genode::strcmp(c_type, "vdi")) {
argv[4] = (char *)"c"; args.add("c");
argv[5] = (char *)"-hda"; args.add("-hda");
} else { } else {
PERR("invalid configuration - abort"); PERR("invalid configuration - abort");
return 3; return 3;
} }
argv[6] = c_file; args.add(c_file);
argv[7] = (char *)"-ioapic"; args.add("-ioapic");
if (9 > argc + 1) {
PERR("argc argv misconfiguration - abort");
return 4;
}
if (bOverlay) if (bOverlay)
argv[8] = (char *)"-overlay"; args.add("-overlay");
else {
argc -= 1;
argv[8] = 0;
}
argv[9] = 0;
PINF("start %s image '%s' with %zu MB Guest memory=%zu", PINF("start %s image '%s' with %zu MB Guest memory=%zu",
c_type, c_file, vm_size / 1024 / 1024, c_type, c_file, vm_size / 1024 / 1024,
Genode::env()->ram_session()->avail()); Genode::env()->ram_session()->avail());
if (RT_FAILURE(RTR3InitExe(argc, (char ***)&argv, 0))) { if (RT_FAILURE(RTR3InitExe(args.argc, (char ***)&args.argv, 0))) {
PERR("Intialization of VBox Runtime failed."); PERR("Intialization of VBox Runtime failed.");
return 5; return 5;
} }
return TrustedMain(argc, argv, NULL); return TrustedMain(args.argc, args.argv, NULL);
} }
} /* EXTERN "C" */ } /* EXTERN "C" */