blob: a05b1745120a76ec387552635b4dea410c6a8363 [file] [log] [blame]
Mark Salyzyn6c1b07f2013-11-22 10:50:27 -08001/*
2**
The Android Open Source Projectdd7bc332009-03-03 19:32:55 -08003** Copyright 2007, The Android Open Source Project
4**
5** This file is dual licensed. It may be redistributed and/or modified
6** under the terms of the Apache 2.0 License OR version 2 of the GNU
7** General Public License.
8*/
9
10#ifndef _UTILS_LOGGER_H
11#define _UTILS_LOGGER_H
12
13#include <stdint.h>
Mark Salyzyn6c1b07f2013-11-22 10:50:27 -080014#include <log/log.h>
15
Mark Salyzync96a4482014-01-03 16:54:28 -080016#ifdef __cplusplus
17extern "C" {
18#endif
The Android Open Source Projectdd7bc332009-03-03 19:32:55 -080019
Nick Kralevich6756a0c2012-03-22 14:28:16 -070020/*
21 * The userspace structure for version 1 of the logger_entry ABI.
22 * This structure is returned to userspace by the kernel logger
23 * driver unless an upgrade to a newer ABI version is requested.
24 */
The Android Open Source Projectdd7bc332009-03-03 19:32:55 -080025struct logger_entry {
26 uint16_t len; /* length of the payload */
27 uint16_t __pad; /* no matter what, we get 2 bytes of padding */
28 int32_t pid; /* generating process's pid */
29 int32_t tid; /* generating process's tid */
30 int32_t sec; /* seconds since Epoch */
31 int32_t nsec; /* nanoseconds */
32 char msg[0]; /* the entry's payload */
33};
34
Nick Kralevich6756a0c2012-03-22 14:28:16 -070035/*
36 * The userspace structure for version 2 of the logger_entry ABI.
37 * This structure is returned to userspace if ioctl(LOGGER_SET_VERSION)
38 * is called with version==2
39 */
40struct logger_entry_v2 {
41 uint16_t len; /* length of the payload */
42 uint16_t hdr_size; /* sizeof(struct logger_entry_v2) */
43 int32_t pid; /* generating process's pid */
44 int32_t tid; /* generating process's tid */
45 int32_t sec; /* seconds since Epoch */
46 int32_t nsec; /* nanoseconds */
47 uint32_t euid; /* effective UID of logger */
48 char msg[0]; /* the entry's payload */
49};
50
The Android Open Source Projectdd7bc332009-03-03 19:32:55 -080051#define LOGGER_LOG_MAIN "log/main"
52#define LOGGER_LOG_RADIO "log/radio"
53#define LOGGER_LOG_EVENTS "log/events"
Joe Onoratoe2bf2ea2010-03-01 09:11:54 -080054#define LOGGER_LOG_SYSTEM "log/system"
The Android Open Source Projectdd7bc332009-03-03 19:32:55 -080055
Nick Kralevich6756a0c2012-03-22 14:28:16 -070056/*
57 * The maximum size of the log entry payload that can be
58 * written to the kernel logger driver. An attempt to write
59 * more than this amount to /dev/log/* will result in a
60 * truncated log entry.
61 */
62#define LOGGER_ENTRY_MAX_PAYLOAD 4076
63
64/*
65 * The maximum size of a log entry which can be read from the
66 * kernel logger driver. An attempt to read less than this amount
67 * may result in read() returning EINVAL.
68 */
69#define LOGGER_ENTRY_MAX_LEN (5*1024)
The Android Open Source Projectdd7bc332009-03-03 19:32:55 -080070
Mark Salyzyn6c1b07f2013-11-22 10:50:27 -080071#define NS_PER_SEC 1000000000ULL
72
73struct log_msg {
74 union {
75 unsigned char buf[LOGGER_ENTRY_MAX_LEN + 1];
76 struct logger_entry_v2 entry;
77 struct logger_entry_v2 entry_v2;
78 struct logger_entry entry_v1;
79 struct {
80 unsigned char buf[LOGGER_ENTRY_MAX_LEN + 1];
81 log_id_t id;
82 } extra;
83 } __attribute__((aligned(4)));
84#ifdef __cplusplus
85 /* Matching log_time_t operators */
86 bool operator== (log_msg &T)
87 {
88 return (entry.sec == T.entry.sec) && (entry.nsec == T.entry.nsec);
89 }
90 bool operator!= (log_msg &T)
91 {
92 return !(*this == T);
93 }
94 bool operator< (log_msg &T)
95 {
96 return (entry.sec < T.entry.sec)
97 || ((entry.sec == T.entry.sec)
98 && (entry.nsec < T.entry.nsec));
99 }
100 bool operator>= (log_msg &T)
101 {
102 return !(*this < T);
103 }
104 bool operator> (log_msg &T)
105 {
106 return (entry.sec > T.entry.sec)
107 || ((entry.sec == T.entry.sec)
108 && (entry.nsec > T.entry.nsec));
109 }
110 bool operator<= (log_msg &T)
111 {
112 return !(*this > T);
113 }
114 uint64_t nsec(void)
115 {
116 return static_cast<uint64_t>(entry.sec) * NS_PER_SEC + entry.nsec;
117 }
118
119 /* packet methods */
120 log_id_t id(void)
121 {
122 return extra.id;
123 }
124 char *msg(void)
125 {
126 return entry.hdr_size ? (char *) buf + entry.hdr_size : entry_v1.msg;
127 }
128 unsigned int len(void)
129 {
130 return (entry.hdr_size ? entry.hdr_size : sizeof(entry_v1)) + entry.len;
131 }
132#endif
133};
134
135struct logger;
136
137log_id_t android_logger_get_id(struct logger *logger);
138
139int android_logger_clear(struct logger *logger);
140int android_logger_get_log_size(struct logger *logger);
141int android_logger_get_log_readable_size(struct logger *logger);
142int android_logger_get_log_version(struct logger *logger);
143
144struct logger_list;
145
146struct logger_list *android_logger_list_alloc(int mode,
147 unsigned int tail,
148 pid_t pid);
149void android_logger_list_free(struct logger_list *logger_list);
150/* In the purest sense, the following two are orthogonal interfaces */
151int android_logger_list_read(struct logger_list *logger_list,
152 struct log_msg *log_msg);
153
154/* Multiple log_id_t opens */
155struct logger *android_logger_open(struct logger_list *logger_list,
156 log_id_t id);
157#define android_logger_close android_logger_free
158/* Single log_id_t open */
159struct logger_list *android_logger_list_open(log_id_t id,
160 int mode,
161 unsigned int tail,
162 pid_t pid);
163#define android_logger_list_close android_logger_list_free
164
165/*
166 * log_id_t helpers
167 */
168log_id_t android_name_to_log_id(const char *logName);
169const char *android_log_id_to_name(log_id_t log_id);
170
The Android Open Source Projectdd7bc332009-03-03 19:32:55 -0800171#ifdef HAVE_IOCTL
172
173#include <sys/ioctl.h>
174
175#define __LOGGERIO 0xAE
176
177#define LOGGER_GET_LOG_BUF_SIZE _IO(__LOGGERIO, 1) /* size of log */
178#define LOGGER_GET_LOG_LEN _IO(__LOGGERIO, 2) /* used log len */
179#define LOGGER_GET_NEXT_ENTRY_LEN _IO(__LOGGERIO, 3) /* next entry len */
180#define LOGGER_FLUSH_LOG _IO(__LOGGERIO, 4) /* flush log */
Nick Kralevich6756a0c2012-03-22 14:28:16 -0700181#define LOGGER_GET_VERSION _IO(__LOGGERIO, 5) /* abi version */
182#define LOGGER_SET_VERSION _IO(__LOGGERIO, 6) /* abi version */
The Android Open Source Projectdd7bc332009-03-03 19:32:55 -0800183
184#endif // HAVE_IOCTL
185
Mark Salyzync96a4482014-01-03 16:54:28 -0800186#ifdef __cplusplus
187}
188#endif
Mark Salyzyn6c1b07f2013-11-22 10:50:27 -0800189
The Android Open Source Projectdd7bc332009-03-03 19:32:55 -0800190#endif /* _UTILS_LOGGER_H */