X-Git-Url: https://sigrok.org/gitweb/?p=pulseview.git;a=blobdiff_plain;f=signalhandler.cpp;h=71f66f559b4b6b5711b83dfafce691e8aa2dc17c;hp=a3ef6b82e8755c7d579da5e46f2f199395138acf;hb=f3d66e52ed6b454ea7a0662d5e6367e230116a2b;hpb=7a255aa9c51ebb41bb629f6d327560dcfa18433f diff --git a/signalhandler.cpp b/signalhandler.cpp index a3ef6b82..71f66f55 100644 --- a/signalhandler.cpp +++ b/signalhandler.cpp @@ -1,94 +1,93 @@ /* - -Copyright 2013 Adam Reichold - -This file is part of qpdfview. - -qpdfview is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 2 of the License, or -(at your option) any later version. - -qpdfview is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with qpdfview. If not, see . - -*/ - -#include "signalhandler.h" - + * This file is part of the PulseView project. + * + * Copyright (C) 2013 Adam Reichold + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "signalhandler.hpp" + +#include #include +#include #include #include +#include #include -int SignalHandler::s_sockets[2]; +int SignalHandler::sockets_[2]; -bool SignalHandler::prepareSignals() +bool SignalHandler::prepare_signals() { - if(socketpair(AF_UNIX, SOCK_STREAM, 0, s_sockets) != 0) - { - return false; - } - - struct sigaction sigAction; - - sigAction.sa_handler = SignalHandler::handleSignals; - sigemptyset(&sigAction.sa_mask); - sigAction.sa_flags = SA_RESTART; - - if(sigaction(SIGINT, &sigAction, 0) != 0) - { - close(s_sockets[0]); - close(s_sockets[1]); + if(socketpair(AF_UNIX, SOCK_STREAM, 0, sockets_) != 0) + return false; - return false; - } + struct sigaction sig_action; - if(sigaction(SIGTERM, &sigAction, 0) != 0) - { - close(s_sockets[0]); - close(s_sockets[1]); + sig_action.sa_handler = SignalHandler::handle_signals; + sigemptyset(&sig_action.sa_mask); + sig_action.sa_flags = SA_RESTART; - return false; - } + if(sigaction(SIGINT, &sig_action, 0) != 0 || + sigaction(SIGTERM, &sig_action, 0) != 0) { + close(sockets_[0]); + close(sockets_[1]); + return false; + } - return true; + return true; } SignalHandler::SignalHandler(QObject* parent) : QObject(parent), - m_socketNotifier(0) + socket_notifier_(0) { - m_socketNotifier = new QSocketNotifier(s_sockets[1], QSocketNotifier::Read, this); - connect(m_socketNotifier, SIGNAL(activated(int)), SLOT(on_socketNotifier_activated())); + socket_notifier_ = new QSocketNotifier(sockets_[1], + QSocketNotifier::Read, this); + connect(socket_notifier_, SIGNAL(activated(int)), + SLOT(on_socket_notifier_activated())); } -void SignalHandler::on_socketNotifier_activated() +void SignalHandler::on_socket_notifier_activated() { - m_socketNotifier->setEnabled(false); - - int sigNumber; - read(s_sockets[1], &sigNumber, sizeof(int)); - - switch(sigNumber) - { - case SIGINT: - emit sigIntReceived(); - break; - case SIGTERM: - emit sigTermReceived(); - break; - } - - m_socketNotifier->setEnabled(true); + socket_notifier_->setEnabled(false); + + int sig_number; + if(read(sockets_[1], &sig_number, sizeof(int)) != sizeof(int)) { + qDebug() << "Failed to catch signal"; + abort(); + } + + switch(sig_number) + { + case SIGINT: + Q_EMIT int_received(); + break; + case SIGTERM: + Q_EMIT term_received(); + break; + } + + socket_notifier_->setEnabled(true); } -void SignalHandler::handleSignals(int sigNumber) +void SignalHandler::handle_signals(int sig_number) { - write(s_sockets[0], &sigNumber, sizeof(int)); + if(write(sockets_[0], &sig_number, sizeof(int)) != sizeof(int)) { + // Failed to handle signal + abort(); + } }