| // Copyright 2020 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 "src/sys/tools/log/log.h" |
| |
| #include <lib/syslog/wire_format.h> |
| #include <zircon/errors.h> |
| |
| #include <iostream> |
| |
| namespace log { |
| |
| zx_status_t ParseAndWriteLog(fuchsia::logger::LogSinkHandle log_sink, zx::time time, int argc, |
| char** argv) { |
| if (argc != 3) { |
| std::cerr << "Usage: log [tag] [message]" << std::endl; |
| return ZX_ERR_INVALID_ARGS; |
| } |
| std::string tag = argv[1]; |
| std::string message = argv[2]; |
| |
| if (tag.length() > fuchsia::logger::MAX_TAG_LEN_BYTES) { |
| std::cerr << "Tag too long." << std::endl; |
| return ZX_ERR_OUT_OF_RANGE; |
| } |
| |
| if (tag.length() + 1 + 1 + message.length() + 1 > sizeof(fx_log_packet::data)) { |
| std::cerr << "Message too long." << std::endl; |
| return ZX_ERR_OUT_OF_RANGE; |
| } |
| |
| zx::socket client; |
| zx::socket server; |
| zx_status_t status = zx::socket::create(ZX_SOCKET_DATAGRAM, &client, &server); |
| if (status != ZX_OK) { |
| std::cerr << "Failed to create socket." << std::endl; |
| return status; |
| } |
| |
| status = log_sink.BindSync()->Connect(std::move(server)); |
| if (status != ZX_OK) { |
| std::cerr << "Failed to connect socket." << std::endl; |
| return status; |
| } |
| |
| fx_log_packet packet{ |
| .metadata{.time = time.get(), .severity = fuchsia::logger::LOG_LEVEL_DEFAULT}}; |
| packet.data[0] = tag.length(); |
| tag.copy(&packet.data[1], tag.length()); |
| message.copy(&packet.data[tag.length() + 2], message.length()); |
| size_t actual = 0; |
| status = client.write(0, &packet, sizeof(packet), &actual); |
| if (status != ZX_OK || actual != sizeof(packet)) { |
| std::cerr << "Failed to write data to socket." << std::endl; |
| return status == ZX_OK ? ZX_ERR_INTERNAL : status; |
| } |
| |
| return ZX_OK; |
| } |
| |
| } // namespace log |