X-Git-Url: https://git.saurik.com/redis.git/blobdiff_plain/1043c8064bce1ffaaa89c9358889bf0ea0b33f51..2fd7c9efdedd81cfa2909ebbcdb30eb9b58d7094:/src/redis.c diff --git a/src/redis.c b/src/redis.c index 5ee44a31..089251b6 100644 --- a/src/redis.c +++ b/src/redis.c @@ -293,6 +293,34 @@ void redisLog(int level, const char *fmt, ...) { redisLogRaw(level,msg); } +/* Log a fixed message without printf-alike capabilities, in a way that is + * safe to call from a signal handler. + * + * We actually use this only for signals that are not fatal from the point + * of view of Redis. Signals that are going to kill the server anyway and + * where we need printf-alike features are served by redisLog(). */ +void redisLogFromHandler(int level, const char *msg) { + int fd; + char buf[64]; + + if ((level&0xff) < server.verbosity || + (server.logfile == NULL && server.daemonize)) return; + fd = server.logfile ? + open(server.logfile, O_APPEND|O_CREAT|O_WRONLY, 0644) : + STDOUT_FILENO; + if (fd == -1) return; + ll2string(buf,sizeof(buf),getpid()); + write(fd,"[",1); + write(fd,buf,strlen(buf)); + write(fd," | signal handler] (",20); + ll2string(buf,sizeof(buf),time(NULL)); + write(fd,buf,strlen(buf)); + write(fd,") ",2); + write(fd,msg,strlen(msg)); + write(fd,"\n",1); + if (server.logfile) close(fd); +} + /* Redis generally does not try to recover from out of memory conditions * when allocating objects or strings, it is not clear if it will be possible * to report this condition to the client since the networking layer itself @@ -1040,6 +1068,7 @@ void initServerConfig() { server.lua_time_limit = REDIS_LUA_TIME_LIMIT; server.lua_client = NULL; server.lua_timedout = 0; + server.lua_protect_globals = 1; updateLRUClock(); resetServerSaveParams(); @@ -2282,7 +2311,7 @@ void redisAsciiArt(void) { static void sigtermHandler(int sig) { REDIS_NOTUSED(sig); - redisLog(REDIS_WARNING,"Received SIGTERM, scheduling shutdown..."); + redisLogFromHandler(REDIS_WARNING,"Received SIGTERM, scheduling shutdown..."); server.shutdown_asap = 1; }