Fixes: NB#273378 - Boosters should restore original signal handlers modified by applauncherd

RevBy: Dmitry Rozenshtein, Pertti Kellomaki
pull/1/head
Alexey Shilov 15 years ago
parent 2350ee17e5
commit 4c8ecba811

1
debian/changelog vendored

@ -2,6 +2,7 @@ applauncherd (1.1.0) unstable; urgency=low
* Fixes: NB#262604 - applauncherd not buildable with eglibc 2.12
* Fixes: NB#248543 - [SSU]:Error seen at 'invoker: error: Can't send signal to application: No such process '
* Fixes: NB#273378 - Boosters should restore original signal handlers modified by applauncherd
-- Juha Lintula <juha.lintula@nokia.com> Tue, 14 Jun 2011 14:55:06 +0300

@ -405,12 +405,8 @@ void Daemon::forkBooster(char type, int sleepTime)
if (newPid == 0) /* Child process */
{
// Reset used signal handlers
signal(SIGCHLD, SIG_DFL);
signal(SIGTERM, SIG_DFL);
signal(SIGUSR1, SIG_DFL);
signal(SIGUSR2, SIG_DFL);
signal(SIGPIPE, SIG_DFL);
// Restore used signal handlers
restoreUnixSignalHandlers();
// Will get this signal if applauncherd dies
prctl(PR_SET_PDEATHSIG, SIGHUP);
@ -767,6 +763,33 @@ void Daemon::killBoosters()
// in order to automatically start new boosters.
}
void Daemon::setUnixSignalHandler(int signum, sighandler_t handler)
{
struct sigaction *oldAct = new struct sigaction();
struct sigaction newAct;
newAct.sa_handler = handler;
sigemptyset(&newAct.sa_mask);
newAct.sa_flags |= SA_RESTART;
if (sigaction(signum, &newAct, oldAct) == 0)
{
m_originalSigHandlers[signum] = oldAct;
} else {
throw std::runtime_error("Daemon: Failed to set signal handler");
}
}
void Daemon::restoreUnixSignalHandlers()
{
for (SigHandlerMap::iterator it = m_originalSigHandlers.begin(); it != m_originalSigHandlers.end(); it++ )
{
sigaction(it->first, it->second, NULL);
}
m_originalSigHandlers.clear();
}
Daemon::~Daemon()
{
delete m_socketManager;

@ -97,6 +97,16 @@ public:
*/
int sigPipeFd() const;
/*!
* Set unix signal handler and save its original value.
*/
void setUnixSignalHandler(int signum, sighandler_t handler);
/*!
* Restore unix signal handlers to their saved values.
*/
void restoreUnixSignalHandlers();
private:
//! Disable copy-constructor
@ -221,6 +231,10 @@ private:
//! Single instance plugin handle
SingleInstance * m_singleInstance;
//! Original unix signal handlers are saved here
typedef map<int, struct sigaction*> SigHandlerMap;
SigHandlerMap m_originalSigHandlers;
#ifdef UNIT_TEST
friend class Ut_Daemon;
#endif

@ -93,12 +93,13 @@ DECL_EXPORT int main(int argc, char * argv[])
// Get fd for signal pipe.
g_sigPipeFd = myDaemon.sigPipeFd();
// Install signal handlers
signal(SIGCHLD, sigChldHandler); // reap zombies
signal(SIGTERM, sigTermHandler); // exit launcher
signal(SIGUSR1, sigUsr1Handler); // enter normal mode from boot mode
signal(SIGUSR2, sigUsr2Handler); // enter boot mode (same as --boot-mode)
signal(SIGPIPE, sigPipeHandler); // broken invoker's pipe
// Install signal handlers. The original handlers are saved
// in the daemon instance so that they can be restored in boosters.
myDaemon.setUnixSignalHandler(SIGCHLD, sigChldHandler); // reap zombies
myDaemon.setUnixSignalHandler(SIGTERM, sigTermHandler); // exit launcher
myDaemon.setUnixSignalHandler(SIGUSR1, sigUsr1Handler); // enter normal mode from boot mode
myDaemon.setUnixSignalHandler(SIGUSR2, sigUsr2Handler); // enter boot mode (same as --boot-mode)
myDaemon.setUnixSignalHandler(SIGPIPE, sigPipeHandler); // broken invoker's pipe
// Run the main loop
myDaemon.run();

Loading…
Cancel
Save