00001
00002 #include "rcs_defs.hh"
00003 #include "sokintrf.h"
00004 #include "rcs_prnt.hh"
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
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>
00071 #include <sys/types.h>
00072 #include <sys/socket.h>
00073
00074 #include <netinet/in.h>
00075 #if !defined(VXWORKS)
00076 #include <arpa/inet.h>
00077 #include <netdb.h>
00078 #else
00079 unsigned long inet_addr (char *);
00080 char *inet_ntoa (struct in_addr);
00081 #include <sockLib.h>
00082 #include <ioLib.h>
00083 #include <selectLib.h>
00084 #include <inetLib.h>
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 }
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
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
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
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
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
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 }