121de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn/*
221de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn * Copyright (C) 2005-2017 The Android Open Source Project
321de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn *
421de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn * Licensed under the Apache License, Version 2.0 (the "License");
521de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn * you may not use this file except in compliance with the License.
621de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn * You may obtain a copy of the License at
721de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn *
821de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn *      http://www.apache.org/licenses/LICENSE-2.0
921de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn *
1021de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn * Unless required by applicable law or agreed to in writing, software
1121de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn * distributed under the License is distributed on an "AS IS" BASIS,
1221de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1321de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn * See the License for the specific language governing permissions and
1421de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn * limitations under the License.
1521de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn */
1621de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn
1721de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn#ifndef _LIBS_LOG_LOG_READ_H
1821de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn#define _LIBS_LOG_LOG_READ_H
1921de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn
2021de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn/* deal with possible sys/cdefs.h conflict with fcntl.h */
2121de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn#ifdef __unused
2221de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn#define __unused_defined __unused
2321de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn#undef __unused
2421de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn#endif
2521de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn
2621de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn#include <fcntl.h> /* Pick up O_* macros */
2721de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn
2821de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn/* restore definitions from above */
2921de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn#ifdef __unused_defined
3021de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn#define __unused __attribute__((__unused__))
3121de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn#endif
3221de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn
3321de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn#include <stdint.h>
3421de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn
3521de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn#include <log/log_id.h>
3621de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn#include <log/log_time.h>
3721de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn
3821de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn#ifdef __cplusplus
3921de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzynextern "C" {
4021de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn#endif
4121de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn
4221de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn/*
4321de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn * Native log reading interface section. See logcat for sample code.
4421de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn *
4521de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn * The preferred API is an exec of logcat. Likely uses of this interface
4621de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn * are if native code suffers from exec or filtration being too costly,
4721de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn * access to raw information, or parsing is an issue.
4821de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn */
4921de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn
5021de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn/*
5121de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn * The userspace structure for version 1 of the logger_entry ABI.
5221de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn */
5321de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn#ifndef __struct_logger_entry_defined
5421de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn#define __struct_logger_entry_defined
5521de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzynstruct logger_entry {
562ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn  uint16_t len;   /* length of the payload */
572ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn  uint16_t __pad; /* no matter what, we get 2 bytes of padding */
582ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn  int32_t pid;    /* generating process's pid */
592ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn  int32_t tid;    /* generating process's tid */
602ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn  int32_t sec;    /* seconds since Epoch */
612ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn  int32_t nsec;   /* nanoseconds */
6221de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn#ifndef __cplusplus
632ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn  char msg[0]; /* the entry's payload */
6421de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn#endif
6521de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn};
6621de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn#endif
6721de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn
6821de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn/*
6921de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn * The userspace structure for version 2 of the logger_entry ABI.
7021de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn */
7121de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn#ifndef __struct_logger_entry_v2_defined
7221de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn#define __struct_logger_entry_v2_defined
7321de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzynstruct logger_entry_v2 {
742ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn  uint16_t len;      /* length of the payload */
752ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn  uint16_t hdr_size; /* sizeof(struct logger_entry_v2) */
762ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn  int32_t pid;       /* generating process's pid */
772ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn  int32_t tid;       /* generating process's tid */
782ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn  int32_t sec;       /* seconds since Epoch */
792ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn  int32_t nsec;      /* nanoseconds */
802ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn  uint32_t euid;     /* effective UID of logger */
8121de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn#ifndef __cplusplus
822ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn  char msg[0]; /* the entry's payload */
8321de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn#endif
8421de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn} __attribute__((__packed__));
8521de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn#endif
8621de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn
8721de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn/*
8821de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn * The userspace structure for version 3 of the logger_entry ABI.
8921de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn */
9021de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn#ifndef __struct_logger_entry_v3_defined
9121de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn#define __struct_logger_entry_v3_defined
9221de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzynstruct logger_entry_v3 {
932ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn  uint16_t len;      /* length of the payload */
942ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn  uint16_t hdr_size; /* sizeof(struct logger_entry_v3) */
952ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn  int32_t pid;       /* generating process's pid */
962ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn  int32_t tid;       /* generating process's tid */
972ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn  int32_t sec;       /* seconds since Epoch */
982ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn  int32_t nsec;      /* nanoseconds */
992ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn  uint32_t lid;      /* log id of the payload */
10021de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn#ifndef __cplusplus
1012ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn  char msg[0]; /* the entry's payload */
10221de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn#endif
10321de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn} __attribute__((__packed__));
10421de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn#endif
10521de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn
10621de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn/*
10721de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn * The userspace structure for version 4 of the logger_entry ABI.
10821de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn */
10921de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn#ifndef __struct_logger_entry_v4_defined
11021de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn#define __struct_logger_entry_v4_defined
11121de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzynstruct logger_entry_v4 {
1122ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn  uint16_t len;      /* length of the payload */
1132ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn  uint16_t hdr_size; /* sizeof(struct logger_entry_v4) */
1142ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn  int32_t pid;       /* generating process's pid */
1152ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn  uint32_t tid;      /* generating process's tid */
1162ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn  uint32_t sec;      /* seconds since Epoch */
1172ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn  uint32_t nsec;     /* nanoseconds */
1182ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn  uint32_t lid;      /* log id of the payload, bottom 4 bits currently */
1192ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn  uint32_t uid;      /* generating process's uid */
12021de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn#ifndef __cplusplus
1212ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn  char msg[0]; /* the entry's payload */
12221de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn#endif
12321de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn};
12421de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn#endif
12521de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn
12621de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn/*
12721de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn * The maximum size of the log entry payload that can be
12821de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn * written to the logger. An attempt to write more than
12921de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn * this amount will result in a truncated log entry.
13021de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn */
13121de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn#define LOGGER_ENTRY_MAX_PAYLOAD 4068
13221de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn
13321de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn/*
13421de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn * The maximum size of a log entry which can be read.
13521de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn * An attempt to read less than this amount may result
13621de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn * in read() returning EINVAL.
13721de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn */
1382ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn#define LOGGER_ENTRY_MAX_LEN (5 * 1024)
13921de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn
14021de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn#ifndef __struct_log_msg_defined
14121de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn#define __struct_log_msg_defined
14221de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzynstruct log_msg {
1432ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn  union {
1442ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn    unsigned char buf[LOGGER_ENTRY_MAX_LEN + 1];
1452ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn    struct logger_entry_v4 entry;
1462ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn    struct logger_entry_v4 entry_v4;
1472ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn    struct logger_entry_v3 entry_v3;
1482ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn    struct logger_entry_v2 entry_v2;
1492ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn    struct logger_entry entry_v1;
1502ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn  } __attribute__((aligned(4)));
15121de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn#ifdef __cplusplus
1522ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn  /* Matching log_time operators */
1532ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn  bool operator==(const log_msg& T) const {
1542ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn    return (entry.sec == T.entry.sec) && (entry.nsec == T.entry.nsec);
1552ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn  }
1562ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn  bool operator!=(const log_msg& T) const {
1572ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn    return !(*this == T);
1582ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn  }
1592ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn  bool operator<(const log_msg& T) const {
1602ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn    return (entry.sec < T.entry.sec) ||
1612ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn           ((entry.sec == T.entry.sec) && (entry.nsec < T.entry.nsec));
1622ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn  }
1632ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn  bool operator>=(const log_msg& T) const {
1642ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn    return !(*this < T);
1652ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn  }
1662ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn  bool operator>(const log_msg& T) const {
1672ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn    return (entry.sec > T.entry.sec) ||
1682ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn           ((entry.sec == T.entry.sec) && (entry.nsec > T.entry.nsec));
1692ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn  }
1702ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn  bool operator<=(const log_msg& T) const {
1712ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn    return !(*this > T);
1722ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn  }
1732ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn  uint64_t nsec() const {
1742ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn    return static_cast<uint64_t>(entry.sec) * NS_PER_SEC + entry.nsec;
1752ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn  }
17621de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn
1772ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn  /* packet methods */
1782ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn  log_id_t id() {
1792ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn    return static_cast<log_id_t>(entry.lid);
1802ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn  }
1812ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn  char* msg() {
1822ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn    unsigned short hdr_size = entry.hdr_size;
1832ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn    if (!hdr_size) {
1842ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn      hdr_size = sizeof(entry_v1);
18521de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn    }
1862ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn    if ((hdr_size < sizeof(entry_v1)) || (hdr_size > sizeof(entry))) {
1872ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn      return NULL;
18821de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn    }
1892ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn    return reinterpret_cast<char*>(buf) + hdr_size;
1902ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn  }
1912ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn  unsigned int len() {
1922ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn    return (entry.hdr_size ? entry.hdr_size
1932ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn                           : static_cast<uint16_t>(sizeof(entry_v1))) +
1942ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn           entry.len;
1952ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn  }
19621de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn#endif
19721de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn};
19821de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn#endif
19921de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn
20021de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn#ifndef __ANDROID_USE_LIBLOG_READER_INTERFACE
20121de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn#ifndef __ANDROID_API__
20221de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn#define __ANDROID_USE_LIBLOG_READER_INTERFACE 3
20321de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn#elif __ANDROID_API__ > 23 /* > Marshmallow */
20421de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn#define __ANDROID_USE_LIBLOG_READER_INTERFACE 3
20521de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn#elif __ANDROID_API__ > 22 /* > Lollipop */
20621de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn#define __ANDROID_USE_LIBLOG_READER_INTERFACE 2
20721de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn#elif __ANDROID_API__ > 19 /* > KitKat */
20821de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn#define __ANDROID_USE_LIBLOG_READER_INTERFACE 1
20921de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn#else
21021de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn#define __ANDROID_USE_LIBLOG_READER_INTERFACE 0
21121de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn#endif
21221de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn#endif
21321de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn
21421de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn#if __ANDROID_USE_LIBLOG_READER_INTERFACE
21521de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn
21621de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzynstruct logger;
21721de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn
21821de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzynlog_id_t android_logger_get_id(struct logger* logger);
21921de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn
22021de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzynint android_logger_clear(struct logger* logger);
22121de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzynlong android_logger_get_log_size(struct logger* logger);
22221de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzynint android_logger_set_log_size(struct logger* logger, unsigned long size);
22321de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzynlong android_logger_get_log_readable_size(struct logger* logger);
22421de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzynint android_logger_get_log_version(struct logger* logger);
22521de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn
22621de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzynstruct logger_list;
22721de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn
22821de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn#if __ANDROID_USE_LIBLOG_READER_INTERFACE > 1
22921de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzynssize_t android_logger_get_statistics(struct logger_list* logger_list,
23021de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn                                      char* buf, size_t len);
23121de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzynssize_t android_logger_get_prune_list(struct logger_list* logger_list,
23221de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn                                      char* buf, size_t len);
2332ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzynint android_logger_set_prune_list(struct logger_list* logger_list, char* buf,
2342ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn                                  size_t len);
23521de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn#endif
23621de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn
2372ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn#define ANDROID_LOG_RDONLY O_RDONLY
2382ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn#define ANDROID_LOG_WRONLY O_WRONLY
2392ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn#define ANDROID_LOG_RDWR O_RDWR
2402ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn#define ANDROID_LOG_ACCMODE O_ACCMODE
24162d0d2d683f5d19cf9d451548bd03c4b4f53c42eMark Salyzyn#ifndef O_NONBLOCK
24262d0d2d683f5d19cf9d451548bd03c4b4f53c42eMark Salyzyn#define ANDROID_LOG_NONBLOCK 0x00000800
24362d0d2d683f5d19cf9d451548bd03c4b4f53c42eMark Salyzyn#else
24421de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn#define ANDROID_LOG_NONBLOCK O_NONBLOCK
24562d0d2d683f5d19cf9d451548bd03c4b4f53c42eMark Salyzyn#endif
24621de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn#if __ANDROID_USE_LIBLOG_READER_INTERFACE > 2
2472ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn#define ANDROID_LOG_WRAP 0x40000000 /* Block until buffer about to wrap */
24821de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn#define ANDROID_LOG_WRAP_DEFAULT_TIMEOUT 7200 /* 2 hour default */
24921de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn#endif
25021de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn#if __ANDROID_USE_LIBLOG_READER_INTERFACE > 1
2512ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn#define ANDROID_LOG_PSTORE 0x80000000
25221de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn#endif
25321de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn
2542ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzynstruct logger_list* android_logger_list_alloc(int mode, unsigned int tail,
25521de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn                                              pid_t pid);
2562ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzynstruct logger_list* android_logger_list_alloc_time(int mode, log_time start,
25721de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn                                                   pid_t pid);
25821de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzynvoid android_logger_list_free(struct logger_list* logger_list);
25921de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn/* In the purest sense, the following two are orthogonal interfaces */
26021de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzynint android_logger_list_read(struct logger_list* logger_list,
26121de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn                             struct log_msg* log_msg);
26221de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn
26321de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn/* Multiple log_id_t opens */
2642ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzynstruct logger* android_logger_open(struct logger_list* logger_list, log_id_t id);
26521de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn#define android_logger_close android_logger_free
26621de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn/* Single log_id_t open */
2672ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzynstruct logger_list* android_logger_list_open(log_id_t id, int mode,
2682ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn                                             unsigned int tail, pid_t pid);
26921de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn#define android_logger_list_close android_logger_list_free
27021de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn
27121de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn#endif /* __ANDROID_USE_LIBLOG_READER_INTERFACE */
27221de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn
27321de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn#ifdef __cplusplus
27421de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn}
27521de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn#endif
27621de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn
27721de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn#endif /* _LIBS_LOG_LOG_H */
278