whitespace fixes
[openblackhole/openblackhole-enigma2.git] / lib / network / serversocket.cpp
1 #include <errno.h>
2 #include <lib/network/serversocket.h>
3 #include <arpa/inet.h>
4
5 bool eServerSocket::ok()
6 {
7         return okflag;
8 }
9
10 void eServerSocket::notifier(int)
11 {
12         int clientfd, clientlen;
13         struct sockaddr_in client_addr;
14
15 #ifdef DEBUG_SERVERSOCKET
16         eDebug("[SERVERSOCKET] incoming connection!");
17 #endif
18
19         clientlen=sizeof(client_addr);
20         clientfd=accept(getDescriptor(),
21                         (struct sockaddr *) &client_addr,
22                         (socklen_t*)&clientlen);
23         if(clientfd<0)
24                 eDebug("[SERVERSOCKET] error on accept()");
25
26         strRemoteHost = inet_ntoa(client_addr.sin_addr);
27         newConnection(clientfd);
28 }
29
30 eServerSocket::eServerSocket(int port, eMainloop *ml): eSocket(ml)
31 {
32         struct sockaddr_in serv_addr;
33         strRemoteHost = "";
34
35         bzero(&serv_addr, sizeof(serv_addr));
36         serv_addr.sin_family=AF_INET;
37         serv_addr.sin_addr.s_addr=INADDR_ANY;
38         serv_addr.sin_port=htons(port);
39
40         okflag=1;
41         int val=1;
42
43         setsockopt(getDescriptor(), SOL_SOCKET, SO_REUSEADDR, &val, sizeof(val));
44
45         if(bind(getDescriptor(),
46                 (struct sockaddr *) &serv_addr,
47                 sizeof(serv_addr))<0)
48         {
49                 eDebug("[SERVERSOCKET] ERROR on bind() (%m)");
50                 okflag=0;
51         }
52         listen(getDescriptor(), 0);
53
54         rsn->setRequested(eSocketNotifier::Read);
55 }
56
57 eServerSocket::eServerSocket(std::string path, eMainloop *ml) : eSocket(ml, AF_LOCAL)
58 {
59         struct sockaddr_un serv_addr;
60         strRemoteHost = "";
61
62         memset(&serv_addr, 0, sizeof(serv_addr));
63         serv_addr.sun_family = AF_LOCAL;
64         strcpy(serv_addr.sun_path, path.c_str());
65
66         okflag=1;
67
68         unlink(path.c_str());
69         if(bind(getDescriptor(),
70                 (struct sockaddr *) &serv_addr,
71                 sizeof(serv_addr))<0)
72         {
73                 eDebug("[SERVERSOCKET] ERROR on bind() (%m)");
74                 okflag=0;
75         }
76         listen(getDescriptor(), 0);
77
78         rsn->setRequested(eSocketNotifier::Read);
79 }
80
81 eServerSocket::~eServerSocket()
82 {
83 #if 0
84         eDebug("[SERVERSOCKET] destructed");
85 #endif
86 }
87
88 int eServerSocket::bind(int sockfd, struct sockaddr *addr, socklen_t addrlen)
89 {
90         int result;
91         while (1)
92         {
93                 if ((result = ::bind(sockfd, addr, addrlen)) < 0 && errno == EINTR) continue;
94                 break;
95         }
96         return result;
97 }
98
99 int eServerSocket::listen(int sockfd, int backlog)
100 {
101         int result;
102         while (1)
103         {
104                 if ((result = ::listen(sockfd, backlog)) < 0 && errno == EINTR) continue;
105                 break;
106         }
107         return result;
108 }
109
110 int eServerSocket::accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen)
111 {
112         int result;
113         while (1)
114         {
115                 if ((result = ::accept(sockfd, addr, addrlen)) < 0 && errno == EINTR) continue;
116                 break;
117         }
118         return result;
119 }