2 #include <asm/ioctls.h>
6 #include <lib/network/socket.h>
10 if (writebuffer.empty())
12 int wasconnected=(mystate==Connection) || (mystate==Closing);
22 rsn->setRequested(rsn->getRequested()|eSocketNotifier::Write);
26 void eSocket::enableRead()
29 rsn->setRequested(rsn->getRequested()|eSocketNotifier::Read);
32 void eSocket::disableRead()
35 rsn->setRequested(rsn->getRequested()&~eSocketNotifier::Read);
38 void eSocket::inject(const char *data, int len)
40 readbuffer.write(data, len);
41 if (mystate == Connection)
45 std::string eSocket::readLine()
47 int size=readbuffer.searchchr('\n');
50 size++; // ich will auch das \n
53 readbuffer.read(buffer, size);
54 return std::string(buffer);
57 bool eSocket::canReadLine()
59 return readbuffer.searchchr('\n') != -1;
62 int eSocket::bytesAvailable()
64 return readbuffer.size();
67 int eSocket::readBlock(char *data, unsigned int maxlen)
69 return readbuffer.read(data, maxlen);
72 int eSocket::bytesToWrite()
74 return writebuffer.size();
82 int eSocket::setSocket(int s, int iss, eMainloop *ml)
86 fcntl(socketdesc, F_SETFL, O_NONBLOCK);
87 last_break = 0xFFFFFFFF;
90 rsn=eSocketNotifier::create(ml, getDescriptor(),
91 eSocketNotifier::Read|eSocketNotifier::Hungup);
92 CONNECT(rsn->activated, eSocket::notifier);
96 void eSocket::notifier(int what)
98 if ((what & eSocketNotifier::Read) && (mystate == Connection))
102 if (ioctl(getDescriptor(), FIONREAD, &bytesavail)<0)
103 eDebug("FIONREAD failed.\n");
108 if (!bytesavail) // does the REMOTE END has closed the connection? (no Hungup here!)
114 } else // when operating on terminals, check for break
116 // where is this struct defined?
117 struct async_icount {
118 unsigned long cts, dsr, rng, dcd, tx, rx;
119 unsigned long frame, parity, overrun, brk;
120 unsigned long buf_overrun;
123 if (!ioctl(getDescriptor(), TIOCGICOUNT, &icount))
125 if (last_break == 0xFFFFFFFF)
126 last_break = icount.brk;
127 else if (last_break != icount.brk)
129 last_break = icount.brk;
130 readbuffer.fromfile(getDescriptor(), bytesavail);
133 rsn->setRequested(rsn->getRequested()&~eSocketNotifier::Write);
134 write(getDescriptor(), "BREAK!", 6);
141 if ((r=readbuffer.fromfile(getDescriptor(), bytesavail)) != bytesavail)
143 eDebug("fromfile failed!");
146 } else if (what & eSocketNotifier::Write)
148 if ((mystate == Connection) || (mystate == Closing))
150 if (!writebuffer.empty())
152 bytesWritten_(writebuffer.tofile(getDescriptor(), 65536));
153 if (writebuffer.empty())
155 rsn->setRequested(rsn->getRequested()&~eSocketNotifier::Write);
156 if (mystate == Closing)
158 close(); // warning, we might get destroyed after close.
163 eDebug("got ready to write, but nothin in buffer. strange.");
164 if (mystate == Closing)
166 } else if (mystate == Connecting)
169 rsn->setRequested(rsn->getRequested()&~eSocketNotifier::Write);
172 socklen_t size=sizeof(res);
173 ::getsockopt(getDescriptor(), SOL_SOCKET, SO_ERROR, &res, &size);
182 } else if (what & eSocketNotifier::Hungup)
184 if (mystate == Connection)
188 } else if (mystate == Connecting)
191 socklen_t size=sizeof(res);
192 ::getsockopt(getDescriptor(), SOL_SOCKET, SO_ERROR, &res, &size);
199 int eSocket::writeBlock(const char *data, unsigned int len)
202 if (issocket && writebuffer.empty())
204 int tw=::send(getDescriptor(), data, len, MSG_NOSIGNAL);
205 if ((tw < 0) && (errno != EWOULDBLOCK))
214 writebuffer.write(data, len);
216 if (!writebuffer.empty())
217 rsn->setRequested(rsn->getRequested()|eSocketNotifier::Write);
221 int eSocket::getDescriptor()
226 int eSocket::connectToHost(std::string hostname, int port)
228 struct hostent *server;
235 server=gethostbyname(hostname.c_str());
238 eDebug("can't resolve %s", hostname.c_str());
242 bzero( (char*)&serv_addr, sizeof(serv_addr));
243 serv_addr.sin_family=AF_INET;
244 bcopy( (char*)server->h_addr,
245 (char*)&serv_addr.sin_addr.s_addr,
247 serv_addr.sin_port=htons(port);
248 res=::connect(socketdesc, (const sockaddr*)&serv_addr, sizeof(serv_addr));
249 if ((res < 0) && (errno != EINPROGRESS))
251 eDebug("can't connect to host: %s", hostname.c_str());
256 if (res < 0) // EINPROGRESS
258 rsn->setRequested(rsn->getRequested()|eSocketNotifier::Write);
268 eSocket::eSocket(eMainloop *ml): readbuffer(32768), writebuffer(32768), rsn(0)
271 int s=socket(AF_INET, SOCK_STREAM, 0);
273 eDebug("[SOCKET]: initalized socket %d", socketdesc);
279 eSocket::eSocket(int socket, int issocket, eMainloop *ml): readbuffer(32768), writebuffer(32768)
281 setSocket(socket, issocket, ml);