Main Page   Class Hierarchy   Alphabetical List   Data Structures   File List   Data Fields   Globals  

tcpproxy.cc File Reference

#include "rcs_defs.hh"
#include "sokintrf.h"
#include "linklist.hh"
#include "rcs_prnt.hh"
#include "tcp_opts.hh"
#include <string.h>
#include <errno.h>
#include <signal.h>
#include <stdlib.h>
#include "recvn.h"
#include "sendn.h"

Include dependency graph for tcpproxy.cc:

Include dependency graph

Go to the source code of this file.

Data Structures

class  TCP_PROXY_ENTRY

Functions

int RCS_EXPORT recvn (int fd, void *vptr, int n, int flags, double timeout, int *bytes_read_ptr)
int RCS_EXPORT sendn (int fd, const void *vptr, int n, int flags, double timeout)
void handle_pipe_error (int id)
void handle_sigint (int id)
int main (int argc, char **argv)

Variables

int recvn_timedout
int print_recvn_timeout_errors
int last_pipe_error_id = 0
int tcpproxy_quit = 0
int last_sigint_id = 0
hostentserver_host_entry


Function Documentation

int RCS_EXPORT recvn int    fd,
void *    vptr,
int    n,
int    flags,
double    timeout,
int *    bytes_read_ptr
 

Definition at line 40 of file recvn.c.

Referenced by TCPMEM::blocking_read(), TCPMEM::check_if_read(), TCPMEM::clear(), TCPMEM::get_diagnostics_info(), TCPMEM::handle_old_replies(), TCPMEM::login(), TCPMEM::peek(), TCPMEM::read(), TCPMEM::reconnect(), TCPMEM::verify_bufname(), TCPMEM::write(), and TCPMEM::write_if_read().

