#define CANDIDATE_NONE 0
#define HYDRA_NONE 0
#define PROCESS_POOL_LAUNCHPAD_SOCK ".launchpad-process-pool-sock"
-#define LAUNCHPAD_LOGGER_SOCK ".launchpad-logger-sock"
#define LOADER_PATH_DEFAULT "/usr/bin/launchpad-loader"
#define LOADER_INFO_PATH "/usr/share/aul"
#define OPT_SHARE_PATH "/opt/share"
launchpad::LoaderMethod method,
bool force);
static gboolean __launchpad_recovery_cb(gpointer data);
-static gboolean __logger_recovery_cb(gpointer data);
static gboolean __handle_queuing_slots(gpointer data) {
candidate_process_context_t* cpc;
_setup_stdio(basename(argv[LOADER_ARG_PATH]));
if (execv(argv[LOADER_ARG_PATH], argv) < 0) {
- _send_message_to_logger(argv[LOADER_ARG_PATH],
- "Failed to prepare candidate process. error(%d:%s)",
- errno, strerror_r(errno, err_buf, sizeof(err_buf)));
- } else {
- _D("Succeeded to prepare candidate_process");
+ fprintf(stderr, "Failed to execute a file. path: %s, errno: %d(%s)\n",
+ argv[LOADER_ARG_PATH], errno,
+ strerror_r(errno, err_buf, sizeof(err_buf)));
+ exit(EXIT_FAILURE);
}
- return -1;
+ return 0;
}
static gboolean __handle_deactivate_event(gpointer user_data) {
_close_all_fds();
- if (execv(argv[LOADER_ARG_PATH], argv) < 0) { /* Flawfinder: ignore */
- _send_message_to_logger(argv[LOADER_ARG_PATH],
- "Failed to execute a file. error(%d:%s)",
- errno, strerror_r(errno, err_buf, sizeof(err_buf)));
- return -1;
+ if (execv(argv[LOADER_ARG_PATH], argv) < 0) {
+ fprintf(stderr, "Failed to execute a file. path: %s, errno: %d(%s)\n",
+ argv[LOADER_ARG_PATH], errno,
+ strerror_r(errno, err_buf, sizeof(err_buf)));
+ exit(EXIT_FAILURE);
}
- /* never reach*/
+
return 0;
}
return 0;
}
-static bool __handle_logger(int fd, io_condition_e cond, void* data) {
- app_pkt_t* pkt;
- struct ucred cr;
- int clifd = -1;
-
- if (cond & (IO_ERR | IO_HUP | IO_NVAL)) {
- _E("fd(%d), io_condition(%d)", fd, cond);
- g_idle_add(__logger_recovery_cb, __logger_channel);
- __logger_channel = nullptr;
- return false;
- }
-
- pkt = _accept_recv_pkt_raw(fd, &clifd, &cr);
- if (!pkt) {
- _E("Failed to receive the packet");
- return true;
- }
-
- if (getuid() != cr.uid) {
- _E("Invalid caller");
- goto end;
- }
-
- if (pkt->len <= 0) {
- _E("Invalid message");
- goto end;
- }
-
- _E("[%d] %s", cr.pid, (const char*)pkt->data);
- launchpad::Log::Print("[ERROR]", "pid(%7d) | message(%s)",
- cr.pid, reinterpret_cast<char*>(pkt->data));
-end:
- if (clifd != -1)
- close(clifd);
-
- free(pkt);
-
- return true;
-}
-
-static int __init_logger_fd(void) {
- int fd;
-
- fd = _create_server_sock(LAUNCHPAD_LOGGER_SOCK);
- if (fd < 0) {
- _E("Failed to create logger socker");
- return -1;
- }
-
- auto cond = IO_IN | IO_PRI | IO_ERR | IO_HUP | IO_NVAL;
- __logger_channel = _io_channel_create(fd, static_cast<io_condition_e>(cond),
- __handle_logger, nullptr);
- if (!__logger_channel) {
- close(fd);
- return -1;
- }
-
- return 0;
-}
-
static void UpdateSlotStates(bool low_memory) {
GList* iter = candidate_slot_list;
while (iter) {
}
}
-static gboolean __logger_recovery_cb(gpointer data) {
- auto channel = static_cast<io_channel_h>(data);
- int ret;
-
- _io_channel_destroy(channel);
-
- ret = __init_logger_fd();
- if (ret < 0) {
- _E("Failed to recover logger socket");
- return G_SOURCE_REMOVE;
- }
-
- _E("[__RECOVERY__] Logger socket");
-
- return G_SOURCE_REMOVE;
-}
-
static gboolean __launchpad_recovery_cb(gpointer data) {
auto channel = static_cast<io_channel_h>(data);
int ret;
return -1;
}
- ret = __init_logger_fd();
- if (ret != 0) {
- _E("__init_logger_fd() failed");
- return -1;
- }
-
ret = __init_label_monitor_fd();
if (ret != 0)
_W("Failed to initialize label monitor");
return 0;
}
-static int __send_raw(int fd, int cmd, unsigned char *data, int datalen)
-{
- app_pkt_t *pkt;
- int ret;
-
- pkt = (app_pkt_t *)calloc(1, sizeof(app_pkt_t) + datalen);
- if (!pkt) {
- _E("Out of memory");
- return -ENOMEM;
- }
-
- pkt->cmd = cmd;
- pkt->len = datalen;
- if (data)
- memcpy(pkt->data, data, pkt->len);
-
- ret = _send_pkt_raw(fd, pkt);
- if (ret < 0) {
- free(pkt);
- return -1;
- }
-
- free(pkt);
-
- return 0;
-}
-
-int _send_message_to_logger(const char *tag, const char *format, ...)
-{
- char fmt[PATH_MAX - 256];
- char buf[PATH_MAX];
- va_list ap;
- int ret;
- int fd;
-
- va_start(ap, format);
- ret = vsnprintf(fmt, sizeof(fmt), format, ap);
- va_end(ap);
- if (ret < 0 || ret >= sizeof(fmt)) {
- _E("vsnprintf() is failed. result(%d)", ret);
- return -1;
- }
-
- snprintf(buf, sizeof(buf), "%s/daemons/%u/.launchpad-logger-sock",
- SOCKET_PATH, getuid());
- fd = __create_client_socket(buf);
- if (fd < 0)
- return -1;
-
- snprintf(buf, sizeof(buf), "%s: %s", tag, fmt);
- ret = __send_raw(fd, 0, (unsigned char *)buf, strlen(buf) + 1);
- if (ret < 0) {
- close(fd);
- return -1;
- }
-
- close(fd);
-
- return 0;
-}
-
void _print_hwc_log(const char *format, ...)
{
char buf[1024];