Add multi_user define for single user 58/70158/3 accepted/tizen/common/20160519.191316 accepted/tizen/common/20160519.191534 accepted/tizen/ivi/20160519.085120 accepted/tizen/ivi/20160520.002503 accepted/tizen/mobile/20160519.085053 accepted/tizen/mobile/20160520.002616 accepted/tizen/tv/20160519.085034 accepted/tizen/tv/20160520.002447 accepted/tizen/wearable/20160519.085016 accepted/tizen/wearable/20160520.002515 submit/tizen/20160519.011519 submit/tizen/20160519.075406
authorJiyong Min <jiyong.min@samsung.com>
Wed, 18 May 2016 10:41:05 +0000 (19:41 +0900)
committerJiyong Min <jiyong.min@samsung.com>
Wed, 18 May 2016 11:08:35 +0000 (20:08 +0900)
- Add to support single & multi user system

Change-Id: Idaa62b43630c035dc818cae747a666bae2e22881
Signed-off-by: Jiyong Min <jiyong.min@samsung.com>
CMakeLists.txt [changed mode: 0755->0644]
include/media_controller_db.h [changed mode: 0755->0644]
include/media_controller_private.h [changed mode: 0755->0644]
packaging/capi-media-controller.spec
packaging/mediacontroller-ipc.socket [new file with mode: 0644]
packaging/mediacontroller.socket
src/media_controller_db.c [changed mode: 0755->0644]
svc/daemon/media_controller_main.c
svc/media_controller_db_util.c [changed mode: 0755->0644]
svc/media_controller_socket.h
svc/media_controller_svc.c

old mode 100755 (executable)
new mode 100644 (file)
index 4d52595..f306b97
@@ -54,6 +54,9 @@ ENDIF("${ARCH}" MATCHES "^arm.*")
 ADD_DEFINITIONS("-DPREFIX=\"${CMAKE_INSTALL_PREFIX}\"")
 ADD_DEFINITIONS("-DTIZEN_DEBUG")
 ADD_DEFINITIONS("-D_FILE_OFFSET_BITS=64")
+IF (MULTI_USER)
+ADD_DEFINITIONS("-DMULTI_USER")
+ENDIF(MULTI_USER)
 
 SET(CMAKE_EXE_LINKER_FLAGS "-Wl,--as-needed -Wl,--rpath=${LIB_INSTALL_DIR}")
 
old mode 100755 (executable)
new mode 100644 (file)
index 6218fb3..ab7c692
 #include <sqlite3.h>
 #include <tzplatform_config.h>
 
+#define FAT_FILEPATH_LEN_MAX   4096    /* inc null */
+#define MC_FILE_PATH_LEN_MAX   FAT_FILEPATH_LEN_MAX    /**< File path max length (include file name) on file system */
+
 #define MC_DB_NAME ".media_controller.db"
+#define MC_DB_PATH tzplatform_mkpath(TZ_USER_DB, MC_DB_NAME)
 
 #define MC_DB_TABLE_SERVER_LIST                "server_list"
 #define MC_DB_TABLE_LATEST_SERVER              "latest_server"
