From f8f18c9026e7fe106b541f8281645e0b8a46f8b2 Mon Sep 17 00:00:00 2001 From: Alexey Shilov Date: Mon, 16 Aug 2010 15:54:43 +0300 Subject: [PATCH] Changes: return application's exit status to invoker --- src/invoker/invoker.c | 23 +++++++++++++++++++++-- src/launcher/booster.cpp | 2 +- src/launcher/connection.cpp | 13 ++++++++----- src/launcher/connection.h | 2 +- 4 files changed, 31 insertions(+), 9 deletions(-) diff --git a/src/invoker/invoker.c b/src/invoker/invoker.c index 7dd1349..d6b7ccc 100644 --- a/src/invoker/invoker.c +++ b/src/invoker/invoker.c @@ -223,6 +223,22 @@ static uint32_t invoker_recv_pid(int fd) return pid; } +static uint32_t invoker_recv_exit(int fd) +{ + uint32_t action, status; + + /* Receive action. */ + invoke_recv_msg(fd, &action); + + if (action != INVOKER_MSG_EXIT) + die(1, "receiving bad exit status (%08x)\n", action); + + /* Receive pid. */ + invoke_recv_msg(fd, &status); + return status; +} + + static bool invoker_send_magic(int fd, int options) { // Send magic. @@ -390,6 +406,8 @@ static unsigned int get_delay(char *delay_arg) static int invoke(int prog_argc, char **prog_argv, char *prog_name, enum APP_TYPE app_type, int magic_options, bool wait_term) { + int status = 0; + if (prog_name && prog_argv) { errno = 0; @@ -425,8 +443,8 @@ static int invoke(int prog_argc, char **prog_argv, char *prog_name, // forward signals to invoked process sigs_init(); - char dummy_buf = 0; - recv(fd, (void *)&dummy_buf, 0, MSG_WAITALL); + // wait for exit status from invoked application + status = invoker_recv_exit(fd); // restore default signal handlers sigs_restore(); @@ -434,6 +452,7 @@ static int invoke(int prog_argc, char **prog_argv, char *prog_name, close(fd); } + return status; } int main(int argc, char *argv[]) diff --git a/src/launcher/booster.cpp b/src/launcher/booster.cpp index 1b497cb..9e5a0c6 100644 --- a/src/launcher/booster.cpp +++ b/src/launcher/booster.cpp @@ -87,7 +87,7 @@ void Booster::run() if (m_conn->isReportAppExitStatusNeeded()) { - m_conn->reportAppExitStatus(ret_val); + m_conn->sendAppExitStatus(ret_val); m_conn->closeConn(); Connection::closeAllSockets(); } diff --git a/src/launcher/connection.cpp b/src/launcher/connection.cpp index 13c7ad0..da5e6ef 100644 --- a/src/launcher/connection.cpp +++ b/src/launcher/connection.cpp @@ -234,6 +234,14 @@ bool Connection::sendPid(pid_t pid) return true; } +bool Connection::sendAppExitStatus(int status) +{ + sendMsg(INVOKER_MSG_EXIT); + sendMsg(status); + + return true; +} + int Connection::receiveMagic() { uint32_t magic = 0; @@ -525,8 +533,3 @@ bool Connection::isReportAppExitStatusNeeded() return m_sendPid; } -void Connection::reportAppExitStatus(int status) -{ - //todo: send status to invoker -} - diff --git a/src/launcher/connection.h b/src/launcher/connection.h index c81f8af..733b2ed 100644 --- a/src/launcher/connection.h +++ b/src/launcher/connection.h @@ -80,7 +80,7 @@ public: bool isReportAppExitStatusNeeded(); //! \brief Send application exit status to invoker - void reportAppExitStatus(int status); + bool sendAppExitStatus(int status); /*! \brief Initialize a file socket. * \param socketId Path to the socket file