diff options
Diffstat (limited to 'src/proxy.cc')
| -rw-r--r-- | src/proxy.cc | 54 |
1 files changed, 33 insertions, 21 deletions
diff --git a/src/proxy.cc b/src/proxy.cc index 639bb64..5e9f177 100644 --- a/src/proxy.cc +++ b/src/proxy.cc @@ -261,10 +261,11 @@ struct Monitor : public BaseClient { class ProxyImpl : public Proxy { public: ProxyImpl(Config* config, std::string const& cwd, char const* configfile, - char const* logfile, Logger* logger, int accept_fd, int monitor_fd) + char const* logfile, Logger* logger, int accept_fd, int monitor_fd, + Looper* looper, Resolver* resolver) : config_(config), cwd_(cwd), configfile_(configfile), logfile_(logfile), logger_(logger), accept_socket_(accept_fd), monitor_socket_(monitor_fd), - looper_(Looper::create()), resolver_(Resolver::create(looper_.get())), + looper_(looper), resolver_(resolver), new_timeout_(nullptr), timeout_(nullptr), next_package_id_(1), monitor_send_proxied_(false) { setup(); @@ -320,6 +321,7 @@ private: void fatal_error(); void new_client(int fd, uint8_t events); void new_monitor(int fd, uint8_t events); + void setup_monitor(int fd); void new_base(BaseClient* client, int fd); void signal_event(int fd, uint8_t events); bool base_event(BaseClient* client, uint8_t events, @@ -379,8 +381,8 @@ private: io::auto_fd accept_socket_; io::auto_fd monitor_socket_; io::auto_pipe signal_pipe_; - std::unique_ptr<Looper> looper_; - std::unique_ptr<Resolver> resolver_; + Looper* looper_; + Resolver* resolver_; std::unique_ptr<Mitm> mitm_; bool good_; void* new_timeout_; @@ -423,11 +425,15 @@ void ProxyImpl::setup() { std::placeholders::_1, std::placeholders::_2)); if (monitor_socket_) { - looper_->add(monitor_socket_.get(), - monitors_.full() ? 0 :Looper::EVENT_READ, - std::bind(&ProxyImpl::new_monitor, this, - std::placeholders::_1, - std::placeholders::_2)); + if (config_->get("__one_single_monitor", false)) { + setup_monitor(monitor_socket_.release()); + } else { + looper_->add(monitor_socket_.get(), + monitors_.full() ? 0 :Looper::EVENT_READ, + std::bind(&ProxyImpl::new_monitor, this, + std::placeholders::_1, + std::placeholders::_2)); + } } else { monitors_.clear(); } @@ -1749,6 +1755,18 @@ void ProxyImpl::new_client(int fd, uint8_t events) { } } +void ProxyImpl::setup_monitor(int fd) { + auto index = monitors_.new_client(); + new_base(&monitors_[index], fd); + monitors_[index].got_hello = false; + looper_->add(fd, monitors_[index].read_flag + | monitors_[index].write_flag, + std::bind(&ProxyImpl::monitor_event, this, + index, + std::placeholders::_1, + std::placeholders::_2)); +} + void ProxyImpl::new_monitor(int fd, uint8_t events) { assert(fd == monitor_socket_.get()); if (events == Looper::EVENT_READ) { @@ -1761,15 +1779,7 @@ void ProxyImpl::new_monitor(int fd, uint8_t events) { logger_->out(Logger::WARN, "Accept failed: %s", strerror(errno)); return; } - auto index = monitors_.new_client(); - new_base(&monitors_[index], ret); - monitors_[index].got_hello = false; - looper_->add(ret, monitors_[index].read_flag - | monitors_[index].write_flag, - std::bind(&ProxyImpl::monitor_event, this, - index, - std::placeholders::_1, - std::placeholders::_2)); + setup_monitor(ret); break; } if (monitors_.full()) looper_->modify(fd, 0); @@ -1948,7 +1958,8 @@ int setup_socket(char const* host, std::string const& port, Logger* logger) { hints.ai_socktype = SOCK_STREAM; hints.ai_flags = AI_V4MAPPED | AI_ADDRCONFIG | AI_PASSIVE; struct addrinfo* result; - auto retval = getaddrinfo(host, port.c_str(), &hints, &result); + auto retval = getaddrinfo(host && *host ? host : nullptr, port.c_str(), + &hints, &result); if (retval) { logger->out(Logger::ERR, "getaddrinfo failed for %s:%s: %s", host ? host : "*", port.c_str(), gai_strerror(retval)); @@ -1987,9 +1998,10 @@ Proxy* Proxy::create(Config* config, std::string const& cwd, char const* logfile, Logger* logger, int accept_fd, - int monitor_fd) { + int monitor_fd, + Looper* looper, Resolver* resolver) { return new ProxyImpl(config, cwd, configfile, logfile, logger, - accept_fd, monitor_fd); + accept_fd, monitor_fd, looper, resolver); } // static |
