1ae4d928d816e30dbe57c2c321b0f0759d0567b3fMark Salyzyn/* 2ae4d928d816e30dbe57c2c321b0f0759d0567b3fMark Salyzyn * Copyright (C) 2014 The Android Open Source Project 3ae4d928d816e30dbe57c2c321b0f0759d0567b3fMark Salyzyn * 4ae4d928d816e30dbe57c2c321b0f0759d0567b3fMark Salyzyn * Licensed under the Apache License, Version 2.0 (the "License"); 5ae4d928d816e30dbe57c2c321b0f0759d0567b3fMark Salyzyn * you may not use this file except in compliance with the License. 6ae4d928d816e30dbe57c2c321b0f0759d0567b3fMark Salyzyn * You may obtain a copy of the License at 7ae4d928d816e30dbe57c2c321b0f0759d0567b3fMark Salyzyn * 8ae4d928d816e30dbe57c2c321b0f0759d0567b3fMark Salyzyn * http://www.apache.org/licenses/LICENSE-2.0 9ae4d928d816e30dbe57c2c321b0f0759d0567b3fMark Salyzyn * 10ae4d928d816e30dbe57c2c321b0f0759d0567b3fMark Salyzyn * Unless required by applicable law or agreed to in writing, software 11ae4d928d816e30dbe57c2c321b0f0759d0567b3fMark Salyzyn * distributed under the License is distributed on an "AS IS" BASIS, 12ae4d928d816e30dbe57c2c321b0f0759d0567b3fMark Salyzyn * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13ae4d928d816e30dbe57c2c321b0f0759d0567b3fMark Salyzyn * See the License for the specific language governing permissions and 14ae4d928d816e30dbe57c2c321b0f0759d0567b3fMark Salyzyn * limitations under the License. 15ae4d928d816e30dbe57c2c321b0f0759d0567b3fMark Salyzyn */ 16ae4d928d816e30dbe57c2c321b0f0759d0567b3fMark Salyzyn 17ae4d928d816e30dbe57c2c321b0f0759d0567b3fMark Salyzyn#ifndef _LOGD_LOG_KLOG_H__ 18ae4d928d816e30dbe57c2c321b0f0759d0567b3fMark Salyzyn#define _LOGD_LOG_KLOG_H__ 19ae4d928d816e30dbe57c2c321b0f0759d0567b3fMark Salyzyn 20ae4d928d816e30dbe57c2c321b0f0759d0567b3fMark Salyzyn#include <sysutils/SocketListener.h> 21ae4d928d816e30dbe57c2c321b0f0759d0567b3fMark Salyzyn#include <log/log_read.h> 22ae4d928d816e30dbe57c2c321b0f0759d0567b3fMark Salyzyn 23ea1a24110767d6d5666fda8a19dd0b3f954068d6Mark Salyzynchar *log_strntok_r(char *s, size_t *len, char **saveptr, size_t *sublen); 242c3b300fd8307e8da13608197d0a89bc613de5fbMark Salyzyn 25317bfb923c12af688d18fc9a3580dff201b2482bMark Salyzynclass LogBuffer; 26317bfb923c12af688d18fc9a3580dff201b2482bMark Salyzynclass LogReader; 27317bfb923c12af688d18fc9a3580dff201b2482bMark Salyzyn 28ae4d928d816e30dbe57c2c321b0f0759d0567b3fMark Salyzynclass LogKlog : public SocketListener { 29ae4d928d816e30dbe57c2c321b0f0759d0567b3fMark Salyzyn LogBuffer *logbuf; 30ae4d928d816e30dbe57c2c321b0f0759d0567b3fMark Salyzyn LogReader *reader; 31ae4d928d816e30dbe57c2c321b0f0759d0567b3fMark Salyzyn const log_time signature; 32ae4d928d816e30dbe57c2c321b0f0759d0567b3fMark Salyzyn // Set once thread is started, separates KLOG_ACTION_READ_ALL 33ae4d928d816e30dbe57c2c321b0f0759d0567b3fMark Salyzyn // and KLOG_ACTION_READ phases. 34ae4d928d816e30dbe57c2c321b0f0759d0567b3fMark Salyzyn bool initialized; 35ae4d928d816e30dbe57c2c321b0f0759d0567b3fMark Salyzyn // Used during each of the above phases to control logging. 36ae4d928d816e30dbe57c2c321b0f0759d0567b3fMark Salyzyn bool enableLogging; 37ae4d928d816e30dbe57c2c321b0f0759d0567b3fMark Salyzyn // set if we are also running auditd, to filter out audit reports from 38ae4d928d816e30dbe57c2c321b0f0759d0567b3fMark Salyzyn // our copy of the kernel log 39ae4d928d816e30dbe57c2c321b0f0759d0567b3fMark Salyzyn bool auditd; 40ae4d928d816e30dbe57c2c321b0f0759d0567b3fMark Salyzyn 41ae4d928d816e30dbe57c2c321b0f0759d0567b3fMark Salyzyn static log_time correction; 42ae4d928d816e30dbe57c2c321b0f0759d0567b3fMark Salyzyn 43ae4d928d816e30dbe57c2c321b0f0759d0567b3fMark Salyzynpublic: 44ae4d928d816e30dbe57c2c321b0f0759d0567b3fMark Salyzyn LogKlog(LogBuffer *buf, LogReader *reader, int fdWrite, int fdRead, bool auditd); 45151beac76d372c5c1bd71e656a6cfbd177e36509Mark Salyzyn int log(const char *buf, size_t len); 46151beac76d372c5c1bd71e656a6cfbd177e36509Mark Salyzyn void synchronize(const char *buf, size_t len); 47ae4d928d816e30dbe57c2c321b0f0759d0567b3fMark Salyzyn 48b6bee33182cedea49199eb2252b3f3b442899c6dMark Salyzyn bool isMonotonic() { return logbuf->isMonotonic(); } 49ae4d928d816e30dbe57c2c321b0f0759d0567b3fMark Salyzyn static void convertMonotonicToReal(log_time &real) { real += correction; } 50b6bee33182cedea49199eb2252b3f3b442899c6dMark Salyzyn static void convertRealToMonotonic(log_time &real) { real -= correction; } 51ae4d928d816e30dbe57c2c321b0f0759d0567b3fMark Salyzyn 52ae4d928d816e30dbe57c2c321b0f0759d0567b3fMark Salyzynprotected: 53151beac76d372c5c1bd71e656a6cfbd177e36509Mark Salyzyn void sniffTime(log_time &now, const char **buf, size_t len, bool reverse); 54151beac76d372c5c1bd71e656a6cfbd177e36509Mark Salyzyn pid_t sniffPid(const char *buf, size_t len); 55151beac76d372c5c1bd71e656a6cfbd177e36509Mark Salyzyn void calculateCorrection(const log_time &monotonic, 56151beac76d372c5c1bd71e656a6cfbd177e36509Mark Salyzyn const char *real_string, size_t len); 57ae4d928d816e30dbe57c2c321b0f0759d0567b3fMark Salyzyn virtual bool onDataAvailable(SocketClient *cli); 58ae4d928d816e30dbe57c2c321b0f0759d0567b3fMark Salyzyn 59ae4d928d816e30dbe57c2c321b0f0759d0567b3fMark Salyzyn}; 60ae4d928d816e30dbe57c2c321b0f0759d0567b3fMark Salyzyn 61ae4d928d816e30dbe57c2c321b0f0759d0567b3fMark Salyzyn#endif 62