| // Copyright 2019 The Fuchsia Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include <assert.h> |
| #include <lib/syslog/structured_backend/cpp/fuchsia_syslog.h> |
| #include <log/log.h> |
| #include <stdio.h> |
| #include <stdlib.h> |
| |
| #include <cstdarg> |
| |
| void goldfish_fuchsia_log_vararg(int8_t severity, const char* tag, const char* file, int line, |
| const char* format, ...) { |
| va_list args; |
| va_start(args, format); |
| goldfish_fuchsia_log(severity, tag, file, line, format, args); |
| va_end(args); |
| } |
| |
| void __assert_fail(const char* expr, const char* file, int line, const char* func) { |
| goldfish_fuchsia_log_vararg(FUCHSIA_LOG_ERROR, "goldfish", file, line, |
| "Assertion failed: %s (%s: %s: %d)", expr, file, func, line); |
| abort(); |
| } |
| |
| int puts(const char* s) { return fputs(s, stdout); } |
| |
| int printf(const char* format, ...) { |
| va_list args; |
| va_start(args, format); |
| vfprintf(stdout, format, args); |
| va_end(args); |
| return 0; |
| } |
| |
| int vprintf(const char* format, va_list ap) { return vfprintf(stdout, format, ap); } |
| |
| int fprintf(FILE* stream, const char* format, ...) { |
| assert(stream == stdout || stream == stderr); |
| if (stream == stdout || stream == stderr) { |
| va_list args; |
| va_start(args, format); |
| vfprintf(stream, format, args); |
| va_end(args); |
| } |
| return 0; |
| } |
| |
| static inline FuchsiaLogSeverity severity(FILE* stream) { |
| return stream == stdout ? FUCHSIA_LOG_INFO : FUCHSIA_LOG_ERROR; |
| } |
| |
| int fputs(const char* s, FILE* stream) { |
| assert(stream == stdout || stream == stderr); |
| if (stream == stdout || stream == stderr) { |
| // File is set to nullptr as that information isn't available here. |
| goldfish_fuchsia_log_vararg(severity(stream), "goldfish", nullptr, 0, s); |
| } |
| return 0; |
| } |
| |
| int vfprintf(FILE* stream, const char* format, va_list ap) { |
| assert(stream == stdout || stream == stderr); |
| if (stream == stdout || stream == stderr) { |
| goldfish_fuchsia_log(severity(stream), "goldfish", __FILE__, __LINE__, format, ap); |
| } |
| return 0; |
| } |
| |
| size_t fwrite(const void* ptr, size_t size, size_t nitems, FILE* stream) { |
| assert(stream == stdout || stream == stderr); |
| char buffer[512]; |
| size_t offset = 0; |
| size_t count = 0; |
| for (; count < nitems; count++) { |
| snprintf(buffer + offset, sizeof(buffer) - offset, |
| reinterpret_cast<const char*>(ptr) + offset, size); |
| offset += size; |
| if (offset > sizeof(buffer)) break; |
| } |
| buffer[sizeof(buffer) - 1] = 0; |
| fputs(buffer, stream); |
| return count; |
| } |