old mode 100755 (executable)
new mode 100644 (file)
index 63f0c18..052e0cf
@@ -132,6 +132,8 @@ extern "C" {
 #define MC_COMMAND_PLAYBACKSTATE               "_playback_command_"
 #define MC_COMMAND_CUSTOM                              "_custom_command_"
 
+#define DEFAULT_USER_UID 5001  /* owner */
+
 #define MC_MILLISEC_SLEEP(msec) \
        do { \
                if (msec) { \
index e78f754..20cb364 100644 (file)
@@ -1,6 +1,6 @@
 Name:       capi-media-controller
 Summary:    A media controller library in Tizen Native API
-Version:    0.0.18
+Version:    0.1.19
 Release:    1
 Group:      Multimedia/API
 License:    Apache-2.0
@@ -8,6 +8,7 @@ Source0:    %{name}-%{version}.tar.gz
 Source1:    mediacontroller.service
 Source2:    mediacontroller.socket
 Source3:    media-controller-user.service
+Source4:    mediacontroller-ipc.socket
 Source1001: media-controller_create_db.sh
 BuildRequires:  cmake
 BuildRequires:  sqlite
@@ -43,6 +44,12 @@ Requires:   %{name} = %{version}-%{release}
 %description devel
 This package provides a media controller library in Tizen Native API(Development files included)
 
+%if 0%{?TIZEN_PRODUCT_TV}
+%define multi_user 0
+%else
+%define multi_user 1
+%endif
+
 %prep
 %setup -q
 
@@ -52,7 +59,12 @@ export CFLAGS+=" -Wno-ignored-qualifiers -Wno-unused-parameter -Wshadow"
 export CFLAGS+=" -Wwrite-strings -Wswitch-default"
 export CFLAGS+=" -DGST_EXT_TIME_ANALYSIS -include stdint.h"
 MAJORVER=`echo %{version} | awk 'BEGIN {FS="."}{print $1}'`
-%cmake . -DFULLVER=%{version} -DMAJORVER=${MAJORVER}
+%cmake . -DFULLVER=%{version} \
+%if 0%{?multi_user}
+ -DMAJORVER=${MAJORVER} -DMULTI_USER=YES
+%else
+ -DMAJORVER=${MAJORVER}
+%endif
 
 %__make %{?jobs:-j%jobs}
 
@@ -69,25 +81,32 @@ mkdir -p %{buildroot}%{_unitdir}/sockets.target.wants
 # change
 install -m 644 %{SOURCE1} %{buildroot}%{_unitdir}/mediacontroller.service
 install -m 644 %{SOURCE2} %{buildroot}%{_unitdir}/mediacontroller.socket
+install -m 644 %{SOURCE4} %{buildroot}%{_unitdir}/mediacontroller-ipc.socket
 ln -s ../mediacontroller.socket %{buildroot}%{_unitdir}/sockets.target.wants/mediacontroller.socket
+ln -s ../mediacontroller-ipc.socket %{buildroot}%{_unitdir}/sockets.target.wants/mediacontroller-ipc.socket
 
 # Setup DB creation in user session
+%if 0%{?multi_user}
 mkdir -p %{buildroot}%{_unitdir_user}
 mkdir -p %{buildroot}%{_unitdir_user}/default.target.wants/
 install -m 644 %{SOURCE3} %{buildroot}%{_unitdir_user}/media-controller-user.service
 ln -s ../media-controller-user.service %{buildroot}%{_unitdir_user}/default.target.wants/media-controller-user.service
+%endif
 
-# Create DB for multi-user
+# Create DB
+%if 0%{?multi_user}
 mkdir -p %{buildroot}%{_bindir}
 install -m 0775 %{SOURCE1001} %{buildroot}%{_bindir}/media-controller_create_db.sh
+%endif
 
 %post
+%if 0%{?multi_user}
 chgrp %TZ_SYS_USER_GROUP %{_bindir}/media-controller_create_db.sh
+%endif
 %postun
 
 %files
 %manifest %{name}.manifest
-%{_bindir}/media-controller_create_db.sh
 %defattr(-,root,root,-)
 %{_libdir}/*.so.*
 %{_datadir}/license/%{name}
@@ -95,13 +114,20 @@ chgrp %TZ_SYS_USER_GROUP %{_bindir}/media-controller_create_db.sh
 %files -n mediacontroller
 %defattr(-,root,root,-)
 %{_bindir}/mediacontroller
+%if 0%{?multi_user}
+%{_bindir}/media-controller_create_db.sh
+%endif
 %manifest media-controller-service.manifest
 %defattr(-,system,system,-)
 %{_unitdir}/mediacontroller.service
 %{_unitdir}/mediacontroller.socket
 %{_unitdir}/sockets.target.wants/mediacontroller.socket
+%{_unitdir}/mediacontroller-ipc.socket
+%{_unitdir}/sockets.target.wants/mediacontroller-ipc.socket
+%if 0%{?multi_user}
 %{_unitdir_user}/media-controller-user.service
 %{_unitdir_user}/default.target.wants/media-controller-user.service
+%endif
 %{_datadir}/license/mediacontroller
 
 %files devel
diff --git a/packaging/mediacontroller-ipc.socket b/packaging/mediacontroller-ipc.socket
new file mode 100644 (file)
index 0000000..b99b5cc
--- /dev/null
@@ -0,0 +1,8 @@
+[Unit]
+Description=MediaController Service socket
+
+[Socket]
+ListenStream=/run/.mediacontroller-comm.sock
+
+[Install]
+WantedBy=sockets.target
index e1db656..04ff4ec 100644 (file)
@@ -2,9 +2,7 @@
 Description=MediaController Service socket
 
 [Socket]
-SocketUser=system
-SocketGroup=system
-ListenStream=/var/run/media-controller/media_sa_controller
+ListenStream=/run/.mediacontroller.sock
 Service=mediacontroller.service
 
 [Install]
old mode 100755 (executable)
new mode 100644 (file)
index 9d56b80..8ec1f04
@@ -145,6 +145,41 @@ static int __mc_db_get_ulong_value_of_key(void *handle, const char *server_name,
        return MEDIA_CONTROLLER_ERROR_NONE;
 }
 
+static char* __mc_get_db_name(uid_t uid)
+{
+       char result_psswd[MC_FILE_PATH_LEN_MAX] = {0, };
+       char *result_psswd_rtn = NULL;
+       struct group *grpinfo = NULL;
+       char * dir = NULL;
+
+       memset(result_psswd, 0, sizeof(result_psswd));
+
+       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/%s", userinfo->pw_dir, MC_DB_NAME);
+
+       dir = strrchr(result_psswd, '/');
+       if (!dir)
+               return strdup(result_psswd);
+
+       result_psswd_rtn = strdup(result_psswd);
+
+       return result_psswd_rtn;
+}
+
 int mc_db_connect(void **handle)
 {
        int ret = MEDIA_CONTROLLER_ERROR_NONE;
@@ -155,7 +190,10 @@ int mc_db_connect(void **handle)
        mc_retvm_if(handle == NULL, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "Handle is NULL");
 
        /*Connect DB*/
-       ret = db_util_open_with_options(tzplatform_mkpath(TZ_USER_DB, MC_DB_NAME), &db_handle, SQLITE_OPEN_READWRITE, NULL);
+       char * db_name = NULL;
+       db_name = __mc_get_db_name(getuid());
+       ret = db_util_open_with_options(db_name, &db_handle, SQLITE_OPEN_READONLY, NULL);
+       MC_SAFE_FREE(db_name);
 
        if (SQLITE_OK != ret) {
                mc_error("error when db open");
index 5f20c55..f71cf8c 100644 (file)
@@ -60,6 +60,11 @@ void __mc_main_create_timer(int timer_id)
        g_mc_timer_id = g_source_attach(timer_src, g_main_context_get_thread_default());
 }
 
+void __mc_main_destroy_timer()
+{
+       g_source_destroy(g_main_context_find_source_by_id(g_main_context_get_thread_default(), g_mc_timer_id));
+}
+
 int main(int argc, char **argv)
 {
        GThread *svc_thread = NULL;
@@ -68,7 +73,7 @@ int main(int argc, char **argv)
        struct sockaddr_in client_addr;
        int client_addr_size = 0;
 
-       /*Init main loop*/
+       /* Init main loop */
        g_mc_mainloop = g_main_loop_new(NULL, FALSE);
 
        if (mc_cynara_initialize() != MEDIA_CONTROLLER_ERROR_NONE) {
@@ -86,7 +91,7 @@ int main(int argc, char **argv)
                        mc_error("accept failed");
        }
 
-       /*create each threads*/
+       /* Create media controller service thread */
        svc_thread  = g_thread_new("mc_svc_thread", (GThreadFunc)mc_svc_thread, NULL);
 
        /* Create Timer */
@@ -99,6 +104,7 @@ int main(int argc, char **argv)
        g_thread_join(svc_thread);
        g_main_loop_unref(g_mc_mainloop);
 
+       __mc_main_destroy_timer(g_mc_timer_id);
        mc_cynara_finish();
 
        mc_debug("*** Media Controller Daemon is stopped ***");
old mode 100755 (executable)
new mode 100644 (file)
index e8eb5a6..707b1b0
@@ -154,7 +154,7 @@ static char* __mc_get_db_name(uid_t uid)
                        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);
+               snprintf(result_psswd, sizeof(result_psswd), "%s/.applications/dbspace/%s", userinfo->pw_dir, MC_DB_NAME);
        }
 
        dir = strrchr(result_psswd, '/');
@@ -183,7 +183,7 @@ int mc_db_util_connect(void **handle, uid_t uid)
        }
 
        /*Connect DB*/
-       ret = db_util_open_with_options(db_name, &db_handle, SQLITE_OPEN_READWRITE, NULL);
+       ret = db_util_open_with_options(db_name, &db_handle, SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, NULL);
 
        MC_SAFE_FREE(db_name);
 
@@ -207,6 +207,24 @@ int mc_db_util_connect(void **handle, uid_t uid)
 
        *handle = db_handle;
 
+#ifndef MULTI_USER
+       char *sql = NULL;
+       sql = sqlite3_mprintf("%s", "PRAGMA journal_mode = PERSIST");
+       ret = sqlite3_exec(*handle, sql, NULL, NULL, NULL);
+       sqlite3_free(sql);
+       if (SQLITE_OK != ret) {
+
+               if (*handle) {
+                       mc_error("[error when change the journal mode] %s", sqlite3_errmsg(*handle));
+               }
+
+               db_util_close(*handle);
+               *handle = NULL;
+
+               return MEDIA_CONTROLLER_ERROR_INVALID_OPERATION;
+       }
+#endif
+
        return MEDIA_CONTROLLER_ERROR_NONE;
 }
 
