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 */