26#include <sys/socket.h>
29#ifdef ENABLE_INDI_SHARED_MEMORY
31std::string UnixServer::unixSocketPath = INDIUNIXSOCK;
33UnixServer::UnixServer(
const std::string &path): path(path)
35 sfdev.set<UnixServer, &UnixServer::ioCb>(
this);
38void UnixServer::log(
const std::string &str)
const
40 std::string logLine =
"Local server: ";
45void UnixServer::ioCb(ev::io &,
int revents)
47 if (revents & EV_ERROR)
52 log(
fmt(
"Error on unix socket: %s\n", strerror(sockErrno)));
56 if (revents & EV_READ)
62void initUnixSocketAddr(
const std::string &unixAddr,
struct sockaddr_un &serv_addr_un, socklen_t &addrlen,
bool bind)
64 memset(&serv_addr_un, 0,
sizeof(serv_addr_un));
65 serv_addr_un.sun_family = AF_UNIX;
71 strncpy(serv_addr_un.sun_path + 1, unixAddr.c_str(),
sizeof(serv_addr_un.sun_path) - 2);
73 int len = offsetof(
struct sockaddr_un, sun_path) + unixAddr.size() + 1;
78 strncpy(serv_addr_un.sun_path, unixAddr.c_str(),
sizeof(serv_addr_un.sun_path) - 1);
80 int len = offsetof(
struct sockaddr_un, sun_path) + unixAddr.size();
84 unlink(unixAddr.c_str());
90void UnixServer::listen()
92 struct sockaddr_un serv_socket;
95 if ((sfd = socket(AF_UNIX, SOCK_STREAM, 0)) < 0)
102 if (setsockopt(sfd, SOL_SOCKET, SO_REUSEADDR, &reuse,
sizeof(reuse)) < 0)
110 initUnixSocketAddr(path, serv_socket, len,
true);
112 if (bind(sfd, (
struct sockaddr *)&serv_socket, len) < 0)
119 if (::listen(sfd, 5) < 0)
125 fcntl(sfd, F_SETFL, fcntl(sfd, F_GETFL, 0) | O_NONBLOCK);
126 sfdev.start(sfd, EV_READ);
130 log(
fmt(
"listening on local domain at: @%s\n", path.c_str()));
133void UnixServer::accept()
138 cli_fd = ::accept(sfd, 0, 0);
141 if (
errno == EAGAIN ||
errno == EWOULDBLOCK)
return;
150 cp->
setFds(cli_fd, cli_fd);
156 struct sockpeercred ucred;
157 socklen_t len =
sizeof(
struct sockpeercred);
160 socklen_t len =
sizeof(
struct ucred);
163 if (getsockopt(cli_fd, SOL_SOCKET, SO_PEERCRED, &ucred, &len) == -1)
165 log(
fmt(
"getsockopt failed: %s\n", strerror(
errno)));
169 cp->
log(
fmt(
"new arrival from local pid %ld (user: %ld:%ld) - welcome!\n", (
long)ucred.pid, (
long)ucred.uid,
172 cp->
log(
fmt(
"new arrival from local domain - welcome!\n"));
176#ifdef OSX_EMBEDED_MODE
177 fprintf(stderr,
"CLIENTS %d\n", clients.size());
CommandLineArgs * userConfigurableArguments
void log(const std::string &log)
std::string fmt(const char *fmt,...)
virtual void log(const std::string &log) const
void setFds(int rFd, int wFd)