diff options
author | Alon Levy <alevy@redhat.com> | 2010-10-12 14:49:01 +0200 |
---|---|---|
committer | Alon Levy <alevy@redhat.com> | 2010-10-12 14:49:01 +0200 |
commit | d7d4b4af7787f4166f747bbd0be37f668eb61d2e (patch) | |
tree | 13150d428a737fc45bb789ed9e637a47471d5485 | |
parent | 581b3841eb940c2fb431557dc2e0df911cca88c4 (diff) |
vscclient: handle Reconnect message, some cleanup
-rw-r--r-- | vscclient.c | 134 |
1 files changed, 93 insertions, 41 deletions
diff --git a/vscclient.c b/vscclient.c index 0f510b4..4859f26 100644 --- a/vscclient.c +++ b/vscclient.c @@ -50,6 +50,17 @@ PrintUsage () { vcard_emul_usage(); } +char* +ip_numeric_to_char( + uint32_t ip +) { + char buf[4*4]; + + sprintf(buf, "%d.%d.%d.%d", (ip & 0xff000000) >> 24, (ip & 0xff0000) >> 16, + (ip & 0xff00) >> 8, ip & 0xff); + return strdup(buf); +} + static mutex_t write_lock; int @@ -359,13 +370,61 @@ do_command(void) #define MAX_CERTS 100 int -main ( - int argc, - char *argv[] +connect_to_qemu ( + const char *ip, + uint32_t port ) { struct addrinfo hints; struct addrinfo* server; + int ret; + char port_str[10]; + sock = socket ( + AF_INET, + SOCK_STREAM, + 0 + ); + if (sock < 0) { + // Error + printf ("Error opening socket!\n"); + } + + memset(&hints, 0, sizeof(struct addrinfo)); + hints.ai_family = AF_INET; + hints.ai_socktype = SOCK_STREAM; + hints.ai_flags = 0; + hints.ai_protocol = 0; /* Any protocol */ + snprintf(port_str, sizeof(port_str) - 1, "%d", port); + + ret = getaddrinfo(ip, port_str, &hints, &server); + + if (ret != 0) { + printf ("getaddrinfo failed\n"); + return (5); + } + + if (connect ( + sock, + server->ai_addr, + server->ai_addrlen + ) < 0 + ) { + // Error + printf ("Could not connect\n"); + return (5); + } +if (verbose) + printf ("Connected (sizeof Header=%zd)!\n", sizeof (VSCMsgHeader)); + return sock; +} + +int +main ( + int argc, + char *argv[] +) { + char* qemu_ip; + uint16_t qemu_port; VSCMsgHeader mhHeader; VSCMsgError *error_msg; @@ -384,8 +443,6 @@ main ( char* emul_args = NULL; int cert_count = 0; int c; - int ret; - while ((c = getopt(argc, argv, "c:e:pd:")) != -1) { switch (c) { @@ -450,41 +507,9 @@ main ( vcard_emul_options(emul_args); } - sock = socket ( - AF_INET, - SOCK_STREAM, - 0 - ); - if (sock < 0) { - // Error - printf ("Error opening socket!\n"); - } - - memset(&hints, 0, sizeof(struct addrinfo)); - hints.ai_family = AF_INET; - hints.ai_socktype = SOCK_STREAM; - hints.ai_flags = 0; - hints.ai_protocol = 0; /* Any protocol */ - - ret = getaddrinfo(argv[argc - 2], argv[argc - 1], &hints, &server); - - if (ret != 0) { - printf ("getaddrinfo failed\n"); - return (5); - } - - if (connect ( - sock, - server->ai_addr, - server->ai_addrlen - ) < 0 - ) { - // Error - printf ("Could not connect\n"); - return (5); - } -if (verbose) - printf ("Connected (sizeof Header=%zd)!\n", sizeof (mhHeader)); + qemu_ip = strdup(argv[argc - 2]); + qemu_port = (uint16_t)atoi(argv[argc -1]); + sock = connect_to_qemu(qemu_ip, qemu_port); MUTEX_INIT(write_lock); MUTEX_INIT(pending_reader_lock); @@ -593,7 +618,32 @@ if (verbose) { } vreader_free(reader); reader = NULL; /* we've freed it, don't use it by accident again */ - break; + break; + case VSC_Reconnect: + { + VSCMsgReconnect reconnect; + + if (read(sock, (char*)&reconnect, mhHeader.length) < 0) { + printf ("read error\n"); + close (sock); + return (8); + } + if (reconnect.ip != 0) { + reconnect.ip = ntohl(reconnect.ip); + free(qemu_ip); + qemu_ip = ip_numeric_to_char(reconnect.ip); + qemu_port = reconnect.port; + } else { + printf("info: reconnect with no target ip:port: bumping port by one and reconnecting\n"); + qemu_port = qemu_port + 1; + } + /* sent when qemu is migrating, we need to close the socket + * and reconnect. */ + close(sock); + printf("reconnecting to %s:%d\n", qemu_ip, qemu_port); + sock = connect_to_qemu(qemu_ip, qemu_port); + } + break; case VSC_ReaderAddResponse: MUTEX_LOCK(pending_reader_lock); if (pending_reader) { @@ -611,6 +661,7 @@ if (verbose) { mhHeader.length ); error_msg = (VSCMsgError *) pbSendBuffer; + printf("error: qemu refused to add reader\n"); if (error_msg->code == VSC_CANNOT_ADD_MORE_READERS) { /* clear pending reader, qemu can't handle any more */ MUTEX_LOCK(pending_reader_lock); @@ -621,6 +672,7 @@ if (verbose) { } MUTEX_UNLOCK(pending_reader_lock); } + break; default: printf ("Default\n"); return 0; |