logd_write.c revision ed7ccae2968a75e09c22a3da90a9762170f96477
1dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project/* 2dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project 3dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * 4dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 5dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * you may not use this file except in compliance with the License. 6dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * You may obtain a copy of the License at 7dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * 8dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 9dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * 10dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 11dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 12dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * See the License for the specific language governing permissions and 14dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * limitations under the License. 15dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project */ 16dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <time.h> 17dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <stdio.h> 18dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#ifdef HAVE_PTHREADS 19dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <pthread.h> 20dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif 21dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <unistd.h> 22dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <errno.h> 23dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <fcntl.h> 24dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <string.h> 25dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <stdlib.h> 26dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <stdarg.h> 27dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 28dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <cutils/logger.h> 29dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <cutils/logd.h> 30dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 31dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define LOG_BUF_SIZE 1024 32dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 33dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#if FAKE_LOG_DEVICE 34dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project// This will be defined when building for the host. 35dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define log_open(pathname, flags) fakeLogOpen(pathname, flags) 36dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define log_writev(filedes, vector, count) fakeLogWritev(filedes, vector, count) 37dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define log_close(filedes) fakeLogClose(filedes) 38dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#else 39dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define log_open(pathname, flags) open(pathname, flags) 40dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define log_writev(filedes, vector, count) writev(filedes, vector, count) 41dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define log_close(filedes) close(filedes) 42dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif 43dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 44dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projecttypedef enum { 45dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project LOG_ID_MAIN = 0, 46dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project LOG_ID_RADIO, 47dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project LOG_ID_EVENTS, 48dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project LOG_ID_MAX 49dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} log_id_t; 50dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 51dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic int __write_to_log_init(log_id_t, struct iovec *vec, size_t nr); 52dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic int (*write_to_log)(log_id_t, struct iovec *vec, size_t nr) = 53dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project __write_to_log_init; 54dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#ifdef HAVE_PTHREADS 55dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic pthread_mutex_t log_init_lock = PTHREAD_MUTEX_INITIALIZER; 56dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif 57dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 58dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic int log_fds[(int)LOG_ID_MAX] = { -1, -1, -1 }; 59dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 60dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project/* 61dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * This is used by the C++ code to decide if it should write logs through 62dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * the C code. Basically, if /dev/log/... is available, we're running in 63dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * the simulator rather than a desktop tool and want to use the device. 64dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project */ 65dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic enum { 66dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project kLogUninitialized, kLogNotAvailable, kLogAvailable 67dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} g_log_status = kLogUninitialized; 68dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectint __android_log_dev_available(void) 69dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 70dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (g_log_status == kLogUninitialized) { 71dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (access("/dev/"LOGGER_LOG_MAIN, W_OK) == 0) 72dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project g_log_status = kLogAvailable; 73dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project else 74dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project g_log_status = kLogNotAvailable; 75dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 76dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 77dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return (g_log_status == kLogAvailable); 78dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 79dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 80dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic int __write_to_log_null(log_id_t log_fd, struct iovec *vec, size_t nr) 81dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 82dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return -1; 83dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 84dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 85dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic int __write_to_log_kernel(log_id_t log_id, struct iovec *vec, size_t nr) 86dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 87dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ssize_t ret; 88dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int log_fd; 89dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 90dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (/*(int)log_id >= 0 &&*/ (int)log_id < (int)LOG_ID_MAX) { 91dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project log_fd = log_fds[(int)log_id]; 92dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 93dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return EBADF; 94dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 95dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 96dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project do { 97dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ret = log_writev(log_fd, vec, nr); 98dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } while (ret < 0 && errno == EINTR); 99dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 100dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return ret; 101dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 102dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 103dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic int __write_to_log_init(log_id_t log_id, struct iovec *vec, size_t nr) 104dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 105dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#ifdef HAVE_PTHREADS 106dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project pthread_mutex_lock(&log_init_lock); 107dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif 108dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 109dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (write_to_log == __write_to_log_init) { 110dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project log_fds[LOG_ID_MAIN] = log_open("/dev/"LOGGER_LOG_MAIN, O_WRONLY); 111dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project log_fds[LOG_ID_RADIO] = log_open("/dev/"LOGGER_LOG_RADIO, O_WRONLY); 112dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project log_fds[LOG_ID_EVENTS] = log_open("/dev/"LOGGER_LOG_EVENTS, O_WRONLY); 113dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 114dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project write_to_log = __write_to_log_kernel; 115dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 116dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (log_fds[LOG_ID_MAIN] < 0 || log_fds[LOG_ID_RADIO] < 0 || 117dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project log_fds[LOG_ID_EVENTS] < 0) { 118dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project log_close(log_fds[LOG_ID_MAIN]); 119dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project log_close(log_fds[LOG_ID_RADIO]); 120dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project log_close(log_fds[LOG_ID_EVENTS]); 121dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project log_fds[LOG_ID_MAIN] = -1; 122dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project log_fds[LOG_ID_RADIO] = -1; 123dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project log_fds[LOG_ID_EVENTS] = -1; 124dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project write_to_log = __write_to_log_null; 125dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 126dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 127dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 128dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#ifdef HAVE_PTHREADS 129dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project pthread_mutex_unlock(&log_init_lock); 130dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif 131dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 132dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return write_to_log(log_id, vec, nr); 133dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 134dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 135dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectint __android_log_write(int prio, const char *tag, const char *msg) 136dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 137dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project struct iovec vec[3]; 138dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project log_id_t log_id = LOG_ID_MAIN; 139dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 140dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (!tag) 141dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project tag = ""; 142dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 143dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project /* XXX: This needs to go! */ 144dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (!strcmp(tag, "HTC_RIL") || 145ed7ccae2968a75e09c22a3da90a9762170f96477John Michelau !strncmp(tag, "RIL", 3) || /* Any log tag with "RIL" as the prefix */ 146dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project !strcmp(tag, "AT") || 147dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project !strcmp(tag, "GSM") || 14889efdc9c7f4005032dad86dd6dd220c23a7ff4d7Wink Saville !strcmp(tag, "STK") || 14989efdc9c7f4005032dad86dd6dd220c23a7ff4d7Wink Saville !strcmp(tag, "CDMA") || 15089efdc9c7f4005032dad86dd6dd220c23a7ff4d7Wink Saville !strcmp(tag, "PHONE") || 15189efdc9c7f4005032dad86dd6dd220c23a7ff4d7Wink Saville !strcmp(tag, "SMS")) 152dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project log_id = LOG_ID_RADIO; 153dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 154dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project vec[0].iov_base = (unsigned char *) &prio; 155dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project vec[0].iov_len = 1; 156dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project vec[1].iov_base = (void *) tag; 157dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project vec[1].iov_len = strlen(tag) + 1; 158dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project vec[2].iov_base = (void *) msg; 159dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project vec[2].iov_len = strlen(msg) + 1; 160dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 161dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return write_to_log(log_id, vec, 3); 162dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 163dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 164dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectint __android_log_vprint(int prio, const char *tag, const char *fmt, va_list ap) 165dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 166dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char buf[LOG_BUF_SIZE]; 167dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 168dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project vsnprintf(buf, LOG_BUF_SIZE, fmt, ap); 169dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 170dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return __android_log_write(prio, tag, buf); 171dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 172dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 173dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectint __android_log_print(int prio, const char *tag, const char *fmt, ...) 174dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 175dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project va_list ap; 176dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char buf[LOG_BUF_SIZE]; 177dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 178dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project va_start(ap, fmt); 179dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project vsnprintf(buf, LOG_BUF_SIZE, fmt, ap); 180dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project va_end(ap); 181dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 182dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return __android_log_write(prio, tag, buf); 183dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 184dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 185dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectvoid __android_log_assert(const char *cond, const char *tag, 186dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const char *fmt, ...) 187dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 188dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project va_list ap; 189dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char buf[LOG_BUF_SIZE]; 190dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 191dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project va_start(ap, fmt); 192dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project vsnprintf(buf, LOG_BUF_SIZE, fmt, ap); 193dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project va_end(ap); 194dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 195dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project __android_log_write(ANDROID_LOG_FATAL, tag, buf); 196dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 197dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project __builtin_trap(); /* trap so we have a chance to debug the situation */ 198dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 199dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 200dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectint __android_log_bwrite(int32_t tag, const void *payload, size_t len) 201dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 202dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project struct iovec vec[2]; 203dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 204dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project vec[0].iov_base = &tag; 205dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project vec[0].iov_len = sizeof(tag); 206dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project vec[1].iov_base = (void*)payload; 207dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project vec[1].iov_len = len; 208dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 209dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return write_to_log(LOG_ID_EVENTS, vec, 2); 210dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 211dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 212dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project/* 213dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * Like __android_log_bwrite, but takes the type as well. Doesn't work 214dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * for the general case where we're generating lists of stuff, but very 215dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * handy if we just want to dump an integer into the log. 216dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project */ 217dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectint __android_log_btwrite(int32_t tag, char type, const void *payload, 218dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project size_t len) 219dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 220dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project struct iovec vec[3]; 221dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 222dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project vec[0].iov_base = &tag; 223dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project vec[0].iov_len = sizeof(tag); 224dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project vec[1].iov_base = &type; 225dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project vec[1].iov_len = sizeof(type); 226dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project vec[2].iov_base = (void*)payload; 227dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project vec[2].iov_len = len; 228dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 229dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return write_to_log(LOG_ID_EVENTS, vec, 3); 230dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 231