journald-native 1.0.1 → 1.0.6

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 434d6c7409f38d0c734102b165c7422774b4b765
4
- data.tar.gz: dbb1a39c162a253430a5ddf497a7b6ecc8c71ee5
3
+ metadata.gz: 7074ca755c39b71b382f63b7befe21e0dc7e18ec
4
+ data.tar.gz: 585840efef3b5ee2b50f97e830ecf21df0ec811b
5
5
  SHA512:
6
- metadata.gz: 53b67e58815b34992d37b8a39339372e2d27393bbefe533d37375aac7fd4ef9386fd35fecece27ee7c9b201f56488d12fed26d22d24a1b17bb00e72fdad67473
7
- data.tar.gz: ec9ac27fa92aeb99b0258780342ebdbf34805f90db345990f5e650db5bf9a4ffd8e738f8a64612b7612a03bd4f540ab8091a4a74e8635b234f5caec24d503f68
6
+ metadata.gz: e19cdf3224ca356c47319c5dd6897cc364a8f4d87a1f9c7d9319a31be19be2b4298cbc1b869024e8f0846f48115947dc296afb9d809de368bc16ae18434cdb2a
7
+ data.tar.gz: 214828671762b128ae1875fffce35e8a3db25217db47e6bca8d4a127750c3ad1ca55d9c8999c623829dce3a8b998ffe70d2fe62395b3dedf75b3479d3487532a
data/.gitignore CHANGED
@@ -25,3 +25,5 @@ Makefile
25
25
  *.ipr
26
26
  *.iws
27
27
  .rakeTasks
28
+ .idea
29
+ extconf.h
data/README.md CHANGED
@@ -1,12 +1,15 @@
1
1
  # journald-native
2
2
 
