| /* |
| * Copyright (C) 2007 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| |
| #include <stdlib.h> |
| #include <stdio.h> |
| #include <unistd.h> |
| #include <string.h> |
| #include <fcntl.h> |
| #include <errno.h> |
| #include <sys/socket.h> |
| #include <cutils/logger.h> |
| #include "sysdeps.h" |
| #include "adb.h" |
| |
| #define LOG_FILE_DIR "/dev/log/" |
| |
| void write_log_entry(int fd, struct logger_entry *buf); |
| |
| void log_service(int fd, void *cookie) |
| { |
| /* get the name of the log filepath to read */ |
| char * log_filepath = cookie; |
| |
| /* open the log file. */ |
| int logfd = unix_open(log_filepath, O_RDONLY); |
| if (logfd < 0) { |
| goto done; |
| } |
| |
| // temp buffer to read the entries |
| unsigned char buf[LOGGER_ENTRY_MAX_LEN + 1] __attribute__((aligned(4))); |
| struct logger_entry *entry = (struct logger_entry *) buf; |
| |
| while (1) { |
| int ret; |
| |
| ret = unix_read(logfd, entry, LOGGER_ENTRY_MAX_LEN); |
| if (ret < 0) { |
| if (errno == EINTR || errno == EAGAIN) |
| continue; |
| // perror("logcat read"); |
| goto done; |
| } |
| else if (!ret) { |
| // fprintf(stderr, "read: Unexpected EOF!\n"); |
| goto done; |
| } |
| |
| /* NOTE: driver guarantees we read exactly one full entry */ |
| |
| entry->msg[entry->len] = '\0'; |
| |
| write_log_entry(fd, entry); |
| } |
| |
| done: |
| unix_close(fd); |
| free(log_filepath); |
| } |
| |
| /* returns the full path to the log file in a newly allocated string */ |
| char * get_log_file_path(const char * log_name) { |
| char *log_device = malloc(strlen(LOG_FILE_DIR) + strlen(log_name) + 1); |
| |
| strcpy(log_device, LOG_FILE_DIR); |
| strcat(log_device, log_name); |
| |
| return log_device; |
| } |
| |
| |
| /* prints one log entry into the file descriptor fd */ |
| void write_log_entry(int fd, struct logger_entry *buf) |
| { |
| size_t size = sizeof(struct logger_entry) + buf->len; |
| |
| writex(fd, buf, size); |
| } |