+static void do_outgoing_pipe(connection_t *c, char *command) {
+#ifndef HAVE_MINGW
+ int fd[2];
+
+ if(socketpair(AF_UNIX, SOCK_STREAM, 0, fd)) {
+ logger(LOG_ERR, "Could not create socketpair: %s\n", strerror(errno));
+ return;
+ }
+
+ if(fork()) {
+ c->socket = fd[0];
+ close(fd[1]);
+ ifdebug(CONNECTIONS) logger(LOG_DEBUG, "Using proxy %s", command);
+ return;
+ }
+
+ close(0);
+ close(1);
+ close(fd[0]);
+ dup2(fd[1], 0);
+ dup2(fd[1], 1);
+ close(fd[1]);
+
+ // Other filedescriptors should be closed automatically by CLOEXEC
+
+ char *host = NULL;
+ char *port = NULL;
+
+ sockaddr2str(&c->address, &host, &port);
+ setenv("REMOTEADDRESS", host, true);
+ setenv("REMOTEPORT", port, true);
+ setenv("NODE", c->name, true);
+ setenv("NAME", myself->name, true);
+
+ if(netname) {
+ setenv("NETNAME", netname, true);
+ }
+
+ int result = system(command);
+
+ if(result < 0) {
+ logger(LOG_ERR, "Could not execute %s: %s\n", command, strerror(errno));
+ } else if(result) {
+ logger(LOG_ERR, "%s exited with non-zero status %d", command, result);
+ }
+
+ exit(result);
+#else
+ logger(LOG_ERR, "Proxy type exec not supported on this platform!");
+ return;
+#endif
+}
+
+static bool is_valid_host_port(const char *host, const char *port) {
+ for(const char *p = host; *p; p++)
+ if(!isalnum(*p) && *p != '-' && *p != '.') {
+ return false;
+ }
+
+ for(const char *p = port; *p; p++)
+ if(!isalnum(*p)) {
+ return false;
+ }
+
+ return true;
+}
+
+void do_outgoing_connection(connection_t *c) {
+ struct addrinfo *proxyai = NULL;