- 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(DEBUG_ALWAYS, LOG_ERR, "Could not execute %s: %s", command, strerror(errno));
- else if(result)
- logger(DEBUG_ALWAYS, LOG_ERR, "%s exited with non-zero status %d", command, result);
- exit(result);
-#else
- logger(DEBUG_ALWAYS, LOG_ERR, "Proxy type exec not supported on this platform!");
- return;
-#endif
-}
-
-static void handle_meta_write(connection_t *c) {
- ssize_t outlen = send(c->socket, c->outbuf.data + c->outbuf.offset, c->outbuf.len - c->outbuf.offset, 0);
- if(outlen <= 0) {
- if(!errno || errno == EPIPE) {
- logger(DEBUG_CONNECTIONS, LOG_NOTICE, "Connection closed by %s (%s)", c->name, c->hostname);
- } else if(sockwouldblock(sockerrno)) {
- logger(DEBUG_CONNECTIONS, LOG_DEBUG, "Sending %d bytes to %s (%s) would block", c->outbuf.len - c->outbuf.offset, c->name, c->hostname);
- return;