int main()

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);
                }
            }
        }
    }
}