summaryrefslogtreecommitdiff
path: root/src/proxy.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/proxy.cc')
-rw-r--r--src/proxy.cc54
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