mirror of git://git.acid.vegas/anope.git
62 lines
1000 B
C++
62 lines
1000 B
C++
/* POSIX emulation layer for Windows.
|
|
*
|
|
* (C) 2008-2022 Anope Team
|
|
* Contact us at team@anope.org
|
|
*
|
|
* Please read COPYING and README for further details.
|
|
*/
|
|
|
|
#include "services.h"
|
|
#include "sockets.h"
|
|
|
|
int pipe(int fds[2])
|
|
{
|
|
sockaddrs localhost("127.0.0.1");
|
|
|
|
int cfd = socket(AF_INET, SOCK_STREAM, 0), lfd = socket(AF_INET, SOCK_STREAM, 0);
|
|
if (cfd == -1 || lfd == -1)
|
|
{
|
|
anope_close(cfd);
|
|
anope_close(lfd);
|
|
return -1;
|
|
}
|
|
|
|
if (bind(lfd, &localhost.sa, localhost.size()) == -1)
|
|
{
|
|
anope_close(cfd);
|
|
anope_close(lfd);
|
|
return -1;
|
|
}
|
|
|
|
if (listen(lfd, 1) == -1)
|
|
{
|
|
anope_close(cfd);
|
|
anope_close(lfd);
|
|
return -1;
|
|
}
|
|
|
|
sockaddrs lfd_addr;
|
|
socklen_t sz = sizeof(lfd_addr);
|
|
getsockname(lfd, &lfd_addr.sa, &sz);
|
|
|
|
if (connect(cfd, &lfd_addr.sa, lfd_addr.size()))
|
|
{
|
|
anope_close(cfd);
|
|
anope_close(lfd);
|
|
return -1;
|
|
}
|
|
|
|
int afd = accept(lfd, NULL, NULL);
|
|
anope_close(lfd);
|
|
if (afd == -1)
|
|
{
|
|
anope_close(cfd);
|
|
return -1;
|
|
}
|
|
|
|
fds[0] = cfd;
|
|
fds[1] = afd;
|
|
|
|
return 0;
|
|
}
|