logd_reader.c revision 358cf8a91961eeb1e553664df3bc6b40933ab868
1facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn/* 2facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn * Copyright (C) 2007-2016 The Android Open Source Project 3facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn * 4facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn * Licensed under the Apache License, Version 2.0 (the "License"); 5facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn * you may not use this file except in compliance with the License. 6facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn * You may obtain a copy of the License at 7facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn * 8facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn * http://www.apache.org/licenses/LICENSE-2.0 9facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn * 10facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn * Unless required by applicable law or agreed to in writing, software 11facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn * distributed under the License is distributed on an "AS IS" BASIS, 12facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn * See the License for the specific language governing permissions and 14facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn * limitations under the License. 15facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn */ 16facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn 17facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn#include <endian.h> 18facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn#include <errno.h> 19facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn#include <fcntl.h> 20facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn#include <inttypes.h> 21facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn#include <poll.h> 22facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn#include <stdarg.h> 23facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn#include <stdatomic.h> 24facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn#include <stdio.h> 25facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn#include <stdlib.h> 26facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn#include <string.h> 27facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn#include <sys/stat.h> 28facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn#include <sys/types.h> 29facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn#include <sys/socket.h> 30facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn#include <sys/un.h> 31facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn#include <time.h> 32facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn#include <unistd.h> 33facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn 34facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn#include <cutils/sockets.h> 35facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn#include <log/logd.h> 36facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn#include <log/logger.h> 37facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn#include <log/log_read.h> 38facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn#include <private/android_filesystem_config.h> 39facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn#include <private/android_logger.h> 40facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn 41facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn#include "config_read.h" 42facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn#include "log_portability.h" 43facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn#include "logger.h" 44facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn 45facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn/* branchless on many architectures. */ 46facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn#define min(x,y) ((y) ^ (((x) ^ (y)) & -((x) < (y)))) 47facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn 48facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzynstatic int logdAvailable(log_id_t LogId); 49facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzynstatic int logdVersion(struct android_log_logger *logger, 50facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn struct android_log_transport_context *transp); 51facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzynstatic int logdRead(struct android_log_logger_list *logger_list, 52facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn struct android_log_transport_context *transp, 53facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn struct log_msg *log_msg); 54facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzynstatic int logdPoll(struct android_log_logger_list *logger_list, 55facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn struct android_log_transport_context *transp); 56facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzynstatic void logdClose(struct android_log_logger_list *logger_list, 57facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn struct android_log_transport_context *transp); 58facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzynstatic int logdClear(struct android_log_logger *logger, 59facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn struct android_log_transport_context *transp); 60facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzynstatic ssize_t logdSetSize(struct android_log_logger *logger, 61facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn struct android_log_transport_context *transp, 62facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn size_t size); 63facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzynstatic ssize_t logdGetSize(struct android_log_logger *logger, 64facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn struct android_log_transport_context *transp); 65facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzynstatic ssize_t logdGetReadableSize(struct android_log_logger *logger, 66facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn struct android_log_transport_context *transp); 67facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzynstatic ssize_t logdGetPrune(struct android_log_logger_list *logger, 68facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn struct android_log_transport_context *transp, 69facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn char *buf, size_t len); 70facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzynstatic ssize_t logdSetPrune(struct android_log_logger_list *logger, 71facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn struct android_log_transport_context *transp, 72facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn char *buf, size_t len); 73facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzynstatic ssize_t logdGetStats(struct android_log_logger_list *logger, 74facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn struct android_log_transport_context *transp, 75facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn char *buf, size_t len); 76facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn 77facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark SalyzynLIBLOG_HIDDEN struct android_log_transport_read logdLoggerRead = { 78facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn .node = { &logdLoggerRead.node, &logdLoggerRead.node }, 79facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn .name = "logd", 80facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn .available = logdAvailable, 81facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn .version = logdVersion, 82facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn .read = logdRead, 83facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn .poll = logdPoll, 84facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn .close = logdClose, 85facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn .clear = logdClear, 86facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn .getSize = logdGetSize, 87facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn .setSize = logdSetSize, 88358cf8a91961eeb1e553664df3bc6b40933ab868Mark Salyzyn .getReadableSize = logdGetReadableSize, 89facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn .getPrune = logdGetPrune, 90facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn .setPrune = logdSetPrune, 91facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn .getStats = logdGetStats, 92facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn}; 93facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn 94facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzynstatic int logdAvailable(log_id_t logId) 95facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn{ 96facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn if (logId > LOG_ID_KERNEL) { 97facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn return -EINVAL; 98facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn } 99facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn if (logId == LOG_ID_SECURITY) { 100facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn uid_t uid = __android_log_uid(); 101facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn if (uid != AID_SYSTEM) { 102facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn return -EPERM; 103facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn } 104facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn } 105facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn if (access("/dev/socket/logdw", W_OK) == 0) { 106facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn return 0; 107facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn } 108facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn return -EBADF; 109facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn} 110facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn 111facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn/* Private copy of ../libcutils/socket_local_client.c prevent library loops */ 112facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn 113facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn#if defined(_WIN32) 114facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn 115facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark SalyzynLIBLOG_WEAK int socket_local_client(const char *name, int namespaceId, int type) 116facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn{ 117facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn errno = ENOSYS; 118facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn return -ENOSYS; 119facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn} 120facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn 121facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn#else /* !_WIN32 */ 122facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn 123facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn#include <sys/socket.h> 124facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn#include <sys/un.h> 125facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn#include <sys/select.h> 126facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn#include <sys/types.h> 127facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn 128facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn/* Private copy of ../libcutils/socket_local.h prevent library loops */ 129facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn#define FILESYSTEM_SOCKET_PREFIX "/tmp/" 130facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn#define ANDROID_RESERVED_SOCKET_PREFIX "/dev/socket/" 131facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn/* End of ../libcutils/socket_local.h */ 132facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn 133facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn#define LISTEN_BACKLOG 4 134facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn 135facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn/* Documented in header file. */ 136facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark SalyzynLIBLOG_WEAK int socket_make_sockaddr_un(const char *name, int namespaceId, 137facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn struct sockaddr_un *p_addr, 138facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn socklen_t *alen) 139facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn{ 140facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn memset (p_addr, 0, sizeof (*p_addr)); 141facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn size_t namelen; 142facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn 143facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn switch (namespaceId) { 144facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn case ANDROID_SOCKET_NAMESPACE_ABSTRACT: 145facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn#if defined(__linux__) 146facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn namelen = strlen(name); 147facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn 148facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn /* Test with length +1 for the *initial* '\0'. */ 149facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn if ((namelen + 1) > sizeof(p_addr->sun_path)) { 150facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn goto error; 151facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn } 152facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn 153facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn /* 154facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn * Note: The path in this case is *not* supposed to be 155facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn * '\0'-terminated. ("man 7 unix" for the gory details.) 156facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn */ 157facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn 158facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn p_addr->sun_path[0] = 0; 159facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn memcpy(p_addr->sun_path + 1, name, namelen); 160facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn#else 161facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn /* this OS doesn't have the Linux abstract namespace */ 162facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn 163facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn namelen = strlen(name) + strlen(FILESYSTEM_SOCKET_PREFIX); 164facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn /* unix_path_max appears to be missing on linux */ 165facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn if (namelen > sizeof(*p_addr) 166facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn - offsetof(struct sockaddr_un, sun_path) - 1) { 167facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn goto error; 168facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn } 169facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn 170facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn strcpy(p_addr->sun_path, FILESYSTEM_SOCKET_PREFIX); 171facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn strcat(p_addr->sun_path, name); 172facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn#endif 173facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn break; 174facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn 175facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn case ANDROID_SOCKET_NAMESPACE_RESERVED: 176facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn namelen = strlen(name) + strlen(ANDROID_RESERVED_SOCKET_PREFIX); 177facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn /* unix_path_max appears to be missing on linux */ 178facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn if (namelen > sizeof(*p_addr) 179facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn - offsetof(struct sockaddr_un, sun_path) - 1) { 180facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn goto error; 181facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn } 182facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn 183facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn strcpy(p_addr->sun_path, ANDROID_RESERVED_SOCKET_PREFIX); 184facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn strcat(p_addr->sun_path, name); 185facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn break; 186facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn 187facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn case ANDROID_SOCKET_NAMESPACE_FILESYSTEM: 188facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn namelen = strlen(name); 189facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn /* unix_path_max appears to be missing on linux */ 190facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn if (namelen > sizeof(*p_addr) 191facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn - offsetof(struct sockaddr_un, sun_path) - 1) { 192facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn goto error; 193facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn } 194facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn 195facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn strcpy(p_addr->sun_path, name); 196facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn break; 197facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn 198facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn default: 199facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn /* invalid namespace id */ 200facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn return -1; 201facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn } 202facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn 203facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn p_addr->sun_family = AF_LOCAL; 204facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn *alen = namelen + offsetof(struct sockaddr_un, sun_path) + 1; 205facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn return 0; 206facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzynerror: 207facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn return -1; 208facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn} 209facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn 210facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn/** 211facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn * connect to peer named "name" on fd 212facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn * returns same fd or -1 on error. 213facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn * fd is not closed on error. that's your job. 214facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn * 215facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn * Used by AndroidSocketImpl 216facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn */ 217facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark SalyzynLIBLOG_WEAK int socket_local_client_connect(int fd, const char *name, 218facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn int namespaceId, int type __unused) 219facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn{ 220facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn struct sockaddr_un addr; 221facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn socklen_t alen; 222facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn int err; 223facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn 224facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn err = socket_make_sockaddr_un(name, namespaceId, &addr, &alen); 225facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn 226facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn if (err < 0) { 227facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn goto error; 228facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn } 229facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn 230facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn if(connect(fd, (struct sockaddr *) &addr, alen) < 0) { 231facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn goto error; 232facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn } 233facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn 234facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn return fd; 235facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn 236facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzynerror: 237facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn return -1; 238facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn} 239facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn 240facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn/** 241facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn * connect to peer named "name" 242facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn * returns fd or -1 on error 243facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn */ 244facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark SalyzynLIBLOG_WEAK int socket_local_client(const char *name, int namespaceId, int type) 245facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn{ 246facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn int s; 247facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn 248facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn s = socket(AF_LOCAL, type, 0); 249facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn if(s < 0) return -1; 250facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn 251facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn if ( 0 > socket_local_client_connect(s, name, namespaceId, type)) { 252facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn close(s); 253facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn return -1; 254facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn } 255facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn 256facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn return s; 257facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn} 258facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn 259facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn#endif /* !_WIN32 */ 260facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn/* End of ../libcutils/socket_local_client.c */ 261facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn 262facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn/* worker for sending the command to the logger */ 263facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzynstatic ssize_t send_log_msg(struct android_log_logger *logger, 264facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn const char *msg, char *buf, size_t buf_size) 265facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn{ 266facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn ssize_t ret; 267facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn size_t len; 268facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn char *cp; 269facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn int errno_save = 0; 270facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn int sock = socket_local_client("logd", ANDROID_SOCKET_NAMESPACE_RESERVED, 271facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn SOCK_STREAM); 272facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn if (sock < 0) { 273facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn return sock; 274facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn } 275facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn 276facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn if (msg) { 277facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn snprintf(buf, buf_size, msg, logger ? logger->logId : (unsigned) -1); 278facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn } 279facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn 280facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn len = strlen(buf) + 1; 281facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn ret = TEMP_FAILURE_RETRY(write(sock, buf, len)); 282facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn if (ret <= 0) { 283facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn goto done; 284facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn } 285facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn 286facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn len = buf_size; 287facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn cp = buf; 288facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn while ((ret = TEMP_FAILURE_RETRY(read(sock, cp, len))) > 0) { 289facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn struct pollfd p; 290facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn 291facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn if (((size_t)ret == len) || (buf_size < PAGE_SIZE)) { 292facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn break; 293facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn } 294facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn 295facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn len -= ret; 296facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn cp += ret; 297facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn 298facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn memset(&p, 0, sizeof(p)); 299facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn p.fd = sock; 300facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn p.events = POLLIN; 301facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn 302facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn /* Give other side 20ms to refill pipe */ 303facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn ret = TEMP_FAILURE_RETRY(poll(&p, 1, 20)); 304facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn 305facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn if (ret <= 0) { 306facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn break; 307facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn } 308facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn 309facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn if (!(p.revents & POLLIN)) { 310facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn ret = 0; 311facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn break; 312facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn } 313facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn } 314facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn 315facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn if (ret >= 0) { 316facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn ret += buf_size - len; 317facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn } 318facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn 319facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyndone: 320facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn if ((ret == -1) && errno) { 321facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn errno_save = errno; 322facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn } 323facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn close(sock); 324facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn if (errno_save) { 325facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn errno = errno_save; 326facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn } 327facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn return ret; 328facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn} 329facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn 330facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzynstatic int check_log_success(char *buf, ssize_t ret) 331facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn{ 332facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn if (ret < 0) { 333facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn return ret; 334facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn } 335facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn 336facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn if (strncmp(buf, "success", 7)) { 337facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn errno = EINVAL; 338facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn return -1; 339facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn } 340facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn 341facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn return 0; 342facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn} 343facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn 344facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzynstatic int logdClear(struct android_log_logger *logger, 345facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn struct android_log_transport_context *transp __unused) 346facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn{ 347facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn char buf[512]; 348facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn 349facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn return check_log_success(buf, 350facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn send_log_msg(logger, "clear %d", buf, sizeof(buf))); 351facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn} 352facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn 353facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn/* returns the total size of the log's ring buffer */ 354facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzynstatic ssize_t logdGetSize(struct android_log_logger *logger, 355facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn struct android_log_transport_context *transp __unused) 356facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn{ 357facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn char buf[512]; 358facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn 359facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn ssize_t ret = send_log_msg(logger, "getLogSize %d", buf, sizeof(buf)); 360facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn if (ret < 0) { 361facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn return ret; 362facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn } 363facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn 364facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn if ((buf[0] < '0') || ('9' < buf[0])) { 365facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn return -1; 366facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn } 367facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn 368facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn return atol(buf); 369facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn} 370facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn 371facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzynstatic ssize_t logdSetSize( 372facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn struct android_log_logger *logger, 373facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn struct android_log_transport_context *transp __unused, 374facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn size_t size) 375facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn{ 376facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn char buf[512]; 377facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn 378facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn snprintf(buf, sizeof(buf), "setLogSize %d %zu", logger->logId, size); 379facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn 380facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn return check_log_success(buf, send_log_msg(NULL, NULL, buf, sizeof(buf))); 381facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn} 382facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn 383facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn/* 384facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn * returns the readable size of the log's ring buffer (that is, amount of the 385facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn * log consumed) 386facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn */ 387facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzynstatic ssize_t logdGetReadableSize( 388facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn struct android_log_logger *logger, 389facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn struct android_log_transport_context *transp __unused) 390facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn{ 391facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn char buf[512]; 392facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn 393facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn ssize_t ret = send_log_msg(logger, "getLogSizeUsed %d", buf, sizeof(buf)); 394facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn if (ret < 0) { 395facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn return ret; 396facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn } 397facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn 398facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn if ((buf[0] < '0') || ('9' < buf[0])) { 399facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn return -1; 400facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn } 401facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn 402facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn return atol(buf); 403facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn} 404facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn 405facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn/* 406facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn * returns the logger version 407facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn */ 408facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzynstatic int logdVersion( 409facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn struct android_log_logger *logger __unused, 410facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn struct android_log_transport_context *transp __unused) 411facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn{ 412facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn uid_t uid = __android_log_uid(); 413facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn return ((uid != AID_ROOT) && (uid != AID_LOG) && (uid != AID_SYSTEM)) ? 3 : 4; 414facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn} 415facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn 416facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn/* 417facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn * returns statistics 418facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn */ 419facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzynstatic ssize_t logdGetStats(struct android_log_logger_list *logger_list, 420facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn struct android_log_transport_context *transp __unused, 421facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn char *buf, size_t len) 422facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn{ 423facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn struct android_log_logger *logger; 424facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn char *cp = buf; 425facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn size_t remaining = len; 426facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn size_t n; 427facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn 428facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn n = snprintf(cp, remaining, "getStatistics"); 429facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn n = min(n, remaining); 430facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn remaining -= n; 431facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn cp += n; 432facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn 433facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn logger_for_each(logger, logger_list) { 434facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn n = snprintf(cp, remaining, " %d", logger->logId); 435facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn n = min(n, remaining); 436facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn remaining -= n; 437facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn cp += n; 438facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn } 439facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn 440facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn if (logger_list->pid) { 441facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn snprintf(cp, remaining, " pid=%u", logger_list->pid); 442facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn } 443facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn 444facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn return send_log_msg(NULL, NULL, buf, len); 445facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn} 446facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn 447facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzynstatic ssize_t logdGetPrune( 448facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn struct android_log_logger_list *logger_list __unused, 449facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn struct android_log_transport_context *transp __unused, 450facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn char *buf, size_t len) 451facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn{ 452facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn return send_log_msg(NULL, "getPruneList", buf, len); 453facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn} 454facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn 455facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzynstatic ssize_t logdSetPrune( 456facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn struct android_log_logger_list *logger_list __unused, 457facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn struct android_log_transport_context *transp __unused, 458facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn char *buf, size_t len) 459facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn{ 460facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn const char cmd[] = "setPruneList "; 461facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn const size_t cmdlen = sizeof(cmd) - 1; 462facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn 463facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn if (strlen(buf) > (len - cmdlen)) { 464facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn return -ENOMEM; /* KISS */ 465facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn } 466facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn memmove(buf + cmdlen, buf, len - cmdlen); 467facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn buf[len - 1] = '\0'; 468facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn memcpy(buf, cmd, cmdlen); 469facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn 470facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn return check_log_success(buf, send_log_msg(NULL, NULL, buf, len)); 471facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn} 472facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn 473facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn 474facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzynstatic void caught_signal(int signum __unused) 475facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn{ 476facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn} 477facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn 478facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzynstatic int logdOpen(struct android_log_logger_list *logger_list, 479facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn struct android_log_transport_context *transp) 480facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn{ 481facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn struct android_log_logger *logger; 482facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn struct sigaction ignore; 483facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn struct sigaction old_sigaction; 484facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn unsigned int old_alarm = 0; 485facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn char buffer[256], *cp, c; 486facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn int e, ret, remaining; 487facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn 488facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn int sock = transp->context.sock; 489facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn if (sock > 0) { 490facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn return sock; 491facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn } 492facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn 493facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn if (!logger_list) { 494facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn return -EINVAL; 495facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn } 496facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn 497facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn sock = socket_local_client("logdr", 498facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn ANDROID_SOCKET_NAMESPACE_RESERVED, 499facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn SOCK_SEQPACKET); 500facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn if (sock == 0) { 501facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn /* Guarantee not file descriptor zero */ 502facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn int newsock = socket_local_client("logdr", 503facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn ANDROID_SOCKET_NAMESPACE_RESERVED, 504facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn SOCK_SEQPACKET); 505facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn close(sock); 506facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn sock = newsock; 507facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn } 508facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn if (sock <= 0) { 509facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn if ((sock == -1) && errno) { 510facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn return -errno; 511facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn } 512facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn return sock; 513facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn } 514facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn 515facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn strcpy(buffer, (logger_list->mode & ANDROID_LOG_NONBLOCK) ? 516facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn "dumpAndClose" : "stream"); 517facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn cp = buffer + strlen(buffer); 518facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn 519facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn strcpy(cp, " lids"); 520facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn cp += 5; 521facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn c = '='; 522facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn remaining = sizeof(buffer) - (cp - buffer); 523facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn logger_for_each(logger, logger_list) { 524facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn ret = snprintf(cp, remaining, "%c%u", c, logger->logId); 525facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn ret = min(ret, remaining); 526facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn remaining -= ret; 527facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn cp += ret; 528facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn c = ','; 529facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn } 530facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn 531facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn if (logger_list->tail) { 532facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn ret = snprintf(cp, remaining, " tail=%u", logger_list->tail); 533facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn ret = min(ret, remaining); 534facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn remaining -= ret; 535facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn cp += ret; 536facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn } 537facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn 538facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn if (logger_list->start.tv_sec || logger_list->start.tv_nsec) { 539facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn if (logger_list->mode & ANDROID_LOG_WRAP) { 540facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn // ToDo: alternate API to allow timeout to be adjusted. 541facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn ret = snprintf(cp, remaining, " timeout=%u", 542facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn ANDROID_LOG_WRAP_DEFAULT_TIMEOUT); 543facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn ret = min(ret, remaining); 544facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn remaining -= ret; 545facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn cp += ret; 546facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn } 547facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn ret = snprintf(cp, remaining, " start=%" PRIu32 ".%09" PRIu32, 548facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn logger_list->start.tv_sec, 549facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn logger_list->start.tv_nsec); 550facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn ret = min(ret, remaining); 551facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn remaining -= ret; 552facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn cp += ret; 553facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn } 554facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn 555facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn if (logger_list->pid) { 556facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn ret = snprintf(cp, remaining, " pid=%u", logger_list->pid); 557facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn ret = min(ret, remaining); 558facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn cp += ret; 559facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn } 560facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn 561facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn if (logger_list->mode & ANDROID_LOG_NONBLOCK) { 562facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn /* Deal with an unresponsive logd */ 563facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn memset(&ignore, 0, sizeof(ignore)); 564facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn ignore.sa_handler = caught_signal; 565facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn sigemptyset(&ignore.sa_mask); 566facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn /* particularily useful if tombstone is reporting for logd */ 567facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn sigaction(SIGALRM, &ignore, &old_sigaction); 568facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn old_alarm = alarm(30); 569facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn } 570facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn ret = write(sock, buffer, cp - buffer); 571facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn e = errno; 572facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn if (logger_list->mode & ANDROID_LOG_NONBLOCK) { 573facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn if (e == EINTR) { 574facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn e = ETIMEDOUT; 575facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn } 576facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn alarm(old_alarm); 577facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn sigaction(SIGALRM, &old_sigaction, NULL); 578facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn } 579facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn 580facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn if (ret <= 0) { 581facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn close(sock); 582facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn if ((ret == -1) && e) { 583facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn return -e; 584facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn } 585facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn if (ret == 0) { 586facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn return -EIO; 587facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn } 588facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn return ret; 589facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn } 590facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn 591facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn return transp->context.sock = sock; 592facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn} 593facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn 594facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn/* Read from the selected logs */ 595facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzynstatic int logdRead(struct android_log_logger_list *logger_list, 596facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn struct android_log_transport_context *transp, 597facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn struct log_msg *log_msg) 598facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn{ 599facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn int ret, e; 600facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn struct sigaction ignore; 601facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn struct sigaction old_sigaction; 602facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn unsigned int old_alarm = 0; 603facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn 604facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn ret = logdOpen(logger_list, transp); 605facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn if (ret < 0) { 606facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn return ret; 607facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn } 608facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn 609facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn memset(log_msg, 0, sizeof(*log_msg)); 610facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn 611facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn if (logger_list->mode & ANDROID_LOG_NONBLOCK) { 612facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn memset(&ignore, 0, sizeof(ignore)); 613facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn ignore.sa_handler = caught_signal; 614facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn sigemptyset(&ignore.sa_mask); 615facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn /* particularily useful if tombstone is reporting for logd */ 616facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn sigaction(SIGALRM, &ignore, &old_sigaction); 617facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn old_alarm = alarm(30); 618facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn } 619facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn 620facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn /* NOTE: SOCK_SEQPACKET guarantees we read exactly one full entry */ 621facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn ret = recv(ret, log_msg, LOGGER_ENTRY_MAX_LEN, 0); 622facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn e = errno; 623facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn 624facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn if (logger_list->mode & ANDROID_LOG_NONBLOCK) { 625facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn if ((ret == 0) || (e == EINTR)) { 626facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn e = EAGAIN; 627facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn ret = -1; 628facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn } 629facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn alarm(old_alarm); 630facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn sigaction(SIGALRM, &old_sigaction, NULL); 631facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn } 632facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn 633facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn if ((ret == -1) && e) { 634facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn return -e; 635facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn } 636facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn return ret; 637facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn} 638facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn 639facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzynstatic int logdPoll(struct android_log_logger_list *logger_list, 640facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn struct android_log_transport_context *transp) 641facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn{ 642facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn struct pollfd p; 643facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn 644facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn int ret = logdOpen(logger_list, transp); 645facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn if (ret < 0) { 646facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn return ret; 647facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn } 648facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn 649facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn memset(&p, 0, sizeof(p)); 650facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn p.fd = ret; 651facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn p.events = POLLIN; 652facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn ret = poll(&p, 1, 20); 653facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn if ((ret > 0) && !(p.revents & POLLIN)) { 654facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn ret = 0; 655facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn } 656facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn if ((ret == -1) && errno) { 657facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn return -errno; 658facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn } 659facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn return ret; 660facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn} 661facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn 662facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn/* Close all the logs */ 663facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzynstatic void logdClose(struct android_log_logger_list *logger_list __unused, 664facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn struct android_log_transport_context *transp) 665facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn{ 666facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn if (transp->context.sock > 0) { 667facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn close (transp->context.sock); 668facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn transp->context.sock = -1; 669facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn } 670facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn} 671