Change from INET tcp to Unix domain socket
authorHyunjun Ko <zzoon.ko@samsung.com>
Thu, 18 Apr 2013 02:37:13 +0000 (11:37 +0900)
committerHyunjun Ko <zzoon.ko@samsung.com>
Thu, 18 Apr 2013 02:37:13 +0000 (11:37 +0900)
configure.ac
lib/include/media-server-ipc.h
lib/include/media-util-ipc.h
lib/media-util-db.c
lib/media-util-ipc.c
packaging/media-server.spec
src/server/media-server-db.c
src/server/media-server-socket.c
src/server/media-server-thumb.c

index e9350d5..676cd16 100755 (executable)
@@ -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:
index a1dfb44..1cfeb76 100755 (executable)
@@ -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{
index 9cd93ad..d858ede 100755 (executable)
@@ -39,6 +39,11 @@ extern "C" {
 #else
 #include <sys/socket.h>
 #endif
+
+#ifdef _USE_UDS_SOCKET_TCP_
+#include <sys/un.h>
+#endif
+
 #include <netinet/in.h>
 #include <arpa/inet.h>
 
@@ -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);
index 51e8fa4..60a1dc3 100755 (executable)
@@ -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
 
index 7c0af35..eb49c12 100755 (executable)
@@ -31,6 +31,8 @@
 #include <string.h>
 #include <unistd.h>
 #include <errno.h>
+#include <sys/types.h>
+#include <sys/stat.h>
 
 #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 */
index 1696897..4a88fd3 100755 (executable)
@@ -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
index 49141b7..23b0bd1 100755 (executable)
@@ -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);
index c889d9e..7fb8e11 100755 (executable)
@@ -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
index 3b4c12a..adaacf2 100755 (executable)
@@ -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;
        }