• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
qemu_log_rotation_init(void)21 void qemu_log_rotation_init(void) {
22     // Nothing to do on Win32 for now.
23 }
24 
qemu_log_rotation_poll(void)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 
rotate_qemu_logs_handler(int signum)35 static void rotate_qemu_logs_handler(int signum) {
36   rotate_logs_requested = 1;
37 }
38 
qemu_log_rotation_init(void)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.
rotate_log(FILE * old_log_fd,const char * filename)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 
qemu_log_rotation_poll(void)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