1 // Copyright 2007-2008 The Android Open Source Project
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 // http://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14 #include "android/utils/debug.h"
15 
16 #include <fcntl.h>
17 #include <pthread.h>
18 #include <stdint.h>
19 #include <stdio.h>
20 #include <sys/syscall.h>
21 #include <sys/types.h>
22 #include <unistd.h>
23 
24 uint64_t android_verbose = 0;
25 
26 void
dprint(const char * format,...)27 dprint( const char*  format,  ... )
28 {
29     va_list  args;
30     va_start( args, format );
31     fprintf( stdout, "emulator: ");
32     vfprintf( stdout, format, args );
33     fprintf( stdout, "\n" );
34     va_end( args );
35 }
36 
37 
38 void
dprintn(const char * format,...)39 dprintn( const char*  format, ... )
40 {
41     va_list  args;
42     va_start( args, format );
43     vfprintf( stdout, format, args );
44     va_end( args );
45 }
46 
47 void
dprintnv(const char * format,va_list args)48 dprintnv( const char*  format, va_list args )
49 {
50     vfprintf( stdout, format, args );
51 }
52 
53 
54 void
dwarning(const char * format,...)55 dwarning( const char*  format, ... )
56 {
57     va_list  args;
58     va_start( args, format );
59     dprintn( "emulator: WARNING: " );
60     dprintnv( format, args );
61     dprintn( "\n" );
62     va_end( args );
63 }
64 
65 
66 void
derror(const char * format,...)67 derror( const char*  format, ... )
68 {
69     va_list  args;
70     va_start( args, format );
71     dprintn( "emulator: ERROR: " );
72     dprintnv( format, args );
73     dprintn( "\n" );
74     va_end( args );
75 }
76 
77 void
android_tid_function_print(bool use_emulator_prefix,const char * function,const char * format,...)78 android_tid_function_print(
79         bool use_emulator_prefix,
80         const char* function,
81         const char* format, ... )
82 {
83     int tid = syscall(SYS_gettid);
84     va_list args;
85     va_start(args, format);
86     const char* prefix = use_emulator_prefix ? "emulator: " : "";
87     if (function) {
88         printf("%stid=0x%x: %s: ", prefix, tid,
89                function);
90     } else {
91         printf("%stid=0x%x: ", prefix, tid);
92     }
93 
94     vprintf(format, args);
95     printf("\n");
96     va_end(args);
97 }
98 
99 /** STDOUT/STDERR REDIRECTION
100  **
101  ** allows you to shut temporarily shutdown stdout/stderr
102  ** this is useful to get rid of debug messages from ALSA and esd
103  ** on Linux.
104  **/
105 static int    stdio_disable_count;
106 static int    stdio_save_out_fd;
107 static int    stdio_save_err_fd;
108 
109 #ifdef _WIN32
110 extern void
stdio_disable(void)111 stdio_disable( void )
112 {
113     if (++stdio_disable_count == 1) {
114         int  null_fd, out_fd, err_fd;
115         fflush(stdout);
116         out_fd = _fileno(stdout);
117         err_fd = _fileno(stderr);
118         stdio_save_out_fd = _dup(out_fd);
119         stdio_save_err_fd = _dup(err_fd);
120         null_fd = _open( "NUL", _O_WRONLY );
121         _dup2(null_fd, out_fd);
122         _dup2(null_fd, err_fd);
123         close(null_fd);
124     }
125 }
126 
127 extern void
stdio_enable(void)128 stdio_enable( void )
129 {
130     if (--stdio_disable_count == 0) {
131         int  out_fd, err_fd;
132         fflush(stdout);
133         out_fd = _fileno(stdout);
134         err_fd = _fileno(stderr);
135         _dup2(stdio_save_out_fd, out_fd);
136         _dup2(stdio_save_err_fd, err_fd);
137         _close(stdio_save_out_fd);
138         _close(stdio_save_err_fd);
139     }
140 }
141 #else
142 extern void
stdio_disable(void)143 stdio_disable( void )
144 {
145     if (++stdio_disable_count == 1) {
146         int  null_fd, out_fd, err_fd;
147         fflush(stdout);
148         out_fd = fileno(stdout);
149         err_fd = fileno(stderr);
150         stdio_save_out_fd = dup(out_fd);
151         stdio_save_err_fd = dup(err_fd);
152         null_fd = open( "/dev/null", O_WRONLY );
153         dup2(null_fd, out_fd);
154         dup2(null_fd, err_fd);
155         close(null_fd);
156     }
157 }
158 
159 extern void
stdio_enable(void)160 stdio_enable( void )
161 {
162     if (--stdio_disable_count == 0) {
163         int  out_fd, err_fd;
164         fflush(stdout);
165         out_fd = fileno(stdout);
166         err_fd = fileno(stderr);
167         dup2(stdio_save_out_fd, out_fd);
168         dup2(stdio_save_err_fd, err_fd);
169         close(stdio_save_out_fd);
170         close(stdio_save_err_fd);
171     }
172 }
173 #endif
174