#include "socket_handler.hxx"
#include "t2n_exception.hxx"
+#include "log.hxx"
using namespace std;
/* fast reuse enable */
if (setsockopt(sock,SOL_SOCKET, SO_REUSEADDR, &i, sizeof(i)) < 0)
- {
- string err="error setting socket option: ";
- err+=strerror(errno);
- log(error, err);
- throw t2n_communication_error(err);
- }
+ EXCEPTIONSTREAM(error,t2n_communication_error,"error setting socket option: " << strerror(errno));
/* keepalive enable */
if (setsockopt(sock,SOL_SOCKET, SO_KEEPALIVE, &i, sizeof(i)) < 0)
- {
- string err="error setting socket option: ";
- err+=strerror(errno);
- log(error, err);
- throw t2n_communication_error(err);
- }
+ EXCEPTIONSTREAM(error,t2n_communication_error,"error setting socket option: " << strerror(errno));
/* close on exec */
int fdflags;
fdflags=fcntl(sock,F_GETFD, 0);
if (fdflags < 0)
- {
- string err="fcntl error on socket: ";
- err+=strerror(errno);
- log(error, err);
- throw t2n_communication_error(err);
- }
+ EXCEPTIONSTREAM(error,t2n_communication_error,"fcntl error on socket: " << strerror(errno));
+
fdflags |= FD_CLOEXEC;
if (fcntl(sock,F_SETFD,fdflags) < 0)
- {
- string err="fcntl error on socket: ";
- err+=strerror(errno);
- log(error, err);
- throw t2n_communication_error(err);
- }
+ EXCEPTIONSTREAM(error,t2n_communication_error,"fcntl error on socket: " << strerror(errno));
/* non-blocking mode */
int flflags;
flflags=fcntl(sock,F_GETFL,0);
if (flflags < 0)
- {
- string err="fcntl error on socket: ";
- err+=strerror(errno);
- log(error, err);
- throw t2n_communication_error(err);
- }
+ EXCEPTIONSTREAM(error,t2n_communication_error,"fcntl error on socket: " << strerror(errno));
+
flflags |= O_NONBLOCK;
if (fcntl(sock,F_SETFL,flflags) < 0)
- {
- string err="fcntl error on socket: ";
- err+=strerror(errno);
- log(error, err);
- throw t2n_communication_error(err);
- }
+ EXCEPTIONSTREAM(error,t2n_communication_error,"fcntl error on socket: " << strerror(errno));
}
/// close the underlying socket connection. Don't call directly, use the version provided
else if (errno == EINTR)
{
// interrupted, try again
+ LOGSTREAM(debug,"EINTR received on read(), trying again");
try_again=true;
}
else
{
- log(error,string("error reading from socket : ")+strerror(errno));
+ LOGSTREAM(error,"error reading from socket : " << strerror(errno));
// TODO: exception?
return false;
}
// End-of-file
if (nbytes == 0 && !try_again)
{
+ LOGSTREAM(debug,"0 bytes received on read(), closing connection");
close();
return false;
}
// Data read -> store it
if (nbytes > 0)
+ {
buffer.assign(socket_buffer,nbytes);
+ LOGSTREAM(debug,nbytes << " bytes read");
+ }
// more data waiting -> recurse
if (data_waiting(0))
rtn == -1 && (errno == EAGAIN || errno == EINTR))
{
usleep (80000);
- log(debug,"resuming write() call after EAGAIN or EINTR");
+ LOGSTREAM(debug,"resuming write() call after EAGAIN or EINTR");
}
if (rtn == -1)
{
- log(error,string("write() returned ")+strerror(errno));
+ LOGSTREAM(error,"write() returned " << strerror(errno));
// TODO: exception?
return;
}
else if (rtn != write_size)
{
- ostringstream msg;
- msg << "write() wrote " << rtn << " bytes, should have been "
- << write_size << " (complete: " << data.size() << ")";
-
- log(error,msg.str());
+ LOGSTREAM(error,"write() wrote " << rtn << " bytes, should have been "
+ << write_size << " (complete: " << data.size() << ")");
// TODO: exception?
return;
offset += write_size;
}
+ LOGSTREAM(debug,"wrote " << data.size() << " bytes");
+
return;
}