in file2sock.cpp [47:168]
int main(int argc, char**argv) {
std::string data_file;
std::string data_file_type = "text";
std::string socket_path;
int opt;
while ((opt = getopt(argc, argv, "i:s:t:")) != -1) {
switch (opt) {
case 'i':
data_file = optarg;
break;
case 's':
socket_path = optarg;
break;
case 't':
data_file_type = optarg;
break;
default:
usage();
}
}
if (data_file.empty() || socket_path.empty()) {
usage();
}
int fd = -1;
if (data_file == "-") {
fd = 1;
} else {
fd = open(data_file.c_str(), O_RDONLY);
if (fd < 0) {
Logger::Error("open(%s) failed: %s", data_file.c_str(), std::strerror(errno));
exit(1);
}
}
IOBase input(fd);
UnixDomainWriter output(socket_path);
Logger::Info("Connecting to '%s'", socket_path.c_str());
if (!output.Open()) {
Logger::Warn("Failed to connect to '%s': %s", socket_path.c_str(), std::strerror(errno));
exit(1);
}
if (data_file_type == "text") {
char data[1024];
for (;;) {
auto ret = input.Read(data, sizeof(data), nullptr);
if (ret < 0) {
input.Close();
output.Close();
Logger::Error("Read failed");
exit(1);
} else if (ret == 0) {
input.Close();
output.Close();
exit(0);
}
ret = output.IWriter::WriteAll(data, ret);
if (ret != IO::OK) {
input.Close();
output.Close();
if (ret == IO::CLOSED) {
Logger::Error("output closed");
} else {
Logger::Error("Write failed");
}
exit(1);
}
}
} else if (data_file_type == "raw" || data_file_type == "raw_ack") {
RawEventReader reader;
RawEventWriter writer;
for(;;) {
char data[10*1024];
auto ret = reader.ReadEvent(data, sizeof(data), &input, nullptr);
if (ret < 0) {
input.Close();
output.Close();
Logger::Error("Read failed");
exit(1);
} else if (ret == 0) {
input.Close();
output.Close();
exit(0);
}
Event event(data, ret);
ret = writer.WriteEvent(event, &output);
if (ret < 0) {
input.Close();
output.Close();
if (ret == IO::CLOSED) {
Logger::Error("output closed");
} else {
Logger::Error("Write failed");
}
exit(1);
} else if (ret == 0) {
input.Close();
output.Close();
exit(0);
}
if (data_file_type == "raw_ack") {
EventId event_id;
ret = writer.ReadAck(event_id, &output);
if (ret < 0) {
input.Close();
output.Close();
Logger::Error("Read ack failed");
exit(1);
} else if (ret == 0) {
input.Close();
output.Close();
Logger::Error("output closed");
exit(0);
}
}
}
}
}