17ec681f3Smrg/*
27ec681f3Smrg * Copyright (C) 2005-2017 The Android Open Source Project
37ec681f3Smrg *
47ec681f3Smrg * Licensed under the Apache License, Version 2.0 (the "License");
57ec681f3Smrg * you may not use this file except in compliance with the License.
67ec681f3Smrg * You may obtain a copy of the License at
77ec681f3Smrg *
87ec681f3Smrg *      http://www.apache.org/licenses/LICENSE-2.0
97ec681f3Smrg *
107ec681f3Smrg * Unless required by applicable law or agreed to in writing, software
117ec681f3Smrg * distributed under the License is distributed on an "AS IS" BASIS,
127ec681f3Smrg * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
137ec681f3Smrg * See the License for the specific language governing permissions and
147ec681f3Smrg * limitations under the License.
157ec681f3Smrg */
167ec681f3Smrg
177ec681f3Smrg#pragma once
187ec681f3Smrg
197ec681f3Smrg#include <stdint.h>
207ec681f3Smrg#include <sys/types.h>
217ec681f3Smrg
227ec681f3Smrg#include <android/log.h>
237ec681f3Smrg#include <log/log_time.h>
247ec681f3Smrg
257ec681f3Smrg#ifdef __cplusplus
267ec681f3Smrgextern "C" {
277ec681f3Smrg#endif
287ec681f3Smrg
297ec681f3Smrg#define ANDROID_LOG_WRAP_DEFAULT_TIMEOUT 7200 /* 2 hour default */
307ec681f3Smrg
317ec681f3Smrg/*
327ec681f3Smrg * Native log reading interface section. See logcat for sample code.
337ec681f3Smrg *
347ec681f3Smrg * The preferred API is an exec of logcat. Likely uses of this interface
357ec681f3Smrg * are if native code suffers from exec or filtration being too costly,
367ec681f3Smrg * access to raw information, or parsing is an issue.
377ec681f3Smrg */
387ec681f3Smrg
397ec681f3Smrgstruct logger_entry {
407ec681f3Smrg  uint16_t len;      /* length of the payload */
417ec681f3Smrg  uint16_t hdr_size; /* sizeof(struct logger_entry) */
427ec681f3Smrg  int32_t pid;       /* generating process's pid */
437ec681f3Smrg  uint32_t tid;      /* generating process's tid */
447ec681f3Smrg  uint32_t sec;      /* seconds since Epoch */
457ec681f3Smrg  uint32_t nsec;     /* nanoseconds */
467ec681f3Smrg  uint32_t lid;      /* log id of the payload, bottom 4 bits currently */
477ec681f3Smrg  uint32_t uid;      /* generating process's uid */
487ec681f3Smrg};
497ec681f3Smrg
507ec681f3Smrg/*
517ec681f3Smrg * The maximum size of a log entry which can be read.
527ec681f3Smrg * An attempt to read less than this amount may result
537ec681f3Smrg * in read() returning EINVAL.
547ec681f3Smrg */
557ec681f3Smrg#define LOGGER_ENTRY_MAX_LEN (5 * 1024)
567ec681f3Smrg
577ec681f3Smrgstruct log_msg {
587ec681f3Smrg  union {
597ec681f3Smrg    unsigned char buf[LOGGER_ENTRY_MAX_LEN + 1];
607ec681f3Smrg    struct logger_entry entry;
617ec681f3Smrg  } __attribute__((aligned(4)));
627ec681f3Smrg#ifdef __cplusplus
637ec681f3Smrg  uint64_t nsec() const {
647ec681f3Smrg    return static_cast<uint64_t>(entry.sec) * NS_PER_SEC + entry.nsec;
657ec681f3Smrg  }
667ec681f3Smrg  log_id_t id() {
677ec681f3Smrg    return static_cast<log_id_t>(entry.lid);
687ec681f3Smrg  }
697ec681f3Smrg  char* msg() {
707ec681f3Smrg    unsigned short hdr_size = entry.hdr_size;
717ec681f3Smrg    if (hdr_size >= sizeof(struct log_msg) - sizeof(entry)) {
727ec681f3Smrg      return nullptr;
737ec681f3Smrg    }
747ec681f3Smrg    return reinterpret_cast<char*>(buf) + hdr_size;
757ec681f3Smrg  }
767ec681f3Smrg  unsigned int len() { return entry.hdr_size + entry.len; }
777ec681f3Smrg#endif
787ec681f3Smrg};
797ec681f3Smrg
807ec681f3Smrgstruct logger;
817ec681f3Smrg
827ec681f3Smrglog_id_t android_logger_get_id(struct logger* logger);
837ec681f3Smrg
847ec681f3Smrg/* Clears the given log buffer. */
857ec681f3Smrgint android_logger_clear(struct logger* logger);
867ec681f3Smrg/* Return the allotted size for the given log buffer. */
877ec681f3Smrglong android_logger_get_log_size(struct logger* logger);
887ec681f3Smrg/* Set the allotted size for the given log buffer. */
897ec681f3Smrgint android_logger_set_log_size(struct logger* logger, unsigned long size);
907ec681f3Smrg/* Return the actual, uncompressed size that can be read from the given log buffer. */
917ec681f3Smrglong android_logger_get_log_readable_size(struct logger* logger);
927ec681f3Smrg/* Return the actual, compressed size that the given log buffer is consuming. */
937ec681f3Smrglong android_logger_get_log_consumed_size(struct logger* logger);
947ec681f3Smrg/* Deprecated.  Always returns '4' regardless of input. */
957ec681f3Smrgint android_logger_get_log_version(struct logger* logger);
967ec681f3Smrg
977ec681f3Smrgstruct logger_list;
987ec681f3Smrg
997ec681f3Smrgssize_t android_logger_get_statistics(struct logger_list* logger_list,
1007ec681f3Smrg                                      char* buf, size_t len);
1017ec681f3Smrgssize_t android_logger_get_prune_list(struct logger_list* logger_list,
1027ec681f3Smrg                                      char* buf, size_t len);
1037ec681f3Smrgint android_logger_set_prune_list(struct logger_list* logger_list, const char* buf, size_t len);
1047ec681f3Smrg
1057ec681f3Smrg/* The below values are used for the `mode` argument of the below functions. */
1067ec681f3Smrg/* Note that 0x00000003 were previously used and should be considered reserved. */
1077ec681f3Smrg#define ANDROID_LOG_NONBLOCK 0x00000800
1087ec681f3Smrg#define ANDROID_LOG_WRAP 0x40000000 /* Block until buffer about to wrap */
1097ec681f3Smrg#define ANDROID_LOG_PSTORE 0x80000000
1107ec681f3Smrg
1117ec681f3Smrgstruct logger_list* android_logger_list_alloc(int mode, unsigned int tail,
1127ec681f3Smrg                                              pid_t pid);
1137ec681f3Smrgstruct logger_list* android_logger_list_alloc_time(int mode, log_time start,
1147ec681f3Smrg                                                   pid_t pid);
1157ec681f3Smrgvoid android_logger_list_free(struct logger_list* logger_list);
1167ec681f3Smrg/* In the purest sense, the following two are orthogonal interfaces */
1177ec681f3Smrgint android_logger_list_read(struct logger_list* logger_list,
1187ec681f3Smrg                             struct log_msg* log_msg);
1197ec681f3Smrg
1207ec681f3Smrg/* Multiple log_id_t opens */
1217ec681f3Smrgstruct logger* android_logger_open(struct logger_list* logger_list, log_id_t id);
1227ec681f3Smrg/* Single log_id_t open */
1237ec681f3Smrgstruct logger_list* android_logger_list_open(log_id_t id, int mode,
1247ec681f3Smrg                                             unsigned int tail, pid_t pid);
1257ec681f3Smrg#define android_logger_list_close android_logger_list_free
1267ec681f3Smrg
1277ec681f3Smrg#ifdef __cplusplus
1287ec681f3Smrg}
1297ec681f3Smrg#endif
130