Ruby
2.1.3p242(2014-09-19revision47630)
Main Page
Modules
Data Structures
Files
File List
Globals
ext
syslog
syslog.c
Go to the documentation of this file.
1
/*
2
* UNIX Syslog extension for Ruby
3
* Amos Gouaux, University of Texas at Dallas
4
* <amos+ruby@utdallas.edu>
5
* Documented by mathew <meta@pobox.com>
6
*
7
* $RoughId: syslog.c,v 1.21 2002/02/25 12:21:17 knu Exp $
8
* $Id: syslog.c 44904 2014-02-10 13:35:07Z naruse $
9
*/
10
11
#include "
ruby/ruby.h
"
12
#include "
ruby/util.h
"
13
#include <syslog.h>
14
15
/* Syslog class */
16
static
VALUE
mSyslog
;
17
/*
18
* Module holding all Syslog constants. See Syslog::log and
19
* Syslog::open for constant descriptions.
20
*/
21
static
VALUE
mSyslogConstants
;
22
/* Module holding Syslog option constants */
23
static
VALUE
mSyslogOption
;
24
/* Module holding Syslog facility constants */
25
static
VALUE
mSyslogFacility
;
26
/* Module holding Syslog level constants */
27
static
VALUE
mSyslogLevel
;
28
/* Module holding Syslog utility macros */
29
static
VALUE
mSyslogMacros
;
30
31
static
const
char
*
syslog_ident
=
NULL
;
32
static
int
syslog_options
= -1,
syslog_facility
= -1,
syslog_mask
= -1;
33
static
int
syslog_opened
= 0;
34
35
/* Package helper routines */
36
static
void
syslog_write
(
int
pri,
int
argc
,
VALUE
*
argv
)
37
{
38
VALUE
str
;
39
40
if
(argc < 1) {
41
rb_raise
(
rb_eArgError
,
"no log message supplied"
);
42
}
43
44
if
(!
syslog_opened
) {
45
rb_raise
(
rb_eRuntimeError
,
"must open syslog before write"
);
46
}
47
48
str =
rb_f_sprintf
(argc, argv);
49
50
syslog(pri,
"%s"
,
RSTRING_PTR
(str));
51
}
52
53
/* Closes the syslog facility.
54
* Raises a runtime exception if it is not open.
55
*/
56
static
VALUE
mSyslog_close
(
VALUE
self
)
57
{
58
if
(!
syslog_opened
) {
59
rb_raise
(
rb_eRuntimeError
,
"syslog not opened"
);
60
}
61
62
closelog();
63
64
xfree
((
void
*)
syslog_ident
);
65
syslog_ident
=
NULL
;
66
syslog_options
=
syslog_facility
=
syslog_mask
= -1;
67
syslog_opened
= 0;
68
69
return
Qnil
;
70
}
71
72
/* call-seq:
73
* open(ident, options, facility) => syslog
74
*
75
* :yields: syslog
76
*
77
* Open the syslog facility.
78
* Raises a runtime exception if it is already open.
79
*
80
* Can be called with or without a code block. If called with a block, the
81
* Syslog object created is passed to the block.
82
*
83
* If the syslog is already open, raises a RuntimeError.
84
*
85
* +ident+ is a String which identifies the calling program.
86
*
87
* +options+ is the logical OR of any of the following:
88
*
89
* LOG_CONS:: If there is an error while sending to the system logger,
90
* write directly to the console instead.
91
*
92
* LOG_NDELAY:: Open the connection now, rather than waiting for the first
93
* message to be written.
94
*
95
* LOG_NOWAIT:: Don't wait for any child processes created while logging
96
* messages. (Has no effect on Linux.)
97
*
98
* LOG_ODELAY:: Opposite of LOG_NDELAY; wait until a message is sent before
99
* opening the connection. (This is the default.)
100
*
101
* LOG_PERROR:: Print the message to stderr as well as sending it to syslog.
102
* (Not in POSIX.1-2001.)
103
*
104
* LOG_PID:: Include the current process ID with each message.
105
*
106
* +facility+ describes the type of program opening the syslog, and is
107
* the logical OR of any of the following which are defined for the host OS:
108
*
109
* LOG_AUTH:: Security or authorization. Deprecated, use LOG_AUTHPRIV
110
* instead.
111
*
112
* LOG_AUTHPRIV:: Security or authorization messages which should be kept
113
* private.
114
*
115
* LOG_CONSOLE:: System console message.
116
*
117
* LOG_CRON:: System task scheduler (cron or at).
118
*
119
* LOG_DAEMON:: A system daemon which has no facility value of its own.
120
*
121
* LOG_FTP:: An FTP server.
122
*
123
* LOG_KERN:: A kernel message (not sendable by user processes, so not of
124
* much use to Ruby, but listed here for completeness).
125
*
126
* LOG_LPR:: Line printer subsystem.
127
*
128
* LOG_MAIL:: Mail delivery or transport subsystem.
129
*
130
* LOG_NEWS:: Usenet news system.
131
*
132
* LOG_NTP:: Network Time Protocol server.
133
*
134
* LOG_SECURITY:: General security message.
135
*
136
* LOG_SYSLOG:: Messages generated internally by syslog.
137
*
138
* LOG_USER:: Generic user-level message.
139
*
140
* LOG_UUCP:: UUCP subsystem.
141
*
142
* LOG_LOCAL0 to LOG_LOCAL7:: Locally-defined facilities.
143
*
144
* Example:
145
*
146
* Syslog.open("webrick", Syslog::LOG_PID,
147
* Syslog::LOG_DAEMON | Syslog::LOG_LOCAL3)
148
*
149
*/
150
static
VALUE
mSyslog_open
(
int
argc
,
VALUE
*
argv
,
VALUE
self
)
151
{
152
VALUE
ident, opt, fac;
153
154
if
(
syslog_opened
) {
155
rb_raise
(
rb_eRuntimeError
,
"syslog already open"
);
156
}
157
158
rb_scan_args
(argc, argv,
"03"
, &ident, &opt, &fac);
159
160
if
(
NIL_P
(ident)) {
161
ident =
rb_gv_get
(
"$0"
);
162
}
163
SafeStringValue
(ident);
164
syslog_ident
=
strdup
(
RSTRING_PTR
(ident));
165
166
if
(
NIL_P
(opt)) {
167
syslog_options
= LOG_PID | LOG_CONS;
168
}
else
{
169
syslog_options
=
NUM2INT
(opt);
170
}
171
172
if
(
NIL_P
(fac)) {
173
syslog_facility
= LOG_USER;
174
}
else
{
175
syslog_facility
=
NUM2INT
(fac);
176
}
177
178
openlog(
syslog_ident
,
syslog_options
,
syslog_facility
);
179
180
syslog_opened
= 1;
181
182
setlogmask(
syslog_mask
= setlogmask(0));
183
184
/* be like File.new.open {...} */
185
if
(
rb_block_given_p
()) {
186
rb_ensure
(
rb_yield
,
self
,
mSyslog_close
,
self
);
187
}
188
189
return
self
;
190
}
191
192
/* call-seq:
193
* reopen(ident, options, facility) => syslog
194
*
195
* :yields: syslog
196
*
197
* Closes and then reopens the syslog.
198
*
199
* Arguments are the same as for open().
200
*/
201
static
VALUE
mSyslog_reopen
(
int
argc
,
VALUE
*
argv
,
VALUE
self
)
202
{
203
mSyslog_close
(
self
);
204
205
return
mSyslog_open
(argc, argv,
self
);
206
}
207
208
/* call-seq:
209
* opened?
210
*
211
* Returns true if the syslog is open.
212
*/
213
static
VALUE
mSyslog_isopen
(
VALUE
self
)
214
{
215
return
syslog_opened
?
Qtrue
:
Qfalse
;
216
}
217
218
/* Returns the identity string used in the last call to open()
219
*/
220
static
VALUE
mSyslog_ident
(
VALUE
self
)
221
{
222
return
syslog_opened
?
rb_str_new2
(
syslog_ident
) :
Qnil
;
223
}
224
225
/* Returns the options bitmask used in the last call to open()
226
*/
227
static
VALUE
mSyslog_options
(
VALUE
self
)
228
{
229
return
syslog_opened
?
INT2NUM
(
syslog_options
) :
Qnil
;
230
}
231
232
/* Returns the facility number used in the last call to open()
233
*/
234
static
VALUE
mSyslog_facility
(
VALUE
self
)
235
{
236
return
syslog_opened
?
INT2NUM
(
syslog_facility
) :
Qnil
;
237
}
238
239
/* Returns the log priority mask in effect. The mask is not reset by opening
240
* or closing syslog.
241
*/
242
static
VALUE
mSyslog_get_mask
(
VALUE
self
)
243
{
244
return
syslog_opened
?
INT2NUM
(
syslog_mask
) :
Qnil
;
245
}
246
247
/* call-seq:
248
* mask=(priority_mask)
249
*
250
* Sets the log priority mask. A method LOG_UPTO is defined to make it easier
251
* to set mask values. Example:
252
*
253
* Syslog.mask = Syslog::LOG_UPTO(Syslog::LOG_ERR)
254
*
255
* Alternatively, specific priorities can be selected and added together using
256
* binary OR. Example:
257
*
258
* Syslog.mask = Syslog::LOG_MASK(Syslog::LOG_ERR) | Syslog::LOG_MASK(Syslog::LOG_CRIT)
259
*
260
* The priority mask persists through calls to open() and close().
261
*/
262
static
VALUE
mSyslog_set_mask
(
VALUE
self
,
VALUE
mask)
263
{
264
if
(!
syslog_opened
) {
265
rb_raise
(
rb_eRuntimeError
,
"must open syslog before setting log mask"
);
266
}
267
268
setlogmask(
syslog_mask
=
NUM2INT
(mask));
269
270
return
mask;
271
}
272
273
/* call-seq:
274
* log(priority, format_string, *format_args)
275
*
276
* Log a message with the specified priority. Example:
277
*
278
* Syslog.log(Syslog::LOG_CRIT, "Out of disk space")
279
* Syslog.log(Syslog::LOG_CRIT, "User %s logged in", ENV['USER'])
280
*
281
* The priority levels, in descending order, are:
282
*
283
* LOG_EMERG:: System is unusable
284
* LOG_ALERT:: Action needs to be taken immediately
285
* LOG_CRIT:: A critical condition has occurred
286
* LOG_ERR:: An error occurred
287
* LOG_WARNING:: Warning of a possible problem
288
* LOG_NOTICE:: A normal but significant condition occurred
289
* LOG_INFO:: Informational message
290
* LOG_DEBUG:: Debugging information
291
*
292
* Each priority level also has a shortcut method that logs with it's named priority.
293
* As an example, the two following statements would produce the same result:
294
*
295
* Syslog.log(Syslog::LOG_ALERT, "Out of memory")
296
* Syslog.alert("Out of memory")
297
*
298
* Format strings are as for printf/sprintf, except that in addition %m is
299
* replaced with the error message string that would be returned by
300
* strerror(errno).
301
*
302
*/
303
static
VALUE
mSyslog_log
(
int
argc
,
VALUE
*
argv
,
VALUE
self
)
304
{
305
VALUE
pri;
306
307
if
(argc < 2) {
308
rb_raise
(
rb_eArgError
,
"wrong number of arguments (%d for 2+)"
, argc);
309
}
310
311
argc--;
312
pri = *argv++;
313
314
if
(!
FIXNUM_P
(pri)) {
315
rb_raise
(
rb_eTypeError
,
"type mismatch: %"
PRIsVALUE
" given"
,
rb_obj_class
(pri));
316
}
317
318
syslog_write
(
FIX2INT
(pri), argc, argv);
319
320
return
self
;
321
}
322
323
/* Returns an inspect() string summarizing the object state.
324
*/
325
static
VALUE
mSyslog_inspect
(
VALUE
self
)
326
{
327
Check_Type
(
self
,
T_MODULE
);
328
329
if
(!
syslog_opened
)
330
return
rb_sprintf
(
"<#%s: opened=false>"
,
rb_class2name
(
self
));
331
332
return
rb_sprintf
(
"<#%s: opened=true, ident=\"%s\", options=%d, facility=%d, mask=%d>"
,
333
rb_class2name
(
self
),
334
syslog_ident
,
335
syslog_options
,
336
syslog_facility
,
337
syslog_mask
);
338
}
339
340
/* Returns self, for backward compatibility.
341
*/
342
static
VALUE
mSyslog_instance
(
VALUE
self
)
343
{
344
return
self
;
345
}
346
347
#define define_syslog_shortcut_method(pri, name) \
348
static VALUE mSyslog_##name(int argc, VALUE *argv, VALUE self) \
349
{ \
350
syslog_write((pri), argc, argv); \
351
\
352
return self; \
353
}
354
355
#ifdef LOG_EMERG
356
define_syslog_shortcut_method
(LOG_EMERG, emerg)
357
#endif
358
#ifdef LOG_ALERT
359
define_syslog_shortcut_method
(LOG_ALERT, alert)
360
#endif
361
#ifdef LOG_CRIT
362
define_syslog_shortcut_method
(LOG_CRIT, crit)
363
#endif
364
#ifdef LOG_ERR
365
define_syslog_shortcut_method
(LOG_ERR,
err
)
366
#endif
367
#ifdef LOG_WARNING
368
define_syslog_shortcut_method
(LOG_WARNING, warning)
369
#endif
370
#ifdef LOG_NOTICE
371
define_syslog_shortcut_method
(LOG_NOTICE, notice)
372
#endif
373
#ifdef LOG_INFO
374
define_syslog_shortcut_method
(LOG_INFO, info)
375
#endif
376
#ifdef LOG_DEBUG
377
define_syslog_shortcut_method
(LOG_DEBUG,
debug
)
378
#endif
379
380
/* call-seq:
381
* LOG_MASK(priority_level) => priority_mask
382
*
383
* Generates a mask bit for a priority level. See #mask=
384
*/
385
static
VALUE
mSyslogMacros_LOG_MASK
(
VALUE
mod
,
VALUE
pri)
386
{
387
return
INT2FIX
(LOG_MASK(
NUM2INT
(pri)));
388
}
389
390
/* call-seq:
391
* LOG_UPTO(priority_level) => priority_mask
392
*
393
* Generates a mask value for priority levels at or below the level specified.
394
* See #mask=
395
*/
396
static
VALUE
mSyslogMacros_LOG_UPTO
(
VALUE
mod
,
VALUE
pri)
397
{
398
return
INT2FIX
(LOG_UPTO(
NUM2INT
(pri)));
399
}
400
401
static
VALUE
mSyslogMacros_included
(
VALUE
mod
,
VALUE
target)
402
{
403
rb_extend_object
(target,
mSyslogMacros
);
404
return
mod
;
405
}
406
407
/* The syslog package provides a Ruby interface to the POSIX system logging
408
* facility.
409
*
410
* Syslog messages are typically passed to a central logging daemon.
411
* The daemon may filter them; route them into different files (usually
412
* found under /var/log); place them in SQL databases; forward
413
* them to centralized logging servers via TCP or UDP; or even alert the
414
* system administrator via email, pager or text message.
415
*
416
* Unlike application-level logging via Logger or Log4r, syslog is designed
417
* to allow secure tamper-proof logging.
418
*
419
* The syslog protocol is standardized in RFC 5424.
420
*/
421
void
Init_syslog
()
422
{
423
mSyslog
=
rb_define_module
(
"Syslog"
);
424
425
mSyslogConstants
=
rb_define_module_under
(
mSyslog
,
"Constants"
);
426
427
mSyslogOption
=
rb_define_module_under
(
mSyslog
,
"Option"
);
428
mSyslogFacility
=
rb_define_module_under
(
mSyslog
,
"Facility"
);
429
mSyslogLevel
=
rb_define_module_under
(
mSyslog
,
"Level"
);
430
mSyslogMacros
=
rb_define_module_under
(
mSyslog
,
"Macros"
);
431
432
rb_define_module_function
(
mSyslog
,
"open"
,
mSyslog_open
, -1);
433
rb_define_module_function
(
mSyslog
,
"reopen"
,
mSyslog_reopen
, -1);
434
rb_define_module_function
(
mSyslog
,
"open!"
,
mSyslog_reopen
, -1);
435
rb_define_module_function
(
mSyslog
,
"opened?"
,
mSyslog_isopen
, 0);
436
437
rb_define_module_function
(
mSyslog
,
"ident"
,
mSyslog_ident
, 0);
438
rb_define_module_function
(
mSyslog
,
"options"
,
mSyslog_options
, 0);
439
rb_define_module_function
(
mSyslog
,
"facility"
,
mSyslog_facility
, 0);
440
441
rb_define_module_function
(
mSyslog
,
"log"
,
mSyslog_log
, -1);
442
rb_define_module_function
(
mSyslog
,
"close"
,
mSyslog_close
, 0);
443
rb_define_module_function
(
mSyslog
,
"mask"
,
mSyslog_get_mask
, 0);
444
rb_define_module_function
(
mSyslog
,
"mask="
,
mSyslog_set_mask
, 1);
445
446
rb_define_singleton_method
(
mSyslog
,
"inspect"
,
mSyslog_inspect
, 0);
447
rb_define_module_function
(
mSyslog
,
"instance"
,
mSyslog_instance
, 0);
448
449
/* Syslog options */
450
451
#define rb_define_syslog_option(c) \
452
rb_define_const(mSyslogOption, #c, INT2NUM(c))
453
454
#ifdef LOG_PID
455
rb_define_syslog_option
(LOG_PID);
456
#endif
457
#ifdef LOG_CONS
458
rb_define_syslog_option
(LOG_CONS);
459
#endif
460
#ifdef LOG_ODELAY
461
rb_define_syslog_option
(LOG_ODELAY);
/* deprecated */
462
#endif
463
#ifdef LOG_NDELAY
464
rb_define_syslog_option
(LOG_NDELAY);
465
#endif
466
#ifdef LOG_NOWAIT
467
rb_define_syslog_option
(LOG_NOWAIT);
/* deprecated */
468
#endif
469
#ifdef LOG_PERROR
470
rb_define_syslog_option
(LOG_PERROR);
471
#endif
472
473
/* Syslog facilities */
474
475
#define rb_define_syslog_facility(c) \
476
rb_define_const(mSyslogFacility, #c, INT2NUM(c))
477
478
#ifdef LOG_AUTH
479
rb_define_syslog_facility
(LOG_AUTH);
480
#endif
481
#ifdef LOG_AUTHPRIV
482
rb_define_syslog_facility
(LOG_AUTHPRIV);
483
#endif
484
#ifdef LOG_CONSOLE
485
rb_define_syslog_facility
(LOG_CONSOLE);
486
#endif
487
#ifdef LOG_CRON
488
rb_define_syslog_facility
(LOG_CRON);
489
#endif
490
#ifdef LOG_DAEMON
491
rb_define_syslog_facility
(LOG_DAEMON);
492
#endif
493
#ifdef LOG_FTP
494
rb_define_syslog_facility
(LOG_FTP);
495
#endif
496
#ifdef LOG_KERN
497
rb_define_syslog_facility
(LOG_KERN);
498
#endif
499
#ifdef LOG_LPR
500
rb_define_syslog_facility
(LOG_LPR);
501
#endif
502
#ifdef LOG_MAIL
503
rb_define_syslog_facility
(LOG_MAIL);
504
#endif
505
#ifdef LOG_NEWS
506
rb_define_syslog_facility
(LOG_NEWS);
507
#endif
508
#ifdef LOG_NTP
509
rb_define_syslog_facility
(LOG_NTP);
510
#endif
511
#ifdef LOG_SECURITY
512
rb_define_syslog_facility
(LOG_SECURITY);
513
#endif
514
#ifdef LOG_SYSLOG
515
rb_define_syslog_facility
(LOG_SYSLOG);
516
#endif
517
#ifdef LOG_USER
518
rb_define_syslog_facility
(LOG_USER);
519
#endif
520
#ifdef LOG_UUCP
521
rb_define_syslog_facility
(LOG_UUCP);
522
#endif
523
#ifdef LOG_LOCAL0
524
rb_define_syslog_facility
(LOG_LOCAL0);
525
#endif
526
#ifdef LOG_LOCAL1
527
rb_define_syslog_facility
(LOG_LOCAL1);
528
#endif
529
#ifdef LOG_LOCAL2
530
rb_define_syslog_facility
(LOG_LOCAL2);
531
#endif
532
#ifdef LOG_LOCAL3
533
rb_define_syslog_facility
(LOG_LOCAL3);
534
#endif
535
#ifdef LOG_LOCAL4
536
rb_define_syslog_facility
(LOG_LOCAL4);
537
#endif
538
#ifdef LOG_LOCAL5
539
rb_define_syslog_facility
(LOG_LOCAL5);
540
#endif
541
#ifdef LOG_LOCAL6
542
rb_define_syslog_facility
(LOG_LOCAL6);
543
#endif
544
#ifdef LOG_LOCAL7
545
rb_define_syslog_facility
(LOG_LOCAL7);
546
#endif
547
548
/* Syslog levels and the shortcut methods */
549
550
#define rb_define_syslog_level(c, m) \
551
rb_define_const(mSyslogLevel, #c, INT2NUM(c)); \
552
rb_define_module_function(mSyslog, #m, mSyslog_##m, -1)
553
554
#ifdef LOG_EMERG
555
rb_define_syslog_level
(LOG_EMERG, emerg);
556
#endif
557
#ifdef LOG_ALERT
558
rb_define_syslog_level
(LOG_ALERT, alert);
559
#endif
560
#ifdef LOG_CRIT
561
rb_define_syslog_level
(LOG_CRIT, crit);
562
#endif
563
#ifdef LOG_ERR
564
rb_define_syslog_level
(LOG_ERR,
err
);
565
#endif
566
#ifdef LOG_WARNING
567
rb_define_syslog_level
(LOG_WARNING, warning);
568
#endif
569
#ifdef LOG_NOTICE
570
rb_define_syslog_level
(LOG_NOTICE, notice);
571
#endif
572
#ifdef LOG_INFO
573
rb_define_syslog_level
(LOG_INFO, info);
574
#endif
575
#ifdef LOG_DEBUG
576
rb_define_syslog_level
(LOG_DEBUG,
debug
);
577
#endif
578
579
/* Syslog macros */
580
581
rb_define_method
(
mSyslogMacros
,
"LOG_MASK"
,
mSyslogMacros_LOG_MASK
, 1);
582
rb_define_method
(
mSyslogMacros
,
"LOG_UPTO"
,
mSyslogMacros_LOG_UPTO
, 1);
583
rb_define_singleton_method
(
mSyslogMacros
,
"included"
,
mSyslogMacros_included
, 1);
584
585
rb_include_module
(
mSyslogConstants
,
mSyslogOption
);
586
rb_include_module
(
mSyslogConstants
,
mSyslogFacility
);
587
rb_include_module
(
mSyslogConstants
,
mSyslogLevel
);
588
rb_funcall
(
mSyslogConstants
,
rb_intern
(
"include"
), 1,
mSyslogMacros
);
589
590
rb_define_singleton_method
(
mSyslogConstants
,
"included"
,
mSyslogMacros_included
, 1);
591
rb_funcall
(
mSyslog
,
rb_intern
(
"include"
), 1,
mSyslogConstants
);
592
}
593
Generated on Mon Sep 22 2014 11:05:30 for Ruby by
1.8.2