summaryrefslogtreecommitdiffstats
path: root/video/out/drm_common.c
diff options
context:
space:
mode:
authorrr- <mkurczew@gmail.com>2015-10-30 18:55:48 +0100
committerwm4 <wm4@nowhere>2015-10-30 20:26:37 +0100
commit03cf69f0a8b847beebf01c4ca4cc39553f7baba6 (patch)
tree6c6523b154adda91fb13b76960c6a27eb51f0a00 /video/out/drm_common.c
parent05e39ec51362d9c23f0652a4ac5017a1b6489e49 (diff)
downloadmpv-03cf69f0a8b847beebf01c4ca4cc39553f7baba6.tar.bz2
mpv-03cf69f0a8b847beebf01c4ca4cc39553f7baba6.tar.xz
vo_drm: check if signal already used
Diffstat (limited to 'video/out/drm_common.c')
-rw-r--r--video/out/drm_common.c28
1 files changed, 23 insertions, 5 deletions
diff --git a/video/out/drm_common.c b/video/out/drm_common.c
index 1ea0e45ae8..4fb74d064c 100644
--- a/video/out/drm_common.c
+++ b/video/out/drm_common.c
@@ -35,15 +35,24 @@
#define EVT_INTERRUPT 255
#define HANDLER_ACQUIRE 0
#define HANDLER_RELEASE 1
+#define RELEASE_SIGNAL SIGUSR1
+#define ACQUIRE_SIGNAL SIGUSR2
static int vt_switcher_pipe[2];
static void vt_switcher_sighandler(int sig)
{
- unsigned char event = sig == SIGUSR1 ? EVT_RELEASE : EVT_ACQUIRE;
+ unsigned char event = sig == RELEASE_SIGNAL ? EVT_RELEASE : EVT_ACQUIRE;
write(vt_switcher_pipe[1], &event, sizeof(event));
}
+static bool has_signal_installed(int signo)
+{
+ struct sigaction act = { 0 };
+ sigaction(signo, 0, &act);
+ return act.sa_handler != 0;
+}
+
int vt_switcher_init(struct vt_switcher *s, struct mp_log *log)
{
s->log = log;
@@ -62,12 +71,21 @@ int vt_switcher_init(struct vt_switcher *s, struct mp_log *log)
return -1;
}
+ if (has_signal_installed(RELEASE_SIGNAL)) {
+ MP_ERR(s, "Can't handle VT release - signal already used\n");
+ return -1;
+ }
+ if (has_signal_installed(ACQUIRE_SIGNAL)) {
+ MP_ERR(s, "Can't handle VT acquire - signal already used\n");
+ return -1;
+ }
+
struct sigaction act;
act.sa_handler = vt_switcher_sighandler;
act.sa_flags = SA_RESTART;
sigemptyset(&act.sa_mask);
- sigaction(SIGUSR1, &act, 0);
- sigaction(SIGUSR2, &act, 0);
+ sigaction(RELEASE_SIGNAL, &act, 0);
+ sigaction(ACQUIRE_SIGNAL, &act, 0);
struct vt_mode vt_mode;
if (ioctl(s->tty_fd, VT_GETMODE, &vt_mode) < 0) {
@@ -76,8 +94,8 @@ int vt_switcher_init(struct vt_switcher *s, struct mp_log *log)
}
vt_mode.mode = VT_PROCESS;
- vt_mode.relsig = SIGUSR1;
- vt_mode.acqsig = SIGUSR2;
+ vt_mode.relsig = RELEASE_SIGNAL;
+ vt_mode.acqsig = ACQUIRE_SIGNAL;
if (ioctl(s->tty_fd, VT_SETMODE, &vt_mode) < 0) {
MP_ERR(s, "VT_SETMODE failed: %s\n", mp_strerror(errno));
return -1;