util-src/signal.c
author Kim Alvefur <zash@zash.se>
Sat, 24 Feb 2024 01:00:44 +0100
changeset 13445 6d96b6eeee5a
parent 13443 1e229d710a3c
child 13452 93b4ce0115f0
permissions -rw-r--r--
util.signal: Wrap signalfd in an userdatum for gc handling etc
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
988
8cb9a0d59e78 util.lsignal: Add lsignal library for catching POSIX signals
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
     1
/*
2405
88f73ee1c46f util.signal: Update header comment for new filename
Matthew Wild <mwild1@gmail.com>
parents: 2343
diff changeset
     2
 * signal.c -- Signal Handler Library for Lua
988
8cb9a0d59e78 util.lsignal: Add lsignal library for catching POSIX signals
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
     3
 *
2431
c4d32b35fe60 util.signal: Update version in header, and author's email
Matthew Wild <mwild1@gmail.com>
parents: 2430
diff changeset
     4
 * Version: 1.000+changes
988
8cb9a0d59e78 util.lsignal: Add lsignal library for catching POSIX signals
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
     5
 *
2431
c4d32b35fe60 util.signal: Update version in header, and author's email
Matthew Wild <mwild1@gmail.com>
parents: 2430
diff changeset
     6
 * Copyright (C) 2007  Patrick J. Donnelly (batrick@batbytes.com)
988
8cb9a0d59e78 util.lsignal: Add lsignal library for catching POSIX signals
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
     7
 *
8cb9a0d59e78 util.lsignal: Add lsignal library for catching POSIX signals
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
     8
 * This software is distributed under the same license as Lua 5.0:
8cb9a0d59e78 util.lsignal: Add lsignal library for catching POSIX signals
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
     9
 *
8cb9a0d59e78 util.lsignal: Add lsignal library for catching POSIX signals
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    10
 * Permission is hereby granted, free of charge, to any person obtaining a
8cb9a0d59e78 util.lsignal: Add lsignal library for catching POSIX signals
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    11
 * copy of this software and associated documentation files (the "Software"),
8cb9a0d59e78 util.lsignal: Add lsignal library for catching POSIX signals
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    12
 * to deal in the Software without restriction, including without limitation
8cb9a0d59e78 util.lsignal: Add lsignal library for catching POSIX signals
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    13
 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8cb9a0d59e78 util.lsignal: Add lsignal library for catching POSIX signals
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    14
 * and/or sell copies of the Software, and to permit persons to whom the
8cb9a0d59e78 util.lsignal: Add lsignal library for catching POSIX signals
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    15
 * Software is furnished to do so, subject to the following conditions:
8cb9a0d59e78 util.lsignal: Add lsignal library for catching POSIX signals
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    16
 *
8cb9a0d59e78 util.lsignal: Add lsignal library for catching POSIX signals
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    17
 * The above copyright notice and this permission notice shall be included
8cb9a0d59e78 util.lsignal: Add lsignal library for catching POSIX signals
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    18
 * in all copies or substantial portions of the Software.
8cb9a0d59e78 util.lsignal: Add lsignal library for catching POSIX signals
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    19
 *
8cb9a0d59e78 util.lsignal: Add lsignal library for catching POSIX signals
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    20
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
8cb9a0d59e78 util.lsignal: Add lsignal library for catching POSIX signals
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    21
 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
8cb9a0d59e78 util.lsignal: Add lsignal library for catching POSIX signals
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    22
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
8cb9a0d59e78 util.lsignal: Add lsignal library for catching POSIX signals
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    23
 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
8cb9a0d59e78 util.lsignal: Add lsignal library for catching POSIX signals
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    24
 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
8cb9a0d59e78 util.lsignal: Add lsignal library for catching POSIX signals
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    25
 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
6618
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
    26
 * OTHER DEALINGS IN THE SOFTWARE.
988
8cb9a0d59e78 util.lsignal: Add lsignal library for catching POSIX signals
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    27
*/
8cb9a0d59e78 util.lsignal: Add lsignal library for catching POSIX signals
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    28
9153
c1d5f52274cf net, pposix, signal: Check for redefined defines, fix warnings.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8423
diff changeset
    29
#ifndef _GNU_SOURCE
7976
703f7f45feb4 util.signal: Enable all GNU features, _DEFAULT_SOURCE doesn't have the desired effect before glibc 2.19
Kim Alvefur <zash@zash.se>
parents: 7974
diff changeset
    30
#define _GNU_SOURCE
9153
c1d5f52274cf net, pposix, signal: Check for redefined defines, fix warnings.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8423
diff changeset
    31
#endif
7934
b619b85e01aa util.pposix, configure: Move _GNU_SOURCE macro into source files
Kim Alvefur <zash@zash.se>
parents: 7892
diff changeset
    32
988
8cb9a0d59e78 util.lsignal: Add lsignal library for catching POSIX signals
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    33
#include <signal.h>
2459
66f60e69567b util.signal: Using stdlib.h instead of malloc.h.
Tobias Markmann <tm@ayena.de>
parents: 2432
diff changeset
    34
#include <stdlib.h>
13443
1e229d710a3c util.signal: Add support for signalfd(2) on Linux
Kim Alvefur <zash@zash.se>
parents: 12980
diff changeset
    35
#ifdef __linux__
1e229d710a3c util.signal: Add support for signalfd(2) on Linux
Kim Alvefur <zash@zash.se>
parents: 12980
diff changeset
    36
#include <unistd.h>
1e229d710a3c util.signal: Add support for signalfd(2) on Linux
Kim Alvefur <zash@zash.se>
parents: 12980
diff changeset
    37
#include <sys/signalfd.h>
1e229d710a3c util.signal: Add support for signalfd(2) on Linux
Kim Alvefur <zash@zash.se>
parents: 12980
diff changeset
    38
#endif
988
8cb9a0d59e78 util.lsignal: Add lsignal library for catching POSIX signals
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    39
8cb9a0d59e78 util.lsignal: Add lsignal library for catching POSIX signals
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    40
#include "lua.h"
8cb9a0d59e78 util.lsignal: Add lsignal library for catching POSIX signals
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    41
#include "lauxlib.h"
8cb9a0d59e78 util.lsignal: Add lsignal library for catching POSIX signals
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    42
10803
763bb2ce3f60 util.pposix,signal: Pass around various OS numbers as integers [Lua 5.3]
Kim Alvefur <zash@zash.se>
parents: 10484
diff changeset
    43
#if (LUA_VERSION_NUM < 503)
763bb2ce3f60 util.pposix,signal: Pass around various OS numbers as integers [Lua 5.3]
Kim Alvefur <zash@zash.se>
parents: 10484
diff changeset
    44
#define lua_isinteger(L, n) lua_isnumber(L, n)
763bb2ce3f60 util.pposix,signal: Pass around various OS numbers as integers [Lua 5.3]
Kim Alvefur <zash@zash.se>
parents: 10484
diff changeset
    45
#endif
6416
a552f4170aed util-src/*.c: Add macro for compiling with Lua 5.2
Kim Alvefur <zash@zash.se>
parents: 6415
diff changeset
    46
988
8cb9a0d59e78 util.lsignal: Add lsignal library for catching POSIX signals
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    47
#ifndef lsig
8cb9a0d59e78 util.lsignal: Add lsignal library for catching POSIX signals
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    48
8cb9a0d59e78 util.lsignal: Add lsignal library for catching POSIX signals
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    49
#define lsig
8cb9a0d59e78 util.lsignal: Add lsignal library for catching POSIX signals
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    50
6618
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
    51
struct lua_signal {
7892
b8d694646597 util-src/*.c: Attach pointer * to name instead of type
Kim Alvefur <zash@zash.se>
parents: 7821
diff changeset
    52
	char *name; /* name of the signal */
