| /* Copyright (C) 2007-2008 The Android Open Source Project |
| ** |
| ** This software is licensed under the terms of the GNU General Public |
| ** License version 2, as published by the Free Software Foundation, and |
| ** may be copied, distributed, and modified under those terms. |
| ** |
| ** This program is distributed in the hope that it will be useful, |
| ** but WITHOUT ANY WARRANTY; without even the implied warranty of |
| ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| ** GNU General Public License for more details. |
| */ |
| #include "android/utils/debug.h" |
| |
| #include <fcntl.h> // for open, O_WRONLY |
| #include <stdint.h> // for uint64_t |
| #include <stdio.h> // for fileno, fprintf, printf, stdout |
| |
| #ifdef _MSC_VER |
| #include "msvc-posix.h" |
| #else |
| #include <sys/time.h> |
| #include <time.h> // for localtime, tm, time_t |
| #include <unistd.h> // for dup2, close, dup |
| #endif |
| |
| |
| // TODO(jansene): Some external libraries (nibmle) still rely on these, so we cannot remove them yet. |
| #undef dprint |
| #undef dinfo |
| #undef derror |
| #undef dwarning |
| |
| uint64_t android_verbose = 0; |
| LogSeverity android_log_severity = EMULATOR_LOG_INFO; |
| |
| void dprint(const char* format, ...) { |
| va_list args; |
| va_start(args, format); |
| fdprintfnv(stdout, 0, format, args); |
| va_end(args); |
| } |
| |
| void fdprintf(FILE* fp, const char* format, ...) { |
| va_list args; |
| va_start(args, format); |
| fdprintfnv(fp, 0, format, args); |
| va_end(args); |
| } |
| |
| void fdprintfnv(FILE* fp, const char* lvl, const char* format, va_list args) { |
| if (VERBOSE_CHECK(time)) { |
| struct timeval tv; |
| gettimeofday(&tv, 0); |
| time_t now = tv.tv_sec; |
| struct tm* time = localtime(&now); |
| fprintf(fp, "%02d:%02d:%02d.%05ld ", time->tm_hour, time->tm_min, |
| time->tm_sec, tv.tv_usec); |
| } |
| fprintf(fp, "emulator: "); |
| if (lvl) { |
| fprintf(fp, "%s", lvl); |
| } |
| vfprintf(fp, format, args); |
| fprintf(fp, "\n"); |
| } |
| |
| void dprintn(const char* format, ...) { |
| va_list args; |
| va_start(args, format); |
| vfprintf(stdout, format, args); |
| va_end(args); |
| } |
| |
| void dprintnv(const char* format, va_list args) { |
| vfprintf(stdout, format, args); |
| } |
| void dinfo(const char* format, ...) { |
| va_list args; |
| va_start(args, format); |
| fdprintfnv(stdout, "INFO: ", format, args); |
| va_end(args); |
| } |
| |
| void dwarning(const char* format, ...) { |
| va_list args; |
| va_start(args, format); |
| fdprintfnv(stdout, "WARNING: ", format, args); |
| va_end(args); |
| } |
| |
| void derror(const char* format, ...) { |
| va_list args; |
| va_start(args, format); |
| fdprintfnv(stdout, "ERROR: ", format, args); |
| va_end(args); |
| } |
| |
| |
| /** STDOUT/STDERR REDIRECTION |
| ** |
| ** allows you to shut temporarily shutdown stdout/stderr |
| ** this is useful to get rid of debug messages from ALSA and esd |
| ** on Linux. |
| **/ |
| static int stdio_disable_count; |
| static int stdio_save_out_fd; |
| static int stdio_save_err_fd; |
| |
| #ifdef _WIN32 |
| extern void stdio_disable(void) { |
| if (++stdio_disable_count == 1) { |
| int null_fd, out_fd, err_fd; |
| fflush(stdout); |
| out_fd = _fileno(stdout); |
| err_fd = _fileno(stderr); |
| stdio_save_out_fd = _dup(out_fd); |
| stdio_save_err_fd = _dup(err_fd); |
| null_fd = _open("NUL", _O_WRONLY); |
| _dup2(null_fd, out_fd); |
| _dup2(null_fd, err_fd); |
| close(null_fd); |
| } |
| } |
| |
| extern void stdio_enable(void) { |
| if (--stdio_disable_count == 0) { |
| int out_fd, err_fd; |
| fflush(stdout); |
| out_fd = _fileno(stdout); |
| err_fd = _fileno(stderr); |
| _dup2(stdio_save_out_fd, out_fd); |
| _dup2(stdio_save_err_fd, err_fd); |
| _close(stdio_save_out_fd); |
| _close(stdio_save_err_fd); |
| } |
| } |
| #else |
| extern void stdio_disable(void) { |
| if (++stdio_disable_count == 1) { |
| int null_fd, out_fd, err_fd; |
| fflush(stdout); |
| out_fd = fileno(stdout); |
| err_fd = fileno(stderr); |
| stdio_save_out_fd = dup(out_fd); |
| stdio_save_err_fd = dup(err_fd); |
| null_fd = open("/dev/null", O_WRONLY); |
| dup2(null_fd, out_fd); |
| dup2(null_fd, err_fd); |
| close(null_fd); |
| } |
| } |
| |
| extern void stdio_enable(void) { |
| if (--stdio_disable_count == 0) { |
| int out_fd, err_fd; |
| fflush(stdout); |
| out_fd = fileno(stdout); |
| err_fd = fileno(stderr); |
| dup2(stdio_save_out_fd, out_fd); |
| dup2(stdio_save_err_fd, err_fd); |
| close(stdio_save_out_fd); |
| close(stdio_save_err_fd); |
| } |
| } |
| #endif |