3 #include <lib/network/serversocket.h>
6 bool eServerSocket::ok()
11 void eServerSocket::notifier(int)
15 struct sockaddr client_addr;
16 char straddr[INET6_ADDRSTRLEN];
18 #ifdef DEBUG_SERVERSOCKET
19 eDebug("[eServerSocket] incoming connection!");
22 clientlen = sizeof(client_addr);
23 clientfd = accept(getDescriptor(), &client_addr, &clientlen);
26 eDebug("[eServerSocket] error on accept: %m");
30 if (client_addr.sa_family == AF_LOCAL)
32 strRemoteHost = "(local)";
36 strRemoteHost = inet_ntop(client_addr.sa_family, client_addr.sa_data, straddr, sizeof(straddr));
38 newConnection(clientfd);
41 eServerSocket::eServerSocket(int port, eMainloop *ml): eSocket(ml)
44 struct addrinfo *addr = NULL;
45 struct addrinfo hints;
51 memset(&hints, 0, sizeof(hints));
52 hints.ai_family = AF_UNSPEC; /* both ipv4 and ipv6 */
53 hints.ai_socktype = SOCK_STREAM;
54 hints.ai_protocol = 0; /* any */
56 hints.ai_flags = AI_PASSIVE | AI_NUMERICSERV | AI_ADDRCONFIG; /* only return ipv6 if we have an ipv6 address ourselves, and ipv4 if we have an ipv4 address ourselves */
58 hints.ai_flags = AI_PASSIVE | AI_NUMERICSERV; /* AI_ADDRCONFIG is not available */
60 snprintf(portnumber, sizeof(portnumber), "%d", port);
62 if ((res = getaddrinfo(NULL, portnumber, &hints, &addr)) || !addr)
64 eDebug("[eServerSocket] getaddrinfo: %s", gai_strerror(res));
68 if (startListening(addr) >= 0)
71 rsn->setRequested(eSocketNotifier::Read);
76 eServerSocket::eServerSocket(std::string path, eMainloop *ml) : eSocket(ml)
78 struct sockaddr_un serv_addr_un;
84 memset(&serv_addr_un, 0, sizeof(serv_addr_un));
85 serv_addr_un.sun_family = AF_LOCAL;
86 strcpy(serv_addr_un.sun_path, path.c_str());
88 memset(&addr, 0, sizeof(addr));
89 addr.ai_family = AF_LOCAL;
90 addr.ai_socktype = SOCK_STREAM;
91 addr.ai_protocol = 0; /* any */
92 addr.ai_addr = (struct sockaddr *)&serv_addr_un;
93 addr.ai_addrlen = sizeof(serv_addr_un);
97 if (startListening(&addr) >= 0)
100 rsn->setRequested(eSocketNotifier::Read);
104 eServerSocket::~eServerSocket()
106 #ifdef DEBUG_SERVERSOCKET
107 eDebug("[eServerSocket] destructed");
111 int eServerSocket::startListening(struct addrinfo *addr)
113 struct addrinfo *ptr = addr;
114 for (ptr = addr; ptr != NULL; ptr = ptr->ai_next)
116 if (setSocket(socket(ptr->ai_family, ptr->ai_socktype, ptr->ai_protocol), 1) < 0)
122 setsockopt(getDescriptor(), SOL_SOCKET, SO_REUSEADDR, &val, sizeof(val));
124 if (bind(getDescriptor(), ptr->ai_addr, ptr->ai_addrlen) < 0)
126 eDebug("[eServerSocket] ERROR on bind: %m");
132 if (getDescriptor() < 0)
137 if (listen(getDescriptor(), 0) < 0)
145 int eServerSocket::bind(int sockfd, struct sockaddr *addr, socklen_t addrlen)
150 if ((result = ::bind(sockfd, addr, addrlen)) < 0 && errno == EINTR) continue;
156 int eServerSocket::listen(int sockfd, int backlog)
161 if ((result = ::listen(sockfd, backlog)) < 0 && errno == EINTR) continue;
167 int eServerSocket::accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen)
172 if ((result = ::accept(sockfd, addr, addrlen)) < 0 && errno == EINTR) continue;