Software /
code /
prosody
Comparison
util-src/signal.c @ 11120:b2331f3dfeea
Merge 0.11->trunk
author | Matthew Wild <mwild1@gmail.com> |
---|---|
date | Wed, 30 Sep 2020 09:50:33 +0100 |
parent | 10799:763bb2ce3f60 |
child | 12575:1f6f05a98fcd |
comparison
equal
deleted
inserted
replaced
11119:68df52bf08d5 | 11120:b2331f3dfeea |
---|---|
37 #include "lauxlib.h" | 37 #include "lauxlib.h" |
38 | 38 |
39 #if (LUA_VERSION_NUM == 501) | 39 #if (LUA_VERSION_NUM == 501) |
40 #define luaL_setfuncs(L, R, N) luaL_register(L, NULL, R) | 40 #define luaL_setfuncs(L, R, N) luaL_register(L, NULL, R) |
41 #endif | 41 #endif |
42 #if (LUA_VERSION_NUM < 503) | |
43 #define lua_isinteger(L, n) lua_isnumber(L, n) | |
44 #endif | |
42 | 45 |
43 #ifndef lsig | 46 #ifndef lsig |
44 | 47 |
45 #define lsig | 48 #define lsig |
46 | 49 |
162 static lua_State *Lsig = NULL; | 165 static lua_State *Lsig = NULL; |
163 static lua_Hook Hsig = NULL; | 166 static lua_Hook Hsig = NULL; |
164 static int Hmask = 0; | 167 static int Hmask = 0; |
165 static int Hcount = 0; | 168 static int Hcount = 0; |
166 | 169 |
167 int signals[MAX_PENDING_SIGNALS]; | 170 static int signals[MAX_PENDING_SIGNALS]; |
168 int nsig = 0; | 171 static int nsig = 0; |
169 | 172 |
170 static void sighook(lua_State *L, lua_Debug *ar) { | 173 static void sighook(lua_State *L, lua_Debug *ar) { |
171 (void)ar; | 174 (void)ar; |
172 /* restore the old hook */ | 175 /* restore the old hook */ |
173 lua_sethook(L, Hsig, Hmask, Hcount); | 176 lua_sethook(L, Hsig, Hmask, Hcount); |
174 | 177 |
175 lua_pushstring(L, LUA_SIGNAL); | 178 lua_pushstring(L, LUA_SIGNAL); |
176 lua_gettable(L, LUA_REGISTRYINDEX); | 179 lua_gettable(L, LUA_REGISTRYINDEX); |
177 | 180 |
178 for(int i = 0; i < nsig; i++) { | 181 for(int i = 0; i < nsig; i++) { |
179 lua_pushnumber(L, signals[i]); | 182 lua_pushinteger(L, signals[i]); |
180 lua_gettable(L, -2); | 183 lua_gettable(L, -2); |
181 lua_call(L, 0, 0); | 184 lua_call(L, 0, 0); |
182 }; | 185 }; |
183 | 186 |
184 nsig = 0; | 187 nsig = 0; |
221 /* get type of signal */ | 224 /* get type of signal */ |
222 luaL_checkany(L, 1); | 225 luaL_checkany(L, 1); |
223 t = lua_type(L, 1); | 226 t = lua_type(L, 1); |
224 | 227 |
225 if(t == LUA_TNUMBER) { | 228 if(t == LUA_TNUMBER) { |
226 sig = (int) lua_tonumber(L, 1); | 229 sig = (int) lua_tointeger(L, 1); |
227 } else if(t == LUA_TSTRING) { | 230 } else if(t == LUA_TSTRING) { |
228 lua_pushstring(L, LUA_SIGNAL); | 231 lua_pushstring(L, LUA_SIGNAL); |
229 lua_gettable(L, LUA_REGISTRYINDEX); | 232 lua_gettable(L, LUA_REGISTRYINDEX); |
230 lua_pushvalue(L, 1); | 233 lua_pushvalue(L, 1); |
231 lua_gettable(L, -2); | 234 lua_gettable(L, -2); |
232 | 235 |
233 if(!lua_isnumber(L, -1)) { | 236 if(!lua_isinteger(L, -1)) { |
234 return luaL_error(L, "invalid signal string"); | 237 return luaL_error(L, "invalid signal string"); |
235 } | 238 } |
236 | 239 |
237 sig = (int) lua_tonumber(L, -1); | 240 sig = (int) lua_tointeger(L, -1); |
238 lua_pop(L, 1); /* get rid of number we pushed */ | 241 lua_pop(L, 1); /* get rid of number we pushed */ |
239 } else { | 242 } else { |
240 luaL_checknumber(L, 1); /* will always error, with good error msg */ | 243 luaL_checknumber(L, 1); /* will always error, with good error msg */ |
241 return luaL_error(L, "unreachable: invalid number was accepted"); | 244 return luaL_error(L, "unreachable: invalid number was accepted"); |
242 } | 245 } |
243 | 246 |
244 /* set handler */ | 247 /* set handler */ |
245 if(args == 1 || lua_isnil(L, 2)) { /* clear handler */ | 248 if(args == 1 || lua_isnil(L, 2)) { /* clear handler */ |
246 lua_pushstring(L, LUA_SIGNAL); | 249 lua_pushstring(L, LUA_SIGNAL); |
247 lua_gettable(L, LUA_REGISTRYINDEX); | 250 lua_gettable(L, LUA_REGISTRYINDEX); |
248 lua_pushnumber(L, sig); | 251 lua_pushinteger(L, sig); |
249 lua_gettable(L, -2); /* return old handler */ | 252 lua_gettable(L, -2); /* return old handler */ |
250 lua_pushnumber(L, sig); | 253 lua_pushinteger(L, sig); |
251 lua_pushnil(L); | 254 lua_pushnil(L); |
252 lua_settable(L, -4); | 255 lua_settable(L, -4); |
253 lua_remove(L, -2); /* remove LUA_SIGNAL table */ | 256 lua_remove(L, -2); /* remove LUA_SIGNAL table */ |
254 signal(sig, SIG_DFL); | 257 signal(sig, SIG_DFL); |
255 } else { | 258 } else { |
256 luaL_checktype(L, 2, LUA_TFUNCTION); | 259 luaL_checktype(L, 2, LUA_TFUNCTION); |
257 | 260 |
258 lua_pushstring(L, LUA_SIGNAL); | 261 lua_pushstring(L, LUA_SIGNAL); |
259 lua_gettable(L, LUA_REGISTRYINDEX); | 262 lua_gettable(L, LUA_REGISTRYINDEX); |
260 | 263 |
261 lua_pushnumber(L, sig); | 264 lua_pushinteger(L, sig); |
262 lua_pushvalue(L, 2); | 265 lua_pushvalue(L, 2); |
263 lua_settable(L, -3); | 266 lua_settable(L, -3); |
264 | 267 |
265 /* Set the state for the handler */ | 268 /* Set the state for the handler */ |
266 Lsig = L; | 269 Lsig = L; |
290 */ | 293 */ |
291 | 294 |
292 static int l_raise(lua_State *L) { | 295 static int l_raise(lua_State *L) { |
293 /* int args = lua_gettop(L); */ | 296 /* int args = lua_gettop(L); */ |
294 int t = 0; /* type */ | 297 int t = 0; /* type */ |
295 lua_Number ret; | 298 lua_Integer ret; |
296 | 299 |
297 luaL_checkany(L, 1); | 300 luaL_checkany(L, 1); |
298 | 301 |
299 t = lua_type(L, 1); | 302 t = lua_type(L, 1); |
300 | 303 |
301 if(t == LUA_TNUMBER) { | 304 if(t == LUA_TNUMBER) { |
302 ret = (lua_Number) raise((int) lua_tonumber(L, 1)); | 305 ret = (lua_Integer) raise((int) lua_tointeger(L, 1)); |
303 lua_pushnumber(L, ret); | 306 lua_pushinteger(L, ret); |
304 } else if(t == LUA_TSTRING) { | 307 } else if(t == LUA_TSTRING) { |
305 lua_pushstring(L, LUA_SIGNAL); | 308 lua_pushstring(L, LUA_SIGNAL); |
306 lua_gettable(L, LUA_REGISTRYINDEX); | 309 lua_gettable(L, LUA_REGISTRYINDEX); |
307 lua_pushvalue(L, 1); | 310 lua_pushvalue(L, 1); |
308 lua_gettable(L, -2); | 311 lua_gettable(L, -2); |
309 | 312 |
310 if(!lua_isnumber(L, -1)) { | 313 if(!lua_isnumber(L, -1)) { |
311 return luaL_error(L, "invalid signal string"); | 314 return luaL_error(L, "invalid signal string"); |
312 } | 315 } |
313 | 316 |
314 ret = (lua_Number) raise((int) lua_tonumber(L, -1)); | 317 ret = (lua_Integer) raise((int) lua_tointeger(L, -1)); |
315 lua_pop(L, 1); /* get rid of number we pushed */ | 318 lua_pop(L, 1); /* get rid of number we pushed */ |
316 lua_pushnumber(L, ret); | 319 lua_pushinteger(L, ret); |
317 } else { | 320 } else { |
318 luaL_checknumber(L, 1); /* will always error, with good error msg */ | 321 luaL_checknumber(L, 1); /* will always error, with good error msg */ |
319 } | 322 } |
320 | 323 |
321 return 1; | 324 return 1; |
332 * signal = signal number or string | 335 * signal = signal number or string |
333 */ | 336 */ |
334 | 337 |
335 static int l_kill(lua_State *L) { | 338 static int l_kill(lua_State *L) { |
336 int t; /* type */ | 339 int t; /* type */ |
337 lua_Number ret; /* return value */ | 340 lua_Integer ret; /* return value */ |
338 | 341 |
339 luaL_checknumber(L, 1); /* must be int for pid */ | 342 luaL_checknumber(L, 1); /* must be int for pid */ |
340 luaL_checkany(L, 2); /* check for a second arg */ | 343 luaL_checkany(L, 2); /* check for a second arg */ |
341 | 344 |
342 t = lua_type(L, 2); | 345 t = lua_type(L, 2); |
343 | 346 |
344 if(t == LUA_TNUMBER) { | 347 if(t == LUA_TNUMBER) { |
345 ret = (lua_Number) kill((int) lua_tonumber(L, 1), | 348 ret = (lua_Integer) kill((int) lua_tointeger(L, 1), |
346 (int) lua_tonumber(L, 2)); | 349 (int) lua_tointeger(L, 2)); |
347 lua_pushnumber(L, ret); | 350 lua_pushinteger(L, ret); |
348 } else if(t == LUA_TSTRING) { | 351 } else if(t == LUA_TSTRING) { |
349 lua_pushstring(L, LUA_SIGNAL); | 352 lua_pushstring(L, LUA_SIGNAL); |
350 lua_gettable(L, LUA_REGISTRYINDEX); | 353 lua_gettable(L, LUA_REGISTRYINDEX); |
351 lua_pushvalue(L, 2); | 354 lua_pushvalue(L, 2); |
352 lua_gettable(L, -2); | 355 lua_gettable(L, -2); |
353 | 356 |
354 if(!lua_isnumber(L, -1)) { | 357 if(!lua_isnumber(L, -1)) { |
355 return luaL_error(L, "invalid signal string"); | 358 return luaL_error(L, "invalid signal string"); |
356 } | 359 } |
357 | 360 |
358 ret = (lua_Number) kill((int) lua_tonumber(L, 1), | 361 ret = (lua_Integer) kill((int) lua_tointeger(L, 1), |
359 (int) lua_tonumber(L, -1)); | 362 (int) lua_tointeger(L, -1)); |
360 lua_pop(L, 1); /* get rid of number we pushed */ | 363 lua_pop(L, 1); /* get rid of number we pushed */ |
361 lua_pushnumber(L, ret); | 364 lua_pushinteger(L, ret); |
362 } else { | 365 } else { |
363 luaL_checknumber(L, 2); /* will always error, with good error msg */ | 366 luaL_checknumber(L, 2); /* will always error, with good error msg */ |
364 } | 367 } |
365 | 368 |
366 return 1; | 369 return 1; |
394 lua_newtable(L); | 397 lua_newtable(L); |
395 | 398 |
396 while(lua_signals[i].name != NULL) { | 399 while(lua_signals[i].name != NULL) { |
397 /* registry table */ | 400 /* registry table */ |
398 lua_pushstring(L, lua_signals[i].name); | 401 lua_pushstring(L, lua_signals[i].name); |
399 lua_pushnumber(L, lua_signals[i].sig); | 402 lua_pushinteger(L, lua_signals[i].sig); |
400 lua_settable(L, -3); | 403 lua_settable(L, -3); |
401 /* signal table */ | 404 /* signal table */ |
402 lua_pushstring(L, lua_signals[i].name); | 405 lua_pushstring(L, lua_signals[i].name); |
403 lua_pushnumber(L, lua_signals[i].sig); | 406 lua_pushinteger(L, lua_signals[i].sig); |
404 lua_settable(L, -5); | 407 lua_settable(L, -5); |
405 i++; | 408 i++; |
406 } | 409 } |
407 | 410 |
408 /* add newtable to the registry */ | 411 /* add newtable to the registry */ |