00042 {
00043   int nleft, nrecv;
00044   int select_ret;
00045   char *ptr;
00046   double start_time, current_time;
00047   struct timeval timeout_tv;
00048   fd_set recv_fd_set;
00049   int bytes_ready;
00050   int bytes_to_read;
00051   if (etime_disabled)
00052     {
00053       _timeout = -1.0;
00054     }
00055 
00056   bytes_ready = bytes_to_read = 0;
00057   timeout_tv.tv_sec = (long) _timeout;
00058   timeout_tv.tv_usec = (long) (_timeout * 1000000.0);
00059   if (timeout_tv.tv_usec >= 1000000)
00060     {
00061       timeout_tv.tv_usec = timeout_tv.tv_usec % 1000000;
00062     }
00063   FD_ZERO (&recv_fd_set);
00064   RCS_FD_SET (fd, &recv_fd_set);
00065 
00066   recvn_timedout = 0;
00067   ptr = (char *) vptr;
00068   nleft = n;
00069   if (NULL != bytes_read_ptr)
00070     {
00071       if (*bytes_read_ptr >= n)
00072         {
00073           rcs_print_error
00074             ("recvn: Invalid parameter -- (*bytes_read_ptr = %d) must be less than (n = %d).\n",
00075              *bytes_read_ptr, n);
00076           return -1;
00077         }
00078       if (*bytes_read_ptr < 0)
00079         {
00080           rcs_print_error
00081             ("recvn: Invalid parameter -- (*bytes_read_ptr = %d) must be greater than or equal to zero.\n");
00082           return -1;
00083         }
00084       ptr += *bytes_read_ptr;
00085       nleft -= *bytes_read_ptr;
00086     }
00087 
00088   start_time = etime ();
00089   while (nleft > 0)
00090     {
00091       if (_timeout > 0.0)
00092         {
00093           switch (select_ret =
00094                   dl_select (fd + 1, &recv_fd_set, (fd_set *) NULL,
00095                              (fd_set *) NULL, &timeout_tv))
00096             {
00097             case -1:
00098 #if !defined(_Windows) || defined(gnuwin32)
00099               rcs_print_error ("Error in select: %d -> %s\n", errno,
00100                                strerror (errno));
00101 #else
00102               rcs_print_error ("Error in select: %d\n",
00103                                dl_WSAGetLastError ());
00104 #endif
00105               if (NULL == bytes_read_ptr)
00106                 {
00107                   rcs_print_error
00108                     ("recvn(fd=%d, vptr=%p, int n=%d, int flags=%d, double _timeout=%f) failed.\n",
00109                      fd, vptr, n, flags, _timeout);
00110                 }
00111               else
00112                 {
00113                   rcs_print_error
00114                     ("recvn(fd=%d, vptr=%p, int n=%d, int flags=%d, double _timeout=%f,bytes_read=%d) failed.\n",
00115                      fd, vptr, n, flags, _timeout, *bytes_read_ptr);
00116                 }
00117               return -1;
00118 
00119             case 0:
00120               if (print_recvn_timeout_errors)
00121                 {
00122                   rcs_print_error ("Recv timed out.\n");
00123                   if (NULL == bytes_read_ptr)
00124                     {
00125                       rcs_print_error
00126                         ("recvn(fd=%d, vptr=%p, int n=%d, int flags=%d, double _timeout=%f) failed.\n",
00127                          fd, vptr, n, flags, _timeout);
00128                     }
00129                   else
00130                     {
00131                       rcs_print_error
00132                         ("recvn(fd=%d, vptr=%p, int n=%d, int flags=%d, double _timeout=%f,bytes_read=%d) failed.\n",
00133                          fd, vptr, n, flags, _timeout, *bytes_read_ptr);
00134                     }
00135                 }
00136               recvn_timedout = 1;
00137               if (NULL != bytes_read_ptr)
00138                 {
00139                   *bytes_read_ptr = (n - nleft);
00140                 }
00141               return -1;
00142 
00143             default:
00144               break;
00145             }
00146           bytes_ready = 0;
00147 #if defined(WIN32) && !defined(gnuwin32)
00148           dl_ioctlsocket (fd, FIONREAD, &bytes_ready);
00149 #else
00150 #ifndef VXWORKS
00151 #ifdef MSDOS
00152           bytes_ready = nleft;
00153 #else
00154           ioctl (fd, FIONREAD, (caddr_t) & bytes_ready);
00155 #endif
00156 #else
00157           ioctl (fd, FIONREAD, (int) &bytes_ready);
00158 #endif
00159 #endif
00160           bytes_to_read = (nleft <= bytes_ready) ? nleft : bytes_ready;
00161         }
00162       else
00163         {
00164           bytes_to_read = nleft;
00165         }
00166       nrecv = 0;
00167       if (bytes_to_read > 0)
00168         {
00169           if ((nrecv = dl_recv (fd, ptr, bytes_to_read, flags)) == -1)
00170             {
00171               if (
00172 #if !defined(_WINDOWS) || defined(gnuwin32)
00173 #ifdef MSDOS
00174                    (EWOULDBLOCK == (tk_geterrno (fd)))
00175 #else
00176                    (errno == EWOULDBLOCK)
00177 #endif
00178 #else
00179                    (WSAEWOULDBLOCK == (dl_WSAGetLastError ()))
00180 #endif
00181                 )
00182                 {
00183                   if (fabs (_timeout) < 1e-6)
00184                     {
00185                       recvn_timedout = 1;
00186                       if (NULL != bytes_read_ptr)
00187                         {
00188                           *bytes_read_ptr = (n - nleft);
00189                         }
00190                       return -1;
00191                     }
00192                 }
00193               else
00194                 {
00195 #ifndef UNDER_CE
00196 #ifdef WIN32
00197                   rcs_print_sys_error (WSAGETLASTERROR_ERROR_SOURCE,
00198                                        "recv error:");
00199 #else
00200                   rcs_print_error ("Recv error: %d = %s\n", errno,
00201                                    strerror (errno));
00202 #endif
00203 #endif
00204                   if (NULL == bytes_read_ptr)
00205                     {
00206                       rcs_print_error
00207                         ("recvn(fd=%d, vptr=%p, int n=%d, int flags=%d, double _timeout=%f) failed.\n",
00208                          fd, vptr, n, flags, _timeout);
00209                     }
00210                   else
00211                     {
00212                       rcs_print_error
00213                         ("recvn(fd=%d, vptr=%p, int n=%d, int flags=%d, double _timeout=%f,bytes_read=%d) failed.\n",
00214                          fd, vptr, n, flags, _timeout, *bytes_read_ptr);
00215                     }
00216                   if (NULL != bytes_read_ptr)
00217                     {
00218                       *bytes_read_ptr = (n - nleft);
00219                     }
00220                   return (-1);  /* error, return < 0 */
00221                 }
00222               nrecv = 0;
00223             }
00224           else if (nrecv == 0)
00225             {
00226               rcs_print_error ("recvn: Premature EOF recieved.\n");
00227               return (-2);
00228             }
00229         }
00230       nleft -= nrecv;
00231       ptr += nrecv;
00232       if (nleft > 0 && _timeout > 0.0)
00233         {
00234           esleep (0.001);
00235           current_time = etime ();
00236           if (current_time - start_time > _timeout)
00237             {
00238               rcs_print_error ("Recv timed out.\n");
00239               recvn_timedout = 1;
00240               if (NULL != bytes_read_ptr)
00241                 {
00242                   *bytes_read_ptr = (n - nleft);
00243                 }
00244               return (-1);
00245             }
00246         }
00247     }
00248   rcs_print_debug (PRINT_SOCKET_READ_SIZE, "read %d bytes from %d\n", n, fd);
00249   if (NULL != bytes_read_ptr)
00250     {
00251       *bytes_read_ptr = (n - nleft);
00252     }
00253   return (n - nleft);           /* return >= 0 */
00254 }

