# HG changeset patch # User atton # Date 1452842803 -32400 # Node ID 6b1dddd65d7c76330aa6c3c9cb1b66839afc82d6 # Parent 7f6c5d7355bcabb2ba7e84dc8900843a96a9e8f4 Generate kernel debug port randomly between 10000 to 30000 diff -r 7f6c5d7355bc -r 6b1dddd65d7c ie-virsh.c --- a/ie-virsh.c Fri Jan 15 15:22:10 2016 +0900 +++ b/ie-virsh.c Fri Jan 15 16:26:43 2016 +0900 @@ -10,6 +10,10 @@ #include #include #include +#include +#include +#include +#include /* Creative Commons Attribution-Noncommercial-Share Alike 3.0 United States License */ @@ -231,6 +235,31 @@ strncat(vm_name, vm_num, VM_NAME_LENGTH); } +int +get_kernel_debug_port(void){ + struct sockaddr_in addr; + memset(&addr, 0, sizeof(addr)); + addr.sin_family = AF_INET; + addr.sin_addr.s_addr = htonl(INADDR_ANY); + int socket_fd = socket(AF_INET, SOCK_STREAM, 0); + + int i; + srand(time(NULL)); + for (i = 0; i < 10; i++) { + addr.sin_port = htons((rand() % 20000) + 10000); + + if ((bind(socket_fd, (struct sockaddr *)&addr, sizeof(struct sockaddr) ) == 0) && (listen(socket_fd, 1) == 0)) { + printf("Port %d was allocated for your kernel debug.\n", ntohs(addr.sin_port)); + close(socket_fd); + return ntohs(addr.sin_port); + } else { + printf("Port %d was used. Trying another port...\n", ntohs(addr.sin_port)); + } + } + printf("Cannot allocate debug port.\n"); + exit(EXIT_FAILURE); +} + void create_new_vm(const char const *name, const char const *vm_name, char* xml_name, bool debug_kernel){ if (check_name(name)) { @@ -242,7 +271,7 @@ change_delimiter_to_slash(vm_path); char exec[1024]; if (debug_kernel) { - snprintf(exec, 1024, "%s %s -d true", newvm_command, vm_path); + snprintf(exec, 1024, "%s %s -d %d", newvm_command, vm_path, get_kernel_debug_port()); } else { snprintf(exec, 1024, "%s %s", newvm_command, vm_path); } diff -r 7f6c5d7355bc -r 6b1dddd65d7c newvm.py --- a/newvm.py Fri Jan 15 15:22:10 2016 +0900 +++ b/newvm.py Fri Jan 15 16:26:43 2016 +0900 @@ -76,9 +76,6 @@ random.randint(0x00, 0xff) ] return ':'.join(map(lambda x: "%02x" % x, mac)) -def gen_debug_port(): - return 10000 - parser = OptionParser(); parser.add_option("-n", "--name", dest="name", help="VM name"); @@ -86,7 +83,7 @@ help="Template VM XML config file"); parser.add_option("-i", "--iso", dest="iso", help="When boot VM from ISO"); -parser.add_option("-d", "--debug", dest="debug", +parser.add_option("-d", "--debug", dest="debug", type="int", help="Kernel debug mode"); (options, args) = parser.parse_args(); @@ -124,7 +121,7 @@ domain.attrib['xmlns:qemu'] = "http://libvirt.org/schemas/domain/qemu/1.0" qemu_elem = ET.Element('qemu:commandline') ET.SubElement(qemu_elem, 'qemu:arg', {'value' : '-S'}) - ET.SubElement(qemu_elem, 'qemu:arg', {'value' : ('-s %d' % gen_debug_port())}) + ET.SubElement(qemu_elem, 'qemu:arg', {'value' : ('-s %d' % options.debug)}) domain.append(qemu_elem) if os.path.exists(vm_name + '.xml'):