summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlon Levy <alevy@redhat.com>2010-10-12 14:49:01 +0200
committerAlon Levy <alevy@redhat.com>2010-10-12 14:49:01 +0200
commitd7d4b4af7787f4166f747bbd0be37f668eb61d2e (patch)
tree13150d428a737fc45bb789ed9e637a47471d5485
parent581b3841eb940c2fb431557dc2e0df911cca88c4 (diff)
vscclient: handle Reconnect message, some cleanup
-rw-r--r--vscclient.c134
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;