Split out the communication with listener from the setup_network() for avoiding duplicate codes between listen mode and virt-server mode.
Signed-off-by: Yoshihiro YUNOMAE <yoshihiro.yunomae...@hitachi.com> --- trace-record.c | 119 +++++++++++++++++++++++++++++--------------------------- 1 file changed, 62 insertions(+), 57 deletions(-) diff --git a/trace-record.c b/trace-record.c index ac9f70a..6a096bd 100644 --- a/trace-record.c +++ b/trace-record.c @@ -1607,59 +1607,13 @@ static int create_recorder(struct buffer_instance *instance, int cpu, int extrac exit(0); } -static void setup_network(void) +static void communicate_with_listener(int fd) { - struct tracecmd_output *handle; - struct addrinfo hints; - struct addrinfo *result, *rp; - int sfd, s; - ssize_t n; char buf[BUFSIZ]; - char *server; - char *port; - char *p; - int cpu; - int i; - - if (!strchr(host, ':')) { - server = strdup("localhost"); - if (!server) - die("alloctating server"); - port = host; - host = server; - } else { - host = strdup(host); - if (!host) - die("alloctating server"); - server = strtok_r(host, ":", &p); - port = strtok_r(NULL, ":", &p); - } - - memset(&hints, 0, sizeof(hints)); - hints.ai_family = AF_UNSPEC; - hints.ai_socktype = SOCK_STREAM; - - s = getaddrinfo(server, port, &hints, &result); - if (s != 0) - die("getaddrinfo: %s", gai_strerror(s)); - - for (rp = result; rp != NULL; rp = rp->ai_next) { - sfd = socket(rp->ai_family, rp->ai_socktype, - rp->ai_protocol); - if (sfd == -1) - continue; - - if (connect(sfd, rp->ai_addr, rp->ai_addrlen) != -1) - break; - close(sfd); - } - - if (!rp) - die("Can not connect to %s:%s", server, port); - - freeaddrinfo(result); + ssize_t n; + int cpu, i; - n = read(sfd, buf, 8); + n = read(fd, buf, 8); /* Make sure the server is the tracecmd server */ if (memcmp(buf, "tracecmd", 8) != 0) @@ -1670,13 +1624,13 @@ static void setup_network(void) sprintf(buf, "%d", cpu_count); /* include \0 */ - write(sfd, buf, strlen(buf)+1); + write(fd, buf, strlen(buf)+1); /* write the pagesize (in ASCII) */ sprintf(buf, "%d", page_size); /* include \0 */ - write(sfd, buf, strlen(buf)+1); + write(fd, buf, strlen(buf)+1); /* * If we are using IPV4 and our page size is greater than @@ -1691,14 +1645,14 @@ static void setup_network(void) if (use_tcp) { /* Send one option */ - write(sfd, "1", 2); + write(fd, "1", 2); /* Size 4 */ - write(sfd, "4", 2); + write(fd, "4", 2); /* use TCP */ - write(sfd, "TCP", 4); + write(fd, "TCP", 4); } else /* No options */ - write(sfd, "0", 2); + write(fd, "0", 2); client_ports = malloc_or_die(sizeof(int) * cpu_count); @@ -1708,7 +1662,7 @@ static void setup_network(void) */ for (cpu = 0; cpu < cpu_count; cpu++) { for (i = 0; i < BUFSIZ; i++) { - n = read(sfd, buf+i, 1); + n = read(fd, buf+i, 1); if (n != 1) die("Error, reading server ports"); if (!buf[i] || buf[i] == ',') @@ -1719,6 +1673,57 @@ static void setup_network(void) buf[i] = 0; client_ports[cpu] = atoi(buf); } +} + +static void setup_network(void) +{ + struct tracecmd_output *handle; + struct addrinfo hints; + struct addrinfo *result, *rp; + int sfd, s; + char *server; + char *port; + char *p; + + if (!strchr(host, ':')) { + server = strdup("localhost"); + if (!server) + die("alloctating server"); + port = host; + host = server; + } else { + host = strdup(host); + if (!host) + die("alloctating server"); + server = strtok_r(host, ":", &p); + port = strtok_r(NULL, ":", &p); + } + + memset(&hints, 0, sizeof(hints)); + hints.ai_family = AF_UNSPEC; + hints.ai_socktype = SOCK_STREAM; + + s = getaddrinfo(server, port, &hints, &result); + if (s != 0) + die("getaddrinfo: %s", gai_strerror(s)); + + for (rp = result; rp != NULL; rp = rp->ai_next) { + sfd = socket(rp->ai_family, rp->ai_socktype, + rp->ai_protocol); + if (sfd == -1) + continue; + + if (connect(sfd, rp->ai_addr, rp->ai_addrlen) != -1) + break; + close(sfd); + } + + if (!rp) + die("Can not connect to %s:%s", server, port); + + freeaddrinfo(result); + + communicate_with_listener(sfd); /* Now create the handle through this socket */ handle = tracecmd_create_init_fd_glob(sfd, listed_events); -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/