#include <mm_error.h>
#include <mm_debug.h>
#include <errno.h>
-#include <glib.h>
#include <pthread.h>
#include <signal.h>
EXPORT_API
int mm_session_init(int sessiontype)
{
- debug_fenter();
- return mm_session_init_ex(sessiontype, NULL, NULL);
- debug_fleave();
-}
-
-EXPORT_API
-int mm_session_init_ex(int sessiontype, session_callback_fn callback, void* user_param)
-{
int result = MM_ERROR_NONE;
int ltype = 0;
bool do_not_update_session_info = false;
debug_log("type : %d", sessiontype);
if (sessiontype < MM_SESSION_TYPE_MEDIA || sessiontype >= MM_SESSION_TYPE_NUM) {
- debug_error("Invalid argument %d",sessiontype);
+ debug_error("Invalid argument %d", sessiontype);
return MM_ERROR_INVALID_ARGUMENT;
}
}
}
- /* Monitor Callback */
- if (NULL == callback) {
- debug_warning("Null callback function");
- } else {
- debug_warning("It was deprecated, do not use monitor callback, callback(%p), user_param(%p)", callback, user_param);
- }
-
g_session_type = sessiontype;
if (!do_not_update_session_info) {
}
debug_log("[current] session_type: %d, session_option: %x", ltype, loption);
- if (update_type == MM_SESSION_UPDATE_TYPE_ADD) {
+ if (update_type == MM_SESSION_UPDATE_TYPE_ADD)
loption |= options;
- } else if (update_type == MM_SESSION_UPDATE_TYPE_REMOVE) {
+ else if (update_type == MM_SESSION_UPDATE_TYPE_REMOVE)
loption &= ~options;
- }
result = _mm_session_util_write_information(-1, ltype, loption);
if (result) {
}
EXPORT_API
-int mm_session_add_watch_callback(int watchevent, int watchstate, watch_callback_fn callback, void* user_param)
-{
- debug_fenter();
-
- debug_fleave();
-
- return MM_ERROR_NOT_SUPPORT_API;
-}
-
-EXPORT_API
int mm_session_get_current_type(int *sessiontype)
{
int result = MM_ERROR_NONE;
/* Check monitor handle */
result = _mm_session_util_delete_information(-1);
- if(result != MM_ERROR_NONE)
+ if (result != MM_ERROR_NONE)
return result;
debug_fleave();
}
EXPORT_API
-int mm_session_remove_watch_callback(int watchevent, int watchstate)
-{
- debug_fenter();
-
- debug_fleave();
-
- return MM_ERROR_NOT_SUPPORT_API;
-}
-
-EXPORT_API
-int mm_session_set_subsession(mm_subsession_t subsession, mm_subsession_option_t option)
-{
- debug_fenter();
-
- debug_fleave();
-
- return MM_ERROR_NOT_SUPPORT_API;
-}
-
-EXPORT_API
-int mm_session_get_subsession(mm_subsession_t *subsession)
-{
- debug_fenter();
-
- debug_fleave();
-
- return MM_ERROR_NOT_SUPPORT_API;
-}
-
-EXPORT_API
-int mm_session_set_subevent(mm_session_sub_t subevent)
-{
- debug_fenter();
-
- debug_fleave();
-
- return MM_ERROR_NOT_SUPPORT_API;
-}
-
-EXPORT_API
-int mm_session_get_subevent(mm_session_sub_t *subevent)
-{
- debug_fenter();
-
- debug_fleave();
-
- return MM_ERROR_NOT_SUPPORT_API;
-}
-
-EXPORT_API
-int mm_session_reset_resumption_info(void)
-{
- debug_fenter();
-
- debug_fleave();
-
- return MM_ERROR_NOT_SUPPORT_API;
-}
-
-EXPORT_API
int _mm_session_util_delete_information(int app_pid)
{
pid_t mypid;
char filename[MAX_FILE_LENGTH];
- if(app_pid == -1)
+ if (app_pid == -1)
mypid = getpid();
else
mypid = (pid_t)app_pid;
////// DELETE SESSION TYPE /////////
snprintf(filename, sizeof(filename)-1, "/tmp/mm_session_%d", mypid);
- if(-1 == unlink(filename))
+ if (-1 == unlink(filename))
return MM_ERROR_FILE_NOT_FOUND;
////// DELETE SESSION TYPE /////////
int fd = -1;
char filename[MAX_FILE_LENGTH];
- if(sessiontype < MM_SESSION_TYPE_MEDIA || sessiontype >= MM_SESSION_TYPE_NUM) {
+ if (sessiontype < MM_SESSION_TYPE_MEDIA || sessiontype >= MM_SESSION_TYPE_NUM)
return MM_ERROR_INVALID_ARGUMENT;
- }
- if(app_pid == -1)
+ if (app_pid == -1)
mypid = getpid();
else
mypid = (pid_t)app_pid;
////// WRITE SESSION TYPE /////////
snprintf(filename, sizeof(filename)-1, "/tmp/mm_session_%d", mypid);
- fd = open(filename, O_WRONLY | O_CREAT, 0644 );
- if(fd < 0) {
- debug_error("open() failed with %d",errno);
+ fd = open(filename, O_WRONLY | O_CREAT, 0644);
+ if (fd < 0) {
+ debug_error("open() failed with %d", errno);
return MM_ERROR_FILE_WRITE;
}
sessiontype = sessiontype << 16;
write(fd, &sessiontype, sizeof(int));
- if(0 > fchmod (fd, 00777)) {
+ if (0 > fchmod(fd, 00777))
debug_error("fchmod failed with %d", errno);
- } else {
+ else
debug_warning("write sessiontype(%d) to /tmp/mm_session_%d", sessiontype >> 16, mypid);
- }
+
close(fd);
////// WRITE SESSION TYPE /////////
debug_fenter();
- if(sessiontype == NULL)
+ if (sessiontype == NULL)
return MM_ERROR_INVALID_ARGUMENT;
- if(app_pid == -1)
+ if (app_pid == -1)
mypid = getpid();
else
mypid = (pid_t)app_pid;
////// READ SESSION TYPE /////////
snprintf(filename, sizeof(filename)-1, "/tmp/mm_session_%d", mypid);
fd = open(filename, O_RDONLY);
- if(fd < 0) {
+ if (fd < 0)
return MM_ERROR_INVALID_HANDLE;
- }
+
read(fd, sessiontype, sizeof(int));
*sessiontype = *sessiontype >> 16;
debug_warning("read sessiontype(%d) from /tmp/mm_session_%d", *sessiontype, mypid);
char filename[MAX_FILE_LENGTH];
int result_info = 0;
- if(session_type < MM_SESSION_TYPE_MEDIA || session_type >= MM_SESSION_TYPE_NUM) {
+ if ((session_type != MM_SESSION_TYPE_REPLACED_BY_STREAM) &&
+ (session_type < MM_SESSION_TYPE_MEDIA || session_type >= MM_SESSION_TYPE_NUM)) {
return MM_ERROR_INVALID_ARGUMENT;
}
- if(flags < 0) {
+ if (flags < 0)
return MM_ERROR_INVALID_ARGUMENT;
- }
- if(app_pid == -1) {
+ if (app_pid == -1)
mypid = getpid();
- } else {
+ else
mypid = (pid_t)app_pid;
- }
////// WRITE SESSION INFO /////////
snprintf(filename, sizeof(filename)-1, "/tmp/mm_session_%d", mypid);
- fd = open(filename, O_WRONLY | O_CREAT, 0644 );
- if(fd < 0) {
- debug_error("open() failed with %d",errno);
+ fd = open(filename, O_WRONLY | O_CREAT, 0644);
+ if (fd < 0) {
+ debug_error("open() failed with %d", errno);
return MM_ERROR_FILE_WRITE;
}
result_info = (flags) | (session_type << 16);
write(fd, &result_info, sizeof(int));
- if(0 > fchmod (fd, 00777)) {
+ if (0 > fchmod(fd, 00777))
debug_error("fchmod failed with %d", errno);
- } else {
+ else
debug_warning("write session information(%x) to /tmp/mm_session_%d", result_info, mypid);
- }
close(fd);
////// WRITE SESSION INFO /////////
debug_fenter();
- if(session_type == NULL || flags == NULL) {
+ if (session_type == NULL || flags == NULL)
return MM_ERROR_INVALID_ARGUMENT;
- }
- if(app_pid == -1) {
+ if (app_pid == -1)
mypid = getpid();
- } else {
+ else
mypid = (pid_t)app_pid;
- }
////// READ SESSION INFO /////////
snprintf(filename, sizeof(filename)-1, "/tmp/mm_session_%d", mypid);
fd = open(filename, O_RDONLY);
- if(fd < 0) {
+ if (fd < 0)
return MM_ERROR_INVALID_HANDLE;
- }
read(fd, &result_info, sizeof(int));
*session_type = result_info >> 16;
*flags = result_info & 0x0000ffff;
return MM_ERROR_NONE;
}
-void __session_signal_handler(int signo)
+void __session_signal_handler(int signo, siginfo_t *siginfo, void *context)
{
- char* filename = NULL;
+ char filename[MAX_FILE_LENGTH];
char str_error[256];
debug_warning("ENTER, sig.num(%d)", signo);
sigfillset(&all_mask);
sigprocmask(SIG_BLOCK, &all_mask, &old_mask);
- filename = g_strdup_printf("/tmp/mm_session_%d", getpid());
+ snprintf(filename, sizeof(filename) - 1, "/tmp/mm_session_%d", getpid());
if (!remove(filename)) {
debug_log(" remove %s success\n", filename);
} else {
- strerror_r (errno, str_error, sizeof (str_error));
+ strerror_r(errno, str_error, sizeof(str_error));
debug_error(" remove %s failed with %s\n", filename, str_error);
}
- g_free(filename);
-
sigprocmask(SIG_SETMASK, &old_mask, NULL);
/* signal unblock ------------ */
switch (signo) {
case SIGINT:
- sigaction(SIGINT, &session_int_old_action, NULL);
- raise(signo);
+ if (session_int_old_action.sa_sigaction)
+ session_int_old_action.sa_sigaction(signo, siginfo, context);
+ else
+ sigaction(signo, &session_int_old_action, NULL);
break;
case SIGABRT:
- sigaction(SIGABRT, &session_abrt_old_action, NULL);
- raise(signo);
+ if (session_abrt_old_action.sa_sigaction)
+ session_abrt_old_action.sa_sigaction(signo, siginfo, context);
+ else
+ sigaction(signo, &session_abrt_old_action, NULL);
break;
case SIGSEGV:
- sigaction(SIGSEGV, &session_segv_old_action, NULL);
- raise(signo);
+ if (session_segv_old_action.sa_sigaction)
+ session_segv_old_action.sa_sigaction(signo, siginfo, context);
+ else
+ sigaction(signo, &session_segv_old_action, NULL);
break;
case SIGTERM:
- sigaction(SIGTERM, &session_term_old_action, NULL);
- raise(signo);
+ if (session_term_old_action.sa_sigaction)
+ session_term_old_action.sa_sigaction(signo, siginfo, context);
+ else
+ sigaction(signo, &session_term_old_action, NULL);
break;
case SIGSYS:
- sigaction(SIGSYS, &session_sys_old_action, NULL);
- raise(signo);
+ if (session_sys_old_action.sa_sigaction)
+ session_sys_old_action.sa_sigaction(signo, siginfo, context);
+ else
+ sigaction(signo, &session_sys_old_action, NULL);
break;
case SIGXCPU:
- sigaction(SIGXCPU, &session_xcpu_old_action, NULL);
- raise(signo);
+ if (session_xcpu_old_action.sa_sigaction)
+ session_xcpu_old_action.sa_sigaction(signo, siginfo, context);
+ else
+ sigaction(signo, &session_xcpu_old_action, NULL);
break;
default:
break;
void __mmsession_initialize(void)
{
struct sigaction session_action;
- session_action.sa_handler = __session_signal_handler;
- session_action.sa_flags = SA_NOCLDSTOP;
+ session_action.sa_sigaction = __session_signal_handler;
+ session_action.sa_flags = SA_NOCLDSTOP | SA_SIGINFO;
debug_fenter();