summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJohann Latocha2012-07-25 18:49:27 +0200
committerJohann Latocha2012-07-25 18:49:27 +0200
commit8e1bc3f679afbec5bc46a8990eddb3455d660a42 (patch)
tree9ecf766f124f84dea93ca478e5b99fe9f99f38a2
parentMissing semicolon... (diff)
downloaddnbd3-8e1bc3f679afbec5bc46a8990eddb3455d660a42.tar.gz
dnbd3-8e1bc3f679afbec5bc46a8990eddb3455d660a42.tar.xz
dnbd3-8e1bc3f679afbec5bc46a8990eddb3455d660a42.zip
[SERVER] IPC over TCP
-rw-r--r--CMakeLists.txt2
-rw-r--r--src/config.h1
-rw-r--r--src/server/ipc.c103
-rw-r--r--src/server/server.c2
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 <unistd.h>
#include <pthread.h>
#include <netinet/in.h>
+#include <arpa/inet.h>
#include <libxml/parser.h>
#include <libxml/xpath.h>
@@ -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);
}