00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 #include "ruby/ruby.h"
00011 #include "ruby/util.h"
00012 #include <syslog.h>
00013
00014
00015 static VALUE mSyslog, mSyslogConstants;
00016 static const char *syslog_ident = NULL;
00017 static int syslog_options = -1, syslog_facility = -1, syslog_mask = -1;
00018 static int syslog_opened = 0;
00019
00020
00021 static void syslog_write(int pri, int argc, VALUE *argv)
00022 {
00023 VALUE str;
00024
00025 rb_secure(4);
00026 if (argc < 1) {
00027 rb_raise(rb_eArgError, "no log message supplied");
00028 }
00029
00030 if (!syslog_opened) {
00031 rb_raise(rb_eRuntimeError, "must open syslog before write");
00032 }
00033
00034 str = rb_f_sprintf(argc, argv);
00035
00036 syslog(pri, "%s", RSTRING_PTR(str));
00037 }
00038
00039
00040 static VALUE mSyslog_close(VALUE self)
00041 {
00042 rb_secure(4);
00043 if (!syslog_opened) {
00044 rb_raise(rb_eRuntimeError, "syslog not opened");
00045 }
00046
00047 closelog();
00048
00049 free((void *)syslog_ident);
00050 syslog_ident = NULL;
00051 syslog_options = syslog_facility = syslog_mask = -1;
00052 syslog_opened = 0;
00053
00054 return Qnil;
00055 }
00056
00057 static VALUE mSyslog_open(int argc, VALUE *argv, VALUE self)
00058 {
00059 VALUE ident, opt, fac;
00060
00061 if (syslog_opened) {
00062 rb_raise(rb_eRuntimeError, "syslog already open");
00063 }
00064
00065 rb_scan_args(argc, argv, "03", &ident, &opt, &fac);
00066
00067 if (NIL_P(ident)) {
00068 ident = rb_gv_get("$0");
00069 }
00070 SafeStringValue(ident);
00071 syslog_ident = strdup(RSTRING_PTR(ident));
00072
00073 if (NIL_P(opt)) {
00074 syslog_options = LOG_PID | LOG_CONS;
00075 } else {
00076 syslog_options = NUM2INT(opt);
00077 }
00078
00079 if (NIL_P(fac)) {
00080 syslog_facility = LOG_USER;
00081 } else {
00082 syslog_facility = NUM2INT(fac);
00083 }
00084
00085 openlog(syslog_ident, syslog_options, syslog_facility);
00086
00087 syslog_opened = 1;
00088
00089 setlogmask(syslog_mask = setlogmask(0));
00090
00091
00092 if (rb_block_given_p()) {
00093 rb_ensure(rb_yield, self, mSyslog_close, self);
00094 }
00095
00096 return self;
00097 }
00098
00099 static VALUE mSyslog_reopen(int argc, VALUE *argv, VALUE self)
00100 {
00101 mSyslog_close(self);
00102
00103 return mSyslog_open(argc, argv, self);
00104 }
00105
00106 static VALUE mSyslog_isopen(VALUE self)
00107 {
00108 return syslog_opened ? Qtrue : Qfalse;
00109 }
00110
00111 static VALUE mSyslog_ident(VALUE self)
00112 {
00113 return syslog_opened ? rb_str_new2(syslog_ident) : Qnil;
00114 }
00115
00116 static VALUE mSyslog_options(VALUE self)
00117 {
00118 return syslog_opened ? INT2NUM(syslog_options) : Qnil;
00119 }
00120
00121 static VALUE mSyslog_facility(VALUE self)
00122 {
00123 return syslog_opened ? INT2NUM(syslog_facility) : Qnil;
00124 }
00125
00126 static VALUE mSyslog_get_mask(VALUE self)
00127 {
00128 return syslog_opened ? INT2NUM(syslog_mask) : Qnil;
00129 }
00130
00131 static VALUE mSyslog_set_mask(VALUE self, VALUE mask)
00132 {
00133 rb_secure(4);
00134 if (!syslog_opened) {
00135 rb_raise(rb_eRuntimeError, "must open syslog before setting log mask");
00136 }
00137
00138 setlogmask(syslog_mask = NUM2INT(mask));
00139
00140 return mask;
00141 }
00142
00143 static VALUE mSyslog_log(int argc, VALUE *argv, VALUE self)
00144 {
00145 VALUE pri;
00146
00147 if (argc < 2) {
00148 rb_raise(rb_eArgError, "wrong number of arguments (%d for 2+)", argc);
00149 }
00150
00151 argc--;
00152 pri = *argv++;
00153
00154 if (!FIXNUM_P(pri)) {
00155 rb_raise(rb_eTypeError, "type mismatch: %s given", rb_class2name(CLASS_OF(pri)));
00156 }
00157
00158 syslog_write(FIX2INT(pri), argc, argv);
00159
00160 return self;
00161 }
00162
00163 static VALUE mSyslog_inspect(VALUE self)
00164 {
00165 char buf[1024];
00166
00167 if (syslog_opened) {
00168 snprintf(buf, sizeof(buf),
00169 "<#%s: opened=true, ident=\"%s\", options=%d, facility=%d, mask=%d>",
00170 rb_class2name(self),
00171 syslog_ident,
00172 syslog_options,
00173 syslog_facility,
00174 syslog_mask);
00175 } else {
00176 snprintf(buf, sizeof(buf),
00177 "<#%s: opened=false>", rb_class2name(self));
00178 }
00179
00180 return rb_str_new2(buf);
00181 }
00182
00183 static VALUE mSyslog_instance(VALUE self)
00184 {
00185 return self;
00186 }
00187
00188 #define define_syslog_shortcut_method(pri, name) \
00189 static VALUE mSyslog_##name(int argc, VALUE *argv, VALUE self) \
00190 { \
00191 syslog_write(pri, argc, argv); \
00192 \
00193 return self; \
00194 }
00195
00196 #ifdef LOG_EMERG
00197 define_syslog_shortcut_method(LOG_EMERG, emerg)
00198 #endif
00199 #ifdef LOG_ALERT
00200 define_syslog_shortcut_method(LOG_ALERT, alert)
00201 #endif
00202 #ifdef LOG_CRIT
00203 define_syslog_shortcut_method(LOG_CRIT, crit)
00204 #endif
00205 #ifdef LOG_ERR
00206 define_syslog_shortcut_method(LOG_ERR, err)
00207 #endif
00208 #ifdef LOG_WARNING
00209 define_syslog_shortcut_method(LOG_WARNING, warning)
00210 #endif
00211 #ifdef LOG_NOTICE
00212 define_syslog_shortcut_method(LOG_NOTICE, notice)
00213 #endif
00214 #ifdef LOG_INFO
00215 define_syslog_shortcut_method(LOG_INFO, info)
00216 #endif
00217 #ifdef LOG_DEBUG
00218 define_syslog_shortcut_method(LOG_DEBUG, debug)
00219 #endif
00220
00221 static VALUE mSyslogConstants_LOG_MASK(VALUE klass, VALUE pri)
00222 {
00223 return INT2FIX(LOG_MASK(NUM2INT(pri)));
00224 }
00225
00226 static VALUE mSyslogConstants_LOG_UPTO(VALUE klass, VALUE pri)
00227 {
00228 return INT2FIX(LOG_UPTO(NUM2INT(pri)));
00229 }
00230
00231
00232 void Init_syslog()
00233 {
00234 mSyslog = rb_define_module("Syslog");
00235
00236 mSyslogConstants = rb_define_module_under(mSyslog, "Constants");
00237
00238 rb_include_module(mSyslog, mSyslogConstants);
00239
00240 rb_define_module_function(mSyslog, "open", mSyslog_open, -1);
00241 rb_define_module_function(mSyslog, "reopen", mSyslog_reopen, -1);
00242 rb_define_module_function(mSyslog, "open!", mSyslog_reopen, -1);
00243 rb_define_module_function(mSyslog, "opened?", mSyslog_isopen, 0);
00244
00245 rb_define_module_function(mSyslog, "ident", mSyslog_ident, 0);
00246 rb_define_module_function(mSyslog, "options", mSyslog_options, 0);
00247 rb_define_module_function(mSyslog, "facility", mSyslog_facility, 0);
00248
00249 rb_define_module_function(mSyslog, "log", mSyslog_log, -1);
00250 rb_define_module_function(mSyslog, "close", mSyslog_close, 0);
00251 rb_define_module_function(mSyslog, "mask", mSyslog_get_mask, 0);
00252 rb_define_module_function(mSyslog, "mask=", mSyslog_set_mask, 1);
00253
00254 rb_define_module_function(mSyslog, "LOG_MASK", mSyslogConstants_LOG_MASK, 1);
00255 rb_define_module_function(mSyslog, "LOG_UPTO", mSyslogConstants_LOG_UPTO, 1);
00256
00257 rb_define_module_function(mSyslog, "inspect", mSyslog_inspect, 0);
00258 rb_define_module_function(mSyslog, "instance", mSyslog_instance, 0);
00259
00260 rb_define_module_function(mSyslogConstants, "LOG_MASK", mSyslogConstants_LOG_MASK, 1);
00261 rb_define_module_function(mSyslogConstants, "LOG_UPTO", mSyslogConstants_LOG_UPTO, 1);
00262
00263 #define rb_define_syslog_const(id) \
00264 rb_define_const(mSyslogConstants, #id, INT2NUM(id))
00265
00266
00267 #ifdef LOG_PID
00268 rb_define_syslog_const(LOG_PID);
00269 #endif
00270 #ifdef LOG_CONS
00271 rb_define_syslog_const(LOG_CONS);
00272 #endif
00273 #ifdef LOG_ODELAY
00274 rb_define_syslog_const(LOG_ODELAY);
00275 #endif
00276 #ifdef LOG_NDELAY
00277 rb_define_syslog_const(LOG_NDELAY);
00278 #endif
00279 #ifdef LOG_NOWAIT
00280 rb_define_syslog_const(LOG_NOWAIT);
00281 #endif
00282 #ifdef LOG_PERROR
00283 rb_define_syslog_const(LOG_PERROR);
00284 #endif
00285
00286
00287 #ifdef LOG_AUTH
00288 rb_define_syslog_const(LOG_AUTH);
00289 #endif
00290 #ifdef LOG_AUTHPRIV
00291 rb_define_syslog_const(LOG_AUTHPRIV);
00292 #endif
00293 #ifdef LOG_CONSOLE
00294 rb_define_syslog_const(LOG_CONSOLE);
00295 #endif
00296 #ifdef LOG_CRON
00297 rb_define_syslog_const(LOG_CRON);
00298 #endif
00299 #ifdef LOG_DAEMON
00300 rb_define_syslog_const(LOG_DAEMON);
00301 #endif
00302 #ifdef LOG_FTP
00303 rb_define_syslog_const(LOG_FTP);
00304 #endif
00305 #ifdef LOG_KERN
00306 rb_define_syslog_const(LOG_KERN);
00307 #endif
00308 #ifdef LOG_LPR
00309 rb_define_syslog_const(LOG_LPR);
00310 #endif
00311 #ifdef LOG_MAIL
00312 rb_define_syslog_const(LOG_MAIL);
00313 #endif
00314 #ifdef LOG_NEWS
00315 rb_define_syslog_const(LOG_NEWS);
00316 #endif
00317 #ifdef LOG_NTP
00318 rb_define_syslog_const(LOG_NTP);
00319 #endif
00320 #ifdef LOG_SECURITY
00321 rb_define_syslog_const(LOG_SECURITY);
00322 #endif
00323 #ifdef LOG_SYSLOG
00324 rb_define_syslog_const(LOG_SYSLOG);
00325 #endif
00326 #ifdef LOG_USER
00327 rb_define_syslog_const(LOG_USER);
00328 #endif
00329 #ifdef LOG_UUCP
00330 rb_define_syslog_const(LOG_UUCP);
00331 #endif
00332 #ifdef LOG_LOCAL0
00333 rb_define_syslog_const(LOG_LOCAL0);
00334 #endif
00335 #ifdef LOG_LOCAL1
00336 rb_define_syslog_const(LOG_LOCAL1);
00337 #endif
00338 #ifdef LOG_LOCAL2
00339 rb_define_syslog_const(LOG_LOCAL2);
00340 #endif
00341 #ifdef LOG_LOCAL3
00342 rb_define_syslog_const(LOG_LOCAL3);
00343 #endif
00344 #ifdef LOG_LOCAL4
00345 rb_define_syslog_const(LOG_LOCAL4);
00346 #endif
00347 #ifdef LOG_LOCAL5
00348 rb_define_syslog_const(LOG_LOCAL5);
00349 #endif
00350 #ifdef LOG_LOCAL6
00351 rb_define_syslog_const(LOG_LOCAL6);
00352 #endif
00353 #ifdef LOG_LOCAL7
00354 rb_define_syslog_const(LOG_LOCAL7);
00355 #endif
00356
00357 #define rb_define_syslog_shortcut(name) \
00358 rb_define_module_function(mSyslog, #name, mSyslog_##name, -1)
00359
00360
00361 #ifdef LOG_EMERG
00362 rb_define_syslog_const(LOG_EMERG);
00363 rb_define_syslog_shortcut(emerg);
00364 #endif
00365 #ifdef LOG_ALERT
00366 rb_define_syslog_const(LOG_ALERT);
00367 rb_define_syslog_shortcut(alert);
00368 #endif
00369 #ifdef LOG_CRIT
00370 rb_define_syslog_const(LOG_CRIT);
00371 rb_define_syslog_shortcut(crit);
00372 #endif
00373 #ifdef LOG_ERR
00374 rb_define_syslog_const(LOG_ERR);
00375 rb_define_syslog_shortcut(err);
00376 #endif
00377 #ifdef LOG_WARNING
00378 rb_define_syslog_const(LOG_WARNING);
00379 rb_define_syslog_shortcut(warning);
00380 #endif
00381 #ifdef LOG_NOTICE
00382 rb_define_syslog_const(LOG_NOTICE);
00383 rb_define_syslog_shortcut(notice);
00384 #endif
00385 #ifdef LOG_INFO
00386 rb_define_syslog_const(LOG_INFO);
00387 rb_define_syslog_shortcut(info);
00388 #endif
00389 #ifdef LOG_DEBUG
00390 rb_define_syslog_const(LOG_DEBUG);
00391 rb_define_syslog_shortcut(debug);
00392 #endif
00393 }
00394