4 * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
6 * Contact: Jayoun Lee <airjany@samsung.com>, Sewook Park <sewook7.park@samsung.com>, Jaeho Lee <jaeho81.lee@samsung.com>
8 * Licensed under the Apache License, Version 2.0 (the "License");
9 * you may not use this file except in compliance with the License.
10 * You may obtain a copy of the License at
12 * http://www.apache.org/licenses/LICENSE-2.0
14 * Unless required by applicable law or agreed to in writing, software
15 * distributed under the License is distributed on an "AS IS" BASIS,
16 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17 * See the License for the specific language governing permissions and
18 * limitations under the License.
24 #include <sys/signalfd.h>
26 #include "app_signal.h"
30 static inline void __socket_garbage_collector()
33 struct dirent *dentry;
34 char tmp[MAX_LOCAL_BUFSZ];
36 dp = opendir(AUL_SOCK_PREFIX);
40 while ((dentry = readdir(dp)) != NULL) {
41 if (!isdigit(dentry->d_name[0]))
44 snprintf(tmp, MAX_LOCAL_BUFSZ, "/proc/%s", dentry->d_name);
45 if (access(tmp, F_OK) < 0) { /* Flawfinder: ignore */
46 snprintf(tmp, MAX_LOCAL_BUFSZ, "%s/%s", AUL_SOCK_PREFIX,
55 static inline int __send_app_dead_signal(int dead_pid)
61 dbus_error_init(&error);
62 dbus_threads_init_default();
63 bus = dbus_bus_get_private(DBUS_BUS_SYSTEM, &error);
65 _E("Failed to connect to the D-BUS daemon: %s", error.message);
66 dbus_error_free(&error);
70 message = dbus_message_new_signal(AUL_DBUS_PATH,
71 AUL_DBUS_SIGNAL_INTERFACE,
72 AUL_DBUS_APPDEAD_SIGNAL);
74 if (dbus_message_append_args(message,
75 DBUS_TYPE_UINT32, &dead_pid,
76 DBUS_TYPE_INVALID) == FALSE) {
77 _E("Failed to load data error");
81 if (dbus_connection_send(bus, message, NULL) == FALSE) {
82 _E("dbus send error");
86 dbus_connection_flush(bus);
87 dbus_connection_close(bus);
88 dbus_message_unref(message);
90 _D("send dead signal done\n");
95 static inline int __send_app_launch_signal(int launch_pid)
101 dbus_error_init(&error);
102 dbus_threads_init_default();
103 bus = dbus_bus_get_private(DBUS_BUS_SYSTEM, &error);
105 _E("Failed to connect to the D-BUS daemon: %s", error.message);
106 dbus_error_free(&error);
110 message = dbus_message_new_signal(AUL_DBUS_PATH,
111 AUL_DBUS_SIGNAL_INTERFACE,
112 AUL_DBUS_APPLAUNCH_SIGNAL);
114 if (dbus_message_append_args(message,
115 DBUS_TYPE_UINT32, &launch_pid,
116 DBUS_TYPE_INVALID) == FALSE) {
117 _E("Failed to load data error");
121 if (dbus_connection_send(bus, message, NULL) == FALSE) {
122 _E("dbus send error");
126 dbus_connection_flush(bus);
127 dbus_connection_close(bus);
128 dbus_message_unref(message);
130 _D("send launch signal done\n");
135 static int __sigchild_action(void *data)
140 dead_pid = (pid_t) data;
141 _I("dead_pid(%d)", dead_pid);
145 ret = __send_app_dead_signal(dead_pid);
147 _I("__send_app_dead_signal(%d)", ret);
153 static void __launchpad_process_sigchld(struct signalfd_siginfo *info)
159 child_pgid = getpgid(info->ssi_pid);
160 _I("dead_pid = %d pgid = %d", info->ssi_pid, child_pgid);
162 while ((child_pid = waitpid(-1, &status, WNOHANG)) > 0) {
163 if (child_pid == child_pgid)
164 killpg(child_pgid, SIGKILL);
165 __sigchild_action((void *)child_pid);
168 _I("after __sigchild_action");
173 static inline int __signal_init(void)
176 for (i = 0; i < _NSIG; i++) {
178 /* controlled by sys-assert package*/
196 static inline int __signal_get_sigchld_fd(void)
202 sigaddset(&mask, SIGCHLD);
204 if (sigprocmask(SIG_BLOCK, &mask, &oldmask) == -1)
205 _E("failed to sigprocmask");
207 sfd = signalfd(-1, &mask, SFD_NONBLOCK | SFD_CLOEXEC);
209 _E("failed to create signalfd for SIGCHLD");
216 static inline int __signal_unblock_sigchld(void)
218 if(sigprocmask(SIG_SETMASK, &oldmask, NULL) < 0) {
219 _E("SIG_SETMASK error");
223 _D("SIGCHLD unblocked");
227 static inline int __signal_fini(void)
229 #ifndef PRELOAD_ACTIVATE
231 for (i = 0; i < _NSIG; i++)