summaryrefslogtreecommitdiff
path: root/docs/man/man3/InspSocket.3
diff options
context:
space:
mode:
Diffstat (limited to 'docs/man/man3/InspSocket.3')
-rw-r--r--docs/man/man3/InspSocket.3513
1 files changed, 513 insertions, 0 deletions
diff --git a/docs/man/man3/InspSocket.3 b/docs/man/man3/InspSocket.3
new file mode 100644
index 000000000..a0c2e134c
--- /dev/null
+++ b/docs/man/man3/InspSocket.3
@@ -0,0 +1,513 @@
+.TH "InspSocket" 3 "27 Nov 2005" "Version 1.0Betareleases" "InspIRCd" \" -*- nroff -*-
+.ad l
+.nh
+.SH NAME
+InspSocket \-
+.SH SYNOPSIS
+.br
+.PP
+\fC#include <socket.h>\fP
+.PP
+.SS "Public Member Functions"
+
+.in +1c
+.ti -1c
+.RI "\fBInspSocket\fP ()"
+.br
+.ti -1c
+.RI "\fBInspSocket\fP (int newfd)"
+.br
+.ti -1c
+.RI "\fBInspSocket\fP (\fBstd::string\fP \fBhost\fP, int \fBport\fP, bool listening, unsigned long maxtime)"
+.br
+.ti -1c
+.RI "virtual bool \fBOnConnected\fP ()"
+.br
+.ti -1c
+.RI "virtual void \fBOnError\fP (\fBInspSocketError\fP e)"
+.br
+.ti -1c
+.RI "virtual int \fBOnDisconnect\fP ()"
+.br
+.ti -1c
+.RI "virtual bool \fBOnDataReady\fP ()"
+.br
+.ti -1c
+.RI "virtual void \fBOnTimeout\fP ()"
+.br
+.ti -1c
+.RI "virtual void \fBOnClose\fP ()"
+.br
+.ti -1c
+.RI "virtual char * \fBRead\fP ()"
+.br
+.ti -1c
+.RI "virtual int \fBWrite\fP (\fBstd::string\fP data)"
+.br
+.ti -1c
+.RI "virtual int \fBOnIncomingConnection\fP (int newfd, char *ip)"
+.br
+.ti -1c
+.RI "void \fBSetState\fP (\fBInspSocketState\fP s)"
+.br
+.ti -1c
+.RI "\fBInspSocketState\fP \fBGetState\fP ()"
+.br
+.ti -1c
+.RI "bool \fBPoll\fP ()"
+.br
+.ti -1c
+.RI "virtual void \fBClose\fP ()"
+.br
+.ti -1c
+.RI "virtual \fB~InspSocket\fP ()"
+.br
+.in -1c
+.SS "Private Attributes"
+
+.in +1c
+.ti -1c
+.RI "int \fBfd\fP"
+.br
+.ti -1c
+.RI "\fBstd::string\fP \fBhost\fP"
+.br
+.ti -1c
+.RI "int \fBport\fP"
+.br
+.ti -1c
+.RI "\fBInspSocketState\fP \fBstate\fP"
+.br
+.ti -1c
+.RI "sockaddr_in \fBaddr\fP"
+.br
+.ti -1c
+.RI "in_addr \fBaddy\fP"
+.br
+.ti -1c
+.RI "time_t \fBtimeout_end\fP"
+.br
+.ti -1c
+.RI "bool \fBtimeout\fP"
+.br
+.ti -1c
+.RI "pollfd \fBpolls\fP"
+.br
+.ti -1c
+.RI "char \fBibuf\fP [1024]"
+.br
+.ti -1c
+.RI "sockaddr_in \fBclient\fP"
+.br
+.ti -1c
+.RI "sockaddr_in \fBserver\fP"
+.br
+.ti -1c
+.RI "socklen_t \fBlength\fP"
+.br
+.in -1c
+.SH "Detailed Description"
+.PP
+Definition at line 30 of file socket.h.
+.SH "Constructor & Destructor Documentation"
+.PP
+.SS "InspSocket::InspSocket ()"
+.PP
+Definition at line 46 of file socket.cpp.
+.PP
+References I_DISCONNECTED, and state.
+.PP
+.nf
+47 {
+48 this->state = I_DISCONNECTED;
+49 }
+.fi
+.PP
+.SS "InspSocket::InspSocket (int newfd)"
+.PP
+Definition at line 51 of file socket.cpp.
+.PP
+References fd, I_CONNECTED, and state.
+.PP
+.nf
+52 {
+53 this->fd = newfd;
+54 this->state = I_CONNECTED;
+55 }
+.fi
+.PP
+.SS "InspSocket::InspSocket (\fBstd::string\fP host, int port, bool listening, unsigned long maxtime)"
+.PP
+Definition at line 57 of file socket.cpp.
+.PP
+References addr, addy, Close(), DEBUG, fd, I_CONNECTING, I_ERR_BIND, I_ERR_CONNECT, I_ERR_SOCKET, I_ERROR, I_LISTENING, OnError(), state, timeout, and timeout_end.
+.PP
+.nf
+58 {
+59 if (listening) {
+60 if ((this->fd = OpenTCPSocket()) == ERROR)
+61 {
+62 this->fd = -1;
+63 this->state = I_ERROR;
+64 this->OnError(I_ERR_SOCKET);
+65 log(DEBUG,'OpenTCPSocket() error');
+66 return;
+67 }
+68 else
+69 {
+70 if (BindSocket(this->fd,this->client,this->server,port,(char*)host.c_str()) == ERROR)
+71 {
+72 this->Close();
+73 this->fd = -1;
+74 this->state = I_ERROR;
+75 this->OnError(I_ERR_BIND);
+76 log(DEBUG,'BindSocket() error %s',strerror(errno));
+77 return;
+78 }
+79 else
+80 {
+81 this->state = I_LISTENING;
+82 log(DEBUG,'New socket now in I_LISTENING state');
+83 return;
+84 }
+85 }
+86 } else {
+87 char* ip;
+88 this->host = host;
+89 hostent* hoste = gethostbyname(host.c_str());
+90 if (!hoste) {
+91 ip = (char*)host.c_str();
+92 } else {
+93 struct in_addr* ia = (in_addr*)hoste->h_addr;
+94 ip = inet_ntoa(*ia);
+95 }
+96
+97 timeout_end = time(NULL)+maxtime;
+98 timeout = false;
+99 if ((this->fd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
+100 {
+101 this->state = I_ERROR;
+102 this->OnError(I_ERR_SOCKET);
+103 return;
+104 }
+105 this->port = port;
+106 inet_aton(ip,&addy);
+107 addr.sin_family = AF_INET;
+108 addr.sin_addr = addy;
+109 addr.sin_port = htons(this->port);
+110
+111 int flags;
+112 flags = fcntl(this->fd, F_GETFL, 0);
+113 fcntl(this->fd, F_SETFL, flags | O_NONBLOCK);
+114
+115 if(connect(this->fd, (sockaddr*)&this->addr,sizeof(this->addr)) == -1)
+116 {
+117 if (errno != EINPROGRESS)
+118 {
+119 this->Close();
+120 this->OnError(I_ERR_CONNECT);
+121 this->state = I_ERROR;
+122 return;
+123 }
+124 }
+125 this->state = I_CONNECTING;
+126 return;
+127 }
+128 }
+.fi
+.PP
+.SS "InspSocket::~InspSocket ()\fC [virtual]\fP"
+.PP
+Definition at line 246 of file socket.cpp.
+.PP
+References Close().
+.PP
+.nf
+247 {
+248 this->Close();
+249 }
+.fi
+.PP
+.SH "Member Function Documentation"
+.PP
+.SS "void InspSocket::Close ()\fC [virtual]\fP"
+.PP
+Definition at line 130 of file socket.cpp.
+.PP
+References fd, and OnClose().
+.PP
+Referenced by InspSocket(), and ~InspSocket().
+.PP
+.nf
+131 {
+132 if (this->fd != -1)
+133 {
+134 this->OnClose();
+135 shutdown(this->fd,2);
+136 close(this->fd);
+137 this->fd = -1;
+138 }
+139 }
+.fi
+.PP
+.SS "\fBInspSocketState\fP InspSocket::GetState ()"
+.PP
+Definition at line 233 of file socket.cpp.
+.PP
+References state.
+.PP
+.nf
+234 {
+235 return this->state;
+236 }
+.fi
+.PP
+.SS "void InspSocket::OnClose ()\fC [virtual]\fP"
+.PP
+Definition at line 244 of file socket.cpp.
+.PP
+Referenced by Close().
+.PP
+.nf
+244 { return; }
+.fi
+.PP
+.SS "bool InspSocket::OnConnected ()\fC [virtual]\fP"
+.PP
+Definition at line 238 of file socket.cpp.
+.PP
+Referenced by Poll().
+.PP
+.nf
+238 { return true; }
+.fi
+.PP
+.SS "bool InspSocket::OnDataReady ()\fC [virtual]\fP"
+.PP
+Definition at line 242 of file socket.cpp.
+.PP
+Referenced by Poll().
+.PP
+.nf
+242 { return true; }
+.fi
+.PP
+.SS "int InspSocket::OnDisconnect ()\fC [virtual]\fP"
+.PP
+Definition at line 240 of file socket.cpp.
+.PP
+.nf
+240 { return 0; }
+.fi
+.PP
+.SS "void InspSocket::OnError (\fBInspSocketError\fP e)\fC [virtual]\fP"
+.PP
+Definition at line 239 of file socket.cpp.
+.PP
+Referenced by InspSocket(), and Poll().
+.PP
+.nf
+239 { return; }
+.fi
+.PP
+.SS "int InspSocket::OnIncomingConnection (int newfd, char * ip)\fC [virtual]\fP"
+.PP
+Definition at line 241 of file socket.cpp.
+.PP
+Referenced by Poll().
+.PP
+.nf
+241 { return 0; }
+.fi
+.PP
+.SS "void InspSocket::OnTimeout ()\fC [virtual]\fP"
+.PP
+Definition at line 243 of file socket.cpp.
+.PP
+Referenced by Poll().
+.PP
+.nf
+243 { return; }
+.fi
+.PP
+.SS "bool InspSocket::Poll ()"
+.PP
+Definition at line 183 of file socket.cpp.
+.PP
+References client, fd, I_CONNECTED, I_CONNECTING, I_ERR_TIMEOUT, I_ERROR, I_LISTENING, length, OnConnected(), OnDataReady(), OnError(), OnIncomingConnection(), OnTimeout(), polls, SetState(), state, timeout, and timeout_end.
+.PP
+.nf
+184 {
+185 if ((time(NULL) > timeout_end) && (this->state == I_CONNECTING))
+186 {
+187 // for non-listening sockets, the timeout can occur
+188 // which causes termination of the connection after
+189 // the given number of seconds without a successful
+190 // connection.
+191 this->OnTimeout();
+192 this->OnError(I_ERR_TIMEOUT);
+193 timeout = true;
+194 this->state = I_ERROR;
+195 return false;
+196 }
+197 polls.fd = this->fd;
+198 state == I_CONNECTING ? polls.events = POLLOUT : polls.events = POLLIN;
+199 int ret = poll(&polls,1,1);
+200
+201 if (ret > 0)
+202 {
+203 int incoming = -1;
+204
+205 switch (this->state)
+206 {
+207 case I_CONNECTING:
+208 this->SetState(I_CONNECTED);
+209 return this->OnConnected();
+210 break;
+211 case I_LISTENING:
+212 length = sizeof (client);
+213 incoming = accept (this->fd, (sockaddr*)&client,&length);
+214 this->OnIncomingConnection(incoming,inet_ntoa(client.sin_addr));
+215 return true;
+216 break;
+217 case I_CONNECTED:
+218 return this->OnDataReady();
+219 break;
+220 default:
+221 break;
+222 }
+223 }
+224 return true;
+225 }
+.fi
+.PP
+.SS "char * InspSocket::Read ()\fC [virtual]\fP"
+.PP
+Definition at line 141 of file socket.cpp.
+.PP
+References DEBUG, and ibuf.
+.PP
+.nf
+142 {
+143 int n = recv(this->fd,this->ibuf,sizeof(this->ibuf),0);
+144 if (n > 0)
+145 {
+146 ibuf[n] = 0;
+147 return ibuf;
+148 }
+149 else
+150 {
+151 log(DEBUG,'EOF or error on socket');
+152 return NULL;
+153 }
+154 }
+.fi
+.PP
+.SS "void InspSocket::SetState (\fBInspSocketState\fP s)"
+.PP
+Definition at line 227 of file socket.cpp.
+.PP
+References DEBUG, and state.
+.PP
+Referenced by Poll().
+.PP
+.nf
+228 {
+229 log(DEBUG,'Socket state change');
+230 this->state = s;
+231 }
+.fi
+.PP
+.SS "int InspSocket::Write (\fBstd::string\fP data)\fC [virtual]\fP"
+.PP
+Definition at line 160 of file socket.cpp.
+.PP
+.nf
+161 {
+162 char* d = (char*)data.c_str();
+163 unsigned int written = 0;
+164 int n = 0;
+165 int s = data.length();
+166 while ((written < data.length()) && (n >= 0))
+167 {
+168 n = send(this->fd,d,s,0);
+169 if (n > 0)
+170 {
+171 // If we didnt write everything, advance
+172 // the pointers so that when we retry
+173 // the next time around the loop, we try
+174 // to write what we failed to write before.
+175 written += n;
+176 s -= n;
+177 d += n;
+178 }
+179 }
+180 return written;
+181 }
+.fi
+.PP
+.SH "Member Data Documentation"
+.PP
+.SS "sockaddr_in \fBInspSocket::addr\fP\fC [private]\fP"
+.PP
+Definition at line 37 of file socket.h.
+.PP
+Referenced by InspSocket().
+.SS "in_addr \fBInspSocket::addy\fP\fC [private]\fP"
+.PP
+Definition at line 38 of file socket.h.
+.PP
+Referenced by InspSocket().
+.SS "sockaddr_in \fBInspSocket::client\fP\fC [private]\fP"
+.PP
+Definition at line 43 of file socket.h.
+.PP
+Referenced by Poll().
+.SS "int \fBInspSocket::fd\fP\fC [private]\fP"
+.PP
+Definition at line 33 of file socket.h.
+.PP
+Referenced by Close(), InspSocket(), and Poll().
+.SS "\fBstd::string\fP \fBInspSocket::host\fP\fC [private]\fP"
+.PP
+Definition at line 34 of file socket.h.
+.SS "char \fBInspSocket::ibuf\fP[1024]\fC [private]\fP"
+.PP
+Definition at line 42 of file socket.h.
+.PP
+Referenced by Read().
+.SS "socklen_t \fBInspSocket::length\fP\fC [private]\fP"
+.PP
+Definition at line 45 of file socket.h.
+.PP
+Referenced by Poll().
+.SS "pollfd \fBInspSocket::polls\fP\fC [private]\fP"
+.PP
+Definition at line 41 of file socket.h.
+.PP
+Referenced by Poll().
+.SS "int \fBInspSocket::port\fP\fC [private]\fP"
+.PP
+Definition at line 35 of file socket.h.
+.SS "sockaddr_in \fBInspSocket::server\fP\fC [private]\fP"
+.PP
+Definition at line 44 of file socket.h.
+.SS "\fBInspSocketState\fP \fBInspSocket::state\fP\fC [private]\fP"
+.PP
+Definition at line 36 of file socket.h.
+.PP
+Referenced by GetState(), InspSocket(), Poll(), and SetState().
+.SS "bool \fBInspSocket::timeout\fP\fC [private]\fP"
+.PP
+Definition at line 40 of file socket.h.
+.PP
+Referenced by InspSocket(), and Poll().
+.SS "time_t \fBInspSocket::timeout_end\fP\fC [private]\fP"
+.PP
+Definition at line 39 of file socket.h.
+.PP
+Referenced by InspSocket(), and Poll().
+
+.SH "Author"
+.PP
+Generated automatically by Doxygen for InspIRCd from the source code.