int RCS_EXPORT sendn int    fd,
const void *    vptr,
int    n,
int    flags,
double    timeout
 

Definition at line 32 of file sendn.c.

Referenced by TCPMEM::blocking_read(), TCPMEM::check_if_read(), TCPMEM::clear(), TCPMEM::disconnect(), TCPMEM::get_diagnostics_info(), TCPMEM::login(), TCPMEM::peek(), TCPMEM::read(), TCPMEM::reconnect(), TCPMEM::send_diag_info(), sendline(), CMS_SERVER_REMOTE_TCP_PORT::update_subscriptions(), TCPMEM::verify_bufname(), TCPMEM::write(), and TCPMEM::write_if_read().

00033 {
00034   int nleft;
00035   long nwritten;
00036   int select_ret;
00037   double start_time, current_time;
00038   char *ptr;
00039   struct timeval timeout_tv;
00040   fd_set send_fd_set;
00041 
00042   timeout_tv.tv_sec = (long) _timeout;
00043   timeout_tv.tv_usec = (long) (_timeout * 1000000.0);
00044   if (timeout_tv.tv_usec >= 1000000)
00045     {
00046       timeout_tv.tv_usec = timeout_tv.tv_usec % 1000000;
00047     }
00048   FD_ZERO (&send_fd_set);
00049   RCS_FD_SET (fd, &send_fd_set);
00050 
00051   ptr = (char *) vptr;          /* can't do pointer arithmetic on void* */
00052   nleft = n;
00053   start_time = etime ();
00054   while (nleft > 0)
00055     {
00056       if (fabs (_timeout) > 1E-6)
00057         {
00058           if (_timeout > 0)
00059             {
00060               select_ret =
00061                 dl_select (fd + 1, (fd_set *) NULL, &send_fd_set,
00062                            (fd_set *) NULL, &timeout_tv);
00063             }
00064           else
00065             {
00066               select_ret =
00067                 dl_select (fd + 1, (fd_set *) NULL, &send_fd_set,
00068                            (fd_set *) NULL, NULL);
00069             }
00070           switch (select_ret)
00071             {
00072             case -1:
00073 #if !defined(_Windows) || defined(gnuwin32)
00074               rcs_print_error ("Error in select: %d -> %s\n", errno,
00075                                strerror (errno));
00076 #else
00077               rcs_print_error ("Error in select: %d\n",
00078                                dl_WSAGetLastError ());
00079 #endif
00080               rcs_print_error
00081                 ("sendn(fd=%d, vptr=%p, int n=%d, int _flags=%d, double _timeout=%f) failed.\n",
00082                  fd, vptr, n, _flags, _timeout);
00083               return -1;
00084 
00085             case 0:
00086               rcs_print_error ("Write timed out.\n");
00087               return -1;
00088 
00089             default:
00090               break;
00091             }
00092         }
00093       if ((nwritten = dl_send (fd, ptr, nleft, _flags)) == -1)
00094         {
00095 #if!defined(_WINDOWS) || defined(gnuwin32)
00096           rcs_print_error ("Send error: %d = %s\n", errno, strerror (errno));
00097 #else
00098           rcs_print_error ("Send error: %d\n", dl_WSAGetLastError ());
00099 #endif
00100           return (-1);          /* error */
00101         }
00102       nleft -= nwritten;
00103       ptr += nwritten;
00104       if (nleft > 0 && _timeout > 0.0)
00105         {
00106           current_time = etime ();
00107           if (current_time - start_time > _timeout)
00108             {
00109               rcs_print_error ("sendn: timed out after %f seconds.\n",
00110                                current_time - start_time);
00111               return (-1);
00112             }
00113           esleep (0.001);
00114         }
00115     }
00116   rcs_print_debug (PRINT_SOCKET_WRITE_SIZE, "wrote %d bytes to %d\n", n, fd);
00117   return (n);
00118 }

