3 #include <systemd/sd-journal.h>
7 #include "journal-reader.h"
8 #include "logd-grabber.h"
11 #define GET_ACTION_FROM_EVENT_TYPE(eventType) ((eventType) >> 16)
12 #define GET_OBJECT_FROM_EVENT_TYPE(eventType) ((eventType) & 0xffff)
14 static sd_journal *journal;
20 ret = sd_journal_open(&journal, SD_JOURNAL_LOCAL_ONLY);
21 CHECK_RET(ret, "sd_journal_open");
23 ret = sd_journal_add_match(journal, "CODE_FUNC=logd_event", 0);
24 CHECK_RET(ret, "sd_journal_add_match");
26 ret = sd_journal_seek_tail(journal);
27 CHECK_RET(ret, "sd_journal_seek_tail");
29 ret = sd_journal_previous(journal);
30 CHECK_RET(ret, "sd_journal_previous");
38 sd_journal_close(journal);
43 int jr_get_socket(void)
45 return sd_journal_get_fd(journal);
48 int get_next_event(struct logd_grabber_event *event)
50 const char type_field[] = "LOGD_EVENT_TYPE";
51 const char message_field[] = "MESSAGE";
52 const char application_field[] = "SYSLOG_IDENTIFIER";
55 char *event_application;
62 if (!sd_journal_next(journal)) {
63 ret = sd_journal_process(journal);
65 _E("sd_journal_process failed");
71 ret = sd_journal_get_realtime_usec(journal, &event_date);
72 CHECK_RET(ret, "sd_journal_get_realtime_usec");
73 event->date = event_date / USEC_PER_SEC;
75 ret = sd_journal_get_data(journal, type_field,
76 (const void**)&event_type, &len);
77 CHECK_RET(ret, "sd_journal_get_data");
80 event_type = strdup(event_type + sizeof(type_field));
81 ret = sd_journal_get_data(journal, message_field,
82 (const void**)&event_message, &len);
84 event_message = strdup(event_message +
85 sizeof(message_field));
88 ret = sd_journal_get_data(journal, application_field,
89 (const void**)&event_application, &len);
90 if (event_application) {
91 event_application = strdup(event_application +
92 sizeof(application_field));
98 event->application = event_application;
99 event->message = event_message;
100 event->type = atoi(event_type);
102 event->object = GET_OBJECT_FROM_EVENT_TYPE(event->type);
103 event->action = GET_ACTION_FROM_EVENT_TYPE(event->type);