summaryrefslogtreecommitdiff
path: root/src/socketengines/pipeengine_win32.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/socketengines/pipeengine_win32.cpp')
-rw-r--r--src/socketengines/pipeengine_win32.cpp92
1 files changed, 92 insertions, 0 deletions
diff --git a/src/socketengines/pipeengine_win32.cpp b/src/socketengines/pipeengine_win32.cpp
new file mode 100644
index 000000000..41ec37a4c
--- /dev/null
+++ b/src/socketengines/pipeengine_win32.cpp
@@ -0,0 +1,92 @@
+#include "services.h"
+
+static ClientSocket *newsocket = NULL;
+
+class LSocket : public ListenSocket
+{
+ public:
+ LSocket(const Anope::string &host, int port) : ListenSocket(host, port, false) { }
+
+ ClientSocket *OnAccept(int fd, const sockaddrs &addr)
+ {
+ newsocket = new ClientSocket(this, fd, addr);
+ return newsocket;
+ }
+};
+
+class PipeIO : public SocketIO
+{
+ public:
+ /** Receive something from the buffer
+ * @param s The socket
+ * @param buf The buf to read to
+ * @param sz How much to read
+ * @return Number of bytes received
+ */
+ int Recv(Socket *s, char *buf, size_t sz) const
+ {
+ static char dummy[512];
+ return recv(s->GetFD(), dummy, 512, 0);
+ }
+
+ /** Write something to the socket
+ * @param s The socket
+ * @param buf What to write
+ * @return Number of bytes written
+ */
+ int Send(Socket *s, const Anope::string &buf) const
+ {
+ static const char dummy = '*';
+ Pipe *pipe = debug_cast<Pipe *>(s);
+ return send(pipe->WritePipe, &dummy, 1, 0);
+ }
+} pipeSocketIO;
+
+Pipe::Pipe() : BufferedSocket()
+{
+ LSocket lfs("127.0.0.1", 0);
+
+ int cfd = socket(AF_INET, SOCK_STREAM, 0);
+ if (cfd == -1)
+ throw CoreException("Error accepting new socket for Pipe");
+
+ sockaddr_in addr;
+ socklen_t sz = sizeof(addr);
+ getsockname(lfs.GetFD(), reinterpret_cast<sockaddr *>(&addr), &sz);
+
+ if (connect(cfd, reinterpret_cast<sockaddr *>(&addr), sz))
+ throw CoreException("Error accepting new socket for Pipe");
+ lfs.ProcessRead();
+ if (!newsocket)
+ throw CoreException("Error accepting new socket for Pipe");
+
+ this->IO = &pipeSocketIO;
+ this->Sock = cfd;
+ this->WritePipe = newsocket->GetFD();
+ this->IPv6 = false;
+
+ SocketEngine::AddSocket(this);
+ newsocket = NULL;
+}
+
+bool Pipe::ProcessRead()
+{
+ this->IO->Recv(this, NULL, 0);
+ return this->Read("");
+}
+
+bool Pipe::Read(const Anope::string &)
+{
+ this->OnNotify();
+ return true;
+}
+
+void Pipe::Notify()
+{
+ this->IO->Send(this, "");
+}
+
+void Pipe::OnNotify()
+{
+}
+