void handle_pipe_error int    id [static]
 

Definition at line 113 of file tcpproxy.cc.

00114     {
00115       rcs_print_error ("Can't load socket interface.\n");
00116       exit (-1);
00117     }

void handle_sigint int    id [static]
 

Definition at line 123 of file tcpproxy.cc.

00126     {
00127       rcs_print_error ("Couldn't get host address for (%s).\n", remote_host);

int main int    argc,
char **    argv
 

Definition at line 144 of file tcpproxy.cc.

00144                               : Couldn't get host address for (%s).\n",
00145                        remote_host);
00146       exit (-1);
00147     }
00148 #endif
00149   server_socket_address.sin_port = dl_htons ((unsigned short) remote_port);
00150 
00151   memset (&proxy_socket_address, 0, sizeof (proxy_socket_address));
00152   proxy_socket_address.sin_family = AF_INET;
00153   proxy_socket_address.sin_addr.s_addr = dl_htonl (INADDR_ANY);
00154   proxy_socket_address.sin_port = dl_htons (local_port);
00155 
00156   rcs_print_debug (PRINT_CMS_CONFIG_INFO,
00157                    "Registering server on TCP port %d.\n",
00158                    dl_ntohs (proxy_socket_address.sin_port));
00159   if (proxy_socket_address.sin_port == 0)
00160     {
00161       rcs_print_error ("server can not register on port number 0.\n");
00162       exit (-1);
00163     }
00164   SOCKET connection_socket;
00165 
00166   if ((long) (connection_socket = dl_socket (AF_INET, SOCK_STREAM, 0)) <= 0)
00167     {
00168       rcs_print_error ("socket error: %d -- %s\n", errno, strerror (errno));
00169       rcs_print_error ("Server can not open stream socket.\n");
00170       exit (-1);
00171     }
00172 
00173   if (set_tcp_socket_options (connection_socket) < 0)
00174     {
00175       exit (-1);
00176     }
00177   if (dl_bind (connection_socket, (struct sockaddr *) &proxy_socket_address,
00178                sizeof (proxy_socket_address)) < 0)
00179     {
00180       rcs_print_error ("bind error: %d -- %s\n", errno, strerror (errno));
00181       rcs_print_error
00182         ("Server can not bind the connection socket on port %d.\n",
00183          dl_ntohs (proxy_socket_address.sin_port));
00184       exit (-1);
00185     }
00186   if (dl_listen (connection_socket, 5) < 0)
00187     {
00188       rcs_print_error ("listen error: %d -- %s\n", errno, strerror (errno));
00189       rcs_print_error ("TCP Server: error on call to listen for port %d.\n",
00190                        dl_ntohs (server_socket_address.sin_port));
00191       exit (-1);
00192     }
00193 
00194   unsigned long bytes_ready;
00195   int ready_descriptors;
00196   fd_set read_fd_set, write_fd_set;
00197   FD_ZERO (&read_fd_set);
00198   FD_ZERO (&write_fd_set);
00199   RCS_FD_SET (connection_socket, &read_fd_set);
00200   SOCKET maxfdpl;
00201   maxfdpl = connection_socket + 1;
00202   TCP_PROXY_ENTRY *current_entry;
00203 
00204 #ifndef DOS_WINDOWS
00205   signal (SIGPIPE, handle_pipe_error);
00206 #endif
00207   signal (SIGINT, handle_sigint);
00208   rcs_print
00209     ("Running TCP proxy  for:\n (TCP port %d) \n(connection_socket = %d)\n(remote_host = %s)\n(server_IP_address = %s)\n(remote_port = %d)",
00210      dl_ntohs (proxy_socket_address.sin_port), connection_socket, remote_host,
00211      dl_inet_ntoa (server_socket_address.sin_addr), remote_port);
00212 
00213   char temp_buffer[4096];
00214 
00215   while (!tcpproxy_quit)
00216     {
00217       ready_descriptors =
00218         dl_select (maxfdpl,
00219                    &read_fd_set,
00220                    &write_fd_set, (fd_set *) NULL, (timeval *) NULL);
00221       if (ready_descriptors < 0)
00222         {
00223           rcs_print_error
00224             ("select(%d,%d,%d,NULL,NULL) error.(errno = %d | %s)\n", maxfdpl,
00225              read_fd_set, write_fd_set, errno, strerror (errno));
00226           continue;
00227         }
00228       current_entry = (TCP_PROXY_ENTRY *) proxy_sockets->get_head ();
00229       while (NULL != current_entry)
00230         {
00231           if (dl_fd_isset (current_entry->client_socket, &read_fd_set))
00232             {
00233               ready_descriptors--;
00234               dl_ioctlsocket (current_entry->client_socket, FIONREAD,
00235                               &bytes_ready);
00236               if (bytes_ready == 0)
00237                 {
00238                   rcs_print ("Socket closed by host with IP address %s.\n",
00239                              dl_inet_ntoa (current_entry->client_address.
00240                                            sin_addr));
00241                   dl_closesocket (current_entry->server_socket);
00242                   dl_closesocket (current_entry->client_socket);
00243                   if (dl_fd_isset
00244                       (current_entry->server_socket, &read_fd_set))
00245                     {
00246                       RCS_FD_CLR (current_entry->server_socket, &read_fd_set);
00247                     }
00248                   if (dl_fd_isset
00249                       (current_entry->client_socket, &read_fd_set))
00250                     {
00251                       RCS_FD_CLR (current_entry->client_socket, &read_fd_set);
00252                     }
00253                   proxy_sockets->delete_current_node ();
00254                   current_entry =
00255                     (TCP_PROXY_ENTRY *) proxy_sockets->get_next ();
00256                   continue;
00257                 }
00258               else
00259                 {
00260                   while (bytes_ready > 0)
00261                     {
00262                       if (bytes_ready > 4096)
00263                         {
00264                           recvn (current_entry->client_socket, temp_buffer,
00265                                  4096, 0, -1, NULL);
00266                           sendn (current_entry->server_socket, temp_buffer,
00267                                  4096, 0, -1);
00268                           bytes_ready -= 4096;
00269                         }
00270                       else
00271                         {
00272                           recvn (current_entry->client_socket, temp_buffer,
00273                                  bytes_ready, 0, -1, NULL);
00274                           sendn (current_entry->server_socket, temp_buffer,
00275                                  bytes_ready, 0, -1);
00276                           bytes_ready = 0;
00277                           break;
00278                         }
00279                     }
00280                 }
00281             }
00282           else
00283             {
00284               RCS_FD_SET (current_entry->client_socket, &read_fd_set);
00285             }
00286           if (dl_fd_isset (current_entry->server_socket, &read_fd_set))
00287             {
00288               ready_descriptors--;
00289 #ifdef WIN32
00290               dl_ioctlsocket (current_entry->server_socket, FIONREAD,
00291                               &bytes_ready);
00292 #else
00293 #ifndef VXWORKS
00294               ioctl (current_entry->server_socket, FIONREAD,
00295                      (caddr_t) & bytes_ready);
00296 #else
00297               ioctl (current_entry->server_socket, FIONREAD,
00298                      (int) &bytes_ready);
00299 #endif
00300 #endif
00301               if (bytes_ready == 0)
00302                 {
00303                   rcs_print ("Socket closed by host with IP address %s.\n",
00304                              dl_inet_ntoa (server_socket_address.sin_addr));
00305                   dl_closesocket (current_entry->server_socket);
00306                   dl_closesocket (current_entry->client_socket);
00307                   if (dl_fd_isset
00308                       (current_entry->server_socket, &read_fd_set))
00309                     {
00310                       RCS_FD_CLR (current_entry->server_socket, &read_fd_set);
00311                     }
00312                   if (dl_fd_isset
00313                       (current_entry->client_socket, &read_fd_set))
00314                     {
00315                       RCS_FD_CLR (current_entry->client_socket, &read_fd_set);
00316                     }
00317                   proxy_sockets->delete_current_node ();
00318                   current_entry =
00319                     (TCP_PROXY_ENTRY *) proxy_sockets->get_next ();
00320                   continue;
00321                 }
00322               else
00323                 {
00324                   while (bytes_ready > 0)
00325                     {
00326                       if (bytes_ready > 4096)
00327                         {
00328                           recvn (current_entry->server_socket, temp_buffer,
00329                                  4096, 0, -1, NULL);
00330                           sendn (current_entry->client_socket, temp_buffer,
00331                                  4096, 0, -1);
00332                           bytes_ready -= 4096;
00333                         }
00334                       else
00335                         {
00336                           recvn (current_entry->server_socket, temp_buffer,
00337                                  bytes_ready, 0, -1, NULL);
00338                           sendn (current_entry->client_socket, temp_buffer,
00339                                  bytes_ready, 0, -1);
00340                           bytes_ready = 0;
00341                           break;
00342                         }
00343                     }
00344                 }
00345             }
00346           else
00347             {
00348               RCS_FD_SET (current_entry->server_socket, &read_fd_set);
00349             }
00350           current_entry = (TCP_PROXY_ENTRY *) proxy_sockets->get_next ();
00351         }
00352       if (dl_fd_isset (connection_socket, &read_fd_set)
00353           && ready_descriptors > 0)
00354         {
00355           ready_descriptors--;
00356           current_entry = new TCP_PROXY_ENTRY;
00357           if (NULL == current_entry)
00358             {
00359               continue;
00360             }
00361           current_entry->server_socket = dl_socket (AF_INET, SOCK_STREAM, 0);
00362           if (((long) current_entry->server_socket) <= 0)
00363             {
00364               rcs_print_error ("Error from socket() (errno = %d:%s)\n",
00365                                errno, strerror (errno));
00366               delete current_entry;
00367               continue;
00368             }
00369           proxy_client_socket_address.sin_family = AF_INET;
00370           proxy_client_socket_address.sin_addr.s_addr = dl_htonl (INADDR_ANY);
00371           proxy_client_socket_address.sin_port = dl_htons (0);
00372 
00373           if (dl_bind (current_entry->server_socket,
00374                        (struct sockaddr *) &proxy_client_socket_address,
00375                        sizeof (proxy_client_socket_address)) < 0)
00376             {
00377 #if defined(_Windows) && !defined(USE_PCNFS)
00378               rcs_print_error (" bind error %d\n", dl_WSAGetLastError ());
00379 #else
00380               rcs_print_error (" bind error %d = %s\n", errno,
00381                                strerror (errno));
00382 #endif
00383               delete current_entry;
00384               continue;
00385             }
00386           if (dl_connect (current_entry->server_socket,
00387                           (struct sockaddr *) &server_socket_address,
00388                           sizeof (server_socket_address)) < 0)
00389             {
00390 #if defined(_WINDOWS) && !defined(USE_PCNFS)
00391               rcs_print_error ("Couldn't connect. Error = (%d)\n",
00392                                dl_WSAGetLastError ());
00393 #else
00394               rcs_print_error ("Couldn't connect. Error = (%d:%s)\n",
00395                                errno, strerror (errno));
00396 #endif
00397               delete current_entry;
00398               current_entry = NULL;
00399               continue;
00400             }
00401           int client_address_length;
00402           client_address_length = sizeof (current_entry->client_address);
00403           current_entry->client_socket = dl_accept (connection_socket,
00404                                                     (struct sockaddr *)
00405                                                     &
00406                                                     (current_entry->
00407                                                      client_address),
00408                                                     &client_address_length);
00409           if (((long) current_entry->client_socket) <= 0)
00410             {
00411 #if defined(_WINDOWS) && !defined(USE_PCNFS)
00412               rcs_print_error ("accept error = (%d)\n",
00413                                dl_WSAGetLastError ());
00414 #else
00415               rcs_print_error ("accept error = (%d:%s)\n",
00416                                errno, strerror (errno));
00417 #endif
00418               continue;
00419             }
00420           rcs_print ("Socket opened by host with IP address %s.\n",
00421                      dl_inet_ntoa (current_entry->client_address.sin_addr));
00422           if (NULL != proxy_sockets)
00423             {
00424               proxy_sockets->store_at_tail (current_entry,
00425                                             sizeof (TCP_PROXY_ENTRY), 0);
00426             }
00427           if (maxfdpl < current_entry->client_socket + 1)
00428             {
00429               maxfdpl = current_entry->client_socket + 1;
00430             }
00431           if (maxfdpl < current_entry->server_socket + 1)
00432             {
00433               maxfdpl = current_entry->server_socket + 1;
00434             }
00435           RCS_FD_SET (current_entry->server_socket, &read_fd_set);
00436           RCS_FD_SET (current_entry->client_socket, &read_fd_set);
00437         }
00438       else
00439         {
00440           RCS_FD_SET (connection_socket, &read_fd_set);
00441         }
00442       if (0 != ready_descriptors)
00443         {
00444           rcs_print_error ("%d descriptors ready but not serviced.\n",
00445                            ready_descriptors);
00446         }
00447     }
00448 
00449 
00450   current_entry = (TCP_PROXY_ENTRY *) proxy_sockets->get_head ();
00451   while (NULL != current_entry)
00452     {
00453       dl_closesocket (current_entry->server_socket);
00454       dl_closesocket (current_entry->client_socket);
00455       current_entry = (TCP_PROXY_ENTRY *) proxy_sockets->get_next ();
00456     }
00457   dl_closesocket (connection_socket);
00458   delete proxy_sockets;
00459   exit (0);
00460 }


Variable Documentation

int recvn_timedout
 

Definition at line 55 of file tcpproxy.cc.

int print_recvn_timeout_errors
 

Definition at line 56 of file tcpproxy.cc.

int last_pipe_error_id = 0 [static]
 

Definition at line 110 of file tcpproxy.cc.

int tcpproxy_quit = 0
 

Definition at line 119 of file tcpproxy.cc.

int last_sigint_id = 0 [static]
 

Definition at line 120 of file tcpproxy.cc.

struct hostent* server_host_entry
 

Definition at line 130 of file tcpproxy.cc.


Generated on Sun Dec 2 15:58:01 2001 for rcslib by doxygen1.2.11.1 written by Dimitri van Heesch, © 1997-2001