2024-04-18 23:49:52 +03:00
|
|
|
#pragma once
|
|
|
|
///@file
|
|
|
|
|
|
|
|
#include "types.hh"
|
|
|
|
#include "file-descriptor.hh"
|
|
|
|
|
|
|
|
#ifdef _WIN32
|
2024-05-03 04:41:24 +03:00
|
|
|
# include <winsock2.h>
|
2024-04-18 23:49:52 +03:00
|
|
|
#endif
|
|
|
|
#include <unistd.h>
|
|
|
|
|
|
|
|
namespace nix {
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Create a Unix domain socket.
|
|
|
|
*/
|
|
|
|
AutoCloseFD createUnixDomainSocket();
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Create a Unix domain socket in listen mode.
|
|
|
|
*/
|
|
|
|
AutoCloseFD createUnixDomainSocket(const Path & path, mode_t mode);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Often we want to use `Descriptor`, but Windows makes a slightly
|
|
|
|
* stronger file descriptor vs socket distinction, at least at the level
|
|
|
|
* of C types.
|
|
|
|
*/
|
|
|
|
using Socket =
|
|
|
|
#ifdef _WIN32
|
|
|
|
SOCKET
|
|
|
|
#else
|
|
|
|
int
|
|
|
|
#endif
|
|
|
|
;
|
|
|
|
|
|
|
|
#ifdef _WIN32
|
|
|
|
/**
|
|
|
|
* Windows gives this a different name
|
|
|
|
*/
|
2024-05-03 04:41:24 +03:00
|
|
|
# define SHUT_WR SD_SEND
|
2024-04-19 00:49:17 +03:00
|
|
|
# define SHUT_RDWR SD_BOTH
|
2024-04-18 23:49:52 +03:00
|
|
|
#endif
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Convert a `Socket` to a `Descriptor`
|
|
|
|
*
|
|
|
|
* This is a no-op except on Windows.
|
|
|
|
*/
|
|
|
|
static inline Socket toSocket(Descriptor fd)
|
|
|
|
{
|
|
|
|
#ifdef _WIN32
|
|
|
|
return reinterpret_cast<Socket>(fd);
|
|
|
|
#else
|
|
|
|
return fd;
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Convert a `Socket` to a `Descriptor`
|
|
|
|
*
|
|
|
|
* This is a no-op except on Windows.
|
|
|
|
*/
|
|
|
|
static inline Descriptor fromSocket(Socket fd)
|
|
|
|
{
|
|
|
|
#ifdef _WIN32
|
|
|
|
return reinterpret_cast<Descriptor>(fd);
|
|
|
|
#else
|
|
|
|
return fd;
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Bind a Unix domain socket to a path.
|
|
|
|
*/
|
|
|
|
void bind(Socket fd, const std::string & path);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Connect to a Unix domain socket.
|
|
|
|
*/
|
|
|
|
void connect(Socket fd, const std::string & path);
|
|
|
|
|
|
|
|
}
|