1
/****************************************************************************
2
**
3
** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
4
** All rights reserved.
5
** Contact: Nokia Corporation (qt-info@nokia.com)
6
**
7
** This file is part of the tools applications of the Qt Toolkit.
8
**
9
** $QT_BEGIN_LICENSE:LGPL$
10
** GNU Lesser General Public License Usage
11
** This file may be used under the terms of the GNU Lesser General Public
12
** License version 2.1 as published by the Free Software Foundation and
13
** appearing in the file LICENSE.LGPL included in the packaging of this
14
** file. Please review the following information to ensure the GNU Lesser
15
** General Public License version 2.1 requirements will be met:
16
** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
17
**
18
** In addition, as a special exception, Nokia gives you certain additional
19
** rights. These rights are described in the Nokia Qt LGPL Exception
20
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
21
**
22
** GNU General Public License Usage
23
** Alternatively, this file may be used under the terms of the GNU General
24
** Public License version 3.0 as published by the Free Software Foundation
25
** and appearing in the file LICENSE.GPL included in the packaging of this
26
** file. Please review the following information to ensure the GNU General
27
** Public License version 3.0 requirements will be met:
28
** http://www.gnu.org/copyleft/gpl.html.
29
**
30
** Other Usage
31
** Alternatively, this file may be used in accordance with the terms and
32
** conditions contained in a signed written agreement between you and Nokia.
33
**
34
**
35
**
36
**
37
**
38
** $QT_END_LICENSE$
39
**
40
****************************************************************************/
41
42
#include "ossignalconverter_p.h"
43
#include <signal.h>
44
#include <QTimer>
45
#include <stdio.h>
46
47
Q_GLOBAL_STATIC(OsSignalConverter, osSignalConverter);
48
49
OsSignalConverter* OsSignalConverter::instance()
50
{
51
    return osSignalConverter();
52
}
53
54
OsSignalConverter::OsSignalConverter()
55
: d(new OsSignalConverterPrivate(this))
56
{
57
};
58
59
OsSignalConverter::~OsSignalConverter()
60
{
61
}
62
63
OsSignalConverterPrivate::OsSignalConverterPrivate(OsSignalConverter* owner)
64
: QObject(owner), q(owner), poller(new QTimer(this))
65
{
66
    trap();
67
    connect(poller, SIGNAL(timeout()), this, SLOT(poll()));
68
    poller->start(1000);
69
}
70
71
OsSignalConverterPrivate::~OsSignalConverterPrivate()
72
{
73
    untrap();
74
}
75
76
void OsSignalConverterPrivate::trap()
77
{
78
    signal(SIGINT, handler);
79
    signal(SIGTERM, handler);
80
#ifdef SIGBREAK
81
    signal(SIGBREAK, handler);
82
#endif
83
#ifdef SIGHUP
84
    signal(SIGHUP, handler);
85
#endif
86
#ifdef SIGQUIT
87
    signal(SIGQUIT, handler);
88
#endif
89
}
90
91
void OsSignalConverterPrivate::untrap()
92
{
93
    signal(SIGINT, SIG_DFL);
94
    signal(SIGTERM, SIG_DFL);
95
#ifdef SIGBREAK
96
    signal(SIGBREAK, SIG_DFL);
97
#endif
98
#ifdef SIGHUP
99
    signal(SIGHUP, SIG_DFL);
100
#endif
101
#ifdef SIGQUIT
102
    signal(SIGQUIT, SIG_DFL);
103
#endif
104
}
105
106
void OsSignalConverterPrivate::handler(int sig)
107
{
108
    untrap(); //allow 2nd ctrl-c to really kill us
109
    terminateRequest = sig;
110
}
111
112
void OsSignalConverterPrivate::poll()
113
{
114
    if (terminateRequest) {
115
        fprintf(stderr, "\n*** caught signal %d, terminating ***\n", terminateRequest);
116
        poller->stop();
117
        emit q->terminate();
118
    }
119
}
120
121
sig_atomic_t OsSignalConverterPrivate::terminateRequest;