+#endif
+
+ /* return signal number so we can kill ourselves */
+ return last_signal;
+}
+
+void exit_on_signal(int sig)
+{
+#ifndef _WIN32
+ /* bring back default system handler and kill yourself */
+ signal(sig, SIG_DFL);
+ kill(getpid(), sig);
+#endif
+}
+
+int connection_write(struct connection *connection, const void *data, int len)
+{
+ if (len == 0) {
+ /* successful no-op. Sockets and pipes behave differently here... */
+ return 0;
+ }
+ if (connection->service->type == CONNECTION_TCP)
+ return write_socket(connection->fd_out, data, len);
+ else
+ return write(connection->fd_out, data, len);
+}
+
+int connection_read(struct connection *connection, void *data, int len)
+{
+ if (connection->service->type == CONNECTION_TCP)
+ return read_socket(connection->fd, data, len);
+ else
+ return read(connection->fd, data, len);