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

sokintrf.c

Go to the documentation of this file.
00001 
00002 #include "rcs_defs.hh"          /* _WINDOWS, EXTERN_C_STD_HEADERS */
00003 #include "sokintrf.h"           /* Forward Fuction Prototypes */
00004 #include "rcs_prnt.hh"          /* rcs_print_error() */
00005 
00006 #ifdef EXTERN_C_STD_HEADERS
00007 extern "C"
00008 {
00009 #endif
00010 
00011 #ifndef MAKEWORD
00012 #define MAKEWORD(a,b) \
00013         ((unsigned short) (((unsigned char) (a)) | ((unsigned short) ((unsigned char) (b)) << 8)))
00014 #endif
00015 
00016   int WSA_count = 0;
00017 
00018 #if defined(_WINDOWS) && !defined(gnuwin32)
00019 #define USE_WINSOCK
00020 #endif
00021 
00022 #ifdef _WINDOWS
00023 #ifdef gnuwin32
00024 #define WSADESCRIPTION_LEN      256
00025 #define WSASYS_STATUS_LEN       128
00026 
00027 #ifndef WSADATA_DEFINED
00028 #define WSADATA_DEFINED
00029   typedef struct WSAData
00030   {
00031     short wVersion;
00032     short wHighVersion;
00033     char szDescription[WSADESCRIPTION_LEN + 1];
00034     char szSystemStatus[WSASYS_STATUS_LEN + 1];
00035     unsigned short iMaxSockets;
00036     unsigned short iMaxUdpDg;
00037     char RCS_FAR *lpVendorInfo;
00038   }
00039   WSADATA;
00040 #endif
00041 #endif
00042 
00043   typedef WSADATA RCS_FAR *LPWSADATA;
00044   typedef int (RCS_PASCAL RCS_FAR * PTR_TO_WSASTARTUP) (short, LPWSADATA);
00045   extern PTR_TO_WSASTARTUP ptr_to_wsastartup;
00046   typedef int (RCS_PASCAL RCS_FAR * PTR_TO_WSACLEANUP) (void);
00047   extern PTR_TO_WSACLEANUP ptr_to_wsacleanup;
00048 
00049 
00050   PTR_TO_WSASTARTUP ptr_to_wsastartup = NULL;
00051   PTR_TO_WSACLEANUP ptr_to_wsacleanup = NULL;
00052   PTR_TO_WSAGETLASTERROR ptr_to_wsagetlasterror = NULL;
00053   void RCS_FAR *socket_library_instance = (void RCS_FAR *) NULL;
00054 
00055 #else                           /* _WINDOWS */
00056 
00057 
00058 
00059 
00060 #ifdef MSDOS
00061 #include <tklib.h>
00062 #include <sys\tk_types.h>
00063 #include <sys\nfs_time.h>
00064 #include <sys\socket.h>
00065 #include <io.h>
00066 #include <netinet\in.h>
00067 #include <in_addr.h>
00068 #include <netdb.h>
00069 #else
00070 #include <unistd.h>             /* close() */
00071 #include <sys/types.h>          /* u_long, u_short */
00072 #include <sys/socket.h>         /* send(), recv(), */
00073   /* socket(), accept(), bind(), listen() */
00074 #include <netinet/in.h>         /* htonl(), htons(), ntohs(), ntohl() */
00075 #if !defined(VXWORKS)
00076 #include <arpa/inet.h>          /* inet_ntoa(), inet_addr() */
00077 #include <netdb.h>              /* gethostbyname() */
00078 #else
00079   unsigned long inet_addr (char *);
00080   char *inet_ntoa (struct in_addr);
00081 #include <sockLib.h>            /* accept(), socket(), bind(), ... */
00082 #include <ioLib.h>              /* ioctl() */
00083 #include <selectLib.h>          /* select() */
00084 #include <inetLib.h>            /* inet_makeaddr */
00085 #endif
00086 
00087 #endif
00088 
00089 #ifdef CenterLine
00090   int ioctl (int, int, caddr_t);
00091 #endif
00092 #endif
00093 
00094 
00095 #ifdef EXTERN_C_STD_HEADERS
00096 }                               // extern "C"
00097 #endif
00098 
00099 
00100 enum SOCKET_AVAILABILITY
00101 {
00102   SOCKET_AVAIL_NOT_CHECKED,
00103   SOCKETS_AVAILABLE,
00104   SOCKETS_NOT_AVAILABLE
00105 };
00106 enum SOCKET_AVAILABILITY socket_availability = SOCKET_AVAIL_NOT_CHECKED;
00107 
00108 
00109 
00110 /* Declare Pointers to all the Socket Functions */
00111 #if defined(USE_DYNAMICALLY_LOADED_POINTERS)
00112 
00113 
00114 typedef int (RCS_PASCAL RCS_FAR * PTR_TO_SEND) (SOCKET, char RCS_FAR *, int,
00115                                                 int);
00116 extern PTR_TO_SEND ptr_to_send;
00117 #ifdef MSDOS
00118 typedef int (RCS_PASCAL RCS_FAR * PTR_TO_SELECT) (int, void *, void *, void *,
00119                                                   struct timeval *);
00120 #else
00121 typedef int (RCS_PASCAL RCS_FAR * PTR_TO_SELECT) (int, fd_set *, fd_set *,
00122                                                   fd_set *, struct timeval *);
00123 #endif
00124 extern PTR_TO_SELECT ptr_to_select;
00125 typedef int (RCS_PASCAL RCS_FAR * PTR_TO_RECV) (SOCKET, char RCS_FAR *, int,
00126                                                 int);
00127 extern PTR_TO_RECV ptr_to_recv;
00128 typedef int (RCS_PASCAL RCS_FAR * PTR_TO_RECVFROM) (SOCKET, char RCS_FAR *,
00129                                                     int, int,
00130                                                     struct sockaddr *, int *);
00131 extern PTR_TO_RECVFROM ptr_to_recvfrom;
00132 typedef int (RCS_PASCAL RCS_FAR * PTR_TO_SENDTO) (SOCKET, char RCS_FAR *, int,
00133                                                   int, struct sockaddr *,
00134                                                   int);
00135 extern PTR_TO_SENDTO ptr_to_sendto;
00136 typedef int (RCS_PASCAL RCS_FAR * PTR_TO_SETSOCKOPT) (SOCKET s, int level,
00137                                                       int optname,
00138                                                       const char RCS_FAR *
00139                                                       optval, int optlen);
00140 extern PTR_TO_SETSOCKOPT ptr_to_setsockopt;
00141 typedef int (RCS_PASCAL RCS_FAR * PTR_TO_IOCTLSOCKET) (SOCKET s,
00142                                                        long cmd,
00143                                                        unsigned long RCS_FAR *
00144                                                        argp);
00145 extern PTR_TO_IOCTLSOCKET ptr_to_ioctlsocket;
00146 typedef unsigned short (RCS_PASCAL RCS_FAR *
00147                         PTR_TO_NTOHS) (unsigned short netshort);
00148 extern PTR_TO_NTOHS ptr_to_ntohs;
00149 typedef unsigned long (RCS_PASCAL RCS_FAR *
00150                        PTR_TO_NTOHL) (unsigned long netlong);
00151 extern PTR_TO_NTOHL ptr_to_ntohl;
00152 typedef unsigned short (RCS_PASCAL RCS_FAR *
00153                         PTR_TO_HTONS) (unsigned short hostshort);
00154 extern PTR_TO_HTONS ptr_to_htons;
00155 typedef unsigned long (RCS_PASCAL RCS_FAR *
00156                        PTR_TO_HTONL) (unsigned long hostlong);
00157 extern PTR_TO_HTONL ptr_to_htonl;
00158 typedef int (RCS_PASCAL RCS_FAR * PTR_TO_LISTEN) (SOCKET, int);
00159 extern PTR_TO_LISTEN ptr_to_listen;
00160 typedef int (RCS_PASCAL RCS_FAR * PTR_TO_CONNECT) (SOCKET,
00161                                                    struct sockaddr RCS_FAR *,
00162                                                    int);
00163 extern PTR_TO_CONNECT ptr_to_connect;
00164 typedef int (RCS_PASCAL RCS_FAR * PTR_TO_CLOSESOCKET) (SOCKET);
00165 extern PTR_TO_CLOSESOCKET ptr_to_closesocket;
00166 typedef SOCKET (RCS_PASCAL RCS_FAR * PTR_TO_SOCKET) (int, int, int);
00167 extern PTR_TO_SOCKET ptr_to_socket;
00168 typedef unsigned long (RCS_PASCAL RCS_FAR *
00169                        PTR_TO_INET_ADDR) (char RCS_FAR *);
00170 extern PTR_TO_INET_ADDR ptr_to_inet_addr;
00171 typedef char RCS_FAR *(RCS_PASCAL RCS_FAR *
00172                        PTR_TO_INET_NTOA) (struct in_addr);
00173 extern PTR_TO_INET_NTOA ptr_to_inet_ntoa;
00174 extern PTR_TO_ACCEPT ptr_to_accept;
00175 typedef int (RCS_PASCAL RCS_FAR * PTR_TO_BIND) (SOCKET,
00176                                                 struct sockaddr RCS_FAR *,
00177                                                 int);
00178 extern PTR_TO_BIND ptr_to_bind;
00179 typedef struct hostent *(RCS_FAR * PTR_TO_GETHOSTBYNAME) (char RCS_FAR *);
00180 extern PTR_TO_GETHOSTBYNAME ptr_to_get_hostbyname;
00181 #ifdef _WINDOWS
00182 typedef int (RCS_FAR * PTR_TO_WSAISFDSET) (SOCKET, fd_set RCS_FAR *);
00183 extern PTR_TO_WSAISFDSET ptr_to_wsaisfdset;
00184 #endif
00185 
00186 PTR_TO_SOCKET ptr_to_socket = NULL;
00187 PTR_TO_CLOSESOCKET ptr_to_closesocket = NULL;
00188 PTR_TO_ACCEPT ptr_to_accept = NULL;
00189 PTR_TO_BIND ptr_to_bind = NULL;
00190 PTR_TO_CONNECT ptr_to_connect = NULL;
00191 PTR_TO_LISTEN ptr_to_listen = NULL;
00192 PTR_TO_SELECT ptr_to_select = NULL;
00193 PTR_TO_SEND ptr_to_send = NULL;
00194 PTR_TO_SENDTO ptr_to_sendto = NULL;
00195 PTR_TO_RECV ptr_to_recv = NULL;
00196 PTR_TO_RECVFROM ptr_to_recvfrom = NULL;
00197 PTR_TO_INET_ADDR ptr_to_inet_addr = NULL;
00198 PTR_TO_INET_NTOA ptr_to_inet_ntoa = NULL;
00199 PTR_TO_HTONL ptr_to_htonl = NULL;
00200 PTR_TO_HTONS ptr_to_htons = NULL;
00201 PTR_TO_NTOHL ptr_to_ntohl = NULL;
00202 PTR_TO_NTOHS ptr_to_ntohs = NULL;
00203 PTR_TO_SETSOCKOPT ptr_to_setsockopt = NULL;
00204 PTR_TO_IOCTLSOCKET ptr_to_ioctlsocket = NULL;
00205 PTR_TO_GETHOSTBYNAME ptr_to_gethostbyname = NULL;
00206 
00207 PTR_TO_WSAISFDSET ptr_to_wsaisfdset = NULL;
00208 
00209 static FARPROC GetProc (char RCS_FAR * proc_name);
00210 
00211 FARPROC
00212 GetProc (char RCS_FAR * proc_name)
00213 {
00214   FARPROC retval = NULL;
00215   static char buffer[128];
00216   char *ptr;
00217   if (socket_library_instance == NULL)
00218     {
00219       return NULL;
00220     }
00221   retval = GetProcAddress (socket_library_instance, proc_name);
00222   if (retval != NULL)
00223     {
00224       return retval;
00225     }
00226   strcpy (buffer, proc_name);
00227   ptr = buffer;
00228   while (*ptr)
00229     {
00230       *ptr = (char) toupper (*ptr);
00231     }
00232   retval = GetProcAddress (socket_library_instance, proc_name);
00233   if (retval != NULL)
00234     {
00235       return retval;
00236     }
00237   ptr = buffer;
00238   while (*ptr)
00239     {
00240       *ptr = (char) tolower (*ptr);
00241     }
00242   retval = GetProcAddress (socket_library_instance, buffer);
00243   if (retval != NULL)
00244     {
00245       return retval;
00246 
00247     }
00248   return NULL;
00249 }
00250 
00251 #endif /* USE_DYNAMICALLY_LOADED_POINTERS */
00252 
00253 int RCS_EXPORT
00254 load_socket_interface ()
00255 {
00256 #if !defined(_WINDOWS)
00257   socket_availability = SOCKETS_AVAILABLE;
00258   return 0;
00259 #else
00260   short winsock_version;
00261   int wsa_startup_retval;
00262   WSADATA startup_data;
00263 
00264   if (SOCKETS_NOT_AVAILABLE == socket_availability)
00265     {
00266       return -1;
00267     }
00268   if (SOCKETS_AVAILABLE == socket_availability)
00269     {
00270       return 0;
00271     }
00272   socket_availability = SOCKETS_NOT_AVAILABLE;
00273 
00274 #if defined(USE_DYNAMICALLY_LOADED_POINTERS)
00275 #if defined(WIN32)
00276   socket_library_instance = LoadLibrary ("wsock32.dll");
00277   if (socket_library_instance == NULL)
00278     {
00279       rcs_print_error ("Error on LoadLibrary(" "wsock32.dll" ")\n");
00280       return -1;
00281     }
00282 #else
00283   socket_library_instance = (void RCS_FAR *) LoadLibrary ("winsock.dll");
00284   if (((int) socket_library_instance) < HINSTANCE_ERROR)
00285     {
00286       rcs_print_error ("Error %d from LoadLibrary(" "winsock.dll" ")\n",
00287                        socket_library_instance);
00288       return -1;
00289     }
00290 #endif
00291   ptr_to_wsastartup = (PTR_TO_WSASTARTUP) GetProc ("WSAStartup");
00292   if (NULL == ptr_to_wsastartup)
00293     {
00294       rcs_print_error ("Cannot find WSAStartup function.\n");
00295       return -1;
00296     }
00297   ptr_to_wsacleanup = (PTR_TO_WSACLEANUP) GetProc ("WSACleanup");
00298   if (NULL == ptr_to_wsacleanup)
00299     {
00300       rcs_print_error ("Cannot find WSACleanup function.\n");
00301       return -1;
00302     }
00303   ptr_to_wsagetlasterror = (PTR_TO_WSAGETLASTERROR)
00304     GetProc ("WSAGetLastError");
00305   if (NULL == ptr_to_wsagetlasterror)
00306     {
00307       rcs_print_error ("Cannot find WSAGetLastError function.\n");
00308       return -1;
00309     }
00310   ptr_to_wsaisfdset = (PTR_TO_WSAISFDSET) GetProc ("__WSAFDIsSet");
00311   if (NULL == ptr_to_wsaisfdset)
00312     {
00313       rcs_print_error ("Cannot find WSAGetLastError function.\n");
00314       return -1;
00315     }
00316   ptr_to_socket = (PTR_TO_SOCKET) GetProc ("socket");
00317   if (NULL == ptr_to_socket)
00318     {
00319       rcs_print_error ("Cannot find socket function.\n");
00320       return -1;
00321     }
00322   ptr_to_closesocket = (PTR_TO_CLOSESOCKET) GetProc ("closesocket");
00323   if (NULL == ptr_to_closesocket)
00324     {
00325       rcs_print_error ("Cannot find closesocket function.\n");
00326       return -1;
00327     }
00328   ptr_to_bind = (PTR_TO_BIND) GetProc ("bind");
00329   if (NULL == ptr_to_bind)
00330     {
00331       rcs_print_error ("Cannot find bind function.\n");
00332       return -1;
00333     }
00334   ptr_to_connect = (PTR_TO_CONNECT) GetProc ("connect");
00335   if (NULL == ptr_to_connect)
00336     {
00337       rcs_print_error ("Cannot find connect function.\n");
00338       return -1;
00339     }
00340   ptr_to_accept = (PTR_TO_ACCEPT) GetProc ("accept");
00341   if (NULL == ptr_to_accept)
00342     {
00343       rcs_print_error ("Cannot find accept function.\n");
00344       return -1;
00345     }
00346   ptr_to_listen = (PTR_TO_LISTEN) GetProc ("listen");
00347   if (NULL == ptr_to_listen)
00348     {
00349       rcs_print_error ("Cannot find listen function.\n");
00350       return -1;
00351     }
00352   ptr_to_select = (PTR_TO_SELECT) GetProc ("select");
00353   if (NULL == ptr_to_select)
00354     {
00355       rcs_print_error ("Cannot find select function.\n");
00356       return -1;
00357     }
00358   ptr_to_send = (PTR_TO_SEND) GetProc ("send");
00359   if (NULL == ptr_to_send)
00360     {
00361       rcs_print_error ("Cannot find send function.\n");
00362       return -1;
00363     }
00364   ptr_to_recv = (PTR_TO_RECV) GetProc ("recv");
00365   if (NULL == ptr_to_recv)
00366     {
00367       rcs_print_error ("Cannot find recv function.\n");
00368       return -1;
00369     }
00370   ptr_to_sendto = (PTR_TO_SENDTO) GetProc ("sendto");
00371   if (NULL == ptr_to_sendto)
00372     {
00373       rcs_print_error ("Cannot find sendto function.\n");
00374       return -1;
00375     }
00376   ptr_to_recvfrom = (PTR_TO_RECVFROM) GetProc ("recvfrom");
00377   if (NULL == ptr_to_recvfrom)
00378     {
00379       rcs_print_error ("Cannot find recvfrom function.\n");
00380       return -1;
00381     }
00382   ptr_to_inet_addr = (PTR_TO_INET_ADDR) GetProc ("inet_addr");
00383   if (NULL == ptr_to_inet_addr)
00384     {
00385       rcs_print_error ("Cannot find inet_addr function.\n");
00386       return -1;
00387     }
00388   ptr_to_inet_ntoa = (PTR_TO_INET_NTOA) GetProc ("inet_ntoa");
00389   if (NULL == ptr_to_inet_ntoa)
00390     {
00391       rcs_print_error ("Cannot find inet_ntoa function.\n");
00392       return -1;
00393     }
00394 
00395   ptr_to_htonl = (PTR_TO_HTONL) GetProc ("htonl");
00396   if (NULL == ptr_to_htonl)
00397     {
00398       rcs_print_error ("Cannot find htonl function.\n");
00399       return -1;
00400     }
00401   ptr_to_htons = (PTR_TO_HTONS) GetProc ("htons");
00402   if (NULL == ptr_to_htons)
00403     {
00404       rcs_print_error ("Cannot find htons function.\n");
00405       return -1;
00406     }
00407   ptr_to_ntohl = (PTR_TO_NTOHL) GetProc ("ntohl");
00408   if (NULL == ptr_to_ntohl)
00409     {
00410       rcs_print_error ("Cannot find ntohl function.\n");
00411       return -1;
00412     }
00413   ptr_to_ntohs = (PTR_TO_NTOHS) GetProc ("ntohs");
00414   if (NULL == ptr_to_ntohs)
00415     {
00416       rcs_print_error ("Cannot find ntohs function.\n");
00417       return -1;
00418     }
00419   ptr_to_setsockopt = (PTR_TO_SETSOCKOPT) GetProc ("setsockopt");
00420   if (NULL == ptr_to_setsockopt)
00421     {
00422       rcs_print_error ("Cannot find setsockopt function.\n");
00423       return -1;
00424     }
00425   ptr_to_ioctlsocket = (PTR_TO_IOCTLSOCKET) GetProc ("ioctlsocket");
00426   if (NULL == ptr_to_ioctlsocket)
00427     {
00428       rcs_print_error ("Cannot find ioctlsocket function.\n");
00429       return -1;
00430     }
00431   ptr_to_gethostbyname = (PTR_TO_GETHOSTBYNAME) GetProc ("gethostbyname");
00432   if (NULL == ptr_to_gethostbyname)
00433     {
00434       rcs_print_error ("Cannot find gethostbyname function.\n");
00435       return -1;
00436     }
00437 
00438   winsock_version = MAKEWORD (2, 0);
00439   wsa_startup_retval = (*ptr_to_wsastartup) (winsock_version, &startup_data);
00440   if (wsa_startup_retval)
00441     {
00442       rcs_print_error ("Error %d from WSAStartup.\n", wsa_startup_retval);
00443       return -1;
00444     }
00445   socket_availability = SOCKETS_AVAILABLE;
00446 #else /* USE_DYNAMICALLY_LOADED_POINTERS */
00447 #ifdef USE_WINSOCK
00448   winsock_version = MAKEWORD (2, 0);
00449   wsa_startup_retval = WSAStartup (winsock_version, &startup_data);
00450   if (wsa_startup_retval)
00451     {
00452       rcs_print_error ("Error %d from WSAStartup.\n", wsa_startup_retval);
00453       return -1;
00454     }
00455   socket_availability = SOCKETS_AVAILABLE;
00456   return 0;
00457 #endif
00458 #endif /* USE_DYNAMICALLY_LOADED_POINTERS */
00459 
00460 #endif
00461 }
00462 
00463 void RCS_EXPORT
00464 unload_socket_interface ()
00465 {
00466 #ifdef USE_DYNAMICALLY_LOADED_POINTERS
00467   if (SOCKETS_AVAILABLE == socket_availability
00468       && NULL != ptr_to_wsacleanup && socket_library_instance != NULL)
00469     {
00470       (*ptr_to_wsacleanup) ();
00471       FreeLibrary (socket_library_instance);
00472     }
00473   socket_library_instance = NULL;
00474   ptr_to_wsastartup = NULL;
00475   ptr_to_wsagetlasterror = NULL;
00476   ptr_to_wsacleanup = NULL;
00477 #endif /* USE_DYNAMICALLY_LOADED_POINTERS */
00478   socket_availability = SOCKET_AVAIL_NOT_CHECKED;
00479 
00480 }
00481 
00482 #ifdef _WINDOWS
00483 int
00484 dl_WSAGetLastError ()
00485 {
00486 #ifndef USE_WINSOCK
00487   return errno;
00488 #else
00489 #ifdef USE_DYNAMICALLY_LOADED_POINTERS
00490   if (socket_availability != SOCKETS_AVAILABLE
00491       || NULL == ptr_to_wsagetlasterror)
00492     {
00493       rcs_print_error ("Can not call WSAGetLastError.\n");
00494       return 0;
00495     }
00496   return (*ptr_to_wsagetlasterror) ();
00497 #else
00498   return WSAGetLastError ();
00499 #endif
00500 #endif
00501 }
00502 #endif
00503 
00504 int
00505 dl_fd_isset (SOCKET s, fd_set RCS_FAR * set)
00506 {
00507 #if !defined(_WINDOWS) || !defined(USE_DYNAMICALLY_LOADED_POINTERS)
00508   return ((int) FD_ISSET (s, set));
00509 #else
00510   if (socket_availability != SOCKETS_AVAILABLE || NULL == ptr_to_wsaisfdset)
00511     {
00512       rcs_print_error ("Can not call __WSAFDIsSet.\n");
00513       return 0;
00514     }
00515   return (*ptr_to_wsaisfdset) (s, set);
00516 #endif
00517 }
00518 
00519 
00520 int
00521 dl_accept (SOCKET s, struct sockaddr *name, int *plen)
00522 {
00523 #if !defined(USE_DYNAMICALLY_LOADED_POINTERS)
00524   return accept (s, name, plen);
00525 #else
00526   if (socket_availability != SOCKETS_AVAILABLE || NULL == ptr_to_accept)
00527     {
00528       rcs_print_error ("Cannot call accept ().\n");
00529       return -1;
00530     }
00531   return (*ptr_to_accept) (s, name, plen);
00532 #endif
00533 }
00534 
00535 
00536 int RCS_EXPORT
00537 dl_bind (SOCKET s, struct sockaddr *name, int port)
00538 {
00539 #if !defined(USE_DYNAMICALLY_LOADED_POINTERS)
00540   return bind (s, name, port);
00541 #else
00542   if (socket_availability != SOCKETS_AVAILABLE || NULL == ptr_to_bind)
00543     {
00544       rcs_print_error ("Cannot call bind ().\n");
00545       return -1;
00546     }
00547   return (*ptr_to_bind) (s, name, port);
00548 #endif
00549 }
00550 
00551 int RCS_EXPORT
00552 dl_closesocket (SOCKET s)
00553 {
00554 #ifndef USE_WINSOCK
00555   return close (s);
00556 #else
00557 #ifdef USE_DYNAMICALLY_LOADED_POINTERS
00558   if (socket_availability != SOCKETS_AVAILABLE || NULL == ptr_to_closesocket)
00559     {
00560       rcs_print_error ("Cannot call closesocket ().\n");
00561       return -1;
00562     }
00563   return (*ptr_to_closesocket) (s);
00564 #else
00565   return closesocket (s);
00566 #endif
00567 #endif
00568 }
00569 
00570 int RCS_EXPORT
00571 dl_ioctlsocket (SOCKET s, long cmd, unsigned long *argp)
00572 {
00573 #ifndef USE_WINSOCK
00574 #ifndef VXWORKS
00575 #if defined(MSDOS) && !defined(_Windows)
00576   return tk_ioctl (s, (int) cmd, (int *) argp);
00577 #else
00578   return ioctl (s, (int) cmd, (caddr_t) argp);
00579 #endif
00580 #else
00581   return ioctl (s, (int) cmd, (int) argp);
00582 #endif
00583 #else
00584 #ifdef USE_DYNAMICALLY_LOADED_POINTERS
00585   if (socket_availability != SOCKETS_AVAILABLE || NULL == ptr_to_ioctlsocket)
00586     {
00587       rcs_print_error ("Cannot call ioctlsocket ().\n");
00588       return -1;
00589     }
00590   return (*ptr_to_ioctlsocket) (s, cmd, argp);
00591 #else
00592   return ioctlsocket (s, cmd, argp);
00593 #endif
00594 #endif
00595 }
00596 
00597 unsigned long RCS_EXPORT
00598 dl_htonl (unsigned long hostlong)
00599 {
00600 #if !defined(USE_DYNAMICALLY_LOADED_POINTERS)
00601   return htonl (hostlong);
00602 #else
00603   if (socket_availability != SOCKETS_AVAILABLE || NULL == ptr_to_htonl)
00604     {
00605       rcs_print_error ("Cannot call htonl ().\n");
00606       return hostlong;
00607     }
00608   return (*ptr_to_htonl) (hostlong);
00609 #endif
00610 }
00611 
00612 unsigned long RCS_EXPORT
00613 dl_ntohl (unsigned long netlong)
00614 {
00615 #if !defined(USE_DYNAMICALLY_LOADED_POINTERS)
00616   return ntohl (netlong);
00617 #else
00618   if (socket_availability != SOCKETS_AVAILABLE || NULL == ptr_to_ntohl)
00619     {
00620       rcs_print_error ("Cannot call ntohl ().\n");
00621       return netlong;
00622     }
00623   return (*ptr_to_ntohl) (netlong);
00624 #endif
00625 }
00626 
00627 unsigned short RCS_EXPORT
00628 dl_htons (unsigned short hostshort)
00629 {
00630 #if !defined(USE_DYNAMICALLY_LOADED_POINTERS)
00631   return htons (hostshort);
00632 #else
00633   if (socket_availability != SOCKETS_AVAILABLE || NULL == ptr_to_htons)
00634     {
00635       rcs_print_error ("Cannot call htons ().\n");
00636       return hostshort;
00637     }
00638   return (*ptr_to_htons) (hostshort);
00639 #endif
00640 }
00641 
00642 
00643 unsigned short RCS_EXPORT
00644 dl_ntohs (unsigned short netshort)
00645 {
00646 #if !defined(USE_DYNAMICALLY_LOADED_POINTERS)
00647   return ntohs (netshort);
00648 #else
00649   if (socket_availability != SOCKETS_AVAILABLE || NULL == ptr_to_ntohs)
00650     {
00651       rcs_print_error ("Cannot call ntohs ().\n");
00652       return netshort;
00653     }
00654   return (*ptr_to_ntohs) (netshort);
00655 #endif
00656 }
00657 
00658 unsigned long RCS_EXPORT
00659 dl_inet_addr (char *addr_string)
00660 {
00661 #if !defined(USE_DYNAMICALLY_LOADED_POINTERS)
00662   return inet_addr (addr_string);
00663 #else
00664   if (socket_availability != SOCKETS_AVAILABLE || NULL == ptr_to_inet_addr)
00665     {
00666       rcs_print_error ("Cannot call inet_addr ().\n");
00667       return 0;
00668     }
00669   return (*ptr_to_inet_addr) (addr_string);
00670 #endif
00671 }
00672 
00673 char RCS_EXPORT *
00674 dl_inet_ntoa (struct in_addr in)
00675 {
00676 #if !defined(USE_DYNAMICALLY_LOADED_POINTERS)
00677   return (char *) inet_ntoa (in);
00678 #else
00679   if (socket_availability != SOCKETS_AVAILABLE || NULL == ptr_to_inet_ntoa)
00680     {
00681       rcs_print_error ("Cannot call inet_ntoa ().\n");
00682       return NULL;
00683     }
00684   return (*ptr_to_inet_ntoa) (in);
00685 #endif
00686 }
00687 
00688 int RCS_EXPORT
00689 dl_inet_netof (struct in_addr addr)
00690 {
00691 #ifdef WINDOWS
00692   return addr.S_un.S_addr & 0xffffff00;
00693 #else
00694   return inet_netof (addr);
00695 #endif
00696 }
00697 
00698 int RCS_EXPORT
00699 dl_gethostname (char *hostname, int maxlen)
00700 {
00701   return gethostname (hostname, maxlen);
00702 }
00703 
00704 struct in_addr
00705 dl_inet_makeaddr (const int net, const int lna)
00706 {
00707 #ifdef WINDOWS
00708   struct in_addr tempAddress;
00709   tempAddress.S_un.S_addr = ((u_long) net) | ((u_long) lna);
00710   return tempAddress;
00711 #else
00712   return (struct in_addr) inet_makeaddr (net, lna);
00713 #endif
00714 }
00715 
00716 int RCS_EXPORT
00717 dl_listen (SOCKET s, int backlog)
00718 {
00719 #if !defined(USE_DYNAMICALLY_LOADED_POINTERS)
00720   return listen (s, backlog);
00721 #else
00722   if (socket_availability != SOCKETS_AVAILABLE || NULL == ptr_to_listen)
00723     {
00724       rcs_print_error ("Cannot call listen ().\n");
00725       return -1;
00726     }
00727   return (*ptr_to_listen) (s, backlog);
00728 #endif
00729 }
00730 
00731 int RCS_EXPORT
00732 dl_recv (SOCKET s, char *buf, int size, int flags)
00733 {
00734 #if !defined(USE_DYNAMICALLY_LOADED_POINTERS)
00735   return recv (s, buf, size, flags);
00736 #else
00737   if (socket_availability != SOCKETS_AVAILABLE || NULL == ptr_to_recv)
00738     {
00739       rcs_print_error ("Cannot call recv ().\n");
00740       return -1;
00741     }
00742   return (*ptr_to_recv) (s, buf, size, flags);
00743 #endif
00744 }
00745 
00746 int RCS_EXPORT
00747 dl_send (SOCKET s, char *buf, int size, int flags)
00748 {
00749 #if !defined(USE_DYNAMICALLY_LOADED_POINTERS)
00750   return send (s, buf, size, flags);
00751 #else
00752   if (socket_availability != SOCKETS_AVAILABLE || NULL == ptr_to_send)
00753     {
00754       rcs_print_error ("Cannot call recv ().\n");
00755       return -1;
00756     }
00757   return (*ptr_to_send) (s, buf, size, flags);
00758 #endif
00759 }
00760 
00761 int RCS_EXPORT
00762 dl_recvfrom (SOCKET s, char *buf, int size, int flags,
00763              struct sockaddr *from, int *namelen)
00764 {
00765 #if !defined(USE_DYNAMICALLY_LOADED_POINTERS)
00766   return recvfrom (s, buf, size, flags, from, namelen);
00767 #else
00768   if (socket_availability != SOCKETS_AVAILABLE || NULL == ptr_to_recvfrom)
00769     {
00770       rcs_print_error ("Cannot call recvfrom ().\n");
00771       return -1;
00772     }
00773   return (*ptr_to_recvfrom) (s, buf, size, flags, from, namelen);
00774 #endif
00775 }
00776 
00777 int RCS_EXPORT
00778 dl_sendto (SOCKET s, char *buf, int size, int flags,
00779            struct sockaddr *to, int namelen)
00780 {
00781 #if !defined(USE_DYNAMICALLY_LOADED_POINTERS)
00782   return sendto (s, buf, size, flags, to, namelen);
00783 #else
00784   if (socket_availability != SOCKETS_AVAILABLE || NULL == ptr_to_sendto)
00785     {
00786       rcs_print_error ("Cannot call sendto ().\n");
00787       return -1;
00788     }
00789   return (*ptr_to_sendto) (s, buf, size, flags, to, namelen);
00790 #endif
00791 }
00792 
00793 int RCS_EXPORT
00794 dl_select (int maxfd, fd_set * read_fds, fd_set * write_fds,
00795            fd_set * except_fds, struct timeval RCS_FAR * timeout)
00796 {
00797 #if !defined(USE_DYNAMICALLY_LOADED_POINTERS)
00798 #ifdef MSDOS
00799   struct timeval far *temp = timeout;
00800   return select (maxfd, read_fds, write_fds, except_fds,
00801                  ((struct timeval far *) temp));
00802 #else
00803   return select (maxfd, read_fds, write_fds, except_fds, timeout);
00804 #endif
00805 #else
00806   if (socket_availability != SOCKETS_AVAILABLE || NULL == ptr_to_select)
00807     {
00808       rcs_print_error ("Cannot call select ().\n");
00809       return -1;
00810     }
00811   return (*ptr_to_select) (maxfd, read_fds, write_fds, except_fds, timeout);
00812 #endif
00813 }
00814 
00815 SOCKET RCS_EXPORT
00816 dl_socket (int domain, int type, int protocol)
00817 {
00818 #if !defined(USE_DYNAMICALLY_LOADED_POINTERS)
00819   return socket (domain, type, protocol);
00820 #else
00821   if (socket_availability != SOCKETS_AVAILABLE || NULL == ptr_to_socket)
00822     {
00823       rcs_print_error ("Cannot call socket ().\n");
00824       return -1;
00825     }
00826   return (*ptr_to_socket) (domain, type, protocol);
00827 #endif
00828 }
00829 
00830 int RCS_EXPORT
00831 dl_connect (SOCKET s, struct sockaddr *name, int namelen)
00832 {
00833 #if !defined(USE_DYNAMICALLY_LOADED_POINTERS)
00834   return connect (s, name, namelen);
00835 #else
00836   if (socket_availability != SOCKETS_AVAILABLE || NULL == ptr_to_connect)
00837     {
00838       rcs_print_error ("Cannot call connect ().\n");
00839       return -1;
00840     }
00841   return (*ptr_to_connect) (s, name, namelen);
00842 #endif
00843 }
00844 
00845 #ifndef VXWORKS
00846 int RCS_EXPORT
00847 dl_gethostbyname (char *hostname, struct hostent **hpp)
00848 {
00849 #if !defined(USE_DYNAMICALLY_LOADED_POINTERS)
00850 #ifdef VXWORKS
00851   rcs_print_error
00852     ("VxWorks programs must use hostGetByName() rather than dl_gethostbyname().");
00853   return NULL;
00854 #else
00855   *hpp = (struct hostent *) gethostbyname (hostname);
00856   return 0;
00857 #endif
00858 #else
00859   if (socket_availability != SOCKETS_AVAILABLE
00860       || NULL == ptr_to_gethostbyname)
00861     {
00862       rcs_print_error ("Cannot call gethostbyname ().\n");
00863       return -1;
00864     }
00865   *hpp = (*ptr_to_gethostbyname) (hostname);
00866   return 0;
00867 #endif
00868 }
00869 #endif
00870 
00871 int RCS_EXPORT
00872 dl_setsockopt (SOCKET s, int level, int opt, char RCS_FAR * optval, int len)
00873 {
00874 #if !defined(USE_DYNAMICALLY_LOADED_POINTERS)
00875   return setsockopt (s, level, opt, optval, len);
00876 #else
00877   if (socket_availability != SOCKETS_AVAILABLE || NULL == ptr_to_setsockopt)
00878     {
00879       rcs_print_error ("Cannot call setsockopt().\n");
00880       return -1;
00881     }
00882   return (*ptr_to_setsockopt) (s, level, opt, optval, len);
00883 #endif
00884 }

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