index 42e3531..2a5bba1 100644 (file)
@@ -30,8 +30,8 @@ extern "C" {
 #define MC_TIMEOUT_SEC_5                                       5               /**< Response from Server time out */
 #define MAX_MSG_SIZE                           4096*2
 #define MC_SOCK_NOT_ALLOCATE           -1
-#define MC_SOCK_ACTIVATION_PATH                tzplatform_mkpath(TZ_SYS_RUN, "media-controller/media_sa_controller")
-#define MC_IPC_PATH                                    tzplatform_mkpath(TZ_SYS_RUN, "media-controller/media_ipc_controller")
+#define MC_SOCK_ACTIVATION_PATH                "/run/.mediacontroller.sock"            /* tzplatform_mkpath(TZ_SYS_RUN, ".media_controller.sock") */
+#define MC_IPC_PATH                                    "/run/.mediacontroller-comm.sock"       /* tzplatform_mkpath(TZ_SYS_RUN, ".media_controller-comm.sock") */
 #define MC_SERVER_CONNECTION_MSG                       "Connect"
 #define MC_SERVER_DISCONNECTION_MSG            "Disonnect"
 
index 9e15586..23ba2e8 100644 (file)
@@ -30,6 +30,7 @@
 static GMainLoop *g_mc_svc_mainloop = NULL;
 static int g_connection_cnt = -1;
 
+#ifdef MULTI_USER
 #define UID_DBUS_NAME           "org.freedesktop.login1"
 #define UID_DBUS_PATH           "/org/freedesktop/login1"
 #define UID_DBUS_INTERFACE      UID_DBUS_NAME".Manager"
@@ -102,6 +103,7 @@ static int __mc_dbus_get_uid(const char *dest, const char *path, const char *int
 
        return result;
 }
+#endif
 
 static int __create_socket_activation(void)
 {
@@ -310,7 +312,7 @@ gboolean mc_svc_thread(void *data)
        GIOChannel *channel = NULL;
        GMainContext *context = NULL;
        mc_svc_data_t *mc_svc_data = NULL;
-       uid_t uid = -1;
+       uid_t uid = DEFAULT_USER_UID;
 
        mc_svc_data = (mc_svc_data_t *)g_malloc(sizeof(mc_svc_data_t));
        if (mc_svc_data == NULL) {
@@ -319,6 +321,7 @@ gboolean mc_svc_thread(void *data)
        }
        memset(mc_svc_data, 0, sizeof(mc_svc_data_t));
 
+#ifdef MULTI_USER
        ret = __mc_dbus_get_uid(UID_DBUS_NAME, UID_DBUS_PATH, UID_DBUS_INTERFACE, UID_DBUS_METHOD, &uid);
        if (ret < 0) {
                mc_debug("Failed to send dbus (%d)", ret);
@@ -327,6 +330,7 @@ gboolean mc_svc_thread(void *data)
        } else {
                mc_debug("%d get UID[%d]", ret, uid);
        }
+#endif
 
        /* Connect media controller DB*/
        if (mc_db_util_connect(&(mc_svc_data->db_handle), uid) != MEDIA_CONTROLLER_ERROR_NONE) {