3
+ [![Gem Version](https://badge.fury.io/rb/journald-native.svg)](http://badge.fury.io/rb/journald-native)
4
+ [![Reference Status](https://www.versioneye.com/ruby/journald-native/reference_badge.svg)](https://www.versioneye.com/ruby/journald-native/references)
5
+
3
6
  A systemd-journal native logging lib wrapper.
4
7
  [See sd-journal help for more info](http://www.freedesktop.org/software/systemd/man/sd_journal_print.html)
5
8
 
6
9
  ## Usage
7
10
 
8
11
  ```ruby
9
- require 'journald/native'
12
+ require 'journald/native'
10
13
  ```
11
14
 
12
15
  ### Constants
@@ -16,14 +19,14 @@ Constants are used to denote a log level
16
19
  Available constants:
17
20
 
18
21
  ```ruby
19
- Journald::LOG_EMERG # system is unusable
20
- Journald::LOG_ALERT # action must be taken immediately
21
- Journald::LOG_CRIT # critical conditions
22
- Journald::LOG_ERR # error conditions
23
- Journald::LOG_WARNING # warning conditions
24
- Journald::LOG_NOTICE # normal but significant condition
25
- Journald::LOG_INFO # informational
26
- Journald::LOG_DEBUG # debug-level messages
22
+ Journald::LOG_EMERG # system is unusable
23
+ Journald::LOG_ALERT # action must be taken immediately
24
+ Journald::LOG_CRIT # critical conditions
25
+ Journald::LOG_ERR # error conditions
26
+ Journald::LOG_WARNING # warning conditions
27
+ Journald::LOG_NOTICE # normal but significant condition
28
+ Journald::LOG_INFO # informational
29
+ Journald::LOG_DEBUG # debug-level messages
27
30
  ```
28
31
 
29
32
  systemd-journal uses syslog constants to denote level therefore they are equal to those of the Syslog module,
@@ -36,14 +39,14 @@ Methods of Journald::Native class wrap systemd-journal calls.
36
39
  [See sd-journal help for more info](http://www.freedesktop.org/software/systemd/man/sd_journal_print.html)
37
40
 
38
41
  ```ruby
39
- Journald::Native.send "MESSAGE=message", "PRIORITY=#{Journald::LOG_WARNING}"
40
- Journald::Native.print Journald::LOG_WARNING, "message"
41
- Journald::Native.perror "message"
42
+ Journald::Native.send "MESSAGE=message", "PRIORITY=#{Journald::LOG_WARNING}"
43
+ Journald::Native.print Journald::LOG_WARNING, "message"
44
+ Journald::Native.perror "message"
42
45
  ```
43
46
 
44
- It is not recommended to use ```print``` and ```perror``` as you may lose ```'\0'``` byte in your string due to
45
- C zero-terminated string format (all zero bytes in the middle will be removed) On the contrary ```send``` uses
46
- binary buffers and does not have such shortcoming.
47
+ It is not recommended to use ```print``` and ```perror``` as you may get exception if your string contains
48
+ ```'\0'``` byte due to C zero-terminated string format. On the contrary ```send``` uses binary buffers and
49
+ does not have this shortcoming.
47
50
 
48
51
  ### License
49
52
 
@@ -0,0 +1,9 @@
1
+ # dummy cmake file for CLion
2
+
3
+ cmake_minimum_required(VERSION 2.8.4)
4
+ project(journald_native)
5
+
6
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
7
+
8
+ set(SOURCE_FILES extinit.cpp journald_native.cpp ruby_exception_wrapper.cpp)
9
+ add_executable(journald_native ${SOURCE_FILES})
@@ -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,17 +4,33 @@ 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
+
13
+ def have_funcs
14
+ have_funcs = true
15
+
16
+ # check functions. redefine const list in sd_journal.h if changed
17
+ %w(sd_journal_print sd_journal_sendv sd_journal_perror).each do |func|
18
+ have_funcs &&= have_func(func)
19
+ end
20
+
21
+ have_funcs
22
+ end
23
+
12
24
  # check headers
13
- abort 'systemd/sd-journal.h is missing. please install systemd-journal' unless find_header('systemd/sd-journal.h')
25
+ have_header('systemd/sd-journal.h')
26
+
27
+ # first try to find funcs in systemd
28
+ have_library('systemd')
14
29
 
15
- # check functions
16
- %w(sd_journal_print sd_journal_sendv sd_journal_perror).each do |func|
17
- abort "#{func}() is missing. systemd-journal is not usable" unless find_library('systemd-journal', func)
30
+ unless have_funcs
31
+ have_library('systemd-journal') # try to fall back to systemd-journal if older systemd
32
+ have_funcs
18
33
  end
19
34
 
35
+ create_header
20
36
  create_makefile('journald_native')
@@ -0,0 +1,7 @@
1
+ #include "journald_native.h"
2
+
3
+ /* initialize ruby extension */
4
+ extern "C" void Init_journald_native()
5
+ {
6
+ journald_native::init_modules();
7
+ }
@@ -0,0 +1,100 @@
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
+ namespace {
11
+
12
+ /* aux */
13
+ // just a short alias for ruby_raisable_call()
14
+ template <typename Func, typename... Args>
15
+ inline auto r(Func f, Args... args) -> decltype(f(args...))
16
+ {
17
+ return ruby_exception_wrapper::ruby_raisable_call(f, args...);
18
+ }
19
+
20
+ /* methods */
21
+ inline VALUE native_print(VALUE v_self, VALUE v_priority, VALUE v_message)
22
+ {
23
+ int priority = NUM2INT(v_priority);
24
+ std::string message = r(rb_string_value_cstr, &v_message);
25
+
26
+ int result = sd_journal_print(priority, "%s", message.c_str());
27
+
28
+ return INT2NUM(result);
29
+ }
30
+
31
+ inline VALUE native_send(int argc, VALUE* argv, VALUE v_self)
32
+ {
33
+ auto msgs = std::make_unique<iovec[]>((size_t)argc);
34
+
35
+ for (int i = 0; i < argc; i++) {
36
+ VALUE v = r(rb_string_value, &argv[i]);
37
+
38
+ msgs[i].iov_base = (char *)RSTRING_PTR(v);
39
+ msgs[i].iov_len = (size_t)RSTRING_LEN(v);
40
+ }
41
+
42
+ int result = sd_journal_sendv(msgs.get(), argc);
43
+
44
+ return INT2NUM(result);
45
+ }
46
+
47
+ inline VALUE native_perror(VALUE v_self, VALUE v_message)
48
+ {
49
+ std::string message = r(rb_string_value_cstr, &v_message);
50
+
51
+ int result = sd_journal_perror(message.c_str());
52
+
53
+ return INT2NUM(result);
54
+ }
55
+
56
+ VALUE is_dummy(VALUE v_self = Qnil)
57
+ {
58
+ constexpr VALUE dummy = JOURNALD_NATIVE_SD_JOURNAL_DUMMY ? Qtrue : Qfalse;
59
+ return dummy;
60
+ }
61
+
62
+ /* initializers */
63
+ inline void init_journald(VALUE module)
64
+ {
65
+ rb_define_const(module, "LOG_EMERG", INT2NUM(LOG_EMERG)); /* system is unusable */
66
+ rb_define_const(module, "LOG_ALERT", INT2NUM(LOG_ALERT)); /* action must be taken immediately */
67
+ rb_define_const(module, "LOG_CRIT", INT2NUM(LOG_CRIT)); /* critical conditions */
68
+ rb_define_const(module, "LOG_ERR", INT2NUM(LOG_ERR)); /* error conditions */
69
+ rb_define_const(module, "LOG_WARNING", INT2NUM(LOG_WARNING)); /* warning conditions */
70
+ rb_define_const(module, "LOG_NOTICE", INT2NUM(LOG_NOTICE)); /* normal but significant condition */
71
+ rb_define_const(module, "LOG_INFO", INT2NUM(LOG_INFO)); /* informational */
72
+ rb_define_const(module, "LOG_DEBUG", INT2NUM(LOG_DEBUG)); /* debug-level messages */
73
+ }
74
+
75
+ inline void init_native(VALUE module)
76
+ {
77
+ // methods
78
+ rb_define_singleton_method(module, "print", RXW_WRAPPED_METHOD_FUNC(native_print, VALUE, VALUE, VALUE), 2);
79
+ rb_define_singleton_method(module, "send", RXW_WRAPPED_METHOD_FUNC(native_send, int, VALUE*, VALUE), -1); /* -1 to pass as C array */
80
+ rb_define_singleton_method(module, "perror", RXW_WRAPPED_METHOD_FUNC(native_perror, VALUE, VALUE), 1);
81
+
82
+ // dummy detection
83
+ rb_define_const(module, "IS_DUMMY", is_dummy());
84
+ rb_define_singleton_method(module, "dummy?", RUBY_METHOD_FUNC(is_dummy), 0);
85
+ }
86
+
87
+ } // private namespace
88
+
89
+ void init_modules()
90
+ {
91
+ // no nontrivial destructors during initialization, no need for ruby catch
92
+
93
+ VALUE mJournald = rb_define_module("Journald");
94
+ VALUE mNative = rb_define_module_under(mJournald, "Native");
95
+
96
+ init_journald(mJournald); // add constants to Journald
97
+ init_native(mNative); // add methods to Journald::Native
98
+ }
99
+
100
+ }
@@ -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,105 @@
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
+ // wrap functions, prototype required, i.e. RXW_WRAPPED_METHOD_FUNC(native_send, int, VALUE*, VALUE)
13
+ // functions can be inline
14
+ #define RXW_WRAPPED_METHOD_FUNC(method, ...) ((VALUE (*)(ANYARGS))::ruby_exception_wrapper::method_wrapper_call<decltype(&method), method, __VA_ARGS__>)
15
+
16
+ namespace ruby_exception_wrapper {
17
+
18
+ class RbWrappedException: public std::exception {
19
+ VALUE ruby_exception;
20
+ public:
21
+ RbWrappedException(VALUE e): ruby_exception(e) {};
22
+ VALUE getRubyException() { return ruby_exception; }
23
+ };
24
+
25
+ // callback for rb_rescue2 to catch ruby exception and wrap it by RbWrappedException
26
+ VALUE rethrow_as_cpp(VALUE put_exception_here_ptr, VALUE exception);
27
+
28
+ namespace {
29
+ // do real call of function from template
30
+ template <typename FuncPointer, typename... Args>
31
+ inline VALUE call_wrapper_tuple_impl(FuncPointer& fp, Args... args)
32
+ {
33
+ // only pointers and VALUE permitted
34
+ // VALUE guaranteed to be able to contain pointer
35
+ return reinterpret_cast<VALUE>(fp(args...));
36
+ }
37
+
38
+ // unpack params to do real call
39
+ template <typename CallTuple, std::size_t... Is>
40
+ inline VALUE call_wrapper_tuple_unpack(CallTuple& call_tuple, std::index_sequence<Is...>)
41
+ {
42
+ return call_wrapper_tuple_impl(std::get<Is>(call_tuple)...);
43
+ }
44
+
45
+ // callback for rb_rescue2 for no exceptions
46
+ template <typename CallTuple>
47
+ VALUE call_wrapper_tuple(VALUE v_ct) {
48
+ CallTuple call_tuple = std::move(*reinterpret_cast<CallTuple*>(v_ct));
49
+
50
+ return call_wrapper_tuple_unpack(call_tuple, std::make_index_sequence<std::tuple_size<CallTuple>::value> {});
51
+ };
52
+
53
+ // safely call function
54
+ template <typename Func, typename... Args>
55
+ inline auto do_raisable_call(Func f, Args... args) -> decltype(f(args...))
56
+ {
57
+ typedef std::function<typename std::remove_pointer<Func>::type> FuncPointer;
58
+ typedef std::tuple<FuncPointer, Args...> CallTuple;
59
+
60
+ FuncPointer fp = f;
61
+
62
+ CallTuple call_tuple = std::make_tuple(fp, args...);
63
+
64
+ VALUE exception = 0; // get raised exception if any
65
+
66
+ VALUE result = rb_rescue2(
67
+ RUBY_METHOD_FUNC(call_wrapper_tuple<CallTuple>), reinterpret_cast<VALUE>(&call_tuple),
68
+ RUBY_METHOD_FUNC(rethrow_as_cpp), reinterpret_cast<VALUE>(&exception),
69
+ rb_eException, Qfalse
70
+ );
71
+
72
+ if (exception) { // nonzero here if rescue called unless some pervert throws Qfalse
73
+ throw RbWrappedException(exception);
74
+ }
75
+
76
+ return reinterpret_cast<decltype(f(args...))>(result);
77
+ }
78
+ }
79
+
80
+ template <typename Func, typename... Args>
81
+ inline auto ruby_raisable_call(Func f, Args... args) -> decltype(f(args...))
82
+ {
83
+ static_assert(
84
+ std::is_same<decltype(f(args...)), VALUE>::value || std::is_pointer<decltype(f(args...))>::value,
85
+ "Only for funcs returning VALUE or pointer"
86
+ );
87
+
88
+ auto result = do_raisable_call(f, args...);
89
+
90
+ return result;
91
+ }
92
+
93
+ template <typename Func, Func func, typename... Args>
94
+ VALUE method_wrapper_call(Args... args)
95
+ {
96
+ try {
97
+ return func(args...);
98
+ } catch(RbWrappedException &e) {
99
+ rb_exc_raise(e.getRubyException());
100
+ }
101
+ }
102
+
103
+ }
104
+
105
+ #endif
@@ -0,0 +1,45 @@
1
+ #ifndef JOURNALD_NATIVE_SD_JOURNAL_H
2
+ #define JOURNALD_NATIVE_SD_JOURNAL_H
3
+
4
+ #ifdef __linux__
5
+
6
+ #define JOURNALD_NATIVE_SD_JOURNAL_DUMMY false
7
+
8
+ /* do the real stuff */
9
+
10
+ #include "extconf.h"
11
+
12
+ /* check for extconf results */
13
+
14
+ #ifndef HAVE_SYSTEMD_SD_JOURNAL_H
15
+ #error Cannot include <systemd/sd-journal.h>. Please use linux version with systemd-journal installed
16
+ #endif
17
+
18
+ #ifndef HAVE_SD_JOURNAL_PRINT
19
+ #error Required function sd_journal_print is missing
20
+ #endif
21
+
22
+ #ifndef HAVE_SD_JOURNAL_SENDV
23
+ #error Required function sd_journal_sendv is missing
24
+ #endif
25
+
26
+ #ifndef HAVE_SD_JOURNAL_PERROR
27
+ #error Required function sd_journal_perror is missing
28
+ #endif
29
+
30
+ /* Do not add C line and file to the log messages */
31
+ #define SD_JOURNAL_SUPPRESS_LOCATION
32
+ /* include systemd-journal headers */
33
+ #include <systemd/sd-journal.h>
34
+
35
+ #else
36
+
37
+ #define JOURNALD_NATIVE_SD_JOURNAL_DUMMY true
38
+
39
+ #warning Compiling dummy version of the gem for non-Linux OS
40
+
41
+ #include "sd_journal_dummy.h"
42
+
43
+ #endif
44
+
45
+ #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; }
@@ -1,5 +1,5 @@
1
1
  module Journald
2
2
  module Native
3
- VERSION = '1.0.1'
3
+ VERSION = '1.0.6'
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,55 +1,55 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: journald-native
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.1
4
+ version: 1.0.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Anton Smirnov
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-10-30 00:00:00.000000000 Z
11
+ date: 2015-03-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - ~>
17
+ - - "~>"
18
18
  - !ruby/object:Gem::Version
19
19
  version: '1.6'
20
20
  type: :development
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - ~>
24
+ - - "~>"
25
25
  - !ruby/object:Gem::Version
26
26
  version: '1.6'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: rake
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - '>='
31
+ - - ">="
32
32
  - !ruby/object:Gem::Version
33
33
  version: '0'
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - '>='
38
+ - - ">="
39
39
  - !ruby/object:Gem::Version
40
40
  version: '0'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: rake-compiler
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - '>='
45
+ - - ">="
46
46
  - !ruby/object:Gem::Version
47
47
  version: '0'
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - '>='
52
+ - - ">="
53
53
  - !ruby/object:Gem::Version
54
54
  version: '0'
55
55
  description:
@@ -60,13 +60,21 @@ extensions:
60
60
  - ext/journald_native/extconf.rb
61
61
  extra_rdoc_files: []
62
62
  files:
63
- - .gitignore
63
+ - ".gitignore"
64
64
  - Gemfile
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/journald_native.c
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
76
+ - ext/journald_native/sd_journal.h
77
+ - ext/journald_native/sd_journal_dummy.h
70
78
  - journald-native.gemspec
71
79
  - lib/journald/native.rb
72
80
  - lib/journald/native/version.rb
@@ -80,19 +88,18 @@ require_paths:
80
88
  - lib
81
89
  required_ruby_version: !ruby/object:Gem::Requirement
82
90
  requirements:
83
- - - '>='
91
+ - - ">="
84
92
  - !ruby/object:Gem::Version
85
93
  version: 1.9.2
86
94
  required_rubygems_version: !ruby/object:Gem::Requirement
87
95
  requirements:
88
- - - '>='
96
+ - - ">="
89
97
  - !ruby/object:Gem::Version
90
98
  version: '0'
91
99
  requirements: []
92
100
  rubyforge_project:
93
- rubygems_version: 2.1.11
101
+ rubygems_version: 2.4.3
94
102
  signing_key:
95
103
  specification_version: 4
96
104
  summary: systemd-journal logging native lib wrapper
97
105
  test_files: []
98
- has_rdoc:
@@ -1,139 +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 <systemd/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
- //const char * fmt = "%s";
76
- struct iovec *msgs;
77
- size_t i;
78
- int result;
79
-
80
- msgs = calloc(argc, sizeof(struct iovec));
81
-
82
- for (i = 0; i < argc; i++) {
83
- VALUE v = argv[i];
84
- StringValue(v);
85
- msgs[i].iov_base = RSTRING_PTR(v);
86
- msgs[i].iov_len = RSTRING_LEN(v);
87
- }
88
-
89
- result = sd_journal_sendv(msgs, argc);
90
-
91
- free(msgs);
92
-
93
- return INT2NUM(result);
94
- }
95
-
96
- static VALUE jdl_native_perror(VALUE v_self, VALUE v_message)
97
- {
98
- int result;
99
- char *message;
100
-
101
- message = jdl_alloc_safe_string(v_message);
102
-
103
- result = sd_journal_perror(message);
104
-
105
- free(message);
106
-
107
- return INT2NUM(result);
108
- }
109
-
110
- /**
111
- * Remove zeros from string and ensure it's zero-terminated
112
- */
113
- static char * jdl_alloc_safe_string(VALUE v_string)
114
- {
115
- char *str;
116
- size_t len;
117
-
118
- char *newstr,
119
- *ptr;
120
- size_t i;
121
-
122
- /* convert tos sring */
123
- StringValue(v_string);
124
-
125
- str = RSTRING_PTR(v_string);
126
- len = RSTRING_LEN(v_string);
127
-
128
- newstr = calloc(len + 1, sizeof(char));
129
-
130
- for (i = 0, ptr = newstr; i < len; i++) {
131
- if (str[i]) {
132
- *(ptr++) = str[i];
133
- }
134
- }
135
-
136
- *ptr = '\0';
137
-
138
- return newstr;
139
- }