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}")
#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"
#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) { \
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
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
%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
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}
# 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}
%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
--- /dev/null
+[Unit]
+Description=MediaController Service socket
+
+[Socket]
+ListenStream=/run/.mediacontroller-comm.sock
+
+[Install]
+WantedBy=sockets.target
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]
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;
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");
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;
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) {
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 */
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 ***");
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, '/');
}
/*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);
*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;
}
#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"
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"
return result;
}
+#endif
static int __create_socket_activation(void)
{
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) {
}
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);
} 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) {