#include #include #include #include #include #include "json11.hpp" #include #include "common/timing.h" #include "messaging.hpp" volatile sig_atomic_t do_exit = 0; static void set_do_exit(int sig) { do_exit = 1; } int main(int argc, char *argv[]) { // setup signal handlers signal(SIGINT, (sighandler_t)set_do_exit); signal(SIGTERM, (sighandler_t)set_do_exit); PubMaster pm({"androidLog"}); sd_journal *journal; assert(sd_journal_open(&journal, 0) >= 0); assert(sd_journal_get_fd(journal) >= 0); // needed so sd_journal_wait() works properly if files rotate assert(sd_journal_seek_tail(journal) >= 0); int r; while (!do_exit) { r = sd_journal_next(journal); assert(r >= 0); // Wait for new message if we didn't receive anything if (r == 0){ r = sd_journal_wait(journal, 1000 * 1000); assert (r >= 0); continue; // Try again } uint64_t timestamp = 0; r = sd_journal_get_realtime_usec(journal, ×tamp); assert(r >= 0); const void *data; size_t length; std::map kv; SD_JOURNAL_FOREACH_DATA(journal, data, length){ std::string str((char*)data, length); // Split "KEY=VALUE"" on "=" and put in map std::size_t found = str.find("="); if (found != std::string::npos){ kv[str.substr(0, found)] = str.substr(found + 1, std::string::npos); } } MessageBuilder msg; // Build message auto androidEntry = msg.initEvent().initAndroidLog(); androidEntry.setTs(timestamp); androidEntry.setMessage(json11::Json(kv).dump()); if (kv.count("_PID")) androidEntry.setPid(std::atoi(kv["_PID"].c_str())); if (kv.count("PRIORITY")) androidEntry.setPriority(std::atoi(kv["PRIORITY"].c_str())); if (kv.count("SYSLOG_IDENTIFIER")) androidEntry.setTag(kv["SYSLOG_IDENTIFIER"]); pm.send("androidLog", msg); } sd_journal_close(journal); return 0; }