diff --git a/sysemu.h b/sysemu.h index b12fae0a9e..931ac3a91b 100644 --- a/sysemu.h +++ b/sysemu.h @@ -8,6 +8,8 @@ extern const char *bios_dir; extern int vm_running; extern const char *qemu_name; +extern uint8_t qemu_uuid[]; +#define UUID_FMT "%02hhx%02hhx%02hhx%02hhx-%02hhx%02hhx-%02hhx%02hhx-%02hhx%02hhx-%02hhx%02hhx%02hhx%02hhx%02hhx%02hhx" typedef struct vm_change_state_entry VMChangeStateEntry; typedef void VMChangeStateHandler(void *opaque, int running); diff --git a/vl.c b/vl.c index 0d964010ff..bf97b90b52 100644 --- a/vl.c +++ b/vl.c @@ -254,6 +254,8 @@ static int64_t qemu_icount_bias; QEMUTimer *icount_rt_timer; QEMUTimer *icount_vm_timer; +uint8_t qemu_uuid[16]; + #define TFR(expr) do { if ((expr) != -1) break; } while (errno == EINTR) /***********************************************************/ @@ -7700,6 +7702,7 @@ static void help(int exitcode) "-g WxH[xDEPTH] Set the initial graphical resolution and depth\n" #endif "-name string set the name of the guest\n" + "-uuid %%08x-%%04x-%%04x-%%04x-%%012x specify machine UUID\n" "\n" "Network options:\n" "-net nic[,vlan=n][,macaddr=addr][,model=type]\n" @@ -7894,6 +7897,7 @@ enum { QEMU_OPTION_startdate, QEMU_OPTION_tb_size, QEMU_OPTION_icount, + QEMU_OPTION_uuid, }; typedef struct QEMUOption { @@ -7982,6 +7986,7 @@ const QEMUOption qemu_options[] = { #ifdef CONFIG_CURSES { "curses", 0, QEMU_OPTION_curses }, #endif + { "uuid", HAS_ARG, QEMU_OPTION_uuid }, /* temporary options */ { "usb", 0, QEMU_OPTION_usb }, @@ -8192,6 +8197,23 @@ static BOOL WINAPI qemu_ctrl_handler(DWORD type) } #endif +static int qemu_uuid_parse(const char *str, uint8_t *uuid) +{ + int ret; + + if(strlen(str) != 36) + return -1; + + ret = sscanf(str, UUID_FMT, &uuid[0], &uuid[1], &uuid[2], &uuid[3], + &uuid[4], &uuid[5], &uuid[6], &uuid[7], &uuid[8], &uuid[9], + &uuid[10], &uuid[11], &uuid[12], &uuid[13], &uuid[14], &uuid[15]); + + if(ret != 16) + return -1; + + return 0; +} + #define MAX_NET_CLIENTS 32 #ifndef _WIN32 @@ -8770,6 +8792,13 @@ int main(int argc, char **argv) case QEMU_OPTION_show_cursor: cursor_hide = 0; break; + case QEMU_OPTION_uuid: + if(qemu_uuid_parse(optarg, qemu_uuid) < 0) { + fprintf(stderr, "Fail to parse UUID string." + " Wrong format.\n"); + exit(1); + } + break; case QEMU_OPTION_daemonize: daemonize = 1; break;