Changes: return application's exit status to invoker

pull/1/head
Alexey Shilov 15 years ago
parent bbe2bb8463
commit f8f18c9026

@ -223,6 +223,22 @@ static uint32_t invoker_recv_pid(int fd)
return pid; 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) static bool invoker_send_magic(int fd, int options)
{ {
// Send magic. // 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, static int invoke(int prog_argc, char **prog_argv, char *prog_name,
enum APP_TYPE app_type, int magic_options, bool wait_term) enum APP_TYPE app_type, int magic_options, bool wait_term)
{ {
int status = 0;
if (prog_name && prog_argv) if (prog_name && prog_argv)
{ {
errno = 0; errno = 0;
@ -425,8 +443,8 @@ static int invoke(int prog_argc, char **prog_argv, char *prog_name,
// forward signals to invoked process // forward signals to invoked process
sigs_init(); sigs_init();
char dummy_buf = 0; // wait for exit status from invoked application
recv(fd, (void *)&dummy_buf, 0, MSG_WAITALL); status = invoker_recv_exit(fd);
// restore default signal handlers // restore default signal handlers
sigs_restore(); sigs_restore();
@ -434,6 +452,7 @@ static int invoke(int prog_argc, char **prog_argv, char *prog_name,
close(fd); close(fd);
} }
return status;
} }
int main(int argc, char *argv[]) int main(int argc, char *argv[])

@ -87,7 +87,7 @@ void Booster::run()
if (m_conn->isReportAppExitStatusNeeded()) if (m_conn->isReportAppExitStatusNeeded())
{ {
m_conn->reportAppExitStatus(ret_val); m_conn->sendAppExitStatus(ret_val);
m_conn->closeConn(); m_conn->closeConn();
Connection::closeAllSockets(); Connection::closeAllSockets();
} }

@ -234,6 +234,14 @@ bool Connection::sendPid(pid_t pid)
return true; return true;
} }
bool Connection::sendAppExitStatus(int status)
{
sendMsg(INVOKER_MSG_EXIT);
sendMsg(status);
return true;
}
int Connection::receiveMagic() int Connection::receiveMagic()
{ {
uint32_t magic = 0; uint32_t magic = 0;
@ -525,8 +533,3 @@ bool Connection::isReportAppExitStatusNeeded()
return m_sendPid; return m_sendPid;
} }
void Connection::reportAppExitStatus(int status)
{
//todo: send status to invoker
}

@ -80,7 +80,7 @@ public:
bool isReportAppExitStatusNeeded(); bool isReportAppExitStatusNeeded();
//! \brief Send application exit status to invoker //! \brief Send application exit status to invoker
void reportAppExitStatus(int status); bool sendAppExitStatus(int status);
/*! \brief Initialize a file socket. /*! \brief Initialize a file socket.
* \param socketId Path to the socket file * \param socketId Path to the socket file

Loading…
Cancel
Save