6618
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
    53
	int sig; /* the signal */
988
8cb9a0d59e78 util.lsignal: Add lsignal library for catching POSIX signals
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    54
};
8cb9a0d59e78 util.lsignal: Add lsignal library for catching POSIX signals
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    55
8cb9a0d59e78 util.lsignal: Add lsignal library for catching POSIX signals
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    56
#endif
8cb9a0d59e78 util.lsignal: Add lsignal library for catching POSIX signals
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    57
8417
7ea3311ca632 util.signal: Use a static array to keep track of pending signals (fixes #1029)
Kim Alvefur <zash@zash.se>
parents: 7976
diff changeset
    58
#define MAX_PENDING_SIGNALS 32
7ea3311ca632 util.signal: Use a static array to keep track of pending signals (fixes #1029)
Kim Alvefur <zash@zash.se>
parents: 7976
diff changeset
    59
988
8cb9a0d59e78 util.lsignal: Add lsignal library for catching POSIX signals
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    60
#define LUA_SIGNAL "lua_signal"
8cb9a0d59e78 util.lsignal: Add lsignal library for catching POSIX signals
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    61
8cb9a0d59e78 util.lsignal: Add lsignal library for catching POSIX signals
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    62
static const struct lua_signal lua_signals[] = {
6618
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
    63
	/* ANSI C signals */
988
8cb9a0d59e78 util.lsignal: Add lsignal library for catching POSIX signals
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    64
#ifdef SIGABRT
6618
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
    65
	{"SIGABRT", SIGABRT},
988
8cb9a0d59e78 util.lsignal: Add lsignal library for catching POSIX signals
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    66
#endif
8cb9a0d59e78 util.lsignal: Add lsignal library for catching POSIX signals
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    67
#ifdef SIGFPE
6618
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
    68
	{"SIGFPE", SIGFPE},
988
8cb9a0d59e78 util.lsignal: Add lsignal library for catching POSIX signals
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    69
#endif
8cb9a0d59e78 util.lsignal: Add lsignal library for catching POSIX signals
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    70
#ifdef SIGILL
6618
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
    71
	{"SIGILL", SIGILL},
988
8cb9a0d59e78 util.lsignal: Add lsignal library for catching POSIX signals
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    72
#endif
8cb9a0d59e78 util.lsignal: Add lsignal library for catching POSIX signals
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    73
#ifdef SIGINT
6618
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
    74
	{"SIGINT", SIGINT},
988
8cb9a0d59e78 util.lsignal: Add lsignal library for catching POSIX signals
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    75
#endif
8cb9a0d59e78 util.lsignal: Add lsignal library for catching POSIX signals
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    76
#ifdef SIGSEGV
6618
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
    77
	{"SIGSEGV", SIGSEGV},
988
8cb9a0d59e78 util.lsignal: Add lsignal library for catching POSIX signals
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    78
#endif
8cb9a0d59e78 util.lsignal: Add lsignal library for catching POSIX signals
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    79
#ifdef SIGTERM
6618
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
    80
	{"SIGTERM", SIGTERM},
988
8cb9a0d59e78 util.lsignal: Add lsignal library for catching POSIX signals
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    81
#endif
6618
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
    82
	/* posix signals */
988
8cb9a0d59e78 util.lsignal: Add lsignal library for catching POSIX signals
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    83
#ifdef SIGHUP
6618
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
    84
	{"SIGHUP", SIGHUP},
988
8cb9a0d59e78 util.lsignal: Add lsignal library for catching POSIX signals
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    85
#endif
8cb9a0d59e78 util.lsignal: Add lsignal library for catching POSIX signals
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    86
#ifdef SIGQUIT
6618
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
    87
	{"SIGQUIT", SIGQUIT},
988
8cb9a0d59e78 util.lsignal: Add lsignal library for catching POSIX signals
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    88
#endif
8cb9a0d59e78 util.lsignal: Add lsignal library for catching POSIX signals
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    89
#ifdef SIGTRAP
6618
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
    90
	{"SIGTRAP", SIGTRAP},
988
8cb9a0d59e78 util.lsignal: Add lsignal library for catching POSIX signals
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    91
#endif
8cb9a0d59e78 util.lsignal: Add lsignal library for catching POSIX signals
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    92
#ifdef SIGKILL
6618
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
    93
	{"SIGKILL", SIGKILL},
988
8cb9a0d59e78 util.lsignal: Add lsignal library for catching POSIX signals
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    94
#endif
8cb9a0d59e78 util.lsignal: Add lsignal library for catching POSIX signals
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    95
#ifdef SIGUSR1
6618
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
    96
	{"SIGUSR1", SIGUSR1},
988
8cb9a0d59e78 util.lsignal: Add lsignal library for catching POSIX signals
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    97
#endif
8cb9a0d59e78 util.lsignal: Add lsignal library for catching POSIX signals
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    98
#ifdef SIGUSR2
6618
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
    99
	{"SIGUSR2", SIGUSR2},
988
8cb9a0d59e78 util.lsignal: Add lsignal library for catching POSIX signals
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   100
#endif
8cb9a0d59e78 util.lsignal: Add lsignal library for catching POSIX signals
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   101
#ifdef SIGPIPE
6618
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
   102
	{"SIGPIPE", SIGPIPE},
988
8cb9a0d59e78 util.lsignal: Add lsignal library for catching POSIX signals
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   103
#endif
8cb9a0d59e78 util.lsignal: Add lsignal library for catching POSIX signals
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   104
#ifdef SIGALRM
6618
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
   105
	{"SIGALRM", SIGALRM},
988
8cb9a0d59e78 util.lsignal: Add lsignal library for catching POSIX signals
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   106
#endif
8cb9a0d59e78 util.lsignal: Add lsignal library for catching POSIX signals
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   107
#ifdef SIGCHLD
6618
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
   108
	{"SIGCHLD", SIGCHLD},
988
8cb9a0d59e78 util.lsignal: Add lsignal library for catching POSIX signals
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   109
#endif
8cb9a0d59e78 util.lsignal: Add lsignal library for catching POSIX signals
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   110
#ifdef SIGCONT
6618
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
   111
	{"SIGCONT", SIGCONT},
988
8cb9a0d59e78 util.lsignal: Add lsignal library for catching POSIX signals
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   112
#endif
8cb9a0d59e78 util.lsignal: Add lsignal library for catching POSIX signals
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   113
#ifdef SIGSTOP
6618
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
   114
	{"SIGSTOP", SIGSTOP},
988
8cb9a0d59e78 util.lsignal: Add lsignal library for catching POSIX signals
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   115
#endif
8cb9a0d59e78 util.lsignal: Add lsignal library for catching POSIX signals
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   116
#ifdef SIGTTIN
6618
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
   117
	{"SIGTTIN", SIGTTIN},
988
8cb9a0d59e78 util.lsignal: Add lsignal library for catching POSIX signals
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   118
#endif
8cb9a0d59e78 util.lsignal: Add lsignal library for catching POSIX signals
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   119
#ifdef SIGTTOU
6618
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
   120
	{"SIGTTOU", SIGTTOU},
988
8cb9a0d59e78 util.lsignal: Add lsignal library for catching POSIX signals
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   121
#endif
6618
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
   122
	/* some BSD signals */
988
8cb9a0d59e78 util.lsignal: Add lsignal library for catching POSIX signals
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   123
#ifdef SIGIOT
6618
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
   124
	{"SIGIOT", SIGIOT},
988
8cb9a0d59e78 util.lsignal: Add lsignal library for catching POSIX signals
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   125
#endif
8cb9a0d59e78 util.lsignal: Add lsignal library for catching POSIX signals
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   126
#ifdef SIGBUS
6618
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
   127
	{"SIGBUS", SIGBUS},
988
8cb9a0d59e78 util.lsignal: Add lsignal library for catching POSIX signals
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   128
#endif
8cb9a0d59e78 util.lsignal: Add lsignal library for catching POSIX signals
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   129
#ifdef SIGCLD
6618
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
   130
	{"SIGCLD", SIGCLD},
988
8cb9a0d59e78 util.lsignal: Add lsignal library for catching POSIX signals
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   131
#endif
8cb9a0d59e78 util.lsignal: Add lsignal library for catching POSIX signals
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   132
#ifdef SIGURG
6618
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
   133
	{"SIGURG", SIGURG},
988
8cb9a0d59e78 util.lsignal: Add lsignal library for catching POSIX signals
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   134
#endif
8cb9a0d59e78 util.lsignal: Add lsignal library for catching POSIX signals
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   135
#ifdef SIGXCPU
6618
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
   136
	{"SIGXCPU", SIGXCPU},
988
8cb9a0d59e78 util.lsignal: Add lsignal library for catching POSIX signals
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   137
#endif
8cb9a0d59e78 util.lsignal: Add lsignal library for catching POSIX signals
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   138
#ifdef SIGXFSZ
6618
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
   139
	{"SIGXFSZ", SIGXFSZ},
988
8cb9a0d59e78 util.lsignal: Add lsignal library for catching POSIX signals
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   140
#endif
8cb9a0d59e78 util.lsignal: Add lsignal library for catching POSIX signals
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   141
#ifdef SIGVTALRM
6618
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
   142
	{"SIGVTALRM", SIGVTALRM},
988
8cb9a0d59e78 util.lsignal: Add lsignal library for catching POSIX signals
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   143
#endif
8cb9a0d59e78 util.lsignal: Add lsignal library for catching POSIX signals
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   144
#ifdef SIGPROF
6618
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
   145
	{"SIGPROF", SIGPROF},
988
8cb9a0d59e78 util.lsignal: Add lsignal library for catching POSIX signals
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   146
#endif
8cb9a0d59e78 util.lsignal: Add lsignal library for catching POSIX signals
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   147
#ifdef SIGWINCH
6618
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
   148
	{"SIGWINCH", SIGWINCH},
988
8cb9a0d59e78 util.lsignal: Add lsignal library for catching POSIX signals
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   149
#endif
8cb9a0d59e78 util.lsignal: Add lsignal library for catching POSIX signals
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   150
#ifdef SIGPOLL
6618
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
   151
	{"SIGPOLL", SIGPOLL},
988
8cb9a0d59e78 util.lsignal: Add lsignal library for catching POSIX signals
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   152
#endif
8cb9a0d59e78 util.lsignal: Add lsignal library for catching POSIX signals
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   153
#ifdef SIGIO
6618
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
   154
	{"SIGIO", SIGIO},
988
8cb9a0d59e78 util.lsignal: Add lsignal library for catching POSIX signals
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   155
#endif
6618
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
   156
	/* add odd signals */
988
8cb9a0d59e78 util.lsignal: Add lsignal library for catching POSIX signals
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   157
#ifdef SIGSTKFLT
6618
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
   158
	{"SIGSTKFLT", SIGSTKFLT}, /* stack fault */
988
8cb9a0d59e78 util.lsignal: Add lsignal library for catching POSIX signals
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   159
#endif
8cb9a0d59e78 util.lsignal: Add lsignal library for catching POSIX signals
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   160
#ifdef SIGSYS
6618
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
   161
	{"SIGSYS", SIGSYS},
988
8cb9a0d59e78 util.lsignal: Add lsignal library for catching POSIX signals
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   162
#endif
6618
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
   163
	{NULL, 0}
988
8cb9a0d59e78 util.lsignal: Add lsignal library for catching POSIX signals
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   164
};
8cb9a0d59e78 util.lsignal: Add lsignal library for catching POSIX signals
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   165
7892
b8d694646597 util-src/*.c: Attach pointer * to name instead of type
Kim Alvefur <zash@zash.se>
parents: 7821
diff changeset
   166
static lua_State *Lsig = NULL;
988
8cb9a0d59e78 util.lsignal: Add lsignal library for catching POSIX signals
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   167
static lua_Hook Hsig = NULL;
8cb9a0d59e78 util.lsignal: Add lsignal library for catching POSIX signals
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   168
static int Hmask = 0;
8cb9a0d59e78 util.lsignal: Add lsignal library for catching POSIX signals
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   169
static int Hcount = 0;
8cb9a0d59e78 util.lsignal: Add lsignal library for catching POSIX signals
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   170
10484
94cacf9fd0ae util.*.c: Add static qualifiers everywhere
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9154
diff changeset
   171
static int signals[MAX_PENDING_SIGNALS];
94cacf9fd0ae util.*.c: Add static qualifiers everywhere
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9154
diff changeset
   172
static int nsig = 0;
2430
69d377c84fe3 util.signal: Queue up multiple signals, instead of trampling on the previous debug hook (and never clearing our own)
Matthew Wild <mwild1@gmail.com>
parents: 2405
diff changeset
   173
7892
b8d694646597 util-src/*.c: Attach pointer * to name instead of type
Kim Alvefur <zash@zash.se>
parents: 7821
diff changeset
   174
static void sighook(lua_State *L, lua_Debug *ar) {
9154
fee3933ff346 pposix, signal: Ignore unused arguments.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9153
diff changeset
   175
	(void)ar;
6618
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
   176
	/* restore the old hook */
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
   177
	lua_sethook(L, Hsig, Hmask, Hcount);
2432
1e045b3e9dce util.signal: Restore the old debug hook earlier, just in case we receive another signal between clearing the signal queue and restoring it
Matthew Wild <mwild1@gmail.com>
parents: 2431
diff changeset
   178
6618
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
   179
	lua_pushstring(L, LUA_SIGNAL);
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
   180
	lua_gettable(L, LUA_REGISTRYINDEX);
988
8cb9a0d59e78 util.lsignal: Add lsignal library for catching POSIX signals
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   181
8423
fb27aff6d491 util.signal: Fix loop (fixes #1047)
Kim Alvefur <zash@zash.se>
parents: 8417
diff changeset
   182
	for(int i = 0; i < nsig; i++) {
10803
763bb2ce3f60 util.pposix,signal: Pass around various OS numbers as integers [Lua 5.3]
Kim Alvefur <zash@zash.se>
parents: 10484
diff changeset
   183
		lua_pushinteger(L, signals[i]);
6618
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
   184
		lua_gettable(L, -2);
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
   185
		lua_call(L, 0, 0);
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
   186
	};
988
8cb9a0d59e78 util.lsignal: Add lsignal library for catching POSIX signals
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   187
8417
7ea3311ca632 util.signal: Use a static array to keep track of pending signals (fixes #1029)
Kim Alvefur <zash@zash.se>
parents: 7976
diff changeset
   188
	nsig = 0;
7ea3311ca632 util.signal: Use a static array to keep track of pending signals (fixes #1029)
Kim Alvefur <zash@zash.se>
parents: 7976
diff changeset
   189
6618
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
   190
	lua_pop(L, 1); /* pop lua_signal table */
2430
69d377c84fe3 util.signal: Queue up multiple signals, instead of trampling on the previous debug hook (and never clearing our own)
Matthew Wild <mwild1@gmail.com>
parents: 2405
diff changeset
   191
988
8cb9a0d59e78 util.lsignal: Add lsignal library for catching POSIX signals
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   192
}
8cb9a0d59e78 util.lsignal: Add lsignal library for catching POSIX signals
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   193
6618
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
   194
static void handle(int sig) {
8417
7ea3311ca632 util.signal: Use a static array to keep track of pending signals (fixes #1029)
Kim Alvefur <zash@zash.se>
parents: 7976
diff changeset
   195
	if(nsig == 0) {
6618
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
   196
		/* Store the existing debug hook (if any) and its parameters */
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
   197
		Hsig = lua_gethook(Lsig);
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
   198
		Hmask = lua_gethookmask(Lsig);
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
   199
		Hcount = lua_gethookcount(Lsig);
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
   200
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
   201
		/* Set our new debug hook */
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
   202
		lua_sethook(Lsig, sighook, LUA_MASKCALL | LUA_MASKRET | LUA_MASKCOUNT, 1);
8417
7ea3311ca632 util.signal: Use a static array to keep track of pending signals (fixes #1029)
Kim Alvefur <zash@zash.se>
parents: 7976
diff changeset
   203
	}
6618
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
   204
8417
7ea3311ca632 util.signal: Use a static array to keep track of pending signals (fixes #1029)
Kim Alvefur <zash@zash.se>
parents: 7976
diff changeset
   205
	if(nsig < MAX_PENDING_SIGNALS) {
8423
fb27aff6d491 util.signal: Fix loop (fixes #1047)
Kim Alvefur <zash@zash.se>
parents: 8417
diff changeset
   206
		signals[nsig++] = sig;
6618
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
   207
	}
988
8cb9a0d59e78 util.lsignal: Add lsignal library for catching POSIX signals
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   208
}
8cb9a0d59e78 util.lsignal: Add lsignal library for catching POSIX signals
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   209
8cb9a0d59e78 util.lsignal: Add lsignal library for catching POSIX signals
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   210
/*
8cb9a0d59e78 util.lsignal: Add lsignal library for catching POSIX signals
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   211
 * l_signal == signal(signal [, func [, chook]])
8cb9a0d59e78 util.lsignal: Add lsignal library for catching POSIX signals
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   212
 *
8cb9a0d59e78 util.lsignal: Add lsignal library for catching POSIX signals
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   213
 * signal = signal number or string
8cb9a0d59e78 util.lsignal: Add lsignal library for catching POSIX signals
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   214
 * func = Lua function to call
8cb9a0d59e78 util.lsignal: Add lsignal library for catching POSIX signals
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   215
 * chook = catch within C functions
8cb9a0d59e78 util.lsignal: Add lsignal library for catching POSIX signals
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   216
 *         if caught, Lua function _must_
8cb9a0d59e78 util.lsignal: Add lsignal library for catching POSIX signals
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   217
 *         exit, as the stack is most likely
8cb9a0d59e78 util.lsignal: Add lsignal library for catching POSIX signals
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   218
 *         in an unstable state.
6618
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
   219
*/
988
8cb9a0d59e78 util.lsignal: Add lsignal library for catching POSIX signals
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   220
7892
b8d694646597 util-src/*.c: Attach pointer * to name instead of type
Kim Alvefur <zash@zash.se>
parents: 7821
diff changeset
   221
static int l_signal(lua_State *L) {
6618
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
   222
	int args = lua_gettop(L);
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
   223
	int t, sig; /* type, signal */
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
   224
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
   225
	/* get type of signal */
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
   226
	luaL_checkany(L, 1);
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
   227
	t = lua_type(L, 1);
988
8cb9a0d59e78 util.lsignal: Add lsignal library for catching POSIX signals
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   228
6618
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
   229
	if(t == LUA_TNUMBER) {
10803
763bb2ce3f60 util.pposix,signal: Pass around various OS numbers as integers [Lua 5.3]
Kim Alvefur <zash@zash.se>
parents: 10484
diff changeset
   230
		sig = (int) lua_tointeger(L, 1);
6618
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
   231
	} else if(t == LUA_TSTRING) {
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
   232
		lua_pushstring(L, LUA_SIGNAL);
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
   233
		lua_gettable(L, LUA_REGISTRYINDEX);
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
   234
		lua_pushvalue(L, 1);
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
   235
		lua_gettable(L, -2);
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
   236
10803
763bb2ce3f60 util.pposix,signal: Pass around various OS numbers as integers [Lua 5.3]
Kim Alvefur <zash@zash.se>
parents: 10484
diff changeset
   237
		if(!lua_isinteger(L, -1)) {
6623
50eaefeec013 util-src/*.c: Per convention call luaL_error() as argument to return
Florian Zeitz <florob@babelmonkeys.de>
parents: 6618
diff changeset
   238
			return luaL_error(L, "invalid signal string");
6618
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
   239
		}
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
   240
10803
763bb2ce3f60 util.pposix,signal: Pass around various OS numbers as integers [Lua 5.3]
Kim Alvefur <zash@zash.se>
parents: 10484
diff changeset
   241
		sig = (int) lua_tointeger(L, -1);
6618
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
   242
		lua_pop(L, 1); /* get rid of number we pushed */
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
   243
	} else {
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
   244
		luaL_checknumber(L, 1);    /* will always error, with good error msg */
6623
50eaefeec013 util-src/*.c: Per convention call luaL_error() as argument to return
Florian Zeitz <florob@babelmonkeys.de>
parents: 6618
diff changeset
   245
		return luaL_error(L, "unreachable: invalid number was accepted");
6618
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
   246
	}
988
8cb9a0d59e78 util.lsignal: Add lsignal library for catching POSIX signals
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   247
6618
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
   248
	/* set handler */
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
   249
	if(args == 1 || lua_isnil(L, 2)) { /* clear handler */
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
   250
		lua_pushstring(L, LUA_SIGNAL);
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
   251
		lua_gettable(L, LUA_REGISTRYINDEX);
10803
763bb2ce3f60 util.pposix,signal: Pass around various OS numbers as integers [Lua 5.3]
Kim Alvefur <zash@zash.se>
parents: 10484
diff changeset
   252
		lua_pushinteger(L, sig);
6618
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
   253
		lua_gettable(L, -2); /* return old handler */
10803
763bb2ce3f60 util.pposix,signal: Pass around various OS numbers as integers [Lua 5.3]
Kim Alvefur <zash@zash.se>
parents: 10484
diff changeset
   254
		lua_pushinteger(L, sig);
6618
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
   255
		lua_pushnil(L);
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
   256
		lua_settable(L, -4);
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
   257
		lua_remove(L, -2); /* remove LUA_SIGNAL table */
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
   258
		signal(sig, SIG_DFL);
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
   259
	} else {
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
   260
		luaL_checktype(L, 2, LUA_TFUNCTION);
988
8cb9a0d59e78 util.lsignal: Add lsignal library for catching POSIX signals
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   261
6618
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
   262
		lua_pushstring(L, LUA_SIGNAL);
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
   263
		lua_gettable(L, LUA_REGISTRYINDEX);
988
8cb9a0d59e78 util.lsignal: Add lsignal library for catching POSIX signals
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   264
10803
763bb2ce3f60 util.pposix,signal: Pass around various OS numbers as integers [Lua 5.3]
Kim Alvefur <zash@zash.se>
parents: 10484
diff changeset
   265
		lua_pushinteger(L, sig);
6618
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
   266
		lua_pushvalue(L, 2);
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
   267
		lua_settable(L, -3);
988
8cb9a0d59e78 util.lsignal: Add lsignal library for catching POSIX signals
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   268
6618
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
   269
		/* Set the state for the handler */
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
   270
		Lsig = L;
988
8cb9a0d59e78 util.lsignal: Add lsignal library for catching POSIX signals
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   271
6618
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
   272
		if(lua_toboolean(L, 3)) { /* c hook? */
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
   273
			if(signal(sig, handle) == SIG_ERR) {
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
   274
				lua_pushboolean(L, 0);
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
   275
			} else {
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
   276
				lua_pushboolean(L, 1);
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
   277
			}
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
   278
		} else { /* lua_hook */
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
   279
			if(signal(sig, handle) == SIG_ERR) {
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
   280
				lua_pushboolean(L, 0);
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
   281
			} else {
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
   282
				lua_pushboolean(L, 1);
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
   283
			}
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
   284
		}
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
   285
	}
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
   286
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
   287
	return 1;
988
8cb9a0d59e78 util.lsignal: Add lsignal library for catching POSIX signals
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   288
}
8cb9a0d59e78 util.lsignal: Add lsignal library for catching POSIX signals
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   289
8cb9a0d59e78 util.lsignal: Add lsignal library for catching POSIX signals
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   290
/*
8cb9a0d59e78 util.lsignal: Add lsignal library for catching POSIX signals
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   291
 * l_raise == raise(signal)
8cb9a0d59e78 util.lsignal: Add lsignal library for catching POSIX signals
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   292
 *
8cb9a0d59e78 util.lsignal: Add lsignal library for catching POSIX signals
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   293
 * signal = signal number or string
6618
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
   294
*/
988
8cb9a0d59e78 util.lsignal: Add lsignal library for catching POSIX signals
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   295
7892
b8d694646597 util-src/*.c: Attach pointer * to name instead of type
Kim Alvefur <zash@zash.se>
parents: 7821
diff changeset
   296
static int l_raise(lua_State *L) {
6618
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
   297
	/* int args = lua_gettop(L); */
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
   298
	int t = 0; /* type */
10803
763bb2ce3f60 util.pposix,signal: Pass around various OS numbers as integers [Lua 5.3]
Kim Alvefur <zash@zash.se>
parents: 10484
diff changeset
   299
	lua_Integer ret;
988
8cb9a0d59e78 util.lsignal: Add lsignal library for catching POSIX signals
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   300
6618
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
   301
	luaL_checkany(L, 1);
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
   302
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
   303
	t = lua_type(L, 1);
988
8cb9a0d59e78 util.lsignal: Add lsignal library for catching POSIX signals
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   304
6618
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
   305
	if(t == LUA_TNUMBER) {
10803
763bb2ce3f60 util.pposix,signal: Pass around various OS numbers as integers [Lua 5.3]
Kim Alvefur <zash@zash.se>
parents: 10484
diff changeset
   306
		ret = (lua_Integer) raise((int) lua_tointeger(L, 1));
763bb2ce3f60 util.pposix,signal: Pass around various OS numbers as integers [Lua 5.3]
Kim Alvefur <zash@zash.se>
parents: 10484
diff changeset
   307
		lua_pushinteger(L, ret);
6618
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
   308
	} else if(t == LUA_TSTRING) {
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
   309
		lua_pushstring(L, LUA_SIGNAL);
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
   310
		lua_gettable(L, LUA_REGISTRYINDEX);
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
   311
		lua_pushvalue(L, 1);
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
   312
		lua_gettable(L, -2);
988
8cb9a0d59e78 util.lsignal: Add lsignal library for catching POSIX signals
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   313
6618
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
   314
		if(!lua_isnumber(L, -1)) {
6623
50eaefeec013 util-src/*.c: Per convention call luaL_error() as argument to return
Florian Zeitz <florob@babelmonkeys.de>
parents: 6618
diff changeset
   315
			return luaL_error(L, "invalid signal string");
6618
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
   316
		}
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
   317
10803
763bb2ce3f60 util.pposix,signal: Pass around various OS numbers as integers [Lua 5.3]
Kim Alvefur <zash@zash.se>
parents: 10484
diff changeset
   318
		ret = (lua_Integer) raise((int) lua_tointeger(L, -1));
6618
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
   319
		lua_pop(L, 1); /* get rid of number we pushed */
10803
763bb2ce3f60 util.pposix,signal: Pass around various OS numbers as integers [Lua 5.3]
Kim Alvefur <zash@zash.se>
parents: 10484
diff changeset
   320
		lua_pushinteger(L, ret);
6618
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
   321
	} else {
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
   322
		luaL_checknumber(L, 1);    /* will always error, with good error msg */
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
   323
	}
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
   324
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
   325
	return 1;
988
8cb9a0d59e78 util.lsignal: Add lsignal library for catching POSIX signals
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   326
}
8cb9a0d59e78 util.lsignal: Add lsignal library for catching POSIX signals
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   327
3282
8ef3beed0779 util.signal: Make kill() available on OS X (thanks darkrain).
Waqas Hussain <waqas20@gmail.com>
parents: 3274
diff changeset
   328
#if defined(__unix__) || defined(__APPLE__)
988
8cb9a0d59e78 util.lsignal: Add lsignal library for catching POSIX signals
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   329
8cb9a0d59e78 util.lsignal: Add lsignal library for catching POSIX signals
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   330
/* define some posix only functions */
8cb9a0d59e78 util.lsignal: Add lsignal library for catching POSIX signals
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   331
8cb9a0d59e78 util.lsignal: Add lsignal library for catching POSIX signals
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   332
/*
8cb9a0d59e78 util.lsignal: Add lsignal library for catching POSIX signals
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   333
 * l_kill == kill(pid, signal)
8cb9a0d59e78 util.lsignal: Add lsignal library for catching POSIX signals
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   334
 *
8cb9a0d59e78 util.lsignal: Add lsignal library for catching POSIX signals
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   335
 * pid = process id
8cb9a0d59e78 util.lsignal: Add lsignal library for catching POSIX signals
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   336
 * signal = signal number or string
6618
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
   337
*/
988
8cb9a0d59e78 util.lsignal: Add lsignal library for catching POSIX signals
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   338
7892
b8d694646597 util-src/*.c: Attach pointer * to name instead of type
Kim Alvefur <zash@zash.se>
parents: 7821
diff changeset
   339
static int l_kill(lua_State *L) {
6618
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
   340
	int t; /* type */
10803
763bb2ce3f60 util.pposix,signal: Pass around various OS numbers as integers [Lua 5.3]
Kim Alvefur <zash@zash.se>
parents: 10484
diff changeset
   341
	lua_Integer ret; /* return value */
988
8cb9a0d59e78 util.lsignal: Add lsignal library for catching POSIX signals
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   342
6618
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
   343
	luaL_checknumber(L, 1); /* must be int for pid */
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
   344
	luaL_checkany(L, 2); /* check for a second arg */
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
   345
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
   346
	t = lua_type(L, 2);
988
8cb9a0d59e78 util.lsignal: Add lsignal library for catching POSIX signals
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   347
6618
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
   348
	if(t == LUA_TNUMBER) {
10803
763bb2ce3f60 util.pposix,signal: Pass around various OS numbers as integers [Lua 5.3]
Kim Alvefur <zash@zash.se>
parents: 10484
diff changeset
   349
		ret = (lua_Integer) kill((int) lua_tointeger(L, 1),
763bb2ce3f60 util.pposix,signal: Pass around various OS numbers as integers [Lua 5.3]
Kim Alvefur <zash@zash.se>
parents: 10484
diff changeset
   350
		                         (int) lua_tointeger(L, 2));
763bb2ce3f60 util.pposix,signal: Pass around various OS numbers as integers [Lua 5.3]
Kim Alvefur <zash@zash.se>
parents: 10484
diff changeset
   351
		lua_pushinteger(L, ret);
6618
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
   352
	} else if(t == LUA_TSTRING) {
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
   353
		lua_pushstring(L, LUA_SIGNAL);
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
   354
		lua_gettable(L, LUA_REGISTRYINDEX);
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
   355
		lua_pushvalue(L, 2);
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
   356
		lua_gettable(L, -2);
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
   357
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
   358
		if(!lua_isnumber(L, -1)) {
6623
50eaefeec013 util-src/*.c: Per convention call luaL_error() as argument to return
Florian Zeitz <florob@babelmonkeys.de>
parents: 6618
diff changeset
   359
			return luaL_error(L, "invalid signal string");
6618
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
   360
		}
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
   361
10803
763bb2ce3f60 util.pposix,signal: Pass around various OS numbers as integers [Lua 5.3]
Kim Alvefur <zash@zash.se>
parents: 10484
diff changeset
   362
		ret = (lua_Integer) kill((int) lua_tointeger(L, 1),
763bb2ce3f60 util.pposix,signal: Pass around various OS numbers as integers [Lua 5.3]
Kim Alvefur <zash@zash.se>
parents: 10484
diff changeset
   363
		                         (int) lua_tointeger(L, -1));
6618
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
   364
		lua_pop(L, 1); /* get rid of number we pushed */
10803
763bb2ce3f60 util.pposix,signal: Pass around various OS numbers as integers [Lua 5.3]
Kim Alvefur <zash@zash.se>
parents: 10484
diff changeset
   365
		lua_pushinteger(L, ret);
6618
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
   366
	} else {
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
   367
		luaL_checknumber(L, 2);    /* will always error, with good error msg */
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
   368
	}
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
   369
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
   370
	return 1;
988
8cb9a0d59e78 util.lsignal: Add lsignal library for catching POSIX signals
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   371
}
8cb9a0d59e78 util.lsignal: Add lsignal library for catching POSIX signals
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   372
8cb9a0d59e78 util.lsignal: Add lsignal library for catching POSIX signals
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   373
#endif
8cb9a0d59e78 util.lsignal: Add lsignal library for catching POSIX signals
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   374
13443
1e229d710a3c util.signal: Add support for signalfd(2) on Linux
Kim Alvefur <zash@zash.se>
parents: 12980
diff changeset
   375
#ifdef __linux__
13445
6d96b6eeee5a util.signal: Wrap signalfd in an userdatum for gc handling etc
Kim Alvefur <zash@zash.se>
parents: 13443
diff changeset
   376
struct lsignalfd {
6d96b6eeee5a util.signal: Wrap signalfd in an userdatum for gc handling etc
Kim Alvefur <zash@zash.se>
parents: 13443
diff changeset
   377
	int fd;
6d96b6eeee5a util.signal: Wrap signalfd in an userdatum for gc handling etc
Kim Alvefur <zash@zash.se>
parents: 13443
diff changeset
   378
	sigset_t mask;
6d96b6eeee5a util.signal: Wrap signalfd in an userdatum for gc handling etc
Kim Alvefur <zash@zash.se>
parents: 13443
diff changeset
   379
};
6d96b6eeee5a util.signal: Wrap signalfd in an userdatum for gc handling etc
Kim Alvefur <zash@zash.se>
parents: 13443
diff changeset
   380
13443
1e229d710a3c util.signal: Add support for signalfd(2) on Linux
Kim Alvefur <zash@zash.se>
parents: 12980
diff changeset
   381
static int l_signalfd(lua_State *L) {
13445
6d96b6eeee5a util.signal: Wrap signalfd in an userdatum for gc handling etc
Kim Alvefur <zash@zash.se>
parents: 13443
diff changeset
   382
	struct lsignalfd *sfd = lua_newuserdata(L, sizeof(struct lsignalfd));
6d96b6eeee5a util.signal: Wrap signalfd in an userdatum for gc handling etc
Kim Alvefur <zash@zash.se>
parents: 13443
diff changeset
   383
6d96b6eeee5a util.signal: Wrap signalfd in an userdatum for gc handling etc
Kim Alvefur <zash@zash.se>
parents: 13443
diff changeset
   384
	sigemptyset(&sfd->mask);
6d96b6eeee5a util.signal: Wrap signalfd in an userdatum for gc handling etc
Kim Alvefur <zash@zash.se>
parents: 13443
diff changeset
   385
	sigaddset(&sfd->mask, luaL_checkinteger(L, 1));
6d96b6eeee5a util.signal: Wrap signalfd in an userdatum for gc handling etc
Kim Alvefur <zash@zash.se>
parents: 13443
diff changeset
   386
6d96b6eeee5a util.signal: Wrap signalfd in an userdatum for gc handling etc
Kim Alvefur <zash@zash.se>
parents: 13443
diff changeset
   387
	sigprocmask(SIG_BLOCK, &sfd->mask, NULL); /* TODO check err */
6d96b6eeee5a util.signal: Wrap signalfd in an userdatum for gc handling etc
Kim Alvefur <zash@zash.se>
parents: 13443
diff changeset
   388
6d96b6eeee5a util.signal: Wrap signalfd in an userdatum for gc handling etc
Kim Alvefur <zash@zash.se>
parents: 13443
diff changeset
   389
	sfd->fd = signalfd(-1, &sfd->mask, SFD_NONBLOCK);
13443
1e229d710a3c util.signal: Add support for signalfd(2) on Linux
Kim Alvefur <zash@zash.se>
parents: 12980
diff changeset
   390
13445
6d96b6eeee5a util.signal: Wrap signalfd in an userdatum for gc handling etc
Kim Alvefur <zash@zash.se>
parents: 13443
diff changeset
   391
	if(sfd->fd == -1) {
6d96b6eeee5a util.signal: Wrap signalfd in an userdatum for gc handling etc
Kim Alvefur <zash@zash.se>
parents: 13443
diff changeset
   392
		lua_pushnil(L);
6d96b6eeee5a util.signal: Wrap signalfd in an userdatum for gc handling etc
Kim Alvefur <zash@zash.se>
parents: 13443
diff changeset
   393
		return 1;
6d96b6eeee5a util.signal: Wrap signalfd in an userdatum for gc handling etc
Kim Alvefur <zash@zash.se>
parents: 13443
diff changeset
   394
	}
6d96b6eeee5a util.signal: Wrap signalfd in an userdatum for gc handling etc
Kim Alvefur <zash@zash.se>
parents: 13443
diff changeset
   395
6d96b6eeee5a util.signal: Wrap signalfd in an userdatum for gc handling etc
Kim Alvefur <zash@zash.se>
parents: 13443
diff changeset
   396
	luaL_setmetatable(L, "signalfd");
6d96b6eeee5a util.signal: Wrap signalfd in an userdatum for gc handling etc
Kim Alvefur <zash@zash.se>
parents: 13443
diff changeset
   397
	return 1;
6d96b6eeee5a util.signal: Wrap signalfd in an userdatum for gc handling etc
Kim Alvefur <zash@zash.se>
parents: 13443
diff changeset
   398
}
13443
1e229d710a3c util.signal: Add support for signalfd(2) on Linux
Kim Alvefur <zash@zash.se>
parents: 12980
diff changeset
   399
13445
6d96b6eeee5a util.signal: Wrap signalfd in an userdatum for gc handling etc
Kim Alvefur <zash@zash.se>
parents: 13443
diff changeset
   400
static int l_signalfd_getfd(lua_State *L) {
6d96b6eeee5a util.signal: Wrap signalfd in an userdatum for gc handling etc
Kim Alvefur <zash@zash.se>
parents: 13443
diff changeset
   401
	struct lsignalfd *sfd = luaL_checkudata(L, 1, "signalfd");
13443
1e229d710a3c util.signal: Add support for signalfd(2) on Linux
Kim Alvefur <zash@zash.se>
parents: 12980
diff changeset
   402
13445
6d96b6eeee5a util.signal: Wrap signalfd in an userdatum for gc handling etc
Kim Alvefur <zash@zash.se>
parents: 13443
diff changeset
   403
	if (sfd->fd == -1) {
6d96b6eeee5a util.signal: Wrap signalfd in an userdatum for gc handling etc
Kim Alvefur <zash@zash.se>
parents: 13443
diff changeset
   404
		lua_pushnil(L);
6d96b6eeee5a util.signal: Wrap signalfd in an userdatum for gc handling etc
Kim Alvefur <zash@zash.se>
parents: 13443
diff changeset
   405
		return 1;
6d96b6eeee5a util.signal: Wrap signalfd in an userdatum for gc handling etc
Kim Alvefur <zash@zash.se>
parents: 13443
diff changeset
   406
	}
6d96b6eeee5a util.signal: Wrap signalfd in an userdatum for gc handling etc
Kim Alvefur <zash@zash.se>
parents: 13443
diff changeset
   407
6d96b6eeee5a util.signal: Wrap signalfd in an userdatum for gc handling etc
Kim Alvefur <zash@zash.se>
parents: 13443
diff changeset
   408
	lua_pushinteger(L, sfd->fd);
13443
1e229d710a3c util.signal: Add support for signalfd(2) on Linux
Kim Alvefur <zash@zash.se>
parents: 12980
diff changeset
   409
	return 1;
1e229d710a3c util.signal: Add support for signalfd(2) on Linux
Kim Alvefur <zash@zash.se>
parents: 12980
diff changeset
   410
}
1e229d710a3c util.signal: Add support for signalfd(2) on Linux
Kim Alvefur <zash@zash.se>
parents: 12980
diff changeset
   411
1e229d710a3c util.signal: Add support for signalfd(2) on Linux
Kim Alvefur <zash@zash.se>
parents: 12980
diff changeset
   412
static int l_signalfd_read(lua_State *L) {
13445
6d96b6eeee5a util.signal: Wrap signalfd in an userdatum for gc handling etc
Kim Alvefur <zash@zash.se>
parents: 13443
diff changeset
   413
	struct lsignalfd *sfd = luaL_checkudata(L, 1, "signalfd");
13443
1e229d710a3c util.signal: Add support for signalfd(2) on Linux
Kim Alvefur <zash@zash.se>
parents: 12980
diff changeset
   414
	struct signalfd_siginfo siginfo;
1e229d710a3c util.signal: Add support for signalfd(2) on Linux
Kim Alvefur <zash@zash.se>
parents: 12980
diff changeset
   415
13445
6d96b6eeee5a util.signal: Wrap signalfd in an userdatum for gc handling etc
Kim Alvefur <zash@zash.se>
parents: 13443
diff changeset
   416
	if(read(sfd->fd, &siginfo, sizeof(siginfo)) < 0) {
13443
1e229d710a3c util.signal: Add support for signalfd(2) on Linux
Kim Alvefur <zash@zash.se>
parents: 12980
diff changeset
   417
		return 0;
1e229d710a3c util.signal: Add support for signalfd(2) on Linux
Kim Alvefur <zash@zash.se>
parents: 12980
diff changeset
   418
	}
1e229d710a3c util.signal: Add support for signalfd(2) on Linux
Kim Alvefur <zash@zash.se>
parents: 12980
diff changeset
   419
1e229d710a3c util.signal: Add support for signalfd(2) on Linux
Kim Alvefur <zash@zash.se>
parents: 12980
diff changeset
   420
	lua_pushinteger(L, siginfo.ssi_signo);
1e229d710a3c util.signal: Add support for signalfd(2) on Linux
Kim Alvefur <zash@zash.se>
parents: 12980
diff changeset
   421
	return 1;
1e229d710a3c util.signal: Add support for signalfd(2) on Linux
Kim Alvefur <zash@zash.se>
parents: 12980
diff changeset
   422
}
13445
6d96b6eeee5a util.signal: Wrap signalfd in an userdatum for gc handling etc
Kim Alvefur <zash@zash.se>
parents: 13443
diff changeset
   423
6d96b6eeee5a util.signal: Wrap signalfd in an userdatum for gc handling etc
Kim Alvefur <zash@zash.se>
parents: 13443
diff changeset
   424
static int l_signalfd_close(lua_State *L) {
6d96b6eeee5a util.signal: Wrap signalfd in an userdatum for gc handling etc
Kim Alvefur <zash@zash.se>
parents: 13443
diff changeset
   425
	struct lsignalfd *sfd = luaL_checkudata(L, 1, "signalfd");
6d96b6eeee5a util.signal: Wrap signalfd in an userdatum for gc handling etc
Kim Alvefur <zash@zash.se>
parents: 13443
diff changeset
   426
6d96b6eeee5a util.signal: Wrap signalfd in an userdatum for gc handling etc
Kim Alvefur <zash@zash.se>
parents: 13443
diff changeset
   427
	if(close(sfd->fd) != 0) {
6d96b6eeee5a util.signal: Wrap signalfd in an userdatum for gc handling etc
Kim Alvefur <zash@zash.se>
parents: 13443
diff changeset
   428
		lua_pushboolean(L, 0);
6d96b6eeee5a util.signal: Wrap signalfd in an userdatum for gc handling etc
Kim Alvefur <zash@zash.se>
parents: 13443
diff changeset
   429
		return 1;
6d96b6eeee5a util.signal: Wrap signalfd in an userdatum for gc handling etc
Kim Alvefur <zash@zash.se>
parents: 13443
diff changeset
   430
	}
6d96b6eeee5a util.signal: Wrap signalfd in an userdatum for gc handling etc
Kim Alvefur <zash@zash.se>
parents: 13443
diff changeset
   431
6d96b6eeee5a util.signal: Wrap signalfd in an userdatum for gc handling etc
Kim Alvefur <zash@zash.se>
parents: 13443
diff changeset
   432
	sfd->fd = -1;
6d96b6eeee5a util.signal: Wrap signalfd in an userdatum for gc handling etc
Kim Alvefur <zash@zash.se>
parents: 13443
diff changeset
   433
	lua_pushboolean(L, 1);
6d96b6eeee5a util.signal: Wrap signalfd in an userdatum for gc handling etc
Kim Alvefur <zash@zash.se>
parents: 13443
diff changeset
   434
	return 1;
6d96b6eeee5a util.signal: Wrap signalfd in an userdatum for gc handling etc
Kim Alvefur <zash@zash.se>
parents: 13443
diff changeset
   435
}
13443
1e229d710a3c util.signal: Add support for signalfd(2) on Linux
Kim Alvefur <zash@zash.se>
parents: 12980
diff changeset
   436
#endif
1e229d710a3c util.signal: Add support for signalfd(2) on Linux
Kim Alvefur <zash@zash.se>
parents: 12980
diff changeset
   437
988
8cb9a0d59e78 util.lsignal: Add lsignal library for catching POSIX signals
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   438
static const struct luaL_Reg lsignal_lib[] = {
6618
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
   439
	{"signal", l_signal},
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
   440
	{"raise", l_raise},
3282
8ef3beed0779 util.signal: Make kill() available on OS X (thanks darkrain).
Waqas Hussain <waqas20@gmail.com>
parents: 3274
diff changeset
   441
#if defined(__unix__) || defined(__APPLE__)
6618
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
   442
	{"kill", l_kill},
988
8cb9a0d59e78 util.lsignal: Add lsignal library for catching POSIX signals
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   443
#endif
13443
1e229d710a3c util.signal: Add support for signalfd(2) on Linux
Kim Alvefur <zash@zash.se>
parents: 12980
diff changeset
   444
#ifdef __linux__
1e229d710a3c util.signal: Add support for signalfd(2) on Linux
Kim Alvefur <zash@zash.se>
parents: 12980
diff changeset
   445
	{"signalfd", l_signalfd},
1e229d710a3c util.signal: Add support for signalfd(2) on Linux
Kim Alvefur <zash@zash.se>
parents: 12980
diff changeset
   446
#endif
6618
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
   447
	{NULL, NULL}
988
8cb9a0d59e78 util.lsignal: Add lsignal library for catching POSIX signals
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   448
};
8cb9a0d59e78 util.lsignal: Add lsignal library for catching POSIX signals
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   449
12980
a187600ec7d6 util: Add compat for prosody module name change to C sources
Kim Alvefur <zash@zash.se>
parents: 12579
diff changeset
   450
int luaopen_prosody_util_signal(lua_State *L) {
7821
54669df178c2 util-src: Make C modules assert that the Lua runtime matches what it was compiled for
Kim Alvefur <zash@zash.se>
parents: 6792
diff changeset
   451
	luaL_checkversion(L);
6618
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
   452
	int i = 0;
988
8cb9a0d59e78 util.lsignal: Add lsignal library for catching POSIX signals
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   453
13445
6d96b6eeee5a util.signal: Wrap signalfd in an userdatum for gc handling etc
Kim Alvefur <zash@zash.se>
parents: 13443
diff changeset
   454
#ifdef __linux__
6d96b6eeee5a util.signal: Wrap signalfd in an userdatum for gc handling etc
Kim Alvefur <zash@zash.se>
parents: 13443
diff changeset
   455
	luaL_newmetatable(L, "signalfd");
6d96b6eeee5a util.signal: Wrap signalfd in an userdatum for gc handling etc
Kim Alvefur <zash@zash.se>
parents: 13443
diff changeset
   456
	lua_pushcfunction(L, l_signalfd_close);
6d96b6eeee5a util.signal: Wrap signalfd in an userdatum for gc handling etc
Kim Alvefur <zash@zash.se>
parents: 13443
diff changeset
   457
	lua_setfield(L, -2, "__gc");
6d96b6eeee5a util.signal: Wrap signalfd in an userdatum for gc handling etc
Kim Alvefur <zash@zash.se>
parents: 13443
diff changeset
   458
	lua_createtable(L, 0, 1);
6d96b6eeee5a util.signal: Wrap signalfd in an userdatum for gc handling etc
Kim Alvefur <zash@zash.se>
parents: 13443
diff changeset
   459
	{
6d96b6eeee5a util.signal: Wrap signalfd in an userdatum for gc handling etc
Kim Alvefur <zash@zash.se>
parents: 13443
diff changeset
   460
		lua_pushcfunction(L, l_signalfd_getfd);
6d96b6eeee5a util.signal: Wrap signalfd in an userdatum for gc handling etc
Kim Alvefur <zash@zash.se>
parents: 13443
diff changeset
   461
		lua_setfield(L, -2, "getfd");
6d96b6eeee5a util.signal: Wrap signalfd in an userdatum for gc handling etc
Kim Alvefur <zash@zash.se>
parents: 13443
diff changeset
   462
		lua_pushcfunction(L, l_signalfd_read);
6d96b6eeee5a util.signal: Wrap signalfd in an userdatum for gc handling etc
Kim Alvefur <zash@zash.se>
parents: 13443
diff changeset
   463
		lua_setfield(L, -2, "read");
6d96b6eeee5a util.signal: Wrap signalfd in an userdatum for gc handling etc
Kim Alvefur <zash@zash.se>
parents: 13443
diff changeset
   464
		lua_pushcfunction(L, l_signalfd_close);
6d96b6eeee5a util.signal: Wrap signalfd in an userdatum for gc handling etc
Kim Alvefur <zash@zash.se>
parents: 13443
diff changeset
   465
		lua_setfield(L, -2, "close");
6d96b6eeee5a util.signal: Wrap signalfd in an userdatum for gc handling etc
Kim Alvefur <zash@zash.se>
parents: 13443
diff changeset
   466
	}
6d96b6eeee5a util.signal: Wrap signalfd in an userdatum for gc handling etc
Kim Alvefur <zash@zash.se>
parents: 13443
diff changeset
   467
	lua_setfield(L, -2, "__index");
6d96b6eeee5a util.signal: Wrap signalfd in an userdatum for gc handling etc
Kim Alvefur <zash@zash.se>
parents: 13443
diff changeset
   468
	lua_pop(L, 1);
6d96b6eeee5a util.signal: Wrap signalfd in an userdatum for gc handling etc
Kim Alvefur <zash@zash.se>
parents: 13443
diff changeset
   469
#endif
6d96b6eeee5a util.signal: Wrap signalfd in an userdatum for gc handling etc
Kim Alvefur <zash@zash.se>
parents: 13443
diff changeset
   470
6618
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
   471
	/* add the library */
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
   472
	lua_newtable(L);
6792
6b180e77c97a util-src/*.c: Invert Lua 5.2 compat to be 5.2+ by default and a macro to support 5.1
Kim Alvefur <zash@zash.se>
parents: 6623
diff changeset
   473
	luaL_setfuncs(L, lsignal_lib, 0);
988
8cb9a0d59e78 util.lsignal: Add lsignal library for catching POSIX signals
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   474
6618
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
   475
	/* push lua_signals table into the registry */
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
   476
	/* put the signals inside the library table too,
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
   477
	 * they are only a reference */
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
   478
	lua_pushstring(L, LUA_SIGNAL);
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
   479
	lua_newtable(L);
988
8cb9a0d59e78 util.lsignal: Add lsignal library for catching POSIX signals
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   480
6618
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
   481
	while(lua_signals[i].name != NULL) {
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
   482
		/* registry table */
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
   483
		lua_pushstring(L, lua_signals[i].name);
10803
763bb2ce3f60 util.pposix,signal: Pass around various OS numbers as integers [Lua 5.3]
Kim Alvefur <zash@zash.se>
parents: 10484
diff changeset
   484
		lua_pushinteger(L, lua_signals[i].sig);
6618
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
   485
		lua_settable(L, -3);
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
   486
		/* signal table */
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
   487
		lua_pushstring(L, lua_signals[i].name);
10803
763bb2ce3f60 util.pposix,signal: Pass around various OS numbers as integers [Lua 5.3]
Kim Alvefur <zash@zash.se>
parents: 10484
diff changeset
   488
		lua_pushinteger(L, lua_signals[i].sig);
6618
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
   489
		lua_settable(L, -5);
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
   490
		i++;
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
   491
	}
988
8cb9a0d59e78 util.lsignal: Add lsignal library for catching POSIX signals
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   492
6618
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
   493
	/* add newtable to the registry */
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
   494
	lua_settable(L, LUA_REGISTRYINDEX);
988
8cb9a0d59e78 util.lsignal: Add lsignal library for catching POSIX signals
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   495
6618
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
   496
	return 1;
988
8cb9a0d59e78 util.lsignal: Add lsignal library for catching POSIX signals
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   497
}
12980
a187600ec7d6 util: Add compat for prosody module name change to C sources
Kim Alvefur <zash@zash.se>
parents: 12579
diff changeset
   498
int luaopen_util_signal(lua_State *L) {
a187600ec7d6 util: Add compat for prosody module name change to C sources
Kim Alvefur <zash@zash.se>
parents: 12579
diff changeset
   499
	return luaopen_prosody_util_signal(L);
a187600ec7d6 util: Add compat for prosody module name change to C sources
Kim Alvefur <zash@zash.se>
parents: 12579
diff changeset
   500
}