1 // Copyright (C) 2011 The Android Open Source Project 2 // 3 // This software is licensed under the terms of the GNU General Public 4 // License version 2, as published by the Free Software Foundation, and 5 // may be copied, distributed, and modified under those terms. 6 // 7 // This program is distributed in the hope that it will be useful, 8 // but WITHOUT ANY WARRANTY; without even the implied warranty of 9 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 10 // GNU General Public License for more details. 11 12 #include "android/log-rotate.h" 13 #include "net/net.h" 14 #include "slirp-android/libslirp.h" 15 #include "sysemu/sysemu.h" 16 17 #include <stdio.h> 18 19 #ifdef _WIN32 20 21 void qemu_log_rotation_init(void) { 22 // Nothing to do on Win32 for now. 23 } 24 25 void qemu_log_rotation_poll(void) { 26 // Nothing to do on Win32 for now. 27 } 28 29 #else // !_WIN32 30 31 #include <sys/signal.h> 32 33 static int rotate_logs_requested = 0; 34 35 static void rotate_qemu_logs_handler(int signum) { 36 rotate_logs_requested = 1; 37 } 38 39 void qemu_log_rotation_init(void) { 40 // Install SIGUSR1 signal handler. 41 struct sigaction act; 42 sigfillset(&act.sa_mask); 43 act.sa_flags = 0; 44 act.sa_handler = rotate_qemu_logs_handler; 45 if (sigaction(SIGUSR1, &act, NULL) == -1) { 46 fprintf(stderr, "Failed to setup SIGUSR1 handler to clear Qemu logs\n"); 47 exit(-1); 48 } 49 } 50 51 52 // Clears the passed qemu log when the rotate_logs_requested 53 // is set. We need to clear the logs between the tasks that do not 54 // require restarting Qemu. 55 static FILE* rotate_log(FILE* old_log_fd, const char* filename) { 56 FILE* new_log_fd = NULL; 57 if (old_log_fd) { 58 if (fclose(old_log_fd) == -1) { 59 fprintf(stderr, "Cannot close old_log fd\n"); 60 exit(errno); 61 } 62 } 63 64 if (!filename) { 65 fprintf(stderr, "The log filename to be rotated is not provided"); 66 exit(-1); 67 } 68 69 new_log_fd = fopen(filename , "wb+"); 70 if (new_log_fd == NULL) { 71 fprintf(stderr, "Cannot open the log file: %s for write.\n", 72 filename); 73 exit(1); 74 } 75 76 return new_log_fd; 77 } 78 79 80 void qemu_log_rotation_poll(void) { 81 if (!rotate_logs_requested) 82 return; 83 84 FILE* new_dns_log_fd = rotate_log(get_slirp_dns_log_fd(), 85 dns_log_filename); 86 FILE* new_drop_log_fd = rotate_log(get_slirp_drop_log_fd(), 87 drop_log_filename); 88 slirp_dns_log_fd(new_dns_log_fd); 89 slirp_drop_log_fd(new_drop_log_fd); 90 rotate_logs_requested = 0; 91 } 92 93 #endif // !_WIN32 94