journald-native 1.0.3 → 1.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/ext/journald_native/CMakeLists.txt +7 -0
- data/ext/journald_native/cpp14shiv.h +78 -0
- data/ext/journald_native/extconf.rb +3 -3
- data/ext/journald_native/extinit.cpp +7 -0
- data/ext/journald_native/journald_native.cpp +149 -0
- data/ext/journald_native/journald_native.h +12 -0
- data/ext/journald_native/ruby_exception_wrapper.cpp +16 -0
- data/ext/journald_native/ruby_exception_wrapper.h +91 -0
- data/ext/journald_native/sd_journal.h +25 -55
- data/ext/journald_native/sd_journal_dummy.h +23 -0
- data/lib/journald/native/version.rb +1 -1
- metadata +11 -5
- data/ext/journald_native/journald_native.c +0 -143
- data/ext/journald_native/sd_journal_dummy.c +0 -9
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 62f14b24b4e9636244fd45956b5aa2804748099f
|
4
|
+
data.tar.gz: a373cd433f9a905a0c4e1310a42979b50b6f06cb
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3df15346ea9c39be6bff77310c24e26e03bb23f654d21f15388c8785d09532b88ac47f7cb0ff939dece01535a18d20785790f9faf245044bb9d1258c5509808d
|
7
|
+
data.tar.gz: 34326f6563d13d955da83995d16345a2c385d4f2d87fefee4a248087e703c7c61b8dfb05e4df273db880d4638f6a752abccae058f6b143542efc4cf62588d00c
|
@@ -0,0 +1,78 @@
|
|
1
|
+
/*
|
2
|
+
unique_ptr from http://isocpp.org/files/papers/N3656.txt
|
3
|
+
index sequence from gcc 4.9 sources
|
4
|
+
*/
|
5
|
+
|
6
|
+
#include <cstddef>
|
7
|
+
#include <memory>
|
8
|
+
#include <type_traits>
|
9
|
+
#include <utility>
|
10
|
+
|
11
|
+
namespace std {
|
12
|
+
template<class T> struct _Unique_if {
|
13
|
+
typedef unique_ptr<T> _Single_object;
|
14
|
+
};
|
15
|
+
|
16
|
+
template<class T> struct _Unique_if<T[]> {
|
17
|
+
typedef unique_ptr<T[]> _Unknown_bound;
|
18
|
+
};
|
19
|
+
|
20
|
+
template<class T, size_t N> struct _Unique_if<T[N]> {
|
21
|
+
typedef void _Known_bound;
|
22
|
+
};
|
23
|
+
|
24
|
+
template<class T, class... Args>
|
25
|
+
typename _Unique_if<T>::_Single_object
|
26
|
+
make_unique(Args&&... args) {
|
27
|
+
return unique_ptr<T>(new T(std::forward<Args>(args)...));
|
28
|
+
}
|
29
|
+
|
30
|
+
template<class T>
|
31
|
+
typename _Unique_if<T>::_Unknown_bound
|
32
|
+
make_unique(size_t n) {
|
33
|
+
typedef typename remove_extent<T>::type U;
|
34
|
+
return unique_ptr<T>(new U[n]());
|
35
|
+
}
|
36
|
+
|
37
|
+
template<class T, class... Args>
|
38
|
+
typename _Unique_if<T>::_Known_bound
|
39
|
+
make_unique(Args&&...) = delete;
|
40
|
+
|
41
|
+
/// Class template integer_sequence
|
42
|
+
template<typename _Tp, _Tp... _Idx>
|
43
|
+
struct integer_sequence
|
44
|
+
{
|
45
|
+
typedef _Tp value_type;
|
46
|
+
static constexpr size_t size() { return sizeof...(_Idx); }
|
47
|
+
};
|
48
|
+
|
49
|
+
template<typename _Tp, _Tp _Num,
|
50
|
+
typename _ISeq = typename _Build_index_tuple<_Num>::__type>
|
51
|
+
struct _Make_integer_sequence;
|
52
|
+
|
53
|
+
template<typename _Tp, _Tp _Num, size_t... _Idx>
|
54
|
+
struct _Make_integer_sequence<_Tp, _Num, _Index_tuple<_Idx...>>
|
55
|
+
{
|
56
|
+
static_assert( _Num >= 0,
|
57
|
+
"Cannot make integer sequence of negative length" );
|
58
|
+
|
59
|
+
typedef integer_sequence<_Tp, static_cast<_Tp>(_Idx)...> __type;
|
60
|
+
};
|
61
|
+
|
62
|
+
/// Alias template make_integer_sequence
|
63
|
+
template<typename _Tp, _Tp _Num>
|
64
|
+
using make_integer_sequence
|
65
|
+
= typename _Make_integer_sequence<_Tp, _Num>::__type;
|
66
|
+
|
67
|
+
/// Alias template index_sequence
|
68
|
+
template<size_t... _Idx>
|
69
|
+
using index_sequence = integer_sequence<size_t, _Idx...>;
|
70
|
+
|
71
|
+
/// Alias template make_index_sequence
|
72
|
+
template<size_t _Num>
|
73
|
+
using make_index_sequence = make_integer_sequence<size_t, _Num>;
|
74
|
+
|
75
|
+
/// Alias template index_sequence_for
|
76
|
+
template<typename... _Types>
|
77
|
+
using index_sequence_for = make_index_sequence<sizeof...(_Types)>;
|
78
|
+
}
|
@@ -4,11 +4,12 @@ LIBDIR = RbConfig::CONFIG['libdir']
|
|
4
4
|
INCLUDEDIR = RbConfig::CONFIG['includedir']
|
5
5
|
|
6
6
|
HEADER_DIRS = [INCLUDEDIR]
|
7
|
-
|
8
|
-
LIB_DIRS = [LIBDIR]
|
7
|
+
LIB_DIRS = [LIBDIR]
|
9
8
|
|
10
9
|
dir_config('systemd', HEADER_DIRS, LIB_DIRS)
|
11
10
|
|
11
|
+
$CPPFLAGS = '-std=c++11'
|
12
|
+
|
12
13
|
def have_funcs
|
13
14
|
have_funcs = true
|
14
15
|
|
@@ -33,4 +34,3 @@ end
|
|
33
34
|
|
34
35
|
create_header
|
35
36
|
create_makefile('journald_native')
|
36
|
-
|
@@ -0,0 +1,149 @@
|
|
1
|
+
#include "journald_native.h"
|
2
|
+
#include "sd_journal.h"
|
3
|
+
|
4
|
+
#include <memory>
|
5
|
+
|
6
|
+
#include "ruby_exception_wrapper.h"
|
7
|
+
|
8
|
+
namespace journald_native {
|
9
|
+
|
10
|
+
// just a short alias for ruby_raisable_call()
|
11
|
+
template <typename Func, typename... Args>
|
12
|
+
inline auto r(Func f, Args... args) -> decltype(f(args...))
|
13
|
+
{
|
14
|
+
return ruby_exception_wrapper::ruby_raisable_call(f, args...);
|
15
|
+
}
|
16
|
+
|
17
|
+
/* initializers */
|
18
|
+
inline void init_constants(VALUE module);
|
19
|
+
inline void init_methods(VALUE module);
|
20
|
+
|
21
|
+
/* methods */
|
22
|
+
VALUE native_print(VALUE self, VALUE priority, VALUE message);
|
23
|
+
VALUE native_send(int argc, VALUE* argv, VALUE self);
|
24
|
+
VALUE native_perror(VALUE self, VALUE message);
|
25
|
+
inline VALUE native_print_impl(VALUE v_self, VALUE v_priority, VALUE v_message);
|
26
|
+
inline VALUE native_send_impl(int argc, VALUE* argv, VALUE self);
|
27
|
+
inline VALUE native_perror_impl(VALUE v_self, VALUE v_message);
|
28
|
+
|
29
|
+
/* aux */
|
30
|
+
std::string create_safe_string(VALUE string); // throws ruby exceptions
|
31
|
+
|
32
|
+
/* initializers */
|
33
|
+
void init_modules()
|
34
|
+
{
|
35
|
+
// no nontrivial destructors during initialization, no need for ruby catch
|
36
|
+
|
37
|
+
VALUE mJournald = rb_define_module("Journald");
|
38
|
+
VALUE mNative = rb_define_module_under(mJournald, "Native");
|
39
|
+
|
40
|
+
init_constants(mJournald); // add constants to Journald
|
41
|
+
init_methods(mNative); // add methods to Journald::Native
|
42
|
+
}
|
43
|
+
|
44
|
+
inline void init_constants(VALUE module)
|
45
|
+
{
|
46
|
+
rb_define_const(module, "LOG_EMERG", INT2NUM(LOG_EMERG)); /* system is unusable */
|
47
|
+
rb_define_const(module, "LOG_ALERT", INT2NUM(LOG_ALERT)); /* action must be taken immediately */
|
48
|
+
rb_define_const(module, "LOG_CRIT", INT2NUM(LOG_CRIT)); /* critical conditions */
|
49
|
+
rb_define_const(module, "LOG_ERR", INT2NUM(LOG_ERR)); /* error conditions */
|
50
|
+
rb_define_const(module, "LOG_WARNING", INT2NUM(LOG_WARNING)); /* warning conditions */
|
51
|
+
rb_define_const(module, "LOG_NOTICE", INT2NUM(LOG_NOTICE)); /* normal but significant condition */
|
52
|
+
rb_define_const(module, "LOG_INFO", INT2NUM(LOG_INFO)); /* informational */
|
53
|
+
rb_define_const(module, "LOG_DEBUG", INT2NUM(LOG_DEBUG)); /* debug-level messages */
|
54
|
+
}
|
55
|
+
|
56
|
+
inline void init_methods(VALUE module)
|
57
|
+
{
|
58
|
+
rb_define_singleton_method(module, "print", RUBY_METHOD_FUNC(native_print), 2);
|
59
|
+
rb_define_singleton_method(module, "send", RUBY_METHOD_FUNC(native_send), -1); /* -1 to pass as C array */
|
60
|
+
rb_define_singleton_method(module, "perror", RUBY_METHOD_FUNC(native_perror), 1);
|
61
|
+
}
|
62
|
+
|
63
|
+
VALUE native_print(VALUE v_self, VALUE v_priority, VALUE v_message)
|
64
|
+
{
|
65
|
+
try {
|
66
|
+
return native_print_impl(v_self, v_priority, v_message);
|
67
|
+
} catch(ruby_exception_wrapper::RbWrappedException &e) {
|
68
|
+
rb_exc_raise(e.getRubyException());
|
69
|
+
}
|
70
|
+
}
|
71
|
+
|
72
|
+
VALUE native_send(int argc, VALUE* argv, VALUE v_self)
|
73
|
+
{
|
74
|
+
try {
|
75
|
+
return native_send_impl(argc, argv, v_self);
|
76
|
+
} catch(ruby_exception_wrapper::RbWrappedException &e) {
|
77
|
+
rb_exc_raise(e.getRubyException());
|
78
|
+
}
|
79
|
+
}
|
80
|
+
|
81
|
+
VALUE native_perror(VALUE v_self, VALUE v_message)
|
82
|
+
{
|
83
|
+
try {
|
84
|
+
return native_perror_impl(v_self, v_message);
|
85
|
+
} catch(ruby_exception_wrapper::RbWrappedException &e) {
|
86
|
+
rb_exc_raise(e.getRubyException());
|
87
|
+
}
|
88
|
+
}
|
89
|
+
|
90
|
+
/* methods */
|
91
|
+
inline VALUE native_print_impl(VALUE v_self, VALUE v_priority, VALUE v_message)
|
92
|
+
{
|
93
|
+
int priority = NUM2INT(v_priority);
|
94
|
+
auto message = create_safe_string(v_message); // ruby exception here
|
95
|
+
|
96
|
+
int result = sd_journal_print(priority, "%s", message.c_str());
|
97
|
+
|
98
|
+
return INT2NUM(result);
|
99
|
+
}
|
100
|
+
|
101
|
+
inline VALUE native_send_impl(int argc, VALUE* argv, VALUE v_self)
|
102
|
+
{
|
103
|
+
auto msgs = std::make_unique<iovec[]>((size_t)argc);
|
104
|
+
|
105
|
+
for (int i = 0; i < argc; i++) {
|
106
|
+
VALUE v = r(rb_string_value, &argv[i]);
|
107
|
+
|
108
|
+
msgs[i].iov_base = (char *)RSTRING_PTR(v);
|
109
|
+
msgs[i].iov_len = (size_t)RSTRING_LEN(v);
|
110
|
+
}
|
111
|
+
|
112
|
+
int result = sd_journal_sendv(msgs.get(), argc);
|
113
|
+
|
114
|
+
return INT2NUM(result);
|
115
|
+
}
|
116
|
+
|
117
|
+
inline VALUE native_perror_impl(VALUE v_self, VALUE v_message)
|
118
|
+
{
|
119
|
+
auto message = create_safe_string(v_message); // ruby exception here
|
120
|
+
|
121
|
+
int result = sd_journal_perror(message.c_str());
|
122
|
+
|
123
|
+
return INT2NUM(result);
|
124
|
+
}
|
125
|
+
|
126
|
+
/**
|
127
|
+
* Remove zeros from the string
|
128
|
+
*/
|
129
|
+
std::string create_safe_string(VALUE v_string)
|
130
|
+
{
|
131
|
+
/* convert to string */
|
132
|
+
r(rb_string_value, &v_string);
|
133
|
+
|
134
|
+
char* str = (char *)RSTRING_PTR(v_string);
|
135
|
+
size_t len = (size_t)RSTRING_LEN(v_string);
|
136
|
+
|
137
|
+
std::string safe_str;
|
138
|
+
safe_str.reserve(len);
|
139
|
+
|
140
|
+
for (size_t i = 0; i < len; i++) {
|
141
|
+
if (str[i]) {
|
142
|
+
safe_str += str[i];
|
143
|
+
}
|
144
|
+
}
|
145
|
+
|
146
|
+
return safe_str;
|
147
|
+
}
|
148
|
+
|
149
|
+
}
|
@@ -0,0 +1,12 @@
|
|
1
|
+
#ifndef JOURNALD_NATIVE_JOURNALD_NATIVE_H
|
2
|
+
#define JOURNALD_NATIVE_JOURNALD_NATIVE_H
|
3
|
+
|
4
|
+
#include <string>
|
5
|
+
#include <ruby.h>
|
6
|
+
|
7
|
+
namespace journald_native {
|
8
|
+
/* initializers */
|
9
|
+
void init_modules();
|
10
|
+
}
|
11
|
+
|
12
|
+
#endif // JOURNALD_NATIVE_JOURNALD_NATIVE_H
|
@@ -0,0 +1,16 @@
|
|
1
|
+
#include "ruby_exception_wrapper.h"
|
2
|
+
|
3
|
+
namespace ruby_exception_wrapper {
|
4
|
+
|
5
|
+
// callback for rb_rescue2 to catch ruby exception and wrap it by RbWrappedException
|
6
|
+
VALUE rethrow_as_cpp(VALUE put_exception_here_ptr, VALUE exception)
|
7
|
+
{
|
8
|
+
// cannot actually throw here, just pass the exception
|
9
|
+
VALUE* excptr = reinterpret_cast<VALUE*>(put_exception_here_ptr);
|
10
|
+
|
11
|
+
*excptr = exception;
|
12
|
+
|
13
|
+
return exception;
|
14
|
+
}
|
15
|
+
|
16
|
+
}
|
@@ -0,0 +1,91 @@
|
|
1
|
+
#ifndef RUBY_EXCEPTION_WRAPPER_H
|
2
|
+
#define RUBY_EXCEPTION_WRAPPER_H
|
3
|
+
|
4
|
+
#include <ruby.h>
|
5
|
+
|
6
|
+
#include <functional>
|
7
|
+
#include <type_traits>
|
8
|
+
#include <utility>
|
9
|
+
|
10
|
+
#include "cpp14shiv.h" // make this c++14 code c++11 compatible; remove for c++14
|
11
|
+
|
12
|
+
namespace ruby_exception_wrapper {
|
13
|
+
|
14
|
+
class RbWrappedException: public std::exception {
|
15
|
+
VALUE ruby_exception;
|
16
|
+
public:
|
17
|
+
RbWrappedException(VALUE e): ruby_exception(e) {};
|
18
|
+
VALUE getRubyException() { return ruby_exception; }
|
19
|
+
};
|
20
|
+
|
21
|
+
// callback for rb_rescue2 to catch ruby exception and wrap it by RbWrappedException
|
22
|
+
VALUE rethrow_as_cpp(VALUE put_exception_here_ptr, VALUE exception);
|
23
|
+
|
24
|
+
namespace {
|
25
|
+
// do real call of function from template for func with params
|
26
|
+
template <typename FuncPointer, typename... Args>
|
27
|
+
inline VALUE call_wrapper_tuple_impl(FuncPointer& fp, Args... args)
|
28
|
+
{
|
29
|
+
// only pointers and VALUE permitted
|
30
|
+
// VALUE guaranteed to be able to contain pointer
|
31
|
+
return reinterpret_cast<VALUE>(fp(args...));
|
32
|
+
}
|
33
|
+
|
34
|
+
// unpack params to do real call
|
35
|
+
template <typename CallTuple, std::size_t... Is>
|
36
|
+
inline VALUE call_wrapper_tuple_unpack(CallTuple& call_tuple, std::index_sequence<Is...>)
|
37
|
+
{
|
38
|
+
return call_wrapper_tuple_impl(std::get<Is>(call_tuple)...);
|
39
|
+
}
|
40
|
+
|
41
|
+
// callback for rb_rescue2 for no exceptions
|
42
|
+
template <typename CallTuple>
|
43
|
+
VALUE call_wrapper_tuple(VALUE v_ct) {
|
44
|
+
CallTuple call_tuple = std::move(*reinterpret_cast<CallTuple*>(v_ct));
|
45
|
+
|
46
|
+
return call_wrapper_tuple_unpack(call_tuple, std::make_index_sequence<std::tuple_size<CallTuple>::value> {});
|
47
|
+
};
|
48
|
+
|
49
|
+
// safely call function
|
50
|
+
template <typename Func, typename... Args>
|
51
|
+
inline auto do_raisable_call(Func f, Args... args) -> decltype(f(args...))
|
52
|
+
{
|
53
|
+
typedef std::function<typename std::remove_pointer<Func>::type> FuncPointer;
|
54
|
+
typedef std::tuple<FuncPointer, Args...> CallTuple;
|
55
|
+
|
56
|
+
FuncPointer fp = f;
|
57
|
+
|
58
|
+
CallTuple call_tuple = std::make_tuple(fp, args...);
|
59
|
+
|
60
|
+
VALUE exception = 0; // get raised exception if any
|
61
|
+
|
62
|
+
VALUE result = rb_rescue2(
|
63
|
+
RUBY_METHOD_FUNC(call_wrapper_tuple<CallTuple>), reinterpret_cast<VALUE>(&call_tuple),
|
64
|
+
RUBY_METHOD_FUNC(rethrow_as_cpp), reinterpret_cast<VALUE>(&exception),
|
65
|
+
rb_eException, Qfalse
|
66
|
+
);
|
67
|
+
|
68
|
+
if (exception) { // nonzero here if rescue called unless some pervert throws Qfalse
|
69
|
+
throw RbWrappedException(exception);
|
70
|
+
}
|
71
|
+
|
72
|
+
return reinterpret_cast<decltype(f(args...))>(result);
|
73
|
+
}
|
74
|
+
}
|
75
|
+
|
76
|
+
template <typename Func, typename... Args>
|
77
|
+
inline auto ruby_raisable_call(Func f, Args... args) -> decltype(f(args...))
|
78
|
+
{
|
79
|
+
static_assert(
|
80
|
+
std::is_same<decltype(f(args...)), VALUE>::value || std::is_pointer<decltype(f(args...))>::value,
|
81
|
+
"Only for funcs returning VALUE or pointer"
|
82
|
+
);
|
83
|
+
|
84
|
+
auto result = do_raisable_call(f, args...);
|
85
|
+
|
86
|
+
return result;
|
87
|
+
}
|
88
|
+
|
89
|
+
}
|
90
|
+
|
91
|
+
#endif
|
@@ -1,71 +1,41 @@
|
|
1
|
-
#ifdef __cplusplus
|
2
|
-
extern "C" {
|
3
|
-
#endif
|
4
|
-
|
5
1
|
#ifndef JOURNALD_NATIVE_SD_JOURNAL_H
|
6
|
-
|
7
|
-
|
8
|
-
#ifdef __linux__
|
9
|
-
|
10
|
-
/* do the real stuff */
|
11
|
-
|
12
|
-
#include "extconf.h"
|
13
|
-
|
14
|
-
/* check for extconf results */
|
15
|
-
|
16
|
-
#ifndef HAVE_SYSTEMD_SD_JOURNAL_H
|
17
|
-
#error Cannot include <systemd/sd-journal.h>. Please use linux version with systemd-journal installed
|
18
|
-
#endif
|
2
|
+
#define JOURNALD_NATIVE_SD_JOURNAL_H
|
19
3
|
|
20
|
-
|
21
|
-
#error Required function sd_journal_print is missing
|
22
|
-
#endif
|
4
|
+
#ifdef __linux__
|
23
5
|
|
24
|
-
|
25
|
-
#error Required function sd_journal_sendv is missing
|
26
|
-
#endif
|
6
|
+
/* do the real stuff */
|
27
7
|
|
28
|
-
|
29
|
-
#error Required function sd_journal_perror is missing
|
30
|
-
#endif
|
8
|
+
#include "extconf.h"
|
31
9
|
|
32
|
-
|
10
|
+
/* check for extconf results */
|
33
11
|
|
34
|
-
|
35
|
-
|
36
|
-
#
|
12
|
+
#ifndef HAVE_SYSTEMD_SD_JOURNAL_H
|
13
|
+
#error Cannot include <systemd/sd-journal.h>. Please use linux version with systemd-journal installed
|
14
|
+
#endif
|
37
15
|
|
38
|
-
|
16
|
+
#ifndef HAVE_SD_JOURNAL_PRINT
|
17
|
+
#error Required function sd_journal_print is missing
|
18
|
+
#endif
|
39
19
|
|
40
|
-
|
20
|
+
#ifndef HAVE_SD_JOURNAL_SENDV
|
21
|
+
#error Required function sd_journal_sendv is missing
|
22
|
+
#endif
|
41
23
|
|
42
|
-
|
43
|
-
#
|
24
|
+
#ifndef HAVE_SD_JOURNAL_PERROR
|
25
|
+
#error Required function sd_journal_perror is missing
|
26
|
+
#endif
|
44
27
|
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
#define LOG_ERR 3
|
50
|
-
#define LOG_WARNING 4
|
51
|
-
#define LOG_NOTICE 5
|
52
|
-
#define LOG_INFO 6
|
53
|
-
#define LOG_DEBUG 7
|
28
|
+
/* Do not add C line and file to the log messages */
|
29
|
+
#define SD_JOURNAL_SUPPRESS_LOCATION
|
30
|
+
/* include systemd-journal headers */
|
31
|
+
#include <systemd/sd-journal.h>
|
54
32
|
|
55
|
-
|
56
|
-
struct iovec {
|
57
|
-
void *iov_base; /* Starting address */
|
58
|
-
size_t iov_len; /* Number of bytes to transfer */
|
59
|
-
};
|
33
|
+
#else
|
60
34
|
|
61
|
-
|
62
|
-
int sd_journal_sendv(const struct iovec *iov, int n);
|
63
|
-
int sd_journal_perror(const char *message);
|
35
|
+
#warning Compiling dummy version of the gem for non-Linux OS
|
64
36
|
|
65
|
-
#
|
37
|
+
#include "sd_journal_dummy.h"
|
66
38
|
|
67
39
|
#endif
|
68
40
|
|
69
|
-
#
|
70
|
-
}
|
71
|
-
#endif
|
41
|
+
#endif // JOURNALD_NATIVE_SD_JOURNAL_H
|
@@ -0,0 +1,23 @@
|
|
1
|
+
/* dummy code to be used in sd_journal.h on non-linux system */
|
2
|
+
|
3
|
+
#include <stdlib.h>
|
4
|
+
|
5
|
+
/* syslog constants */
|
6
|
+
#define LOG_EMERG 0
|
7
|
+
#define LOG_ALERT 1
|
8
|
+
#define LOG_CRIT 2
|
9
|
+
#define LOG_ERR 3
|
10
|
+
#define LOG_WARNING 4
|
11
|
+
#define LOG_NOTICE 5
|
12
|
+
#define LOG_INFO 6
|
13
|
+
#define LOG_DEBUG 7
|
14
|
+
|
15
|
+
/* iovec */
|
16
|
+
struct iovec {
|
17
|
+
void *iov_base; /* Starting address */
|
18
|
+
size_t iov_len; /* Number of bytes to transfer */
|
19
|
+
};
|
20
|
+
|
21
|
+
inline int sd_journal_print(int priority, const char *format, ...) { return 0; }
|
22
|
+
inline int sd_journal_sendv(const struct iovec *iov, int n) { return 0; }
|
23
|
+
inline int sd_journal_perror(const char *message) { return 0; }
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: journald-native
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Anton Smirnov
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-03-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -65,10 +65,16 @@ files:
|
|
65
65
|
- LICENSE.txt
|
66
66
|
- README.md
|
67
67
|
- Rakefile
|
68
|
+
- ext/journald_native/CMakeLists.txt
|
69
|
+
- ext/journald_native/cpp14shiv.h
|
68
70
|
- ext/journald_native/extconf.rb
|
69
|
-
- ext/journald_native/
|
71
|
+
- ext/journald_native/extinit.cpp
|
72
|
+
- ext/journald_native/journald_native.cpp
|
73
|
+
- ext/journald_native/journald_native.h
|
74
|
+
- ext/journald_native/ruby_exception_wrapper.cpp
|
75
|
+
- ext/journald_native/ruby_exception_wrapper.h
|
70
76
|
- ext/journald_native/sd_journal.h
|
71
|
-
- ext/journald_native/sd_journal_dummy.
|
77
|
+
- ext/journald_native/sd_journal_dummy.h
|
72
78
|
- journald-native.gemspec
|
73
79
|
- lib/journald/native.rb
|
74
80
|
- lib/journald/native/version.rb
|
@@ -92,7 +98,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
92
98
|
version: '0'
|
93
99
|
requirements: []
|
94
100
|
rubyforge_project:
|
95
|
-
rubygems_version: 2.
|
101
|
+
rubygems_version: 2.2.2
|
96
102
|
signing_key:
|
97
103
|
specification_version: 4
|
98
104
|
summary: systemd-journal logging native lib wrapper
|
@@ -1,143 +0,0 @@
|
|
1
|
-
/* Do not add C line and file to the log messages */
|
2
|
-
#define SD_JOURNAL_SUPPRESS_LOCATION
|
3
|
-
|
4
|
-
#include <ruby.h>
|
5
|
-
#include "sd_journal.h"
|
6
|
-
|
7
|
-
void Init_journald_native();
|
8
|
-
|
9
|
-
/* initializers */
|
10
|
-
static void jdl_init_modules();
|
11
|
-
static void jdl_init_constants();
|
12
|
-
static void jdl_init_methods();
|
13
|
-
|
14
|
-
/* methods */
|
15
|
-
static VALUE jdl_native_print(VALUE self, VALUE priority, VALUE message);
|
16
|
-
static VALUE jdl_native_send(int argc, VALUE* argv, VALUE self);
|
17
|
-
static VALUE jdl_native_perror(VALUE self, VALUE message);
|
18
|
-
|
19
|
-
/* aux */
|
20
|
-
static char * jdl_alloc_safe_string(VALUE string);
|
21
|
-
|
22
|
-
/* globals */
|
23
|
-
static VALUE mJournald;
|
24
|
-
static VALUE mNative;
|
25
|
-
|
26
|
-
void Init_journald_native()
|
27
|
-
{
|
28
|
-
jdl_init_modules();
|
29
|
-
jdl_init_constants();
|
30
|
-
jdl_init_methods();
|
31
|
-
}
|
32
|
-
|
33
|
-
static void jdl_init_modules()
|
34
|
-
{
|
35
|
-
mJournald = rb_define_module("Journald");
|
36
|
-
mNative = rb_define_module_under(mJournald, "Native");
|
37
|
-
}
|
38
|
-
|
39
|
-
static void jdl_init_constants()
|
40
|
-
{
|
41
|
-
rb_define_const(mJournald, "LOG_EMERG", INT2NUM(LOG_EMERG)); /* system is unusable */
|
42
|
-
rb_define_const(mJournald, "LOG_ALERT", INT2NUM(LOG_ALERT)); /* action must be taken immediately */
|
43
|
-
rb_define_const(mJournald, "LOG_CRIT", INT2NUM(LOG_CRIT)); /* critical conditions */
|
44
|
-
rb_define_const(mJournald, "LOG_ERR", INT2NUM(LOG_ERR)); /* error conditions */
|
45
|
-
rb_define_const(mJournald, "LOG_WARNING", INT2NUM(LOG_WARNING)); /* warning conditions */
|
46
|
-
rb_define_const(mJournald, "LOG_NOTICE", INT2NUM(LOG_NOTICE)); /* normal but significant condition */
|
47
|
-
rb_define_const(mJournald, "LOG_INFO", INT2NUM(LOG_INFO)); /* informational */
|
48
|
-
rb_define_const(mJournald, "LOG_DEBUG", INT2NUM(LOG_DEBUG)); /* debug-level messages */
|
49
|
-
}
|
50
|
-
|
51
|
-
static void jdl_init_methods()
|
52
|
-
{
|
53
|
-
rb_define_singleton_method(mNative, "print", jdl_native_print, 2);
|
54
|
-
rb_define_singleton_method(mNative, "send", jdl_native_send, -1); /* -1 to pass as C array */
|
55
|
-
rb_define_singleton_method(mNative, "perror", jdl_native_perror, 1);
|
56
|
-
}
|
57
|
-
|
58
|
-
static VALUE jdl_native_print(VALUE v_self, VALUE v_priority, VALUE v_message)
|
59
|
-
{
|
60
|
-
int priority, result;
|
61
|
-
char *message;
|
62
|
-
|
63
|
-
priority = NUM2INT(v_priority);
|
64
|
-
message = jdl_alloc_safe_string(v_message);
|
65
|
-
|
66
|
-
result = sd_journal_print(priority, "%s", message);
|
67
|
-
|
68
|
-
free(message);
|
69
|
-
|
70
|
-
return INT2NUM(result);
|
71
|
-
}
|
72
|
-
|
73
|
-
static VALUE jdl_native_send(int argc, VALUE* argv, VALUE self)
|
74
|
-
{
|
75
|
-
struct iovec *msgs;
|
76
|
-
int i;
|
77
|
-
int result;
|
78
|
-
|
79
|
-
/* first check everything is a string / convertable to string */
|
80
|
-
for (i = 0; i < argc; i++) {
|
81
|
-
StringValue(argv[i]); /* you may get a ruby exception here */
|
82
|
-
}
|
83
|
-
|
84
|
-
/* allocate memory after all checks to avoid possible memory leak */
|
85
|
-
msgs = calloc(argc, sizeof(struct iovec));
|
86
|
-
|
87
|
-
for (i = 0; i < argc; i++) {
|
88
|
-
VALUE v = argv[i];
|
89
|
-
msgs[i].iov_base = RSTRING_PTR(v);
|
90
|
-
msgs[i].iov_len = RSTRING_LEN(v);
|
91
|
-
}
|
92
|
-
|
93
|
-
result = sd_journal_sendv(msgs, argc);
|
94
|
-
|
95
|
-
free(msgs);
|
96
|
-
|
97
|
-
return INT2NUM(result);
|
98
|
-
}
|
99
|
-
|
100
|
-
static VALUE jdl_native_perror(VALUE v_self, VALUE v_message)
|
101
|
-
{
|
102
|
-
int result;
|
103
|
-
char *message;
|
104
|
-
|
105
|
-
message = jdl_alloc_safe_string(v_message);
|
106
|
-
|
107
|
-
result = sd_journal_perror(message);
|
108
|
-
|
109
|
-
free(message);
|
110
|
-
|
111
|
-
return INT2NUM(result);
|
112
|
-
}
|
113
|
-
|
114
|
-
/**
|
115
|
-
* Remove zeros from string and ensure it's zero-terminated
|
116
|
-
*/
|
117
|
-
static char * jdl_alloc_safe_string(VALUE v_string)
|
118
|
-
{
|
119
|
-
char *str;
|
120
|
-
size_t len;
|
121
|
-
|
122
|
-
char *newstr,
|
123
|
-
*ptr;
|
124
|
-
size_t i;
|
125
|
-
|
126
|
-
/* convert to string */
|
127
|
-
StringValue(v_string);
|
128
|
-
|
129
|
-
str = RSTRING_PTR(v_string);
|
130
|
-
len = RSTRING_LEN(v_string);
|
131
|
-
|
132
|
-
newstr = calloc(len + 1, sizeof(char));
|
133
|
-
|
134
|
-
for (i = 0, ptr = newstr; i < len; i++) {
|
135
|
-
if (str[i]) {
|
136
|
-
*(ptr++) = str[i];
|
137
|
-
}
|
138
|
-
}
|
139
|
-
|
140
|
-
*ptr = '\0';
|
141
|
-
|
142
|
-
return newstr;
|
143
|
-
}
|
@@ -1,9 +0,0 @@
|
|
1
|
-
#include "sd_journal.h"
|
2
|
-
|
3
|
-
#ifdef JOURNALD_NATIVE_SYSTEMD_JOURNAL_DUMMY
|
4
|
-
|
5
|
-
int sd_journal_print(int priority, const char *format, ...) { return 0; }
|
6
|
-
int sd_journal_sendv(const struct iovec *iov, int n) { return 0; }
|
7
|
-
int sd_journal_perror(const char *message) { return 0; }
|
8
|
-
|
9
|
-
#endif
|