File: netsys_c_syslog.c

package info (click to toggle)
ocamlnet 3.5.1-1
  • links: PTS, VCS
  • area: main
  • in suites: wheezy
  • size: 32,468 kB
  • sloc: ml: 96,667; ansic: 9,511; sh: 1,131; makefile: 974
file content (132 lines) | stat: -rw-r--r-- 2,652 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
/* $Id: netsys_c_syslog.c 1691 2012-02-05 18:29:36Z gerd $ */

#include "netsys_c.h"

#ifdef HAVE_SYSLOG
#include <syslog.h>
#endif


/**********************************************************************/
/* Syslog                                                             */
/**********************************************************************/

#ifdef HAVE_SYSLOG
static int syslog_lev_flags[] = {
    LOG_EMERG, LOG_ALERT, LOG_CRIT, LOG_ERR, LOG_WARNING, LOG_NOTICE,
    LOG_INFO, LOG_DEBUG
};

#ifndef LOG_AUTHPRIV
#define LOG_AUTHPRIV LOG_LOCAL0
#endif

#ifndef LOG_CRON
#define LOG_CRON LOG_LOCAL0
#endif

#ifndef LOG_DAEMON
#define LOG_DAEMON LOG_LOCAL0
#endif

#ifndef LOG_FTP
#define LOG_FTP LOG_LOCAL0
#endif

#ifndef LOG_KERN
#define LOG_KERN LOG_LOCAL0
#endif

#ifndef LOG_LPR
#define LOG_LPR LOG_LOCAL0
#endif

#ifndef LOG_MAIL
#define LOG_MAIL LOG_LOCAL0
#endif

#ifndef LOG_NEWS
#define LOG_NEWS LOG_LOCAL0
#endif

#ifndef LOG_SYSLOG
#define LOG_SYSLOG LOG_LOCAL0
#endif

#ifndef LOG_UUCP
#define LOG_UUCP LOG_LOCAL0
#endif

static int syslog_fac_flags[] = {
    LOG_AUTHPRIV, LOG_CRON, LOG_DAEMON, LOG_FTP, LOG_KERN, 
    LOG_LOCAL0, LOG_LOCAL1, LOG_LOCAL2, LOG_LOCAL3, LOG_LOCAL4,
    LOG_LOCAL5, LOG_LOCAL6, LOG_LOCAL7, LOG_LPR, LOG_MAIL,
    LOG_NEWS, LOG_SYSLOG, LOG_USER, LOG_UUCP, 0
};

static int syslog_opt_flags[] = {
    LOG_CONS, LOG_NDELAY, LOG_ODELAY, LOG_NOWAIT, LOG_PID
};

static char *ident_buf = NULL;
#define IDENT_BUF_LEN 256
#endif



CAMLprim value netsys_openlog(value ident,
			      value opts,
			      value fac) 
{
#ifdef HAVE_SYSLOG
    char *id;
    int options;
    int facility;

    id=NULL;
    if (Is_block(ident)) {
	if (ident_buf == NULL) {
	    ident_buf = stat_alloc(IDENT_BUF_LEN);
	};
	strncpy(ident_buf, 
		String_val(Field(ident, 0)),
		IDENT_BUF_LEN-1);
	ident_buf[IDENT_BUF_LEN-1] = 0;
	id=ident_buf;
    };
    options = convert_flag_list(opts, syslog_opt_flags);
    facility = syslog_fac_flags[Int_val(fac)];
    openlog(id, options, facility);
    return Val_unit;
#else
    invalid_argument("Netsys_posix.openlog not available");
#endif
}


CAMLprim value netsys_syslog(value fac, value lev, value msg)
{
#ifdef HAVE_SYSLOG
    int facility;
    int level;
    facility = syslog_fac_flags[Int_val(fac)];
    level = syslog_lev_flags[Int_val(lev)];
    syslog(facility | level, "%s", String_val(msg));
    return Val_unit;
#else
    invalid_argument("Netsys_posix.syslog not available");
#endif
}


CAMLprim value netsys_closelog(value dummy) 
{
#ifdef HAVE_SYSLOG
    closelog();
    return Val_unit;
#else
    invalid_argument("Netsys_posix.closelog not available");
#endif
}