/*
 *	syslog.h
 *
 *	システムログの制御
 *
 *	CLiP - Common Library for P/ECE
 *	Copyright (C) 2016 Naoyuki Sawa
 *
 *	* Mon Jan 18 21:37:57 JST 2016 Naoyuki Sawa
 *	- 1st リリース。
 *	* Thu Mar 03 21:33:11 JST 2016 Naoyuki Sawa
 *	- プログラム起動⇒setlogmask()⇒syslog()の順で呼び出すと、暗黙のopenlog()が実行されず、stSysLogが初期化されないバグが有りました。
 *	  stSysLog.identがNULLのままでsyslog()の処理が行われ、syslog()内のstrconcat()でstSysLog.ident(=NULL)が終端と見なされそれ以降の要素が無いログが生成されてしまっていました。
 *	  今回、プログラム起動⇒setlogmask()⇒syslog()の順で呼び出した場合も、暗黙のopenlog()が実行されるように修正しました。
 */
#ifndef __SYSLOG_H__
#define __SYSLOG_H__
#ifdef  __cplusplus
extern "C" {
#endif//__cplusplus
/*****************************************************************************
 *	
 *****************************************************************************/
//option
#define LOG_CONS		(1<<0)			//エラーがあれば、システムロガーに送る一方でシステムコンソールにも直接書く。
#define LOG_NDELAY		(1<<1)			//ログ記録用プログラムとの接続を即座に開始する(通常は、最初のメッセージが記録される時に接続を開く)。
#define LOG_NOWAIT		(1<<2)			//メッセージを記録する際に生成される子プロセスの終了を待たない。(GNU Cライブラリは子プロセスを生成しない。したがって、このオプションはLinuxでは無効である。)
#define LOG_ODELAY		(1<<3)			//LOG_NDELAYの反対。syslog()が呼ばれるまで、接続の開始を行わない。(このオプションはデフォルトであり、特に指定する必要はない。)
#define LOG_PERROR		(1<<4)			//stderrにも出力する。(POSIX.1-2001とPOSIX.1-2008では定義されていない)
#define LOG_PID			(1<<5)			//個々のメッセージにPIDを含める。
/*---------------------------------------------------------------------------*/
//facility
#define LOG_KERN		( 0<<3)			//カーネルメッセージ(ユーザープロセスから生成することはできない)
#define LOG_USER		( 1<<3)			//一般的なユーザーレベルメッセージ(デフォルト)
#define LOG_MAIL		( 2<<3)			//メールサブシステム
#define LOG_DAEMON		( 3<<3)			//特定のfacility値を持たないシステムデーモン
#define LOG_AUTH		( 4<<3)			//セキュリティ/認証メッセージ
#define LOG_SYSLOG		( 5<<3)			//syslogdによって内部的に発行されるメッセージ
#define LOG_LPR			( 6<<3)			//ラインプリンタサブシステム
#define LOG_NEWS		( 7<<3)			//USENETニュースサブシステム
#define LOG_UUCP		( 8<<3)			//UUCPサブシステム
#define LOG_CRON		( 9<<3)			//クロックデーモン(cronとat)
#define LOG_AUTHPRIV		(10<<3)			//セキュリティ/認証メッセージ(プライベート)
#define LOG_FTP			(11<<3)			//ftpデーモン
//
#define LOG_LOCAL0		(16<<3)			//┐
#define LOG_LOCAL1		(17<<3)			//│
#define LOG_LOCAL2		(18<<3)			//│
#define LOG_LOCAL3		(19<<3)			//├ローカルな使用のためにリザーブされている
#define LOG_LOCAL4		(20<<3)			//│
#define LOG_LOCAL5		(21<<3)			//│
#define LOG_LOCAL6		(22<<3)			//│
#define LOG_LOCAL7		(23<<3)			//┘
/*---------------------------------------------------------------------------*/
//level
#define LOG_EMERG		0			//システムが使用不可
#define LOG_ALERT		1			//直ちに行動を起こさなければならない
#define LOG_CRIT		2			//危険な状態
#define LOG_ERR			3			//エラーの状態
#define LOG_WARNING		4			//ワーニングの状態
#define LOG_NOTICE		5			//通常だが重要な状態
#define LOG_INFO		6			//インフォメーションメッセージ
#define LOG_DEBUG		7			//デバッグレベルのメッセージ
//
#define LOG_MASK(p)		(1<<(p))		//優先度pに対応するマスクを求める。
#define LOG_UPTO(p)		(~((-2)<<(p)))		//優先度p以上の全ての優先度(pを含む)のマスクビットを求める。
/*****************************************************************************
 *	
 *****************************************************************************/
void openlog(const char* ident, int option, int facility);
void syslog(int priority, const char* format, ...);
void vsyslog(int priority, const char* format, va_list ap);
void closelog();
int setlogmask(int mask);
#ifdef  __cplusplus
}//extern "C"
#endif//__cplusplus
#endif//__SYSLOG_H__
