/***************************************************************************
                   Signal Function (Signals.cpp )
                -----------------------------------------

	begin      : 2013/05/28
	copyright  : (C) 2013 Solbox Inc.
	author     : Development 1 Team
					- 2013/05/28 - 1st dadamin
	email      : svc1@solbox.com
	version    : 3.2.0

	CopyRight(C) 2005 Solbox Inc. All Rights reserved.
	Redistribution and use in source and binary forms, with or with out
	modification, are not permitted in outside of Solbox Inc.
***************************************************************************/
#include "cc_statd.h"
#include "Signals.h"
#include "Logger.h"

void SetSighandler(int signum, signal_handler_t handler, int flag)
{
	sigset_t set;
	sigfillset( &set );
	sigprocmask( SIG_SETMASK, &set, NULL ); /* 신호 처리기 처리 설정 위한 블록 */

	int ret;
	struct sigaction oldact;
	struct sigaction act;
	memset(&act, 0, sizeof(act));

	act.sa_handler = handler;
	sigfillset(&act.sa_mask);
	act.sa_flags = flag;

	ret = sigaction(signum, &act, &oldact);
	if (ret != 0) {
		char buf[1024];
		snprintf(buf, sizeof(buf), "SetSighandler: sigaction returned "
			"%d when trying to install a signal handler for %s\n",
			ret, sys_siglist[signum]);
		
		cerr << buf << endl;
		LOG( LERR, "[PID:%d] %s", getpid(), buf);
		exit(EXIT_FAILURE);
	}

	sigemptyset(&set);                                      /* 신호 처리기 처리 설정 위한 블록 해제 */
	sigprocmask(SIG_SETMASK, &set, NULL);
}

void SetIgnoreSignal(bool isDaemon)
{
	SetSighandler(SIGPIPE, SIG_IGN, 0);	// 파이프 디스크립터 오류 발생시 Process가 죽는 것은 방지하기 위하여 설정
	SetSighandler(SIGHUP, SIG_IGN, 0);	// Process를 기동시킨 관리자의 로그아웃시 발생 시그널
	SetSighandler(SIGQUIT, SIG_IGN, 0); // 키보드에 의한  Abort 신호 처리 => ? 

	if(isDaemon == true)
	{
		SetSighandler(SIGINT, SIG_IGN, 0); // ^C 키를 누른 경우 받는 신호 => demon 으로 기동되기 땜시 이 신호 못받음
	}
}

void SetSIGCHLD(signal_handler_t handler)
{
		SetSighandler(SIGCHLD, handler, 0);
}

void SetSIGTERM(bool isDaemon, signal_handler_t handler)
{
	SetSighandler(SIGTERM, handler, 0);
	if (isDaemon == false)
	{
#ifdef _DEBUG
		cout << "SetSIGTERM Console : set SIGINT" << endl;
#endif // _DEBUG
		SetSighandler(SIGINT, handler, 0);
	}
}
