From 7f9fc64274d84d6dcff9693bfd96d98a3e0e31d9 Mon Sep 17 00:00:00 2001 From: David Anderson Date: Sun, 25 Dec 2011 13:18:51 +0000 Subject: [PATCH] - vboxwrapper: for port-forwarding feature, allow specification of guest port only. Change tag to . Separate getting port from registering firewall rule svn path=/trunk/boinc/; revision=24891 --- checkin_notes | 11 +++- samples/vboxwrapper/vbox.cpp | 88 +++++++++++++---------------- samples/vboxwrapper/vbox.h | 9 ++- samples/vboxwrapper/vboxwrapper.cpp | 3 +- 4 files changed, 56 insertions(+), 55 deletions(-) diff --git a/checkin_notes b/checkin_notes index 909e669ecc..5b6ad088ab 100644 --- a/checkin_notes +++ b/checkin_notes @@ -9433,4 +9433,13 @@ Rom 25 Dec 2011 samples/vboxwrapper/ vbox.cpp, .h - \ No newline at end of file + +David 25 Dec 2011 + - vboxwrapper: for port-forwarding feature, + allow specification of guest port only. + Change tag to . + Separate getting port from registering firewall rule + + samples/vboxwrapper/ + vbox.cpp,h + vboxwrapper.cpp diff --git a/samples/vboxwrapper/vbox.cpp b/samples/vboxwrapper/vbox.cpp index 0e817e69db..9d05d7c996 100644 --- a/samples/vboxwrapper/vbox.cpp +++ b/samples/vboxwrapper/vbox.cpp @@ -70,9 +70,8 @@ VBOX_VM::VBOX_VM() { enable_floppyio = false; register_only = false; enable_network = false; - pf_desired_host_port = 0; - pf_desired_guest_port = 0; - pf_assigned_host_port = 0; + pf_guest_port = 0; + pf_host_port = 0; } VBOX_VM::~VBOX_VM() { @@ -129,8 +128,7 @@ int VBOX_VM::vbm_popen(string& arguments, string& output, const char* item, bool int retry_count = 0; string retry_notes; - do - { + do { retval = vbm_popen_raw(arguments, output, item); if (retval) { @@ -573,6 +571,35 @@ int VBOX_VM::initialize() { return 0; } +int VBOX_VM::get_port_forwarding_port() { + struct sockaddr_in addr; + BOINC_SOCKLEN_T addrsize; + int sock; + int retval; + + memset(&addr, 0, sizeof(addr)); + addr.sin_family = AF_INET; + addr.sin_port = htons(0); + addr.sin_addr.s_addr = htonl(INADDR_LOOPBACK); + + addrsize = sizeof(addr); + + retval = boinc_socket(sock); + if (retval) return retval; + + retval = bind(sock, (struct sockaddr *)&addr, addrsize); + if (retval < 0) { + boinc_close_socket(sock); + return ERR_BIND; + } + + getsockname(sock, (struct sockaddr *)&addr, &addrsize); + pf_host_port = addr.sin_port; + + boinc_close_socket(sock); + return 0; +} + int VBOX_VM::register_vm() { string command; string output; @@ -737,7 +764,9 @@ int VBOX_VM::register_vm() { // If a project wants to open up a firewall port through the VirtualBox virtual // network firewall/nat do that here. // - if (pf_desired_host_port) { + if (pf_guest_port) { + retval = get_port_forwarding_port(); + if (retval) return retval; retval = register_vm_firewall_rules(); if (retval) return retval; } @@ -766,9 +795,6 @@ int VBOX_VM::register_vm_firewall_rules() { string output; string virtual_machine_slot_directory; char buf[256]; - struct sockaddr_in addr; - BOINC_SOCKLEN_T addrsize; - int sock; int retval; get_slot_directory(virtual_machine_slot_directory); @@ -779,45 +805,9 @@ int VBOX_VM::register_vm_firewall_rules() { boinc_msg_prefix(buf, sizeof(buf)) ); - memset(&addr, 0, sizeof(addr)); - addr.sin_family = AF_INET; - addr.sin_port = htons(pf_desired_host_port); - addr.sin_addr.s_addr = htonl(INADDR_LOOPBACK); - - addrsize = sizeof(addr); - - retval = boinc_socket(sock); - if(retval) return retval; - - // Attempt to use the desired port number - // - retval = bind(sock, (struct sockaddr *)&addr, addrsize); - if(retval < 0) - { - // Okay the desired port number didn't work, to set the port number - // to 0 and try again. Let the OS choose a valid port number. - // - addr.sin_port = htons(0); - retval = bind(sock, (struct sockaddr *)&addr, addrsize); - if(retval < 0) - { - boinc_close_socket(sock); - return ERR_BIND; - } - } - - // Okay we now have a valid port number, lets see what we have been - // assigned. Store it for future use. - // - getsockname(sock, (struct sockaddr *)&addr, &addrsize); - pf_assigned_host_port = addr.sin_port; - - boinc_close_socket(sock); - - // Add new firewall rule // - sprintf(buf, "vboxwrapper,tcp,127.0.0.1,%d,,%d", pf_assigned_host_port, pf_desired_guest_port); + sprintf(buf, "vboxwrapper,tcp,127.0.0.1,%d,,%d", pf_host_port, pf_guest_port); command = "modifyvm \"" + vm_name + "\" "; command += "--natpf1 \"" + string(buf) + "\" "; @@ -827,7 +817,7 @@ int VBOX_VM::register_vm_firewall_rules() { fprintf( stderr, "%s VM communication is allowed on port '%d'.\n", - boinc_msg_prefix(buf, sizeof(buf)), pf_assigned_host_port + boinc_msg_prefix(buf, sizeof(buf)), pf_host_port ); @@ -845,8 +835,8 @@ int VBOX_VM::register_vm_firewall_rules() { " %d\n" " \n" "\n", - pf_assigned_host_port, - pf_desired_guest_port + pf_host_port, + pf_guest_port ); fclose(f); diff --git a/samples/vboxwrapper/vbox.h b/samples/vboxwrapper/vbox.h index 34c40b1bb0..0a27bf2a42 100644 --- a/samples/vboxwrapper/vbox.h +++ b/samples/vboxwrapper/vbox.h @@ -66,9 +66,11 @@ struct VBOX_VM { bool register_only; // whether to allow network access at all bool enable_network; - int pf_desired_host_port; - int pf_desired_guest_port; - int pf_assigned_host_port; + // the following for optional port forwarding + int pf_host_port; + // dynamically assigned + int pf_guest_port; + // specified in config file int run(); int stop(); @@ -95,6 +97,7 @@ struct VBOX_VM { int get_vm_log(std::string& log); int read_floppy(std::string& data); int write_floppy(std::string& data); + int get_port_forwarding_port(); static int initialize(); static int get_install_directory(std::string& dir); diff --git a/samples/vboxwrapper/vboxwrapper.cpp b/samples/vboxwrapper/vboxwrapper.cpp index bee49e22e8..86d58887a9 100644 --- a/samples/vboxwrapper/vboxwrapper.cpp +++ b/samples/vboxwrapper/vboxwrapper.cpp @@ -110,8 +110,7 @@ int parse_job_file(VBOX_VM& vm) { else if (xp.parse_bool("enable_network", vm.enable_network)) continue; else if (xp.parse_bool("enable_shared_directory", vm.enable_shared_directory)) continue; else if (xp.parse_bool("enable_floppyio", vm.enable_floppyio)) continue; - else if (xp.parse_int("pf_desired_host_port", vm.pf_desired_host_port)) continue; - else if (xp.parse_int("pf_desired_guest_port", vm.pf_desired_guest_port)) continue; + else if (xp.parse_int("pf_guest_port", vm.pf_guest_port)) continue; fprintf(stderr, "%s parse_job_file(): unexpected tag %s\n", boinc_msg_prefix(buf, sizeof(buf)), xp.parsed_tag );