From aef1dd1ba54904e4439c96021236b5e65429e2e2 Mon Sep 17 00:00:00 2001 From: Marcel Holtmann Date: Mon, 29 Oct 2012 14:42:03 -0700 Subject: [PATCH] emulator: Add support for TCP server connections --- emulator/server.c | 67 +++++++++++++++++++++++++++++++++++++++++++++-- emulator/server.h | 1 + 2 files changed, 66 insertions(+), 2 deletions(-) diff --git a/emulator/server.c b/emulator/server.c index 1ff9904ee..fa8f9c3bd 100644 --- a/emulator/server.c +++ b/emulator/server.c @@ -36,6 +36,8 @@ #include #include #include +#include +#include #include #include @@ -220,7 +222,7 @@ static void server_accept_callback(int fd, uint32_t events, void *user_data) } } -static int open_server(const char *path) +static int open_unix(const char *path) { struct sockaddr_un addr; int fd; @@ -263,7 +265,68 @@ struct server *server_open_unix(const char *path, uint16_t id) memset(server, 0, sizeof(*server)); server->id = id; - server->fd = open_server(path); + server->fd = open_unix(path); + if (server->fd < 0) { + free(server); + return NULL; + } + + if (mainloop_add_fd(server->fd, EPOLLIN, server_accept_callback, + server, server_destroy) < 0) { + close(server->fd); + free(server); + return NULL; + } + + return server; +} + +static int open_tcp(void) +{ + struct sockaddr_in addr; + int fd, opt = 1; + + fd = socket(PF_INET, SOCK_STREAM, 0); + if (fd < 0) { + perror("Failed to open server socket"); + return -1; + } + + setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)); + + memset(&addr, 0, sizeof(addr)); + addr.sin_family = AF_INET; + addr.sin_addr.s_addr = INADDR_ANY; + addr.sin_addr.s_addr = inet_addr("127.0.0.1"); + addr.sin_port = htons(45550); + + if (bind(fd, (struct sockaddr *) &addr, sizeof(addr)) < 0) { + perror("Failed to bind server socket"); + close(fd); + return -1; + } + + if (listen(fd, 5) < 0) { + perror("Failed to listen server socket"); + close(fd); + return -1; + } + + return fd; +} + +struct server *server_open_tcp(uint16_t id) +{ + struct server *server; + + server = malloc(sizeof(*server)); + if (!server) + return server; + + memset(server, 0, sizeof(*server)); + server->id = id; + + server->fd = open_tcp(); if (server->fd < 0) { free(server); return NULL; diff --git a/emulator/server.h b/emulator/server.h index 836db5f9e..f2b95a20f 100644 --- a/emulator/server.h +++ b/emulator/server.h @@ -27,4 +27,5 @@ struct server; struct server *server_open_unix(const char *path, uint16_t id); +struct server *server_open_tcp(uint16_t id); void server_close(struct server *server); -- 2.47.3