From 9f50bbb1f5989835a589c3739c6b2313f86a614f Mon Sep 17 00:00:00 2001 From: Hyunjun Ko Date: Thu, 18 Apr 2013 11:37:13 +0900 Subject: [PATCH] Change from INET tcp to Unix domain socket --- configure.ac | 1 + lib/include/media-server-ipc.h | 8 ++++ lib/include/media-util-ipc.h | 11 +++++ lib/media-util-db.c | 14 +++++- lib/media-util-ipc.c | 95 +++++++++++++++++++++++++++++++++++++++- packaging/media-server.spec | 2 +- src/server/media-server-db.c | 4 ++ src/server/media-server-socket.c | 2 + src/server/media-server-thumb.c | 13 ++++++ 9 files changed, 146 insertions(+), 4 deletions(-) diff --git a/configure.ac b/configure.ac index e9350d5..676cd16 100755 --- a/configure.ac +++ b/configure.ac @@ -37,6 +37,7 @@ CPPFLAGS="${CPPFLAGS} -DRND_LINUX" #using UDS socket #CPPFLAGS="${CPPFLAGS} -D_USE_UDS_SOCKET_" +CPPFLAGS="${CPPFLAGS} -D_USE_UDS_SOCKET_TCP_" # FMS_DEBUG - File Manager Service debug options # To open debug options: diff --git a/lib/include/media-server-ipc.h b/lib/include/media-server-ipc.h index a1dfb44..1cfeb76 100755 --- a/lib/include/media-server-ipc.h +++ b/lib/include/media-server-ipc.h @@ -57,6 +57,14 @@ typedef enum{ #define MS_SCAN_COMM_PORT 1008 /**< Port of communication between scanner and server */ #endif +#ifdef _USE_UDS_SOCKET_TCP_ +typedef enum{ + MS_DB_BATCH_UPDATE_TCP_PORT = 0, /**< Media DB batch update */ + MS_THUMB_CREATOR_TCP_PORT, /**< Create thumbnail */ + MS_PORT_MAX, +}ms_msg_port_type_e; +#endif + #define MAX_MSG_SIZE 4096 typedef enum{ diff --git a/lib/include/media-util-ipc.h b/lib/include/media-util-ipc.h index 9cd93ad..d858ede 100755 --- a/lib/include/media-util-ipc.h +++ b/lib/include/media-util-ipc.h @@ -39,6 +39,11 @@ extern "C" { #else #include #endif + +#ifdef _USE_UDS_SOCKET_TCP_ +#include +#endif + #include #include @@ -56,6 +61,12 @@ int ms_ipc_create_client_socket(ms_protocol_e protocol, int timeout_sec, int *so #else int ms_ipc_create_client_socket(ms_protocol_e protocol, int timeout_sec, int *sock_fd); #endif + +#ifdef _USE_UDS_SOCKET_TCP_ +int ms_ipc_create_client_tcp_socket(ms_protocol_e protocol, int timeout_sec, int *sock_fd, int port); +int ms_ipc_create_server_tcp_socket(ms_protocol_e protocol, int port, int *sock_fd); +#endif + int ms_ipc_create_server_socket(ms_protocol_e protocol, int port, int *sock_fd); #ifdef _USE_UDS_SOCKET_ int ms_ipc_send_msg_to_server(int sockfd, int port, ms_comm_msg_s *send_msg, struct sockaddr_un *serv_addr); diff --git a/lib/media-util-db.c b/lib/media-util-db.c index 51e8fa4..60a1dc3 100755 --- a/lib/media-util-db.c +++ b/lib/media-util-db.c @@ -203,13 +203,18 @@ static int __media_db_get_client_tcp_sock() #ifdef _USE_UDS_SOCKET_ extern char MEDIA_IPC_PATH[][50]; +#elif defined(_USE_UDS_SOCKET_TCP_) +extern char MEDIA_IPC_PATH[][50]; #endif + static int __media_db_prepare_tcp_client_socket() { int ret = MS_MEDIA_ERR_NONE; int sockfd = -1; #ifdef _USE_UDS_SOCKET_ struct sockaddr_un serv_addr; +#elif defined(_USE_UDS_SOCKET_TCP_) + struct sockaddr_un serv_addr; #else struct sockaddr_in serv_addr; #endif @@ -218,6 +223,8 @@ static int __media_db_prepare_tcp_client_socket() /*Create TCP Socket*/ #ifdef _USE_UDS_SOCKET_ ret = ms_ipc_create_client_socket(MS_PROTOCOL_TCP, MS_TIMEOUT_SEC_10, &sockfd, 0); +#elif defined(_USE_UDS_SOCKET_TCP_) + ret = ms_ipc_create_client_tcp_socket(MS_PROTOCOL_TCP, MS_TIMEOUT_SEC_10, &sockfd, MS_DB_BATCH_UPDATE_TCP_PORT); #else ret = ms_ipc_create_client_socket(MS_PROTOCOL_TCP, MS_TIMEOUT_SEC_10, &sockfd); #endif @@ -229,9 +236,14 @@ static int __media_db_prepare_tcp_client_socket() serv_addr.sun_family = AF_UNIX; MSAPI_DBG("%s", MEDIA_IPC_PATH[port]); strcpy(serv_addr.sun_path, MEDIA_IPC_PATH[port]); +#elif defined(_USE_UDS_SOCKET_TCP_) + serv_addr.sun_family = AF_UNIX; + MSAPI_DBG("%s", MEDIA_IPC_PATH[MS_DB_BATCH_UPDATE_TCP_PORT]); + strcpy(serv_addr.sun_path, MEDIA_IPC_PATH[MS_DB_BATCH_UPDATE_TCP_PORT]); #else serv_addr.sin_family = AF_INET; - serv_addr.sin_addr.s_addr = inet_addr(SERVER_IP); + serv_addr.sin_addr.s_addr = htonl(INADDR_ANY); + //serv_addr.sin_addr.s_addr = inet_addr(SERVER_IP); serv_addr.sin_port = htons(port); #endif diff --git a/lib/media-util-ipc.c b/lib/media-util-ipc.c index 7c0af35..eb49c12 100755 --- a/lib/media-util-ipc.c +++ b/lib/media-util-ipc.c @@ -31,6 +31,8 @@ #include #include #include +#include +#include #include "media-util-dbg.h" #include "media-util.h" @@ -57,6 +59,11 @@ char MEDIA_IPC_PATH_CLIENT[][50] ={ {"/tmp/media_ipc_thumbcomm_client.dat"}, {"/tmp/media_ipc_thumbdaemon_client.dat"}, }; +#elif defined(_USE_UDS_SOCKET_TCP_) +char MEDIA_IPC_PATH[][50] ={ + {"/tmp/media_ipc_dbbatchupdate.dat"}, + {"/tmp/media_ipc_thumbcreator.dat"}, +}; #endif #ifdef _USE_UDS_SOCKET_ @@ -126,6 +133,90 @@ int ms_ipc_create_client_socket(ms_protocol_e protocol, int timeout_sec, int *so return MS_MEDIA_ERR_NONE; } +#ifdef _USE_UDS_SOCKET_TCP_ +int ms_ipc_create_client_tcp_socket(ms_protocol_e protocol, int timeout_sec, int *sock_fd, int port) +{ + int sock = -1; + + struct timeval tv_timeout = { timeout_sec, 0 }; + + /*Create TCP Socket*/ + if ((sock = socket(PF_FILE, SOCK_STREAM, 0)) < 0) { + MSAPI_DBG_ERR("socket failed: %s", strerror(errno)); + return MS_MEDIA_ERR_SOCKET_CONN; + } + + if (timeout_sec > 0) { + if (setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, &tv_timeout, sizeof(tv_timeout)) == -1) { + MSAPI_DBG_ERR("setsockopt failed: %s", strerror(errno)); + close(sock); + return MS_MEDIA_ERR_SOCKET_CONN; + } + } + + *sock_fd = sock; + + return MS_MEDIA_ERR_NONE; +} + +int ms_ipc_create_server_tcp_socket(ms_protocol_e protocol, int port, int *sock_fd) +{ + int i; + bool bind_success = false; + int sock = -1; + + struct sockaddr_un serv_addr; + mode_t orig_mode; + orig_mode = umask(0); + + /* Create a TCP socket */ + if ((sock = socket(PF_FILE, SOCK_STREAM, 0)) < 0) { + MSAPI_DBG_ERR("socket failed: %s", strerror(errno)); + return MS_MEDIA_ERR_SOCKET_CONN; + } + + memset(&serv_addr, 0, sizeof(serv_addr)); + + serv_addr.sun_family = AF_UNIX; + MSAPI_DBG("%s", MEDIA_IPC_PATH[port]); + unlink(MEDIA_IPC_PATH[port]); + strcpy(serv_addr.sun_path, MEDIA_IPC_PATH[port]); + + /* Bind to the local address */ + for (i = 0; i < 20; i ++) { + if (bind(sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) == 0) { + bind_success = true; + break; + } + MSAPI_DBG("%d",i); + usleep(250000); + } + + if (bind_success == false) { + MSAPI_DBG_ERR("bind failed : %s %d_", strerror(errno), errno); + close(sock); + return MS_MEDIA_ERR_SOCKET_CONN; + } + + MSAPI_DBG("bind success"); + + /* Listening */ + if (listen(sock, SOMAXCONN) < 0) { + MSAPI_DBG_ERR("listen failed : %s", strerror(errno)); + close(sock); + return MS_MEDIA_ERR_SOCKET_CONN; + } + + MSAPI_DBG("Listening..."); + + *sock_fd = sock; + + umask(orig_mode); + return MS_MEDIA_ERR_NONE; +} + +#endif + int ms_ipc_create_server_socket(ms_protocol_e protocol, int port, int *sock_fd) { int i; @@ -181,8 +272,8 @@ int ms_ipc_create_server_socket(ms_protocol_e protocol, int port, int *sock_fd) strcpy(serv_addr.sun_path, MEDIA_IPC_PATH[serv_port]); #else serv_addr.sin_family = AF_INET; -// serv_addr.sin_addr.s_addr = htonl(INADDR_ANY); - serv_addr.sin_addr.s_addr = inet_addr(SERVER_IP); + serv_addr.sin_addr.s_addr = htonl(INADDR_ANY); +// serv_addr.sin_addr.s_addr = inet_addr(SERVER_IP); serv_addr.sin_port = htons(serv_port); #endif /* Bind to the local address */ diff --git a/packaging/media-server.spec b/packaging/media-server.spec index 1696897..4a88fd3 100755 --- a/packaging/media-server.spec +++ b/packaging/media-server.spec @@ -1,6 +1,6 @@ Name: media-server Summary: File manager service server. -Version: 0.2.44 +Version: 0.2.45 Release: 1 Group: utils License: Apache License, Version 2.0 diff --git a/src/server/media-server-db.c b/src/server/media-server-db.c index 49141b7..23b0bd1 100755 --- a/src/server/media-server-db.c +++ b/src/server/media-server-db.c @@ -79,7 +79,11 @@ gboolean ms_db_thread(void *data) } /* Create TCP Socket for batch query*/ +#ifdef _USE_UDS_SOCKET_TCP_ + ret = ms_ipc_create_server_tcp_socket(MS_PROTOCOL_TCP, MS_DB_BATCH_UPDATE_TCP_PORT, &tcp_sockfd); +#else ret = ms_ipc_create_server_socket(MS_PROTOCOL_TCP, MS_DB_BATCH_UPDATE_PORT, &tcp_sockfd); +#endif if(ret != MS_MEDIA_ERR_NONE) { /* Disconnect DB*/ media_db_disconnect(db_handle); diff --git a/src/server/media-server-socket.c b/src/server/media-server-socket.c index c889d9e..7fb8e11 100755 --- a/src/server/media-server-socket.c +++ b/src/server/media-server-socket.c @@ -452,6 +452,8 @@ gboolean ms_read_db_tcp_socket(GIOChannel *src, GIOCondition condition, gpointer { #ifdef _USE_UDS_SOCKET_ struct sockaddr_un client_addr; +#elif defined(_USE_UDS_SOCKET_TCP_) + struct sockaddr_un client_addr; #else struct sockaddr_in client_addr; #endif diff --git a/src/server/media-server-thumb.c b/src/server/media-server-thumb.c index 3b4c12a..adaacf2 100755 --- a/src/server/media-server-thumb.c +++ b/src/server/media-server-thumb.c @@ -195,6 +195,8 @@ _ms_thumb_create_socket(int sock_type, int *sock) #ifdef _USE_UDS_SOCKET_ if ((sock_fd = socket(AF_UNIX, SOCK_STREAM, 0)) < 0) { +#elif defined(_USE_UDS_SOCKET_TCP_) + if ((sock_fd = socket(AF_UNIX, SOCK_STREAM, 0)) < 0) { #else if ((sock_fd = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) { #endif @@ -943,6 +945,8 @@ gboolean _ms_thumb_agent_read_socket(GIOChannel *src, { #ifdef _USE_UDS_SOCKET_ struct sockaddr_un client_addr; +#elif defined(_USE_UDS_SOCKET_TCP_) + struct sockaddr_un client_addr; #else struct sockaddr_in client_addr; #endif @@ -1059,7 +1063,11 @@ gboolean _ms_thumb_agent_prepare_tcp_socket(int *sock_fd) int sock; unsigned short serv_port; +#ifdef _USE_UDS_SOCKET_TCP_ + serv_port = MS_THUMB_CREATOR_TCP_PORT; +#else serv_port = MS_THUMB_CREATOR_PORT; +#endif #if 0 #ifdef _USE_UDS_SOCKET_ @@ -1100,7 +1108,12 @@ gboolean _ms_thumb_agent_prepare_tcp_socket(int *sock_fd) MS_DBG("Listening..."); #endif + +#ifdef _USE_UDS_SOCKET_TCP_ + if (ms_ipc_create_server_tcp_socket(MS_PROTOCOL_TCP, serv_port, &sock) < 0) { +#else if (ms_ipc_create_server_socket(MS_PROTOCOL_TCP, serv_port, &sock) < 0) { +#endif MS_DBG_ERR("_ms_thumb_create_socket failed"); return FALSE; } -- 2.7.4