Software / code / prosody
Comparison
util-src/signal.c @ 6615:8e4572a642cb
util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
| author | Kim Alvefur <zash@zash.se> |
|---|---|
| date | Fri, 03 Apr 2015 19:52:48 +0200 |
| parent | 6413:a552f4170aed |
| child | 6620:50eaefeec013 |
comparison
equal
deleted
inserted
replaced
| 6613:2aae36312eb9 | 6615:8e4572a642cb |
|---|---|
| 21 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | 21 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
| 22 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | 22 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL |
| 23 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR | 23 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR |
| 24 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, | 24 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, |
| 25 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR | 25 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR |
| 26 * OTHER DEALINGS IN THE SOFTWARE. | 26 * OTHER DEALINGS IN THE SOFTWARE. |
| 27 */ | 27 */ |
| 28 | 28 |
| 29 #include <signal.h> | 29 #include <signal.h> |
| 30 #include <stdlib.h> | 30 #include <stdlib.h> |
| 31 | 31 |
| 38 | 38 |
| 39 #ifndef lsig | 39 #ifndef lsig |
| 40 | 40 |
| 41 #define lsig | 41 #define lsig |
| 42 | 42 |
| 43 struct lua_signal | 43 struct lua_signal { |
| 44 { | 44 char* name; /* name of the signal */ |
| 45 char *name; /* name of the signal */ | 45 int sig; /* the signal */ |
| 46 int sig; /* the signal */ | |
| 47 }; | 46 }; |
| 48 | 47 |
| 49 #endif | 48 #endif |
| 50 | 49 |
| 51 #define LUA_SIGNAL "lua_signal" | 50 #define LUA_SIGNAL "lua_signal" |
| 52 | 51 |
| 53 static const struct lua_signal lua_signals[] = { | 52 static const struct lua_signal lua_signals[] = { |
| 54 /* ANSI C signals */ | 53 /* ANSI C signals */ |
| 55 #ifdef SIGABRT | 54 #ifdef SIGABRT |
| 56 {"SIGABRT", SIGABRT}, | 55 {"SIGABRT", SIGABRT}, |
| 57 #endif | 56 #endif |
| 58 #ifdef SIGFPE | 57 #ifdef SIGFPE |
| 59 {"SIGFPE", SIGFPE}, | 58 {"SIGFPE", SIGFPE}, |
| 60 #endif | 59 #endif |
| 61 #ifdef SIGILL | 60 #ifdef SIGILL |
| 62 {"SIGILL", SIGILL}, | 61 {"SIGILL", SIGILL}, |
| 63 #endif | 62 #endif |
| 64 #ifdef SIGINT | 63 #ifdef SIGINT |
| 65 {"SIGINT", SIGINT}, | 64 {"SIGINT", SIGINT}, |
| 66 #endif | 65 #endif |
| 67 #ifdef SIGSEGV | 66 #ifdef SIGSEGV |
| 68 {"SIGSEGV", SIGSEGV}, | 67 {"SIGSEGV", SIGSEGV}, |
| 69 #endif | 68 #endif |
| 70 #ifdef SIGTERM | 69 #ifdef SIGTERM |
| 71 {"SIGTERM", SIGTERM}, | 70 {"SIGTERM", SIGTERM}, |
| 72 #endif | 71 #endif |
| 73 /* posix signals */ | 72 /* posix signals */ |
| 74 #ifdef SIGHUP | 73 #ifdef SIGHUP |
| 75 {"SIGHUP", SIGHUP}, | 74 {"SIGHUP", SIGHUP}, |
| 76 #endif | 75 #endif |
| 77 #ifdef SIGQUIT | 76 #ifdef SIGQUIT |
| 78 {"SIGQUIT", SIGQUIT}, | 77 {"SIGQUIT", SIGQUIT}, |
| 79 #endif | 78 #endif |
| 80 #ifdef SIGTRAP | 79 #ifdef SIGTRAP |
| 81 {"SIGTRAP", SIGTRAP}, | 80 {"SIGTRAP", SIGTRAP}, |
| 82 #endif | 81 #endif |
| 83 #ifdef SIGKILL | 82 #ifdef SIGKILL |
| 84 {"SIGKILL", SIGKILL}, | 83 {"SIGKILL", SIGKILL}, |
| 85 #endif | 84 #endif |
| 86 #ifdef SIGUSR1 | 85 #ifdef SIGUSR1 |
| 87 {"SIGUSR1", SIGUSR1}, | 86 {"SIGUSR1", SIGUSR1}, |
| 88 #endif | 87 #endif |
| 89 #ifdef SIGUSR2 | 88 #ifdef SIGUSR2 |
| 90 {"SIGUSR2", SIGUSR2}, | 89 {"SIGUSR2", SIGUSR2}, |
| 91 #endif | 90 #endif |
| 92 #ifdef SIGPIPE | 91 #ifdef SIGPIPE |
| 93 {"SIGPIPE", SIGPIPE}, | 92 {"SIGPIPE", SIGPIPE}, |
| 94 #endif | 93 #endif |
| 95 #ifdef SIGALRM | 94 #ifdef SIGALRM |
| 96 {"SIGALRM", SIGALRM}, | 95 {"SIGALRM", SIGALRM}, |
| 97 #endif | 96 #endif |
| 98 #ifdef SIGCHLD | 97 #ifdef SIGCHLD |
| 99 {"SIGCHLD", SIGCHLD}, | 98 {"SIGCHLD", SIGCHLD}, |
| 100 #endif | 99 #endif |
| 101 #ifdef SIGCONT | 100 #ifdef SIGCONT |
| 102 {"SIGCONT", SIGCONT}, | 101 {"SIGCONT", SIGCONT}, |
| 103 #endif | 102 #endif |
| 104 #ifdef SIGSTOP | 103 #ifdef SIGSTOP |
| 105 {"SIGSTOP", SIGSTOP}, | 104 {"SIGSTOP", SIGSTOP}, |
| 106 #endif | 105 #endif |
| 107 #ifdef SIGTTIN | 106 #ifdef SIGTTIN |
| 108 {"SIGTTIN", SIGTTIN}, | 107 {"SIGTTIN", SIGTTIN}, |
| 109 #endif | 108 #endif |
| 110 #ifdef SIGTTOU | 109 #ifdef SIGTTOU |
| 111 {"SIGTTOU", SIGTTOU}, | 110 {"SIGTTOU", SIGTTOU}, |
| 112 #endif | 111 #endif |
| 113 /* some BSD signals */ | 112 /* some BSD signals */ |
| 114 #ifdef SIGIOT | 113 #ifdef SIGIOT |
| 115 {"SIGIOT", SIGIOT}, | 114 {"SIGIOT", SIGIOT}, |
| 116 #endif | 115 #endif |
| 117 #ifdef SIGBUS | 116 #ifdef SIGBUS |
| 118 {"SIGBUS", SIGBUS}, | 117 {"SIGBUS", SIGBUS}, |
| 119 #endif | 118 #endif |
| 120 #ifdef SIGCLD | 119 #ifdef SIGCLD |
| 121 {"SIGCLD", SIGCLD}, | 120 {"SIGCLD", SIGCLD}, |
| 122 #endif | 121 #endif |
| 123 #ifdef SIGURG | 122 #ifdef SIGURG |
| 124 {"SIGURG", SIGURG}, | 123 {"SIGURG", SIGURG}, |
| 125 #endif | 124 #endif |
| 126 #ifdef SIGXCPU | 125 #ifdef SIGXCPU |
| 127 {"SIGXCPU", SIGXCPU}, | 126 {"SIGXCPU", SIGXCPU}, |
| 128 #endif | 127 #endif |
| 129 #ifdef SIGXFSZ | 128 #ifdef SIGXFSZ |
| 130 {"SIGXFSZ", SIGXFSZ}, | 129 {"SIGXFSZ", SIGXFSZ}, |
| 131 #endif | 130 #endif |
| 132 #ifdef SIGVTALRM | 131 #ifdef SIGVTALRM |
| 133 {"SIGVTALRM", SIGVTALRM}, | 132 {"SIGVTALRM", SIGVTALRM}, |
| 134 #endif | 133 #endif |
| 135 #ifdef SIGPROF | 134 #ifdef SIGPROF |
| 136 {"SIGPROF", SIGPROF}, | 135 {"SIGPROF", SIGPROF}, |
| 137 #endif | 136 #endif |
| 138 #ifdef SIGWINCH | 137 #ifdef SIGWINCH |
| 139 {"SIGWINCH", SIGWINCH}, | 138 {"SIGWINCH", SIGWINCH}, |
| 140 #endif | 139 #endif |
| 141 #ifdef SIGPOLL | 140 #ifdef SIGPOLL |
| 142 {"SIGPOLL", SIGPOLL}, | 141 {"SIGPOLL", SIGPOLL}, |
| 143 #endif | 142 #endif |
| 144 #ifdef SIGIO | 143 #ifdef SIGIO |
| 145 {"SIGIO", SIGIO}, | 144 {"SIGIO", SIGIO}, |
| 146 #endif | 145 #endif |
| 147 /* add odd signals */ | 146 /* add odd signals */ |
| 148 #ifdef SIGSTKFLT | 147 #ifdef SIGSTKFLT |
| 149 {"SIGSTKFLT", SIGSTKFLT}, /* stack fault */ | 148 {"SIGSTKFLT", SIGSTKFLT}, /* stack fault */ |
| 150 #endif | 149 #endif |
| 151 #ifdef SIGSYS | 150 #ifdef SIGSYS |
| 152 {"SIGSYS", SIGSYS}, | 151 {"SIGSYS", SIGSYS}, |
| 153 #endif | 152 #endif |
| 154 {NULL, 0} | 153 {NULL, 0} |
| 155 }; | 154 }; |
| 156 | 155 |
| 157 static lua_State *Lsig = NULL; | 156 static lua_State* Lsig = NULL; |
| 158 static lua_Hook Hsig = NULL; | 157 static lua_Hook Hsig = NULL; |
| 159 static int Hmask = 0; | 158 static int Hmask = 0; |
| 160 static int Hcount = 0; | 159 static int Hcount = 0; |
| 161 | 160 |
| 162 static struct signal_event | 161 static struct signal_event { |
| 163 { | |
| 164 int Nsig; | 162 int Nsig; |
| 165 struct signal_event *next_event; | 163 struct signal_event* next_event; |
| 166 } *signal_queue = NULL; | 164 }* signal_queue = NULL; |
| 167 | 165 |
| 168 static struct signal_event *last_event = NULL; | 166 static struct signal_event* last_event = NULL; |
| 169 | 167 |
| 170 static void sighook(lua_State *L, lua_Debug *ar) | 168 static void sighook(lua_State* L, lua_Debug* ar) { |
| 171 { | 169 struct signal_event* event; |
| 172 struct signal_event *event; | 170 /* restore the old hook */ |
| 173 /* restore the old hook */ | 171 lua_sethook(L, Hsig, Hmask, Hcount); |
| 174 lua_sethook(L, Hsig, Hmask, Hcount); | 172 |
| 175 | 173 lua_pushstring(L, LUA_SIGNAL); |
| 176 lua_pushstring(L, LUA_SIGNAL); | 174 lua_gettable(L, LUA_REGISTRYINDEX); |
| 177 lua_gettable(L, LUA_REGISTRYINDEX); | 175 |
| 178 | 176 while((event = signal_queue)) { |
| 179 while((event = signal_queue)) | 177 lua_pushnumber(L, event->Nsig); |
| 180 { | 178 lua_gettable(L, -2); |
| 181 lua_pushnumber(L, event->Nsig); | 179 lua_call(L, 0, 0); |
| 182 lua_gettable(L, -2); | 180 signal_queue = event->next_event; |
| 183 lua_call(L, 0, 0); | 181 free(event); |
| 184 signal_queue = event->next_event; | 182 }; |
| 185 free(event); | 183 |
| 186 }; | 184 lua_pop(L, 1); /* pop lua_signal table */ |
| 187 | 185 |
| 188 lua_pop(L, 1); /* pop lua_signal table */ | 186 } |
| 189 | 187 |
| 190 } | 188 static void handle(int sig) { |
| 191 | 189 if(!signal_queue) { |
| 192 static void handle(int sig) | 190 /* Store the existing debug hook (if any) and its parameters */ |
| 193 { | 191 Hsig = lua_gethook(Lsig); |
| 194 if(!signal_queue) | 192 Hmask = lua_gethookmask(Lsig); |
| 195 { | 193 Hcount = lua_gethookcount(Lsig); |
| 196 /* Store the existing debug hook (if any) and its parameters */ | 194 |
| 197 Hsig = lua_gethook(Lsig); | 195 signal_queue = malloc(sizeof(struct signal_event)); |
| 198 Hmask = lua_gethookmask(Lsig); | 196 signal_queue->Nsig = sig; |
| 199 Hcount = lua_gethookcount(Lsig); | 197 signal_queue->next_event = NULL; |
| 200 | 198 |
| 201 signal_queue = malloc(sizeof(struct signal_event)); | 199 last_event = signal_queue; |
| 202 signal_queue->Nsig = sig; | 200 |
| 203 signal_queue->next_event = NULL; | 201 /* Set our new debug hook */ |
| 204 | 202 lua_sethook(Lsig, sighook, LUA_MASKCALL | LUA_MASKRET | LUA_MASKCOUNT, 1); |
| 205 last_event = signal_queue; | 203 } else { |
| 206 | 204 last_event->next_event = malloc(sizeof(struct signal_event)); |
| 207 /* Set our new debug hook */ | 205 last_event->next_event->Nsig = sig; |
| 208 lua_sethook(Lsig, sighook, LUA_MASKCALL | LUA_MASKRET | LUA_MASKCOUNT, 1); | 206 last_event->next_event->next_event = NULL; |
| 209 } | 207 |
| 210 else | 208 last_event = last_event->next_event; |
| 211 { | 209 } |
| 212 last_event->next_event = malloc(sizeof(struct signal_event)); | |
| 213 last_event->next_event->Nsig = sig; | |
| 214 last_event->next_event->next_event = NULL; | |
| 215 | |
| 216 last_event = last_event->next_event; | |
| 217 } | |
| 218 } | 210 } |
| 219 | 211 |
| 220 /* | 212 /* |
| 221 * l_signal == signal(signal [, func [, chook]]) | 213 * l_signal == signal(signal [, func [, chook]]) |
| 222 * | 214 * |
| 224 * func = Lua function to call | 216 * func = Lua function to call |
| 225 * chook = catch within C functions | 217 * chook = catch within C functions |
| 226 * if caught, Lua function _must_ | 218 * if caught, Lua function _must_ |
| 227 * exit, as the stack is most likely | 219 * exit, as the stack is most likely |
| 228 * in an unstable state. | 220 * in an unstable state. |
| 229 */ | 221 */ |
| 230 | 222 |
| 231 static int l_signal(lua_State *L) | 223 static int l_signal(lua_State* L) { |
| 232 { | 224 int args = lua_gettop(L); |
| 233 int args = lua_gettop(L); | 225 int t, sig; /* type, signal */ |
| 234 int t, sig; /* type, signal */ | 226 |
| 235 | 227 /* get type of signal */ |
| 236 /* get type of signal */ | 228 luaL_checkany(L, 1); |
| 237 luaL_checkany(L, 1); | 229 t = lua_type(L, 1); |
| 238 t = lua_type(L, 1); | 230 |
| 239 if (t == LUA_TNUMBER) | 231 if(t == LUA_TNUMBER) { |
| 240 sig = (int) lua_tonumber(L, 1); | 232 sig = (int) lua_tonumber(L, 1); |
| 241 else if (t == LUA_TSTRING) | 233 } else if(t == LUA_TSTRING) { |
| 242 { | 234 lua_pushstring(L, LUA_SIGNAL); |
| 243 lua_pushstring(L, LUA_SIGNAL); | 235 lua_gettable(L, LUA_REGISTRYINDEX); |
| 244 lua_gettable(L, LUA_REGISTRYINDEX); | 236 lua_pushvalue(L, 1); |
| 245 lua_pushvalue(L, 1); | 237 lua_gettable(L, -2); |
| 246 lua_gettable(L, -2); | 238 |
| 247 if (!lua_isnumber(L, -1)) | 239 if(!lua_isnumber(L, -1)) { |
| 248 luaL_error(L, "invalid signal string"); | 240 luaL_error(L, "invalid signal string"); |
| 249 sig = (int) lua_tonumber(L, -1); | 241 } |
| 250 lua_pop(L, 1); /* get rid of number we pushed */ | 242 |
| 251 } else | 243 sig = (int) lua_tonumber(L, -1); |
| 252 luaL_checknumber(L, 1); /* will always error, with good error msg */ | 244 lua_pop(L, 1); /* get rid of number we pushed */ |
| 253 | 245 } else { |
| 254 /* set handler */ | 246 luaL_checknumber(L, 1); /* will always error, with good error msg */ |
| 255 if (args == 1 || lua_isnil(L, 2)) /* clear handler */ | 247 } |
| 256 { | 248 |
| 257 lua_pushstring(L, LUA_SIGNAL); | 249 /* set handler */ |
| 258 lua_gettable(L, LUA_REGISTRYINDEX); | 250 if(args == 1 || lua_isnil(L, 2)) { /* clear handler */ |
| 259 lua_pushnumber(L, sig); | 251 lua_pushstring(L, LUA_SIGNAL); |
| 260 lua_gettable(L, -2); /* return old handler */ | 252 lua_gettable(L, LUA_REGISTRYINDEX); |
| 261 lua_pushnumber(L, sig); | 253 lua_pushnumber(L, sig); |
| 262 lua_pushnil(L); | 254 lua_gettable(L, -2); /* return old handler */ |
| 263 lua_settable(L, -4); | 255 lua_pushnumber(L, sig); |
| 264 lua_remove(L, -2); /* remove LUA_SIGNAL table */ | 256 lua_pushnil(L); |
| 265 signal(sig, SIG_DFL); | 257 lua_settable(L, -4); |
| 266 } else | 258 lua_remove(L, -2); /* remove LUA_SIGNAL table */ |
| 267 { | 259 signal(sig, SIG_DFL); |
| 268 luaL_checktype(L, 2, LUA_TFUNCTION); | 260 } else { |
| 269 | 261 luaL_checktype(L, 2, LUA_TFUNCTION); |
| 270 lua_pushstring(L, LUA_SIGNAL); | 262 |
| 271 lua_gettable(L, LUA_REGISTRYINDEX); | 263 lua_pushstring(L, LUA_SIGNAL); |
| 272 | 264 lua_gettable(L, LUA_REGISTRYINDEX); |
| 273 lua_pushnumber(L, sig); | 265 |
| 274 lua_pushvalue(L, 2); | 266 lua_pushnumber(L, sig); |
| 275 lua_settable(L, -3); | 267 lua_pushvalue(L, 2); |
| 276 | 268 lua_settable(L, -3); |
| 277 /* Set the state for the handler */ | 269 |
| 278 Lsig = L; | 270 /* Set the state for the handler */ |
| 279 | 271 Lsig = L; |
| 280 if (lua_toboolean(L, 3)) /* c hook? */ | 272 |
| 281 { | 273 if(lua_toboolean(L, 3)) { /* c hook? */ |
| 282 if (signal(sig, handle) == SIG_ERR) | 274 if(signal(sig, handle) == SIG_ERR) { |
| 283 lua_pushboolean(L, 0); | 275 lua_pushboolean(L, 0); |
| 284 else | 276 } else { |
| 285 lua_pushboolean(L, 1); | 277 lua_pushboolean(L, 1); |
| 286 } else /* lua_hook */ | 278 } |
| 287 { | 279 } else { /* lua_hook */ |
| 288 if (signal(sig, handle) == SIG_ERR) | 280 if(signal(sig, handle) == SIG_ERR) { |
| 289 lua_pushboolean(L, 0); | 281 lua_pushboolean(L, 0); |
| 290 else | 282 } else { |
| 291 lua_pushboolean(L, 1); | 283 lua_pushboolean(L, 1); |
| 292 } | 284 } |
| 293 } | 285 } |
| 294 return 1; | 286 } |
| 287 | |
| 288 return 1; | |
| 295 } | 289 } |
| 296 | 290 |
| 297 /* | 291 /* |
| 298 * l_raise == raise(signal) | 292 * l_raise == raise(signal) |
| 299 * | 293 * |
| 300 * signal = signal number or string | 294 * signal = signal number or string |
| 301 */ | 295 */ |
| 302 | 296 |
| 303 static int l_raise(lua_State *L) | 297 static int l_raise(lua_State* L) { |
| 304 { | 298 /* int args = lua_gettop(L); */ |
| 305 /* int args = lua_gettop(L); */ | 299 int t = 0; /* type */ |
| 306 int t = 0; /* type */ | 300 lua_Number ret; |
| 307 lua_Number ret; | 301 |
| 308 | 302 luaL_checkany(L, 1); |
| 309 luaL_checkany(L, 1); | 303 |
| 310 | 304 t = lua_type(L, 1); |
| 311 t = lua_type(L, 1); | 305 |
| 312 if (t == LUA_TNUMBER) | 306 if(t == LUA_TNUMBER) { |
| 313 { | 307 ret = (lua_Number) raise((int) lua_tonumber(L, 1)); |
| 314 ret = (lua_Number) raise((int) lua_tonumber(L, 1)); | 308 lua_pushnumber(L, ret); |
| 315 lua_pushnumber(L, ret); | 309 } else if(t == LUA_TSTRING) { |
| 316 } else if (t == LUA_TSTRING) | 310 lua_pushstring(L, LUA_SIGNAL); |
| 317 { | 311 lua_gettable(L, LUA_REGISTRYINDEX); |
| 318 lua_pushstring(L, LUA_SIGNAL); | 312 lua_pushvalue(L, 1); |
| 319 lua_gettable(L, LUA_REGISTRYINDEX); | 313 lua_gettable(L, -2); |
| 320 lua_pushvalue(L, 1); | 314 |
| 321 lua_gettable(L, -2); | 315 if(!lua_isnumber(L, -1)) { |
| 322 if (!lua_isnumber(L, -1)) | 316 luaL_error(L, "invalid signal string"); |
| 323 luaL_error(L, "invalid signal string"); | 317 } |
| 324 ret = (lua_Number) raise((int) lua_tonumber(L, -1)); | 318 |
| 325 lua_pop(L, 1); /* get rid of number we pushed */ | 319 ret = (lua_Number) raise((int) lua_tonumber(L, -1)); |
| 326 lua_pushnumber(L, ret); | 320 lua_pop(L, 1); /* get rid of number we pushed */ |
| 327 } else | 321 lua_pushnumber(L, ret); |
| 328 luaL_checknumber(L, 1); /* will always error, with good error msg */ | 322 } else { |
| 329 | 323 luaL_checknumber(L, 1); /* will always error, with good error msg */ |
| 330 return 1; | 324 } |
| 325 | |
| 326 return 1; | |
| 331 } | 327 } |
| 332 | 328 |
| 333 #if defined(__unix__) || defined(__APPLE__) | 329 #if defined(__unix__) || defined(__APPLE__) |
| 334 | 330 |
| 335 /* define some posix only functions */ | 331 /* define some posix only functions */ |
| 337 /* | 333 /* |
| 338 * l_kill == kill(pid, signal) | 334 * l_kill == kill(pid, signal) |
| 339 * | 335 * |
| 340 * pid = process id | 336 * pid = process id |
| 341 * signal = signal number or string | 337 * signal = signal number or string |
| 342 */ | 338 */ |
| 343 | 339 |
| 344 static int l_kill(lua_State *L) | 340 static int l_kill(lua_State* L) { |
| 345 { | 341 int t; /* type */ |
| 346 int t; /* type */ | 342 lua_Number ret; /* return value */ |
| 347 lua_Number ret; /* return value */ | 343 |
| 348 | 344 luaL_checknumber(L, 1); /* must be int for pid */ |
| 349 luaL_checknumber(L, 1); /* must be int for pid */ | 345 luaL_checkany(L, 2); /* check for a second arg */ |
| 350 luaL_checkany(L, 2); /* check for a second arg */ | 346 |
| 351 | 347 t = lua_type(L, 2); |
| 352 t = lua_type(L, 2); | 348 |
| 353 if (t == LUA_TNUMBER) | 349 if(t == LUA_TNUMBER) { |
| 354 { | 350 ret = (lua_Number) kill((int) lua_tonumber(L, 1), |
| 355 ret = (lua_Number) kill((int) lua_tonumber(L, 1), | 351 (int) lua_tonumber(L, 2)); |
| 356 (int) lua_tonumber(L, 2)); | 352 lua_pushnumber(L, ret); |
| 357 lua_pushnumber(L, ret); | 353 } else if(t == LUA_TSTRING) { |
| 358 } else if (t == LUA_TSTRING) | 354 lua_pushstring(L, LUA_SIGNAL); |
| 359 { | 355 lua_gettable(L, LUA_REGISTRYINDEX); |
| 360 lua_pushstring(L, LUA_SIGNAL); | 356 lua_pushvalue(L, 2); |
| 361 lua_gettable(L, LUA_REGISTRYINDEX); | 357 lua_gettable(L, -2); |
| 362 lua_pushvalue(L, 2); | 358 |
| 363 lua_gettable(L, -2); | 359 if(!lua_isnumber(L, -1)) { |
| 364 if (!lua_isnumber(L, -1)) | 360 luaL_error(L, "invalid signal string"); |
| 365 luaL_error(L, "invalid signal string"); | 361 } |
| 366 ret = (lua_Number) kill((int) lua_tonumber(L, 1), | 362 |
| 367 (int) lua_tonumber(L, -1)); | 363 ret = (lua_Number) kill((int) lua_tonumber(L, 1), |
| 368 lua_pop(L, 1); /* get rid of number we pushed */ | 364 (int) lua_tonumber(L, -1)); |
| 369 lua_pushnumber(L, ret); | 365 lua_pop(L, 1); /* get rid of number we pushed */ |
| 370 } else | 366 lua_pushnumber(L, ret); |
| 371 luaL_checknumber(L, 2); /* will always error, with good error msg */ | 367 } else { |
| 372 return 1; | 368 luaL_checknumber(L, 2); /* will always error, with good error msg */ |
| 369 } | |
| 370 | |
| 371 return 1; | |
| 373 } | 372 } |
| 374 | 373 |
| 375 #endif | 374 #endif |
| 376 | 375 |
| 377 static const struct luaL_Reg lsignal_lib[] = { | 376 static const struct luaL_Reg lsignal_lib[] = { |
| 378 {"signal", l_signal}, | 377 {"signal", l_signal}, |
| 379 {"raise", l_raise}, | 378 {"raise", l_raise}, |
| 380 #if defined(__unix__) || defined(__APPLE__) | 379 #if defined(__unix__) || defined(__APPLE__) |
| 381 {"kill", l_kill}, | 380 {"kill", l_kill}, |
| 382 #endif | 381 #endif |
| 383 {NULL, NULL} | 382 {NULL, NULL} |
| 384 }; | 383 }; |
| 385 | 384 |
| 386 int luaopen_util_signal(lua_State *L) | 385 int luaopen_util_signal(lua_State* L) { |
| 387 { | 386 int i = 0; |
| 388 int i = 0; | 387 |
| 389 | 388 /* add the library */ |
| 390 /* add the library */ | 389 lua_newtable(L); |
| 391 lua_newtable(L); | 390 luaL_register(L, NULL, lsignal_lib); |
| 392 luaL_register(L, NULL, lsignal_lib); | 391 |
| 393 | 392 /* push lua_signals table into the registry */ |
| 394 /* push lua_signals table into the registry */ | 393 /* put the signals inside the library table too, |
| 395 /* put the signals inside the library table too, | 394 * they are only a reference */ |
| 396 * they are only a reference */ | 395 lua_pushstring(L, LUA_SIGNAL); |
| 397 lua_pushstring(L, LUA_SIGNAL); | 396 lua_newtable(L); |
| 398 lua_newtable(L); | 397 |
| 399 | 398 while(lua_signals[i].name != NULL) { |
| 400 while (lua_signals[i].name != NULL) | 399 /* registry table */ |
| 401 { | 400 lua_pushstring(L, lua_signals[i].name); |
| 402 /* registry table */ | 401 lua_pushnumber(L, lua_signals[i].sig); |
| 403 lua_pushstring(L, lua_signals[i].name); | 402 lua_settable(L, -3); |
| 404 lua_pushnumber(L, lua_signals[i].sig); | 403 /* signal table */ |
| 405 lua_settable(L, -3); | 404 lua_pushstring(L, lua_signals[i].name); |
| 406 /* signal table */ | 405 lua_pushnumber(L, lua_signals[i].sig); |
| 407 lua_pushstring(L, lua_signals[i].name); | 406 lua_settable(L, -5); |
| 408 lua_pushnumber(L, lua_signals[i].sig); | 407 i++; |
| 409 lua_settable(L, -5); | 408 } |
| 410 i++; | 409 |
| 411 } | 410 /* add newtable to the registry */ |
| 412 | 411 lua_settable(L, LUA_REGISTRYINDEX); |
| 413 /* add newtable to the registry */ | 412 |
| 414 lua_settable(L, LUA_REGISTRYINDEX); | 413 return 1; |
| 415 | 414 } |
| 416 return 1; | |
| 417 } |