Modify media controller not working 68/43468/8 accepted/tizen/mobile/20150710.080233 accepted/tizen/tv/20150710.080246 accepted/tizen/wearable/20150710.080302 submit/tizen/20150710.052710
authorJi Yong Min <jiyong.min@samsung.com>
Thu, 9 Jul 2015 11:31:30 +0000 (20:31 +0900)
committerJi Yong Min <jiyong.min@samsung.com>
Fri, 10 Jul 2015 04:38:16 +0000 (13:38 +0900)
- Often IPC connection disconnected
- DB query fail because db path of uid was wrong
- Add to wait for service activation & do not connect when service is already running

Change-Id: I5db05d250f30151b52371bb9b5d10c8179f77862
Signed-off-by: Jiyong Min <jiyong.min@samsung.com>
packaging/capi-media-controller.spec
packaging/media-controller_create_db.sh
packaging/mediacontroller.socket
src/media_controller_db.c
src/media_controller_ipc.c
svc/media_controller_socket.h

index d50c8a1..d525839 100755 (executable)
@@ -1,6 +1,6 @@
 Name:       capi-media-controller
 Summary:    Multimedia Controller for player application
-Version:    0.0.4
+Version:    0.0.5
 Release:    1
 Group:      System/Libraries
 License:    Apache-2.0
@@ -9,8 +9,6 @@ Source1:    mediacontroller.service
 Source2:    mediacontroller.socket
 Source3:    media-controller-user.service
 Source1001: media-controller_create_db.sh
-#Requires(post):  /sbin/ldconfig
-#Requires(postun):  /sbin/ldconfig
 BuildRequires:  cmake
 BuildRequires:  sqlite
 BuildRequires:  pkgconfig(capi-base-common)
index c691ca7..33dc7ac 100755 (executable)
@@ -20,5 +20,5 @@ chmod 644 ${TZ_USER_DB}/.media_controller.db-journal
 
 #Change group (6017: db_filemanager 5000: app)
 chgrp $TZ_SYS_USER_GROUP ${TZ_USER_DB}
-chgrp 6017 ${TZ_USER_DB}/.media_controller.db
-chgrp 6017 ${TZ_USER_DB}/.media_controller.db-journal
+#chgrp 6017 ${TZ_USER_DB}/.media_controller.db
+#chgrp 6017 ${TZ_USER_DB}/.media_controller.db-journal
index e1db656..81da5b6 100755 (executable)
@@ -4,7 +4,7 @@ Description=MediaController Service socket
 [Socket]
 SocketUser=system
 SocketGroup=system
-ListenStream=/var/run/media-controller/media_sa_controller
+ListenStream=/var/run/media-controller/media_ipc_controller
 Service=mediacontroller.service
 
 [Install]
index 6b99458..7502259 100755 (executable)
@@ -185,34 +185,22 @@ static char* __mc_get_db_name(uid_t uid)
        char * dir = NULL;
 
        memset(result_psswd, 0, sizeof(result_psswd));
