From 8e1bc3f679afbec5bc46a8990eddb3455d660a42 Mon Sep 17 00:00:00 2001 From: Johann Latocha Date: Wed, 25 Jul 2012 18:49:27 +0200 Subject: [SERVER] IPC over TCP --- CMakeLists.txt | 2 + src/config.h | 1 + src/server/ipc.c | 103 ++++++++++++++++++++++++++++++++++++++++------------ src/server/server.c | 2 + 4 files changed, 85 insertions(+), 23 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 4d0f950..fa2fd4b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -11,6 +11,8 @@ SET(CMAKE_C_FLAGS_RELEASE "-O2 -Wno-unused-result -D_GNU_SOURCE -D_FILE_OFFSET_B SET(CMAKE_CXX_FLAGS_DEBUG "-O0 -g -Wall -Wno-unused-result -D_GNU_SOURCE -D_FILE_OFFSET_BITS=64") SET(CMAKE_CXX_FLAGS_RELEASE "-O2 -Wno-unused-result -D_GNU_SOURCE -D_FILE_OFFSET_BITS=64" ) +ADD_DEFINITIONS(-DIPC_TCP) + FIND_PACKAGE(Threads REQUIRED) FIND_PACKAGE(PkgConfig REQUIRED) FIND_PACKAGE(LibXml2 REQUIRED) diff --git a/src/config.h b/src/config.h index bf5e668..be3df5c 100644 --- a/src/config.h +++ b/src/config.h @@ -44,5 +44,6 @@ #define DEFAULT_CLIENT_CONFIG_FILE "/etc/dnbd3/client.conf" #define UNIX_SOCKET "/run/dnbd3-server.sock" #define UNIX_SOCKET_GROUP "dnbd" +#define IPC_PORT 5004 #endif /* CONFIG_H_ */ diff --git a/src/server/ipc.c b/src/server/ipc.c index 4220aa6..1f462ab 100644 --- a/src/server/ipc.c +++ b/src/server/ipc.c @@ -28,6 +28,7 @@ #include #include #include +#include #include #include @@ -39,28 +40,31 @@ void* dnbd3_ipc_receive() { - int server_sock, client_sock; - struct sockaddr_un server, client; - unsigned int len = sizeof(client); - GSList *iterator = NULL; struct tm * timeinfo; char time_buff[64]; + int server_sock, client_sock; + +#ifdef IPC_TCP + struct sockaddr_in server, client; + unsigned int len = sizeof(client); + // Create socket - if ((server_sock = socket(AF_UNIX, SOCK_STREAM, 0)) < 0) + if ((server_sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) { perror("ERROR: IPC socket"); exit(EXIT_FAILURE); } - server.sun_family = AF_UNIX; - strcpy(server.sun_path, UNIX_SOCKET); - unlink(UNIX_SOCKET); + memset(&server, 0, sizeof(server)); + server.sin_family = AF_INET; // IPv4 + server.sin_addr.s_addr = inet_addr("127.0.0.1"); + server.sin_port = htons(IPC_PORT); // set port number // Bind to socket - if (bind(server_sock, &server, sizeof(server.sun_family) + strlen(server.sun_path)) < 0) + if (bind(server_sock, (struct sockaddr*) &server, sizeof(server)) < 0) { perror("ERROR: IPC bind"); exit(EXIT_FAILURE); @@ -72,19 +76,48 @@ void* dnbd3_ipc_receive() perror("ERROR: IPC listen"); exit(EXIT_FAILURE); } +#else + struct sockaddr_un server, client; + unsigned int len = sizeof(client); - // Set groupID and permissions on ipc socket - struct group *grp; - grp = getgrnam(UNIX_SOCKET_GROUP); - if (grp == NULL) - { - printf("WARN: Group '%s' not found.\n", UNIX_SOCKET_GROUP); - } - else - { - chmod(UNIX_SOCKET, 0775); - chown(UNIX_SOCKET, -1, grp->gr_gid); - } + // Create socket + if ((server_sock = socket(AF_UNIX, SOCK_STREAM, 0)) < 0) + { + perror("ERROR: IPC socket"); + exit(EXIT_FAILURE); + } + + server.sun_family = AF_UNIX; + strcpy(server.sun_path, UNIX_SOCKET); + unlink(UNIX_SOCKET); + + // Bind to socket + if (bind(server_sock, &server, sizeof(server.sun_family) + strlen(server.sun_path)) < 0) + { + perror("ERROR: IPC bind"); + exit(EXIT_FAILURE); + } + + // Listen on socket + if (listen(server_sock, 5) < 0) + { + perror("ERROR: IPC listen"); + exit(EXIT_FAILURE); + } + + // Set groupID and permissions on ipc socket + struct group *grp; + grp = getgrnam(UNIX_SOCKET_GROUP); + if (grp == NULL) + { + printf("WARN: Group '%s' not found.\n", UNIX_SOCKET_GROUP); + } + else + { + chmod(UNIX_SOCKET, 0775); + chown(UNIX_SOCKET, -1, grp->gr_gid); + } +#endif while (1) { @@ -183,14 +216,37 @@ void* dnbd3_ipc_receive() void dnbd3_ipc_send(int cmd) { + uint32_t cmd_net = htonl(cmd); int client_sock, size; - struct sockaddr_un server; - uint32_t cmd_net = htonl(cmd); char buf[64]; xmlParserCtxtPtr ctxt; xmlDocPtr doc; +#ifdef IPC_TCP + struct sockaddr_in server; + + // Create socket + if ((client_sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) + { + perror("ERROR: IPC socket"); + exit(EXIT_FAILURE); + } + + memset(&server, 0, sizeof(server)); + server.sin_family = AF_INET; // IPv4 + server.sin_addr.s_addr = inet_addr("127.0.0.1"); + server.sin_port = htons(IPC_PORT); // set port number + + // Connect to server + if (connect(client_sock, (struct sockaddr *) &server, sizeof(server)) < 0) + { + perror("ERROR: IPC connect"); + exit(EXIT_FAILURE); + } +#else + struct sockaddr_un server; + // Create socket if ((client_sock = socket(AF_UNIX, SOCK_STREAM, 0)) < 0) { @@ -206,6 +262,7 @@ void dnbd3_ipc_send(int cmd) perror("ERROR: IPC connect"); exit(EXIT_FAILURE); } +#endif // Send message send(client_sock, &cmd_net, sizeof(cmd_net), MSG_WAITALL); diff --git a/src/server/server.c b/src/server/server.c index c77fc7e..2171773 100644 --- a/src/server/server.c +++ b/src/server/server.c @@ -99,7 +99,9 @@ void dnbd3_cleanup() close(_sock); free(_images); +#ifndef IPC_TCP unlink(UNIX_SOCKET); +#endif exit(EXIT_SUCCESS); } -- cgit v1.2.3-55-g7522