--- /dev/null
+.*
+!.gitignore
+*~
+
+*~
+\#*\#
+/.emacs.desktop
+/.emacs.desktop.lock
+.elc
+auto-save-list
+tramp
+.\#*
+
+# Org-mode
+.org-id-locations
+*_archive
+
+# Object files
+*.o
+
+# Libraries
+*.lib
+*.a
+
+# Shared objects (inc. Windows DLLs)
+*.dll
+*.so
+*.so.*
+*.dylib
+
+# Executables
+*.exe
+*.out
+*.app
+
+# Patches
+*.patch
+*.diff
# Set required packages
INCLUDE(FindPkgConfig)
-pkg_check_modules(pkgs REQUIRED glib-2.0 gobject-2.0 tcore dlog libsystemd-daemon)
+pkg_check_modules(pkgs REQUIRED glib-2.0 vconf tcore dlog)
FOREACH(flag ${pkgs_CFLAGS})
SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} ${flag}")
INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/include/)
-SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_CFLAGS} -Werror -Wextra -Wno-unused-parameter -Wno-missing-field-initializers -Wdeclaration-after-statement -Wmissing-declarations -Wredundant-decls -Wcast-align")
+SET(ADDITIONAL_CFLAGS "-Wno-array-bounds -Wno-empty-body -Wno-ignored-qualifiers -Wshadow -Wwrite-strings -Wswitch-default -Wno-unused-but-set-parameter -Wno-unused-but-set-variable")
+SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_CFLAGS} -Werror -Wextra -Wall -Wdeclaration-after-statement -Wmissing-declarations -Wredundant-decls -Wcast-align -Wcast-qual")
+SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${ADDITIONAL_CFLAGS}")
ADD_DEFINITIONS("-DFEATURE_TLOG_DEBUG")
-ADD_DEFINITIONS("-DTCORE_LOG_TAG=\"TELEPHONY_DAEMON\"")
+ADD_DEFINITIONS("-DTCORE_LOG_TAG=\"DAEMON\"")
ADD_DEFINITIONS("-DDAEMON_VERSION=\"${VERSION}\"")
+ADD_DEFINITIONS("-DDEFAULT_PLUGINS_PATH=\"/usr/lib/telephony/plugins/\"")
+
+IF (TIZEN_DEBUG_ENABLE)
+ ADD_DEFINITIONS ("-DTIZEN_DEBUG_ENABLE")
+ENDIF (TIZEN_DEBUG_ENABLE)
+
MESSAGE(${CMAKE_C_FLAGS})
MESSAGE(${pkgs_LDFLAGS})
+IF (TIZEN_DEBUG_ENABLE)
SET(SRCS
- src/main.c
- src/monitor.c
+ src/main.c
+ src/monitor.c
)
-
+ELSE (TIZEN_DEBUG_ENABLE)
+SET(SRCS
+ src/main.c
+)
+ENDIF (TIZEN_DEBUG_ENABLE)
# binary build
-ADD_EXECUTABLE(telephony-daemon ${SRCS})
-TARGET_LINK_LIBRARIES(telephony-daemon ${pkgs_LDFLAGS} "-ldl")
-
+ADD_EXECUTABLE(${PROJECT_NAME} ${SRCS})
+TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${pkgs_LDFLAGS} "-ldl")
# install
-INSTALL(TARGETS telephony-daemon
- RUNTIME DESTINATION bin)
-
+INSTALL(TARGETS ${PROJECT_NAME} RUNTIME DESTINATION bin)
INSTALL(FILES ${CMAKE_SOURCE_DIR}/LICENSE DESTINATION /usr/share/license RENAME telephony-daemon)
-INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/systemd/telephony.service DESTINATION /usr/lib/systemd/system)
+INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/packaging/telephony-daemon.service DESTINATION /usr/lib/systemd/system)
--- /dev/null
+## Restart Telephony Daemon
+systemctl restart telephony-daemon.service
+
+## Stop Telephony Daemon
+systemctl stop telephony-daemon.service
+
+++ /dev/null
-telephony-daemon (0.1.4) unstable; urgency=low
-
- * version up for code sync with public binary
- * Git: slp/pkgs/t/telephony-daemon
- * Tag: telephony-daemon_0.1.4
-
- -- Kyeongchul Kim <kyeongchul.kim@samsung.com> Mon, 02 Apr 2012 14:27:25 +0900
-
-telephony-daemon (0.1.3) unstable; urgency=low
-
- * Fix prefix (TAPI_ to TCORE_)
- * Git: slp/pkgs/t/telephony-daemon
- * Tag: telephony-daemon_0.1.3
-
- -- Inho Oh <inho48.oh@samsung.com> Tue, 27 Mar 2012 22:25:04 +0900
-
-telephony-daemon (0.1.2) unstable; urgency=low
-
- * Add debug feature (kill -USR1 <telephony-daemon pid>)
- * Git: slp/pkgs/t/telephony-daemon
- * Tag: telephony-daemon_0.1.2
-
- -- Inho Oh <inho48.oh@samsung.com> Mon, 19 Mar 2012 21:08:42 +0900
-
-telephony-daemon (0.1.1) unstable; urgency=low
-
- * Add autorun script (/etc/...)
- * Git: slp/pkgs/t/telephony-daemon
- * Tag: telephony-daemon_0.1.1
-
- -- Inho Oh <inho48.oh@samsung.com> Fri, 16 Mar 2012 03:19:19 +0900
-
-telephony-daemon (0.1.0) unstable; urgency=low
-
- * Initial
- * Git: slp/pkgs/t/telephony-daemon
- * Tag: telephony-daemon_0.1.0
-
- -- Inho Oh <inho48.oh@samsung.com> Thu, 15 Mar 2012 23:40:55 +0900
+++ /dev/null
-Source: telephony-daemon
-Section: libs
-Priority: extra
-Maintainer: Jongman Park <jman.park@samsung.com>
-Uploaders: Jayoung Gu <jygu@samsung.com>, Kyeongchul Kim <kyeongchul.kim@samsung.com>, Youngman Park <youngman.park@samsung.com>, Inho Oh <inho48.oh@samsung.com>, DongHoo Park <donghoo.park@samsung.com>
-Build-Depends: debhelper (>= 5), libglib2.0-dev, libtcore-dev, dlog-dev
-Standards-Version: 0.0.0
-
-Package: telephony-daemon
-Section: libs
-Architecture: any
-Depends: ${shlibs:Depends}, ${misc:Depends},
-Description: telephony client API library (Shared Object)
-
-Package: telephony-daemon-dbg
-Section: debug
-Architecture: any
-Depends: ${shlibs:Depends}, ${misc:Depends}, telephony-daemon (= ${Source-Version})
-Description: telephony client API library (dbg package)
-
+++ /dev/null
-Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
-
-This program is free software; you can redistribute it and/or modify
-it under the terms of the the Apache License, Version 2.0 (the "License");
-You may obtain a copy of the License at
-http://www.apache.org/licenses/LICENSE-2.0.
+++ /dev/null
-usr/bin
-usr/sbin
+++ /dev/null
-#!/usr/bin/make -f
-# -*- makefile -*-
-# Sample debian/rules that uses debhelper.
-# This file was originally written by Joey Hess and Craig Small.
-# As a special exception, when this file is copied by dh-make into a
-# dh-make output file, you may use that output file without restriction.
-# This special exception was added by Craig Small in version 0.37 of dh-make.
-
-# Uncomment this to turn on verbose mode.
-#export DH_VERBOSE=1
-
-CFLAGS ?= -Wall -g
-CXXFLAGS ?= -Wall -g
-LDFLAGS ?=
-PREFIX ?= /usr
-DATADIR ?= /opt
-
-ifneq (,$(findstring noopt,$(DEB_BUILD_OPTIONS)))
- CFLAGS += -O0
- CXXFLAGS += -O0
-else
- CFLAGS += -O2
- CXXFLAGS += -O2
-endif
-
-CFLAGS += -fvisibility=hidden -fPIC
-LDFLAGS += -ldl -rdynamic -fPIC -Wl,--rpath=$(PREFIX)/lib -Wl,--as-needed
-#LDFLAGS += -Wl,--unresolved-symbols=ignore-in-shared-libs,--as-needed
-
-CMAKE_TMP_DIR = $(CURDIR)/cmake_tmp
-
-configure: configure-stamp
-configure-stamp:
- dh_testdir
- # Add here commands to configure the package.
- mkdir -p $(CMAKE_TMP_DIR);
- cd $(CMAKE_TMP_DIR); CFLAGS="$(CFLAGS)" LDFLAGS="$(LDFLAGS)" cmake .. -DCMAKE_INSTALL_PREFIX=$(PREFIX)
-
- touch configure-stamp
-
-build: build-stamp
-
-build-stamp: configure-stamp
- dh_testdir
-
- # Add here commands to compile the package.
- cd $(CMAKE_TMP_DIR) && $(MAKE) all
-
- for f in `find $(CURDIR)/debian/ -name "*.in"`; do \
- cat $$f > $${f%.in}; \
- sed -i -e "s#@PREFIX@#$(PREFIX)#g" $${f%.in}; \
- sed -i -e "s#@DATADIR@#$(DATADIR)#g" $${f%.in}; \
- done
-
- touch $@
-
-clean:
- dh_testdir
- dh_testroot
- rm -f build-stamp configure-stamp
-
- # Add here commands to clean up after the build process.
- rm -rf $(CMAKE_TMP_DIR)
-
- for f in `find $(CURDIR)/debian/ -name "*.in"`; do \
- rm -f $${f%.in}; \
- done
-
- dh_clean
-
-install: build
- dh_testdir
- dh_testroot
- dh_clean -k
- dh_installdirs
-
- # Add here commands to install the package into debian/wavplayer.
- cd $(CMAKE_TMP_DIR) && $(MAKE) DESTDIR=$(CURDIR)/debian/tmp install
-
-
-# Build architecture-independent files here.
-binary-indep: build install
-# We have nothing to do by default.
-
-# Build architecture-dependent files here.
-binary-arch: build install
- dh_testdir
- dh_testroot
- dh_installchangelogs
- dh_installdocs
- dh_installexamples
- dh_install --sourcedir=debian/tmp
-# dh_installmenu
-# dh_installdebconf
-# dh_installlogrotate
-# dh_installemacsen
-# dh_installpam
-# dh_installmime
-# dh_python
-# dh_installinit
-# dh_installcron
-# dh_installinfo
- dh_installman
- dh_link
- dh_strip --dbg-package=telephony-daemon-dbg
- dh_compress
- dh_fixperms
-# dh_perl
- dh_makeshlibs
- dh_installdeb
- dh_shlibdeps --dpkg-shlibdeps-params=--ignore-missing-info
- dh_gencontrol
- dh_md5sums
- dh_builddeb
-
-binary: binary-indep binary-arch
-.PHONY: build clean binary-indep binary-arch binary install configure
+++ /dev/null
-@PREFIX@/bin/*
-etc/*
+++ /dev/null
-#!/bin/sh
-if [ ${USER} == "root" ]
-then
- chown root:root /etc/rc.d/init.d/telephony-daemon
-fi
--- /dev/null
+[Unit]
+Description=Telephony daemon
+Requires=dbus.socket
+After=factory-reset.service secure-storage.service dlog_logger.service shutdown.target
+
+[Service]
+Type=simple
+ExecStart=/usr/bin/telephony-daemon
+Restart=always
+RestartSec=0
+KillMode=none
+
+[Install]
+WantedBy=multi-user.target
-Name: telephony-daemon
-Summary: Telephony daemon
-Version: 0.1.13
-Release: 2
-Group: System/Telephony
-License: Apache-2.0
-Source0: %{name}-%{version}.tar.gz
+%define major 1
+%define minor 3
+%define patchlevel 18
+
+Name: telephony-daemon
+Version: %{major}.%{minor}.%{patchlevel}
+Release: 2
+License: Apache
+Summary: Telephony Daemon
+Group: System/Telephony
+Source0: %{name}-%{version}.tar.gz
BuildRequires: cmake
+BuildRequires: pkgconfig(dlog)
BuildRequires: pkgconfig(glib-2.0)
-BuildRequires: pkgconfig(gobject-2.0)
BuildRequires: pkgconfig(tcore)
-BuildRequires: pkgconfig(dlog)
-BuildRequires: pkgconfig(libsystemd-daemon)
+BuildRequires: pkgconfig(vconf)
Requires(post): sys-assert
-%{?systemd_requires}
%description
-Description: Telephony daemon
+Description: Telephony Daemon
%prep
%setup -q
%build
-%cmake . -DVERSION=%{version}
-make %{?jobs:-j%jobs}
+cmake . -DCMAKE_INSTALL_PREFIX=%{_prefix} -DVERSION=%{version} \
+ -DTIZEN_DEBUG_ENABLE=1 \
+
+make %{?_smp_mflags}
%install
+
%make_install
-mkdir -p %{buildroot}%{_prefix}/lib/systemd/system/multi-user.target.wants
-ln -s ../telephony.service %{buildroot}%{_prefix}/lib/systemd/system/multi-user.target.wants/telephony.service
-mkdir -p %{buildroot}/usr/share/license
-cp LICENSE %{buildroot}/usr/share/license/%{name}
+mkdir -p %{buildroot}%{_libdir}/systemd/system/multi-user.target.wants
+ln -s %{_libdir}/systemd/system/telephony-daemon.service %{buildroot}%{_libdir}/systemd/system/multi-user.target.wants/telephony-daemon.service
+
+%post -p /sbin/ldconfig
%files
%manifest telephony-daemon.manifest
%defattr(-,root,root,-)
%{_bindir}/telephony-daemon
-%{_prefix}/lib/systemd/system/telephony.service
-%{_prefix}/lib/systemd/system/multi-user.target.wants/telephony.service
-/usr/share/license/%{name}
+%attr(644,root,root) %{_libdir}/systemd/system/telephony-daemon.service
+%attr(644,root,root) %{_libdir}/systemd/system/multi-user.target.wants/telephony-daemon.service
+%{_datadir}/license/telephony-daemon
/*
* telephony-daemon
*
- * Copyright (c) 2012 Samsung Electronics Co., Ltd. All rights reserved.
+ * Copyright (c) 2013 Samsung Electronics Co. Ltd. All rights reserved.
*
* Contact: Ja-young Gu <jygu@samsung.com>
*
* limitations under the License.
*/
-#include <systemd/sd-daemon.h>
+#ifdef TIZEN_DEBUG_ENABLE
+#include "monitor.h"
+#endif
+
+#include <stdlib.h>
#include <stdio.h>
#include <string.h>
-#include <pthread.h>
-#include <unistd.h>
-#include <stdlib.h>
-#include <time.h>
+
#include <dlfcn.h>
#include <getopt.h>
-#include <sys/types.h>
#include <sys/stat.h>
#include <sys/sysinfo.h>
#include <glib.h>
-#include <glib-object.h>
#include <dlog.h>
+#include <vconf.h>
#include <tcore.h>
#include <plugin.h>
#include <server.h>
-#include <util.h>
-#include <log.h>
-
-#include "monitor.h"
#ifndef DAEMON_VERSION
#define DAEMON_VERSION "unknown"
#endif
-static Server *_server;
+#ifndef DEFAULT_PLUGINS_PATH
+#define DEFAULT_PLUGINS_PATH "/usr/lib/telephony/plugins/"
+#endif
+
+#define NOTUSED(var) (var = var)
+
+/* Internal vconf to maintain telephony load info (Number of times telephony daemon is loaded) */
+#define VCONFKEY_TELEPHONY_DAEMON_LOAD_COUNT "memory/private/telephony/daemon_load_count"
+
+static Server *_server = NULL;
+
+static void __usage_info(const char *exec)
+{
+ printf("Usage: %s [OPTION]... [PLUGIN_PATH]\n", exec);
+ printf("\n");
+ printf(" -T, --testload\t run with plugin load test mode and exit\n");
+ printf(" -h, --help\t\t display this help and exit\n");
+ printf("\n");
+}
void tcore_log(enum tcore_log_type type, enum tcore_log_priority priority, const char *tag, const char *fmt, ...)
{
va_list ap;
char buf[1024];
- va_start(ap, fmt);
- vsnprintf(buf, 1023, fmt, ap);
- va_end(ap);
+ switch (type) {
+ case TCORE_LOG_TYPE_RADIO: {
+ if (priority >= TCORE_LOG_INFO) {
+ va_start(ap, fmt);
+ vsnprintf(buf, 1023, fmt, ap);
+ va_end(ap);
+ __dlog_print(LOG_ID_RADIO, priority, tag, buf);
+ } else {
+ #ifdef TIZEN_DEBUG_ENABLE
+ va_start(ap, fmt);
+ vsnprintf(buf, 1023, fmt, ap);
+ va_end(ap);
+ __dlog_print(LOG_ID_RADIO, priority, tag, buf);
+ #endif
+ }
+ } break;
+
+ case TCORE_LOG_TYPE_TIME_CHECK: {
+ #ifdef TIZEN_DEBUG_ENABLE /* User Mode should not log performance data */
+ float a = 0.00, b = 0.00;
+ int next = 0;
+ FILE *fp = fopen("/proc/uptime", "r");
+ g_return_if_fail(NULL != fp);
+
+ if(fscanf(fp, "%f %f", &a, &b)){};
+ fclose(fp);
+ next = sprintf(buf, "[UPTIME] %f ", a);
+ if (next < 0)
+ return;
+
+ va_start(ap, fmt);
+ vsnprintf(buf + next, 1023 - next, fmt, ap);
+ va_end(ap);
+ __dlog_print(LOG_ID_RADIO, priority, tag, buf);
+ #endif
+ } break;
+
+ default:
+ break;
+ }
+}
+
+static void glib_log(const gchar *log_domain, GLogLevelFlags log_level,
+ const gchar *msg, gpointer user_data)
+{
+ NOTUSED(log_domain);
+ NOTUSED(log_level);
+ NOTUSED(user_data);
+
+ __dlog_print (LOG_ID_RADIO, DLOG_ERROR, "GLIB", msg);
+}
+
+#ifdef TIZEN_DEBUG_ENABLE
+static void telephony_signal_handler(int signo)
+{
+ if (!_server)
+ return;
+
+ switch (signo) {
+ case SIGUSR1: {
+ monitor_server_state(_server);
+ } break;
+
+ case SIGTERM: {
+ tcore_server_exit(_server);
+ } break;
- __dlog_print(type, priority, tag, buf);
+ default: {
+ warn("*~*~*~* Unhandled Signal: [%d] *~*~*~*", signo);
+ } break;
+ } /* end switch */
+
+ return;
+}
+#endif
+
+static void __log_uptime()
+{
+ float a = 0.00, b = 0.00;
+ FILE *fp = fopen("/proc/uptime", "r");
+ g_return_if_fail(NULL != fp);
+ info("scanned %d items", fscanf(fp, "%f %f", &a, &b));
+ info("proc uptime = %f idletime = %f\n", a, b);
+ fclose(fp);
+}
+
+static gboolean __init_plugin(TcorePlugin *plugin)
+{
+ const struct tcore_plugin_define_desc *desc = tcore_plugin_get_description(plugin);
+
+ if (!desc || !desc->init)
+ return FALSE;
+
+ if (!desc->init(plugin)) { /* TODO: Remove plugin from server */
+ char *plugin_name = tcore_plugin_get_filename(plugin);
+ if (NULL != plugin_name) {
+ err("plugin(%s) init failed.", plugin_name);
+ free(plugin_name);
+ }
+ return FALSE;
+ }
+
+ return TRUE;
}
-static gboolean load_plugins(Server *s, const char *path, int flag_test_load)
+static gboolean init_plugins(Server *s)
{
- const gchar *file;
- char *filename;
- GDir *dir;
- void *handle;
- GSList *list;
+ GSList *list = tcore_server_ref_plugins(s);
+
+ while (list != NULL) {
+ if (G_UNLIKELY(FALSE == __init_plugin(list->data))) {
+ list = g_slist_next(list);
+ continue;
+ }
+ list = g_slist_next(list);
+ }
+
+ return TRUE;
+}
+
+static void *__load_plugin(const gchar *filename, struct tcore_plugin_define_desc **desc_out)
+{
+ void *handle = NULL;
+ struct tcore_plugin_define_desc *desc = NULL;
struct stat stat_buf;
char file_date[27];
- TcorePlugin *p;
- struct tcore_plugin_define_desc *desc;
+ handle = dlopen(filename, RTLD_LAZY);
+ if (G_UNLIKELY(NULL == handle)) {
+ err("fail to load '%s': %s", filename, dlerror());
+ return NULL;
+ }
+
+ desc = dlsym(handle, "plugin_define_desc");
+ if (G_UNLIKELY(NULL == desc)) {
+ err("fail to load symbol: %s", dlerror());
+ dlclose(handle);
+ return NULL;
+ }
+
+ dbg("%s plugin", desc->name);
+ dbg(" - path = %s", filename);
+ dbg(" - version = %d", desc->version);
+ dbg(" - priority = %d", desc->priority);
+
+ memset(&stat_buf, 0x00, sizeof(stat_buf));
+ memset(&file_date, '\0', sizeof(file_date));
+
+ if (0 == stat(filename, &stat_buf)) {
+ if (NULL != ctime_r(&stat_buf.st_mtime, file_date)) {
+ if (1 < strlen(file_date))
+ file_date[strlen(file_date)-1] = '\0';
+ dbg(" - date = %s", file_date);
+ }
+ }
+
+ if (G_LIKELY(desc->load)) {
+ if (G_UNLIKELY(FALSE == desc->load())) {
+ warn("false return from load(). skip this plugin");
+ dlclose(handle);
+ return NULL;
+ }
+ }
+
+ if (NULL != desc_out)
+ *desc_out = desc;
+
+ return handle;
+}
+
+static gboolean load_plugins(Server *s, const char *path, gboolean flag_test_load)
+{
+ const gchar *file = NULL;
+ gchar *filename = NULL;
+ GDir *dir = NULL;
+ void *handle = NULL;
+ struct tcore_plugin_define_desc *desc = NULL;
- if ((path == NULL) || (s == NULL))
+ if (!path || !s)
return FALSE;
dir = g_dir_open(path, 0, NULL);
- if (dir == NULL)
+ if (!dir)
return FALSE;
while ((file = g_dir_read_name(dir)) != NULL) {
if (g_str_has_prefix(file, "lib") == TRUE
- || g_str_has_suffix(file, ".so") == FALSE)
+ || g_str_has_suffix(file, ".so") == FALSE)
continue;
filename = g_build_filename(path, file, NULL);
- handle = dlopen(filename, RTLD_NOW);
- if (handle == NULL) {
- dbg("fail to load '%s': %s", filename, dlerror());
+ /* Load a plugin */
+ if (G_UNLIKELY((handle = __load_plugin(filename, &desc)) == NULL)) {
g_free(filename);
continue;
}
+ /* Don't add to server if flag_test_load */
if (flag_test_load) {
dbg("success to load '%s'", filename);
dlclose(handle);
continue;
}
- desc = dlsym(handle, "plugin_define_desc");
- if (desc == NULL) {
- dbg("fail to load symbol: %s", dlerror());
- dlclose(handle);
- g_free(filename);
- continue;
- }
-
- dbg("%s plugin", desc->name);
- dbg(" - path = %s", filename);
- dbg(" - version = %d", desc->version);
- dbg(" - priority = %d", desc->priority);
-
- memset(&stat_buf, 0, sizeof(struct stat));
- if (stat(filename, &stat_buf) == 0) {
- if (ctime_r(&stat_buf.st_mtime, file_date) != NULL) {
- if (strlen(file_date) > 1)
- file_date[strlen(file_date)-1] = '\0';
-
- dbg(" - date = %s", file_date);
- }
- }
-
- if (desc->load) {
- if (desc->load() == FALSE) {
- dbg("false return from load(). skip this plugin");
- dlclose(handle);
- g_free(filename);
- continue;
- }
- }
-
- p = tcore_plugin_new(s, desc, filename, handle);
- tcore_server_add_plugin(s, p);
+ tcore_server_add_plugin(s, tcore_plugin_new(s, desc, filename, handle));
dbg("%s added", desc->name);
g_free(filename);
}
g_dir_close(dir);
- info("plugin load finished");
-
- list = tcore_server_ref_plugins(s);
- for (; list; list = list->next) {
- p = list->data;
- if (p == NULL)
- continue;
-
- desc = (struct tcore_plugin_define_desc *)tcore_plugin_get_description(p);
- if (desc == NULL)
- continue;
-
- if (desc->init == NULL)
- continue;
-
- if (desc->init(p) == FALSE) {
- dbg("plugin(%s) init failed.", tcore_plugin_get_filename(p));
- }
- }
-
- info("plugin init finished");
-
return TRUE;
}
-static void usage(const char *name)
-{
- printf("Usage: %s [OPTION]... [PLUGIN_PATH]\n", name);
- printf("\n");
- printf(" -T, --testload\t run with plugin load test mode and exit\n");
- printf(" -h, --help\t\t display this help and exit\n");
- printf("\n");
-}
-
-static void on_signal_usr1(int signo)
-{
- if (_server == NULL)
- return;
-
- monitor_server_state(_server);
-}
-
int main(int argc, char *argv[])
{
- struct sigaction sigact_usr1;
- Server *s;
- int flag_test_load = 0;
- int opt;
- int opt_index;
+#ifdef TIZEN_DEBUG_ENABLE
+ struct sigaction sigact;
+#endif
+ Server *s = NULL;
+ gboolean flag_test_load = FALSE;
+ int opt = 0, opt_index = 0, ret_code = EXIT_SUCCESS;
+ int daemon_load_count = 0;
struct option options[] = {
- { "help", 0, 0, 0 },
- { "testload", 0, &flag_test_load, 1 },
- { 0, 0, 0, 0 }
+ { "help", 0, 0, 0 },
+ { "testload", 0, &flag_test_load, 1 },
+ { 0, 0, 0, 0 }
};
- char *plugin_path = "/usr/lib/telephony/plugins/";
- char *tcore_ver;
- struct sysinfo info;
+ const char *plugin_path = DEFAULT_PLUGINS_PATH;
+ char *tcore_ver = NULL;
+ struct sysinfo sys_info;
- if (sysinfo(&info) == 0) {
- info("uptime: %ld secs", info.uptime);
- }
+ TIME_CHECK("Starting Telephony");
- info("daemon version: %s", DAEMON_VERSION);
+ /* System Uptime */
+ if (0 == sysinfo(&sys_info))
+ info("uptime: %ld secs", sys_info.uptime);
+ __log_uptime();
+ /* Version Info */
tcore_ver = tcore_util_get_version();
+ info("daemon version: %s", DAEMON_VERSION);
info("libtcore version: %s", tcore_ver);
free(tcore_ver);
-
- sigact_usr1.sa_handler = on_signal_usr1;
- sigemptyset(&sigact_usr1.sa_mask);
- sigaddset(&sigact_usr1.sa_mask, SIGUSR1);
- sigact_usr1.sa_flags = 0;
-
- if (sigaction(SIGUSR1, &sigact_usr1, NULL) < 0) {
+ info("glib version: %u.%u.%u", glib_major_version, glib_minor_version, glib_micro_version);
+
+ /* Telephony reset handling*/
+ vconf_get_int(VCONFKEY_TELEPHONY_DAEMON_LOAD_COUNT,&daemon_load_count);
+ daemon_load_count++;
+ vconf_set_int(VCONFKEY_TELEPHONY_DAEMON_LOAD_COUNT,daemon_load_count);
+ dbg("daemon load count = [%d]", daemon_load_count);
+
+#ifdef TIZEN_DEBUG_ENABLE
+ /* Signal Registration */
+ sigact.sa_handler = telephony_signal_handler;
+ sigemptyset(&sigact.sa_mask);
+ sigact.sa_flags = 0;
+ if (sigaction(SIGTERM, &sigact, NULL) < 0)
+ warn("sigaction(SIGTERM) failed.");
+ if (sigaction(SIGUSR1, &sigact, NULL) < 0)
warn("sigaction(SIGUSR1) failed.");
- }
+#endif
- while (1) {
+ /* Commandline option parser TODO: Replace with GOptionContext */
+ while (TRUE) {
opt = getopt_long(argc, argv, "hT", options, &opt_index);
- if (opt == -1)
+ if (-1 == opt)
break;
switch (opt) {
- case 0:
- switch (opt_index) {
- case 0: // help
- usage(argv[0]);
- return 0;
- break;
- }
- break;
-
- case 'h':
- usage(argv[0]);
+ case 0: {
+ switch (opt_index) {
+ case 0: {
+ __usage_info(argv[0]);
return 0;
- break;
-
- case 'T':
- flag_test_load = 1;
- break;
- }
+ } break;
+ default: {
+ warn("unhandled opt_index.");
+ } break;
+ } /* end switch */
+ } break;
+
+ case 'h': {
+ __usage_info(argv[0]);
+ return 0;
+ } break;
+
+ case 'T': {
+ flag_test_load = TRUE;
+ } break;
+ default: {
+ warn("unhandled opt case.");
+ } break;
+ } /* end switch */
}
if (optind < argc)
info("plugin_path: [%s]", plugin_path);
-#if !GLIB_CHECK_VERSION(2,35,0)
+#if !GLIB_CHECK_VERSION(2, 35, 0)
g_type_init();
#endif
-#if !GLIB_CHECK_VERSION (2, 31, 0)
+#if !GLIB_CHECK_VERSION(2, 31, 0)
g_thread_init(NULL);
#endif
s = tcore_server_new();
- if (s == NULL) {
+ if (G_UNLIKELY(NULL == s)) {
err("server_new failed.");
- goto end;
+ ret_code = EXIT_FAILURE;
+ goto END;
}
_server = s;
- if (load_plugins(s, plugin_path, flag_test_load) == FALSE)
- goto free_end;
+ g_log_set_default_handler(glib_log, s);
- if (flag_test_load)
- goto free_end;
+ /* Load Plugins */
+ if (G_UNLIKELY(FALSE == load_plugins(s, (const char *)plugin_path, flag_test_load))) {
+ err("load_plugins failed.");
+ ret_code = EXIT_FAILURE;
+ goto END;
+ }
- info("server mainloop start");
+ TIME_CHECK("Loading Plugins Complete");
- /* Notification to systemd */
- sd_notify(0, "READY=1");
+ if (flag_test_load) {
+ ret_code = EXIT_SUCCESS;
+ goto END;
+ }
- if (tcore_server_run(s) == FALSE) {
- err("server_run failed.");
+ /* Initialize Plugins */
+ if (G_UNLIKELY(FALSE == init_plugins(s))) {
+ err("init_plugins failed.");
+ ret_code = EXIT_FAILURE;
+ goto END;
}
- /*
- * RUNNING
- */
+ info("server mainloop start");
+ TIME_CHECK("Initializing Plugins Complete. Starting Daemon");
-free_end:
- info("server end");
- tcore_server_free(s);
+ if (G_UNLIKELY(TCORE_RETURN_SUCCESS != tcore_server_run(s))) {
+ err("server_run failed.");
+ ret_code = EXIT_FAILURE;
+ }
-end:
- return EXIT_SUCCESS;
+END:
+ tcore_server_free(s); _server = NULL;
+ return ret_code;
}
/*
* telephony-daemon
*
- * Copyright (c) 2012 Samsung Electronics Co., Ltd. All rights reserved.
+ * Copyright (c) 2013 Samsung Electronics Co. Ltd. All rights reserved.
*
* Contact: Ja-young Gu <jygu@samsung.com>
*
* limitations under the License.
*/
-#include <stdio.h>
-#include <string.h>
-#include <pthread.h>
-#include <unistd.h>
-#include <stdlib.h>
-#include <time.h>
-#include <dlfcn.h>
-#include <getopt.h>
+#include "monitor.h"
+#include <stdlib.h>
#include <glib.h>
-#include <glib-object.h>
-#include <tcore.h>
-#include <plugin.h>
-#include <server.h>
-#include <hal.h>
-#include <queue.h>
-#include <storage.h>
#include <communicator.h>
#include <user_request.h>
+#include <storage.h>
+#include <server.h>
+#include <plugin.h>
+#include <queue.h>
+#include <hal.h>
+#include <core_object.h>
-#include "monitor.h"
+#define NOTUSED(var) (var = var)
-/* Hacking TcoreQueue */
+/* hacking TcoreQueue */
struct tcore_queue_type {
TcorePlugin *plugin;
GQueue *gq;
};
+static void _hash_dump(gpointer key, gpointer value, gpointer user_data)
+{
+ NOTUSED(user_data);
+
+ msg(" - %s: [%s]", key, value);
+}
+
+static void _monitor_core_objects(GSList *list)
+{
+ CoreObject *co;
+ GHashTable *prop;
+
+ do {
+ co = list->data;
+
+ msg(" Name: [%s]", tcore_object_ref_name(co));
+ msg(" - addr: %p", co);
+ msg(" - type: %p", tcore_object_get_type(co));
+ msg(" - hal: %p", tcore_object_get_hal(co));
+
+ prop = tcore_object_ref_property_hash(co);
+ if (prop) {
+ msg(" - Properties: %d", g_hash_table_size(prop));
+ g_hash_table_foreach(prop, _hash_dump, NULL);
+ }
+
+ list = list->next;
+ } while(list);
+}
+
static void _monitor_plugin(Server *s)
{
GSList *list;
+ GSList *co_list;
TcorePlugin *p;
char *str;
msg("-- Plugins --");
list = tcore_server_ref_plugins(s);
- if (list == NULL)
+ if (!list)
return;
do {
msg("Name: [%s]", tcore_plugin_get_description(p)->name);
str = tcore_plugin_get_filename(p);
- msg(" - file: %s", str);
- if (str)
+ if (str) {
+ msg(" - file: %s", str);
free(str);
+ }
msg(" - addr: %p", p);
msg(" - userdata: %p", tcore_plugin_ref_user_data(p));
- msg("");
+ co_list = tcore_plugin_get_core_objects(p);
+ if (co_list) {
+ msg(" - core_object list: %d", g_slist_length(co_list));
+
+ _monitor_core_objects(co_list);
+ g_slist_free(co_list);
+ }
+
+ msg("");
list = list->next;
- } while (list);
+ } while(list);
}
static void _monitor_storage(Server *s)
msg("-- Storages --");
list = tcore_server_ref_storages(s);
- if (list == NULL)
+ if (!list)
return;
do {
msg("");
list = list->next;
- } while (list);
+ } while(list);
}
static void _monitor_communicator(Server *s)
GSList *list;
Communicator *comm;
- msg("-- Communicators --");
+ msg("-- Coomunicators --");
list = tcore_server_ref_communicators(s);
- if (list == NULL)
+ if (!list)
return;
do {
msg("");
list = list->next;
- } while (list);
+ } while(list);
}
-static void _monitor_modems(Server *s)
+static void _monitor_hal(Server *s)
{
GSList *list;
- TcorePlugin *p;
+ TcoreHal *h;
+ TcoreQueue *q;
+ TcorePending *pending;
+ UserRequest *ur;
+ char *str;
+ int qlen;
+ int i;
+ void *data;
+ unsigned int data_len;
- msg("-- Modems --");
+ msg("-- Hals --");
- list = tcore_server_ref_plugins(s);
- if (list == NULL)
+ list = tcore_server_ref_hals(s);
+ if (!list)
return;
- for (; list != NULL; list = g_slist_next(list)) {
- p = list->data;
- if (p == NULL)
+ do {
+ h = list->data;
+
+ str = tcore_hal_get_name(h);
+ if (str) {
+ msg("Name: [%s]", str);
+ free(str);
+ }
+ msg(" - addr: %p", h);
+ msg(" - parent_plugin: %p", tcore_hal_ref_plugin(h));
+ msg(" - userdata: %p", tcore_hal_ref_user_data(h));
+
+ q = tcore_hal_ref_queue(h);
+ if (!q) {
+ msg("");
+ list = list->next;
continue;
+ }
- tcore_server_print_modems(p);
- }
+ if (!(q->gq)) {
+ msg("");
+ list = list->next;
+ continue;
+ }
+
+ qlen = tcore_queue_get_length(q);
+ msg(" - queue: %p, length: %d", q, qlen);
+ msg(" queue_head: %p", g_queue_peek_head(q->gq));
+ for (i = 0; i < qlen; i++) {
+ pending = g_queue_peek_nth(q->gq, i);
+ ur = tcore_pending_ref_user_request(pending);
+ msg(" [%02d] pending=%p, id=0x%x, ur=%p", i, pending, tcore_pending_get_id(pending), ur);
+ if (ur) {
+ msg(" ur request command = 0x%x", tcore_user_request_get_command(ur));
+ }
+ data_len = 0;
+ data = tcore_pending_ref_request_data(pending, &data_len);
+ msg(" data=%p, data_len=%d", data, data_len);
+ }
+ msg(" queue_tail: %p", g_queue_peek_tail(q->gq));
+ msg("");
+
+ list = list->next;
+ } while(list);
}
void monitor_server_state(Server *s)
_monitor_plugin(s);
_monitor_storage(s);
_monitor_communicator(s);
- _monitor_modems(s);
+ _monitor_hal(s);
}
/*
* telephony-daemon
*
- * Copyright (c) 2012 Samsung Electronics Co., Ltd. All rights reserved.
+ * Copyright (c) 2013 Samsung Electronics Co. Ltd. All rights reserved.
*
* Contact: Ja-young Gu <jygu@samsung.com>
*
* limitations under the License.
*/
-#ifndef __MONITIR_H__
-#define __MONITOR_H__
+#pragma once
+#include <tcore.h>
void monitor_server_state(Server *s);
-
-#endif
+++ /dev/null
-[Unit]
-Description=Telephony daemon
-After=modem.service vconf-setup.service
-
-[Service]
-Type=notify
-ExecStart=/usr/bin/telephony-daemon
-
-[Install]
-WantedBy=multi-user.target
<manifest>
<define>
- <domain name="telephony_framework"/>
+ <domain name="telephony_framework" policy="restricted[shared]"/>
<provide>
<label name="telephony_framework::db"/>
<label name="telephony_framework::api_manager"/>
<label name="telephony_framework::api_sim"/>
<label name="telephony_framework::api_sms"/>
<label name="telephony_framework::api_ss"/>
+ <label name="telephony_framework::api_ps_public"/>
+ <label name="telephony_framework::api_ps_profile"/>
+ <label name="telephony_framework::api_ps_private"/>
+ <label name="telephony_framework::api_private"/>
<label name="telephony_framework::vconf"/>
+ <label name="telephony_framework::properties"/>
</provide>
<request>
+ <smack request="telephony_framework::properties" type="rwx"/>
<smack request="dbus" type="rwx"/>
<smack request="sys-assert::core" type="rwxat"/>
<smack request="system::use_internet" type="rwx"/>
+ <smack request="secure-storage::telephony_sim" type="rw"/>
+ <smack request="security-server::api-privilege-by-pid" type="w"/>
+ <smack request="deviced::display" type="rw"/>
+ <smack request="system::vconf" type="rwxat"/>
+ <smack request="system::vconf_system" type="rwxat"/>
</request>
<permit>
<smack permit="dbus" type="rwx"/>
</permit>
</define>
<assign>
- <filesystem path="/usr/lib/systemd/system/telephony.service" label="_" exec_label="none" />
- <filesystem path="/usr/lib/systemd/system/multi-user.target.wants/telephony.service" label="_" exec_label="none" />
+ <filesystem path="/usr/lib/systemd/system/telephony-daemon.service" label="_"/>
+ <filesystem path="/usr/lib/systemd/system/tizen-system.target.wants/telephony-daemon.service" label="_"/>
+ <dbus name="org.tizen.telephony" own="telephony_framework" bus="system">
+ <node name="/org/tizen/telephony">
+ <interface name="org.freedesktop.DBus.Properties">
+ <annotation name="com.tizen.smack" value="telephony_framework::properties"/>
+ </interface>
+ </node>
+ </dbus>
+ <dbus name="com.tcore.ps" own="telephony_framework" bus="system">
+ <node name="/">
+ <interface name="com.tcore.ps.context">
+ <method name="GetProperties">
+ <annotation name="com.tizen.smack" value="telephony_framework::api_ps_public"/>
+ </method>
+ <method name="GetProfile">
+ <annotation name="com.tizen.smack" value="telephony_framework::api_ps_public"/>
+ </method>
+ <method name="Activate">
+ <annotation name="com.tizen.smack" value="telephony_framework::api_ps_private"/>
+ </method>
+ <method name="Deactivate">
+ <annotation name="com.tizen.smack" value="telephony_framework::api_ps_private"/>
+ </method>
+ <method name="SetDefaultConnection">
+ <annotation name="com.tizen.smack" value="telephony_framework::api_ps_profile"/>
+ </method>
+ <method name="ModifyProfile">
+ <annotation name="com.tizen.smack" value="telephony_framework::api_ps_profile"/>
+ </method>
+ <method name="RemoveProfile">
+ <annotation name="com.tizen.smack" value="telephony_framework::api_ps_profile"/>
+ </method>
+ <signal name="PropertyChanged">
+ <annotation name="com.tizen.smack" value="telephony_framework::api_ps_private"/>
+ </signal>
+ </interface>
+ <interface name="com.tcore.ps.master">
+ <method name="GetModems">
+ <annotation name="com.tizen.smack" value="telephony_framework::api_ps_public"/>
+ </method>
+ <signal name="ModemAdded">
+ <annotation name="com.tizen.smack" value="telephony_framework::api_ps_private"/>
+ </signal>
+ <signal name="ModemRemoved">
+ <annotation name="com.tizen.smack" value="telephony_framework::api_ps_private"/>
+ </signal>
+ </interface>
+ <interface name="com.tcore.ps.modem">
+ <method name="GetProperties">
+ <annotation name="com.tizen.smack" value="telephony_framework::api_ps_public"/>
+ </method>
+ <method name="GetServices">
+ <annotation name="com.tizen.smack" value="telephony_framework::api_ps_public"/>
+ </method>
+ <method name="GetProfileList">
+ <annotation name="com.tizen.smack" value="telephony_framework::api_ps_public"/>
+ </method>
+ <method name="AddProfile">
+ <annotation name="com.tizen.smack" value="telephony_framework::api_ps_profile"/>
+ </method>
+ <method name="ResetProfile">
+ <annotation name="com.tizen.smack" value="telephony_framework::api_ps_profile"/>
+ </method>
+ <signal name="PropertyChanged">
+ <annotation name="com.tizen.smack" value="telephony_framework::api_ps_private"/>
+ </signal>
+ <signal name="ServiceAdded">
+ <annotation name="com.tizen.smack" value="telephony_framework::api_ps_private"/>
+ </signal>
+ <signal name="ServiceRemoved">
+ <annotation name="com.tizen.smack" value="telephony_framework::api_ps_private"/>
+ </signal>
+ </interface>
+ <interface name="com.tcore.ps.service">
+ <method name="GetProperties">
+ <annotation name="com.tizen.smack" value="telephony_framework::api_ps_public"/>
+ </method>
+ <method name="GetContexts">
+ <annotation name="com.tizen.smack" value="telephony_framework::api_ps_public"/>
+ </method>
+ <signal name="PropertyChanged">
+ <annotation name="com.tizen.smack" value="telephony_framework::api_ps_private"/>
+ </signal>
+ <signal name="ContextAdded">
+ <annotation name="com.tizen.smack" value="telephony_framework::api_ps_private"/>
+ </signal>
+ <signal name="ContextRemoved">
+ <annotation name="com.tizen.smack" value="telephony_framework::api_ps_private"/>
+ </signal>
+ </interface>
+ </node>
+ </dbus>
</assign>
<request>
<domain name="telephony_framework"/>