blob: 8833f71b13ea52e0f83169b21309ec7de69c1c6a [file] [log] [blame]
// 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