From b4d6df902253637f24647d3db2bc3781d69eec1c Mon Sep 17 00:00:00 2001 From: Joel Klinghed Date: Thu, 20 Feb 2025 22:54:56 +0100 Subject: Initial commit --- meson.build | 62 ++++++++++ src/args.cc | 293 ++++++++++++++++++++++++++++++++++++++++++++++ src/args.hh | 56 +++++++++ src/buffer.cc | 233 ++++++++++++++++++++++++++++++++++++ src/buffer.hh | 25 ++++ src/logger.hh | 51 ++++++++ src/logger_base.cc | 68 +++++++++++ src/logger_base.hh | 25 ++++ src/logger_file.cc | 52 ++++++++ src/logger_file.hh | 16 +++ src/logger_null.cc | 18 +++ src/logger_stdio.cc | 39 ++++++ src/logger_syslog.cc | 49 ++++++++ src/logger_syslog.hh | 14 +++ src/looper.hh | 38 ++++++ src/looper_poll.cc | 224 +++++++++++++++++++++++++++++++++++ src/main.cc | 153 ++++++++++++++++++++++++ src/net.cc | 136 +++++++++++++++++++++ src/net.hh | 22 ++++ src/ro_buffer.cc | 27 +++++ src/ro_buffer.hh | 23 ++++ src/server.cc | 275 +++++++++++++++++++++++++++++++++++++++++++ src/server.hh | 26 ++++ src/unique_fd.cc | 9 ++ src/unique_fd.hh | 48 ++++++++ subprojects/protobuf.wrap | 16 +++ 26 files changed, 1998 insertions(+) create mode 100644 meson.build create mode 100644 src/args.cc create mode 100644 src/args.hh create mode 100644 src/buffer.cc create mode 100644 src/buffer.hh create mode 100644 src/logger.hh create mode 100644 src/logger_base.cc create mode 100644 src/logger_base.hh create mode 100644 src/logger_file.cc create mode 100644 src/logger_file.hh create mode 100644 src/logger_null.cc create mode 100644 src/logger_stdio.cc create mode 100644 src/logger_syslog.cc create mode 100644 src/logger_syslog.hh create mode 100644 src/looper.hh create mode 100644 src/looper_poll.cc create mode 100644 src/main.cc create mode 100644 src/net.cc create mode 100644 src/net.hh create mode 100644 src/ro_buffer.cc create mode 100644 src/ro_buffer.hh create mode 100644 src/server.cc create mode 100644 src/server.hh create mode 100644 src/unique_fd.cc create mode 100644 src/unique_fd.hh create mode 100644 subprojects/protobuf.wrap diff --git a/meson.build b/meson.build new file mode 100644 index 0000000..847c660 --- /dev/null +++ b/meson.build @@ -0,0 +1,62 @@ +project( + 'buildhelper', + 'cpp', + version : '0.1', + default_options : [ + 'warning_level=3', + 'cpp_std=c++17', + ], +) + +protobuf_dep = dependency( + 'protobuf-lite', + fallback: ['protobuf', 'protobuf_lite_dep'], +) + +protoc = find_program('protoc', native: true) + +protoc_gen = generator( + protoc, + output: ['@BASENAME@.pb.cc', '@BASENAME@.pb.h'], + depfile: '@BASENAME@.deps', + arguments: ['-I@SOURCE_ROOT@/apis/remote-apis', '-I@SOURCE_ROOT@/apis/googleapis', '--cpp_out=@BUILD_DIR@', '--dependency_out=@DEPFILE@', '@INPUT@'], +) + +google_apis = protoc_gen.process( + [ + 'apis/googleapis/google/api/annotations.proto', + 'apis/googleapis/google/api/client.proto', + 'apis/googleapis/google/api/http.proto', + 'apis/googleapis/google/api/launch_stage.proto', + 'apis/googleapis/google/longrunning/operations.proto', + 'apis/googleapis/google/rpc/status.proto', + ], + preserve_path_from: meson.project_source_root() + '/apis/googleapis', +) + +remote_apis = protoc_gen.process( + [ + 'apis/remote-apis/build/bazel/semver/semver.proto', + 'apis/remote-apis/build/bazel/remote/execution/v2/remote_execution.proto', + ], + preserve_path_from: meson.project_source_root() + '/apis/remote-apis', +) + +libapis = static_library('apis', [google_apis, remote_apis]) + +executable('buildhelper', + 'src/args.cc', + 'src/buffer.cc', + 'src/logger_base.cc', + 'src/logger_file.cc', + 'src/logger_null.cc', + 'src/logger_stdio.cc', + 'src/logger_syslog.cc', + 'src/looper_poll.cc', + 'src/main.cc', + 'src/net.cc', + 'src/ro_buffer.cc', + 'src/server.cc', + 'src/unique_fd.cc', + link_with: libapis, + install : true) diff --git a/src/args.cc b/src/args.cc new file mode 100644 index 0000000..a89c418 --- /dev/null +++ b/src/args.cc @@ -0,0 +1,293 @@ +#include "args.hh" + +#include +#include +#include +#include + +namespace { + +class OptionImpl : public OptionWithArg { +public: + OptionImpl(char short_name, std::string long_name, std::string description, + bool require_arg, std::string arg_description) + : short_name_(short_name), + long_name_(std::move(long_name)), + description_(std::move(description)), + require_arg_(require_arg), + arg_description_(std::move(arg_description)) { + } + + bool is_set() const override { return set_; } + + std::string const& arg() const override { return arg_; } + + char short_name() const { return short_name_; } + + std::string const& long_name() const { return long_name_; } + + std::string const& description() const { return description_; } + + bool require_arg() const { return require_arg_; } + + std::string const& arg_description() const { return arg_description_; } + + void reset() { + set_ = false; + arg_.clear(); + } + + void set() { + set_ = true; + } + + void set_arg(std::string arg) { + arg_ = std::move(arg); + } + +private: + char const short_name_; + std::string const long_name_; + std::string const description_; + bool const require_arg_; + std::string const arg_description_; + bool set_ = false; + std::string arg_; +}; + +class ArgsImpl : public Args { +public: + ArgsImpl() = default; + + std::shared_ptr