-       if(uid == getuid())
-       {
-               strncpy(result_psswd, MC_DB_NAME, sizeof(result_psswd));
-               grpinfo = getgrnam("users");
-               if(grpinfo == NULL) {
-                       mc_error("getgrnam(users) returns NULL !");
-                       return NULL;
-               }
+       struct passwd *userinfo = getpwuid(uid);
+       if(userinfo == NULL) {
+               mc_error("getpwuid(%d) returns NULL !", uid);
+               return NULL;
        }
-       else
-       {
-               struct passwd *userinfo = getpwuid(uid);
-               if(userinfo == NULL) {
-                       mc_error("getpwuid(%d) returns NULL !", uid);
-                       return NULL;
-               }
-               grpinfo = getgrnam("users");
-               if(grpinfo == NULL) {
-                       mc_error("getgrnam(users) returns NULL !");
-                       return NULL;
-               }
-               // Compare git_t type and not group name
-               if (grpinfo->gr_gid != userinfo->pw_gid) {
-                       mc_error("UID [%d] does not belong to 'users' group!", uid);
-                       return NULL;
-               }
-               snprintf(result_psswd, sizeof(result_psswd), "%s/.applications/dbspace/.media_controller.db", userinfo->pw_dir);
+       grpinfo = getgrnam("users");
+       if(grpinfo == NULL) {
+               mc_error("getgrnam(users) returns NULL !");
+               return NULL;
+       }
+       // Compare git_t type and not group name
+       if (grpinfo->gr_gid != userinfo->pw_gid) {
+               mc_error("UID [%d] does not belong to 'users' group!", uid);
+               return NULL;
        }
+       snprintf(result_psswd, sizeof(result_psswd), "%s/.applications/dbspace/.media_controller.db", userinfo->pw_dir);
 
        dir = strrchr(result_psswd, '/');
        if(!dir)
index b0d6f45..8267aea 100755 (executable)
 * limitations under the License.
 */
 
+#include <stdio.h>
+#include <glib.h>
 #include <tzplatform_config.h>
 
 #include "media_controller_private.h"
 
 #define MAX_RETRY_COUNT 3
+#define MAX_WAIT_COUNT 3
+#define MC_SVC_NAME "mediacontroller"
+
+GMainLoop *g_wait_mainloop = NULL;
+
+static gboolean __timeout_func(gpointer data)
+{
+    mc_debug("Timeout!");
+    g_main_loop_quit((GMainLoop *) data);
+    return FALSE;
+}
+
+static void __wait_for_activate()
+{
+    int timeout_id = 0;
+    g_wait_mainloop = g_main_loop_new(NULL, FALSE);
+
+    timeout_id = g_timeout_add(500, __timeout_func, g_wait_mainloop);
+    g_main_loop_run(g_wait_mainloop);
+    g_source_remove(timeout_id);
+       g_main_loop_unref(g_wait_mainloop);
+       g_wait_mainloop = NULL;
+}
+
+/* This checks if service daemon is running */
+static gboolean __is_service_activated()
+{
+       gboolean ret = FALSE;
+       DIR *pdir;
+       struct dirent pinfo;
+       struct dirent *result = NULL;
+
+       pdir = opendir("/proc");
+       if (pdir == NULL) {
+               mc_error("err: NO_DIR");
+               return FALSE;
+       }
+
+       while (!readdir_r(pdir, &pinfo, &result)) {
+               if (result == NULL)
+                       break;
+
+               if (pinfo.d_type != 4 || pinfo.d_name[0] == '.'
+                   || pinfo.d_name[0] > 57)
+                       continue;
+
+               FILE *fp;
+               char buff[128];
+               char path[128];
+
+               snprintf(path, sizeof(path), "/proc/%s/status", pinfo.d_name);
+               fp = fopen(path, "rt");
+               if (fp) {
+                       if (fgets(buff, 128, fp) == NULL)
+                               mc_error("fgets failed");
+                       fclose(fp);
+
+                       if (strstr(buff, MC_SVC_NAME)) {
+                               mc_error("%s proc is already running", buff);
+                               ret = TRUE;
+                               break;
+                       }
+               } else {
+                       mc_error("Can't read file [%s]", path);
+               }
+       }
+
+       closedir(pdir);
+
+       return ret;
+}
 
 static char *__make_key_for_map(const char *main_key, const char *sub_key)
 {
@@ -364,6 +437,12 @@ int mc_ipc_service_connect(void)
        int sockfd = -1;
        mc_sock_info_s sock_info;
        struct sockaddr_un serv_addr;
+       unsigned int retrycount = 0;
+
+       if (__is_service_activated() == TRUE) {
+               mc_debug("service is already running!");
+               return MEDIA_CONTROLLER_ERROR_NONE;
+       }
 
        /*Create Socket*/
        ret = mc_ipc_create_client_socket(MC_TIMEOUT_SEC_10, &sock_info);
@@ -373,7 +452,7 @@ int mc_ipc_service_connect(void)
        /*Set server Address*/
        memset(&serv_addr, 0, sizeof(serv_addr));
        serv_addr.sun_family = AF_UNIX;
-       strncpy(serv_addr.sun_path, MC_SOCK_ACTIVATION_PATH, sizeof(serv_addr.sun_path) - 1);
+       strncpy(serv_addr.sun_path, MC_IPC_PATH, sizeof(serv_addr.sun_path) - 1);
 
        /* Connecting to the media db server */
        if (connect(sockfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) {
@@ -382,8 +461,13 @@ int mc_ipc_service_connect(void)
                return MEDIA_CONTROLLER_ERROR_INVALID_OPERATION;
        }
 
+       mc_ipc_delete_client_socket(&sock_info);
+
+       while((__is_service_activated() == FALSE) && (retrycount++ < MAX_WAIT_COUNT)) {
+               __wait_for_activate();
+       }
+
        mc_debug("CONNECT OK");
 
-       mc_ipc_delete_client_socket(&sock_info);
        return ret;
 }
index 15d5bb9..bfc5107 100755 (executable)
@@ -30,7 +30,7 @@ extern "C" {
 #define MC_TIMEOUT_SEC_10                                      10              /**< Response from Server time out */
 #define MAX_MSG_SIZE                           4096*2
 #define MC_SOCK_NOT_ALLOCATE           -1
-#define MC_SOCK_ACTIVATION_PATH                "/var/run/media-controller/media_sa_controller"
+//#define MC_SOCK_ACTIVATION_PATH              "/var/run/media-controller/media_sa_controller"
 #define MC_IPC_PATH                                    "/var/run/media-controller/media_ipc_controller"
 #define MC_SERVER_CONNECTION_MSG                       "Connect"
 #define MC_SERVER_DISCONNECTION_MSG            "Disonnect"