Software /
code /
prosody
Comparison
util-src/signal.c @ 13441:6d96b6eeee5a
util.signal: Wrap signalfd in an userdatum for gc handling etc
author | Kim Alvefur <zash@zash.se> |
---|---|
date | Sat, 24 Feb 2024 01:00:44 +0100 |
parent | 13439:1e229d710a3c |
child | 13448:93b4ce0115f0 |
comparison
equal
deleted
inserted
replaced
13440:b27de3d2bad6 | 13441:6d96b6eeee5a |
---|---|
371 } | 371 } |
372 | 372 |
373 #endif | 373 #endif |
374 | 374 |
375 #ifdef __linux__ | 375 #ifdef __linux__ |
376 struct lsignalfd { | |
377 int fd; | |
378 sigset_t mask; | |
379 }; | |
380 | |
376 static int l_signalfd(lua_State *L) { | 381 static int l_signalfd(lua_State *L) { |
377 sigset_t mask; | 382 struct lsignalfd *sfd = lua_newuserdata(L, sizeof(struct lsignalfd)); |
378 | 383 |
379 sigemptyset(&mask); | 384 sigemptyset(&sfd->mask); |
380 sigaddset(&mask, luaL_checkinteger(L, 1)); | 385 sigaddset(&sfd->mask, luaL_checkinteger(L, 1)); |
381 | 386 |
382 sigprocmask(SIG_BLOCK, &mask, NULL); /* TODO check err */ | 387 sigprocmask(SIG_BLOCK, &sfd->mask, NULL); /* TODO check err */ |
383 | 388 |
384 lua_pushinteger(L, signalfd(-1, &mask, SFD_NONBLOCK)); | 389 sfd->fd = signalfd(-1, &sfd->mask, SFD_NONBLOCK); |
390 | |
391 if(sfd->fd == -1) { | |
392 lua_pushnil(L); | |
393 return 1; | |
394 } | |
395 | |
396 luaL_setmetatable(L, "signalfd"); | |
397 return 1; | |
398 } | |
399 | |
400 static int l_signalfd_getfd(lua_State *L) { | |
401 struct lsignalfd *sfd = luaL_checkudata(L, 1, "signalfd"); | |
402 | |
403 if (sfd->fd == -1) { | |
404 lua_pushnil(L); | |
405 return 1; | |
406 } | |
407 | |
408 lua_pushinteger(L, sfd->fd); | |
385 return 1; | 409 return 1; |
386 } | 410 } |
387 | 411 |
388 static int l_signalfd_read(lua_State *L) { | 412 static int l_signalfd_read(lua_State *L) { |
389 const int sigfd = luaL_checkinteger(L, 1); | 413 struct lsignalfd *sfd = luaL_checkudata(L, 1, "signalfd"); |
390 struct signalfd_siginfo siginfo; | 414 struct signalfd_siginfo siginfo; |
391 | 415 |
392 if(read(sigfd, &siginfo, sizeof(siginfo)) < 0) { | 416 if(read(sfd->fd, &siginfo, sizeof(siginfo)) < 0) { |
393 return 0; | 417 return 0; |
394 } | 418 } |
395 | 419 |
396 lua_pushinteger(L, siginfo.ssi_signo); | 420 lua_pushinteger(L, siginfo.ssi_signo); |
421 return 1; | |
422 } | |
423 | |
424 static int l_signalfd_close(lua_State *L) { | |
425 struct lsignalfd *sfd = luaL_checkudata(L, 1, "signalfd"); | |
426 | |
427 if(close(sfd->fd) != 0) { | |
428 lua_pushboolean(L, 0); | |
429 return 1; | |
430 } | |
431 | |
432 sfd->fd = -1; | |
433 lua_pushboolean(L, 1); | |
397 return 1; | 434 return 1; |
398 } | 435 } |
399 #endif | 436 #endif |
400 | 437 |
401 static const struct luaL_Reg lsignal_lib[] = { | 438 static const struct luaL_Reg lsignal_lib[] = { |
404 #if defined(__unix__) || defined(__APPLE__) | 441 #if defined(__unix__) || defined(__APPLE__) |
405 {"kill", l_kill}, | 442 {"kill", l_kill}, |
406 #endif | 443 #endif |
407 #ifdef __linux__ | 444 #ifdef __linux__ |
408 {"signalfd", l_signalfd}, | 445 {"signalfd", l_signalfd}, |
409 {"signalfd_read", l_signalfd_read}, | |
410 #endif | 446 #endif |
411 {NULL, NULL} | 447 {NULL, NULL} |
412 }; | 448 }; |
413 | 449 |
414 int luaopen_prosody_util_signal(lua_State *L) { | 450 int luaopen_prosody_util_signal(lua_State *L) { |
415 luaL_checkversion(L); | 451 luaL_checkversion(L); |
416 int i = 0; | 452 int i = 0; |
453 | |
454 #ifdef __linux__ | |
455 luaL_newmetatable(L, "signalfd"); | |
456 lua_pushcfunction(L, l_signalfd_close); | |
457 lua_setfield(L, -2, "__gc"); | |
458 lua_createtable(L, 0, 1); | |
459 { | |
460 lua_pushcfunction(L, l_signalfd_getfd); | |
461 lua_setfield(L, -2, "getfd"); | |
462 lua_pushcfunction(L, l_signalfd_read); | |
463 lua_setfield(L, -2, "read"); | |
464 lua_pushcfunction(L, l_signalfd_close); | |
465 lua_setfield(L, -2, "close"); | |
466 } | |
467 lua_setfield(L, -2, "__index"); | |
468 lua_pop(L, 1); | |
469 #endif | |
417 | 470 |
418 /* add the library */ | 471 /* add the library */ |
419 lua_newtable(L); | 472 lua_newtable(L); |
420 luaL_setfuncs(L, lsignal_lib, 0); | 473 luaL_setfuncs(L, lsignal_lib, 0); |
421 | 474 |