mirror of
https://github.com/octoleo/lsyncd.git
synced 2024-06-02 00:10:49 +00:00
rewriting signal system
This commit is contained in:
parent
9b9ac5d675
commit
e2be36a831
3
.gitignore
vendored
3
.gitignore
vendored
|
@ -4,7 +4,6 @@
|
||||||
*.out
|
*.out
|
||||||
lsyncd
|
lsyncd
|
||||||
|
|
||||||
|
|
||||||
# cmake
|
# cmake
|
||||||
|
|
||||||
AdditionalInfo.txt
|
AdditionalInfo.txt
|
||||||
|
@ -16,8 +15,8 @@ CMakeFiles/
|
||||||
cmake_install.cmake
|
cmake_install.cmake
|
||||||
install_manifest.txt
|
install_manifest.txt
|
||||||
|
|
||||||
|
|
||||||
# generated C code
|
# generated C code
|
||||||
|
|
||||||
default.c
|
default.c
|
||||||
mantle.c
|
mantle.c
|
||||||
|
signames.c
|
||||||
|
|
|
@ -108,7 +108,8 @@ check_logcat( const char *name )
|
||||||
|
|
|
|
||||||
| Returns true if OK.
|
| Returns true if OK.
|
||||||
*/
|
*/
|
||||||
bool add_logcat( const char *name, int priority )
|
bool
|
||||||
|
add_logcat( const char *name, int priority )
|
||||||
{
|
{
|
||||||
struct logcat *lc;
|
struct logcat *lc;
|
||||||
|
|
||||||
|
|
15
core/main.c
15
core/main.c
|
@ -371,8 +371,8 @@ main1( int argc, char *argv[] )
|
||||||
|
|
||||||
while( argp < argc )
|
while( argp < argc )
|
||||||
{
|
{
|
||||||
lua_pushnumber( L, idx++ );
|
|
||||||
lua_pushstring( L, argv[ argp++ ] );
|
lua_pushstring( L, argv[ argp++ ] );
|
||||||
|
lua_pushnumber( L, idx++ );
|
||||||
lua_settable( L, -3 );
|
lua_settable( L, -3 );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -400,6 +400,12 @@ main1( int argc, char *argv[] )
|
||||||
lua_pop( L, 2 );
|
lua_pop( L, 2 );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
signal_init( );
|
||||||
|
|
||||||
|
#ifdef WITH_INOTIFY
|
||||||
|
open_inotify( L );
|
||||||
|
#endif
|
||||||
|
|
||||||
// checks existence of the config file
|
// checks existence of the config file
|
||||||
if( lsyncd_config_file )
|
if( lsyncd_config_file )
|
||||||
{
|
{
|
||||||
|
@ -437,7 +443,6 @@ main1( int argc, char *argv[] )
|
||||||
exit( -1 );
|
exit( -1 );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// loads the user enivornment
|
// loads the user enivornment
|
||||||
lua_getglobal( L, "userENV" );
|
lua_getglobal( L, "userENV" );
|
||||||
lua_setupvalue( L, -2, 1 );
|
lua_setupvalue( L, -2, 1 );
|
||||||
|
@ -453,12 +458,6 @@ main1( int argc, char *argv[] )
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef WITH_INOTIFY
|
|
||||||
open_inotify( L );
|
|
||||||
#endif
|
|
||||||
|
|
||||||
signal_init( );
|
|
||||||
|
|
||||||
// runs initializations from mantle
|
// runs initializations from mantle
|
||||||
// it will set the configuration and add watches
|
// it will set the configuration and add watches
|
||||||
{
|
{
|
||||||
|
|
17
core/mci.c
17
core/mci.c
|
@ -111,10 +111,10 @@ int callError;
|
||||||
| Returns (Lua stack) the pid on success, 0 on failure.
|
| Returns (Lua stack) the pid on success, 0 on failure.
|
||||||
*/
|
*/
|
||||||
static int
|
static int
|
||||||
l_exec( lua_State *L )
|
l_exec( lua_State * L )
|
||||||
{
|
{
|
||||||
// the binary to call
|
// the binary to call
|
||||||
const char *binary = luaL_checkstring(L, 1);
|
const char *binary = luaL_checkstring( L, 1 );
|
||||||
|
|
||||||
// number of arguments
|
// number of arguments
|
||||||
int argc = lua_gettop( L ) - 1;
|
int argc = lua_gettop( L ) - 1;
|
||||||
|
@ -352,7 +352,7 @@ l_realdir( lua_State *L )
|
||||||
{
|
{
|
||||||
luaL_Buffer b;
|
luaL_Buffer b;
|
||||||
const char *rdir = luaL_checkstring(L, 1);
|
const char *rdir = luaL_checkstring(L, 1);
|
||||||
char *adir = get_realpath(rdir);
|
char *adir = get_realpath( rdir );
|
||||||
|
|
||||||
if( !adir )
|
if( !adir )
|
||||||
{
|
{
|
||||||
|
@ -476,9 +476,7 @@ l_readdir( lua_State *L )
|
||||||
{
|
{
|
||||||
const char * dirname = luaL_checkstring( L, 1 );
|
const char * dirname = luaL_checkstring( L, 1 );
|
||||||
|
|
||||||
DIR *d;
|
DIR *d = opendir( dirname );
|
||||||
|
|
||||||
d = opendir( dirname );
|
|
||||||
|
|
||||||
if( d == NULL )
|
if( d == NULL )
|
||||||
{
|
{
|
||||||
|
@ -596,8 +594,7 @@ l_configure( lua_State *L )
|
||||||
free( settings.log_file );
|
free( settings.log_file );
|
||||||
}
|
}
|
||||||
|
|
||||||
settings.log_file =
|
settings.log_file = s_strdup( file );
|
||||||
s_strdup( file );
|
|
||||||
}
|
}
|
||||||
else if( !strcmp( command, "logfacility" ) )
|
else if( !strcmp( command, "logfacility" ) )
|
||||||
{
|
{
|
||||||
|
@ -644,7 +641,7 @@ l_configure( lua_State *L )
|
||||||
/*
|
/*
|
||||||
| The Lsnycd's core library.
|
| The Lsnycd's core library.
|
||||||
*/
|
*/
|
||||||
static const luaL_Reg corelib[] =
|
static const luaL_Reg corelib[ ] =
|
||||||
{
|
{
|
||||||
{ "configure", l_configure },
|
{ "configure", l_configure },
|
||||||
{ "exec", l_exec },
|
{ "exec", l_exec },
|
||||||
|
@ -653,8 +650,10 @@ static const luaL_Reg corelib[] =
|
||||||
{ "now", l_now },
|
{ "now", l_now },
|
||||||
{ "nonobserve_fd", l_nonobserve_fd },
|
{ "nonobserve_fd", l_nonobserve_fd },
|
||||||
{ "observe_fd", l_observe_fd },
|
{ "observe_fd", l_observe_fd },
|
||||||
|
// { "onsignal", l_onsignal },
|
||||||
{ "readdir", l_readdir },
|
{ "readdir", l_readdir },
|
||||||
{ "realdir", l_realdir },
|
{ "realdir", l_realdir },
|
||||||
|
{ "signames", l_signames },
|
||||||
{ "stackdump", l_stackdump },
|
{ "stackdump", l_stackdump },
|
||||||
{ "terminate", l_terminate },
|
{ "terminate", l_terminate },
|
||||||
{ NULL, NULL }
|
{ NULL, NULL }
|
||||||
|
|
|
@ -1,7 +1,9 @@
|
||||||
/*
|
/*
|
||||||
| singal.c from Lsyncd -- the Live (Mirror) Syncing Demon
|
| singal.c from Lsyncd -- the Live (Mirror) Syncing Demon
|
||||||
|
|
|
|
||||||
| Signal handling.
|
| Albeit this signal handling system at first seems to violate
|
||||||
|
| rentry rules things are evened out by sigmasks taking care
|
||||||
|
| only one signal at a time can enter the core.
|
||||||
|
|
|
|
||||||
| License: GPLv2 (see COPYING) or any later version
|
| License: GPLv2 (see COPYING) or any later version
|
||||||
| Authors: Axel Kittenberger <axkibe@gmail.com>
|
| Authors: Axel Kittenberger <axkibe@gmail.com>
|
||||||
|
@ -10,6 +12,26 @@
|
||||||
|
|
||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
#include <signal.h>
|
#include <signal.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#define LUA_USE_APICHECK 1
|
||||||
|
#include <lua.h>
|
||||||
|
#include <lualib.h>
|
||||||
|
#include <lauxlib.h>
|
||||||
|
|
||||||
|
#include "mem.h"
|
||||||
|
|
||||||
|
|
||||||
|
static volatile sig_atomic_t * queue;
|
||||||
|
static int queue_len;
|
||||||
|
static int queue_pos;
|
||||||
|
|
||||||
|
/*
|
||||||
|
| XXX
|
||||||
|
*/
|
||||||
|
static int *handlers;
|
||||||
|
static int handlers_len;
|
||||||
|
static int handlers_maxlen;
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -21,12 +43,16 @@ volatile sig_atomic_t term = 0;
|
||||||
volatile sig_atomic_t sigcode = 0;
|
volatile sig_atomic_t sigcode = 0;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
| signal handler
|
| signal handler
|
||||||
*/
|
*/
|
||||||
static void signal_child( int sig )
|
static void signal_child( int sig )
|
||||||
{
|
{
|
||||||
// Nothing!
|
// Nothing!
|
||||||
|
//
|
||||||
// This signal handler is just installed so the kernel
|
// This signal handler is just installed so the kernel
|
||||||
// keeps finished child processes as zombies waiting to be reaped.
|
// keeps finished child processes as zombies waiting to be reaped.
|
||||||
}
|
}
|
||||||
|
@ -53,6 +79,8 @@ signal_handler( int sig )
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
| Initializes signal handling.
|
| Initializes signal handling.
|
||||||
|
|
|
|
||||||
|
@ -62,6 +90,16 @@ signal_handler( int sig )
|
||||||
void
|
void
|
||||||
signal_init( )
|
signal_init( )
|
||||||
{
|
{
|
||||||
|
queue_len = 5;
|
||||||
|
queue = s_malloc( queue_len * sizeof( sig_atomic_t ) );
|
||||||
|
queue_pos = 0;
|
||||||
|
|
||||||
|
handlers_maxlen = 5;
|
||||||
|
handlers_len = 0;
|
||||||
|
handlers = s_malloc( handlers_maxlen * sizeof( int * ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
sigset_t set;
|
sigset_t set;
|
||||||
sigemptyset( &set );
|
sigemptyset( &set );
|
||||||
sigaddset( &set, SIGCHLD );
|
sigaddset( &set, SIGCHLD );
|
||||||
|
@ -72,4 +110,31 @@ signal_init( )
|
||||||
signal( SIGTERM, signal_handler );
|
signal( SIGTERM, signal_handler );
|
||||||
signal( SIGINT, signal_handler );
|
signal( SIGINT, signal_handler );
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
| Forwards the result of psiginfo to mantle.
|
||||||
|
|
|
||||||
|
| Params on Lua stack:
|
||||||
|
|
|
||||||
|
| Returns on Lua stack:
|
||||||
|
| A table of all signalnames as keys and their signal number as value.
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
l_signames( lua_State * L )
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
lua_newtable( L );
|
||||||
|
|
||||||
|
for( i = 0; i < NSIG; i++ )
|
||||||
|
{
|
||||||
|
lua_pushnumber( L, i );
|
||||||
|
lua_pushstring( L, strsignal( i ) );
|
||||||
|
lua_settable( L, -3 );
|
||||||
|
}
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -18,4 +18,7 @@ extern volatile sig_atomic_t sigcode;
|
||||||
// Initializes signal handling.
|
// Initializes signal handling.
|
||||||
extern void signal_init( );
|
extern void signal_init( );
|
||||||
|
|
||||||
|
// returns signal name/signums as table
|
||||||
|
int l_signames( lua_State * L );
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -375,11 +375,23 @@ end
|
||||||
--
|
--
|
||||||
-- Called from core on init or restart after user configuration.
|
-- Called from core on init or restart after user configuration.
|
||||||
--
|
--
|
||||||
-- firstTime:
|
function mci.initialize
|
||||||
-- true when Lsyncd startups the first time,
|
(
|
||||||
-- false on resets, due to HUP signal or monitor queue overflow.
|
firstTime -- true when Lsyncd startups the first time,
|
||||||
--
|
-- -- false on resets, due to HUP signal or monitor queue overflow.
|
||||||
function mci.initialize( firstTime )
|
)
|
||||||
|
do
|
||||||
|
local signames = core.signames( )
|
||||||
|
local signum = 0
|
||||||
|
signame = signames[ 0 ]
|
||||||
|
|
||||||
|
while signame ~= nil
|
||||||
|
do
|
||||||
|
print( 'SIG', signum, signame )
|
||||||
|
signum = signum + 1
|
||||||
|
signame = signames[ signum ]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
-- Checks if user overwrote the settings function.
|
-- Checks if user overwrote the settings function.
|
||||||
-- ( was Lsyncd <2.1 style )
|
-- ( was Lsyncd <2.1 style )
|
||||||
|
|
31
signames.sh
Executable file
31
signames.sh
Executable file
|
@ -0,0 +1,31 @@
|
||||||
|
##
|
||||||
|
# signames.sh from Lsyncd -- the Live (Mirror) Syncing Demon
|
||||||
|
#
|
||||||
|
# Creates a .c file for all signal names understood by the kill command
|
||||||
|
# on the system Lsyncd is being compiled for.
|
||||||
|
#
|
||||||
|
# License: GPLv2 (see COPYING) or any later version
|
||||||
|
# Authors: Axel Kittenberger <axkibe@gmail.com>
|
||||||
|
#
|
||||||
|
KILL=/bin/kill
|
||||||
|
|
||||||
|
if [ "$#" -ne 1 ];
|
||||||
|
then
|
||||||
|
echo >&2 "$0 needs excatly one argument -- the c file to create"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "/* This file is autogenerated by $0 querying `$KILL --version` */" > $1
|
||||||
|
echo "char const * const siglist[ ] =" >> $1
|
||||||
|
echo "{" >> $1
|
||||||
|
|
||||||
|
n=1
|
||||||
|
while name=`kill -l $n 2>/dev/null`;
|
||||||
|
do
|
||||||
|
echo -e "\t\"$name\"," >> $1
|
||||||
|
n=$((n+1))
|
||||||
|
done
|
||||||
|
|
||||||
|
echo -e "\tNULL," >> $1
|
||||||
|
echo "}" >> $1
|
||||||
|
|
Loading…
Reference in New Issue
Block a user