www.pudn.com > watsock.zip > WINSOCK.C


/* 
 * Copyright (C) 1993 by ISA Corp.  All Rights Reserved. 
 * 
 * $Header: $ 
 * 
 * Name:        Windows Socket API for Wat-TCP 1.0 
 * Author: 
 * Date:        1993 
 * 
 * Description: 
 * 
 * This DLL implements the Windows Socket API version 1.1 for the 
 * Waterloo TCP stack ver 1.0. 
 * 
 * Refer to the Windows Sockets Version 1.1 DRAFT 2 specification 
 * for a complete description how to use the API. 
 *  
 * 
 ************************************************************************* 
 *                                                                       * 
 *   THE DLL IS NOT WINSOCK COMPLIANT AS ONLY THOSE ROUTINES NEEDED      * 
 *   TO IMPLEMENT THE CLIENT (PC) SIDE OF THE INTERFACE ARE SUPPORTED.   * 
 *                                                                       * 
 ************************************************************************* 
 * 
 * 
 */ 
#include  
#include  
#include "winsock.h" 
 
static char     *version = "Wat-TCP version 1.0 Socket API"; 
static int      init = 0; 
static int      lasterror = 0 ; 
 
#define WSA_VERSION(major,minor) ((major) + 256*(minor)) 
 
extern int PASCAL FAR wattcp_init(void); 
extern void sock_init(); 
extern int PASCAL FAR wat_socket(int domain, int tpye, int protocol); 
extern int PASCAL FAR wat_connect(SOCKET s, struct sockaddr FAR *name, int namelen); 
extern int PASCAL FAR wat_closesocket(SOCKET s); 
extern int PASCAL FAR wat_select(int nfds, fd_set FAR *readfds, 
    fd_set FAR *writefds, fd_set FAR *exceptfds, struct timeval FAR *timeout); 
extern int PASCAL FAR wat_receive(SOCKET s, char FAR *buf, int len, int flags); 
extern int PASCAL FAR wat_send(SOCKET s, char FAR *buf, int len, int flags); 
extern struct hostent FAR * PASCAL FAR wat_gethostbyname(char FAR *name); 
extern unsigned long PASCAL FAR wat_inet_addr(char FAR *cp); 
extern u_long PASCAL FAR wat_htonl(u_long hostlong); 
extern u_long PASCAL FAR wat_ntohl(u_long netlong); 
extern u_short PASCAL FAR wat_htons(u_short hostshort); 
extern u_short PASCAL FAR wat_ntohs(u_short netshort); 
extern int PASCAL FAR wat_WSACleanup(void); 
 
/* --- DLL initialization --- */ 
int PASCAL FAR LibMain(HANDLE hInstance, WORD wDataSeg, WORD wHeapSize, LPSTR lpCmdLine) 
{ 
    return(1); 
} /* LibMain */ 
 
void PASCAL FAR WEP(int nParameter) 
{ 
} /* WEP */ 
 
int PASCAL FAR WSAStartup(WORD wVersionRequired, LPWSADATA lpWSAData) 
{ 
    int major = LOBYTE(wVersionRequired); 
    int minor = HIBYTE(wVersionRequired); 
     
/* verify stack is loaded and WSA version is correct */ 
      if (wattcp_init() == 0 )    
	  return(WSASYSNOTREADY);         /* PC-NFS inittialize fails */ 
       
      if ( (major > 2) || ((major == 2) && (minor > 0)) )  
	  return(WSAVERNOTSUPPORTED);     /* version not supported */ 
     
    /* return WSA status */ 
    lpWSAData->wVersion = WSA_VERSION(1,1); 
    lpWSAData->wHighVersion = WSA_VERSION(1,1); 
    memcpy(lpWSAData->szDescription, version, strlen(version)+1); 
    lpWSAData->szSystemStatus[0] = '\0'; 
    lpWSAData->iMaxSockets = 8; 
    lpWSAData->iMaxUdpDg = 0; 
    lpWSAData->lpVendorInfo = (char FAR *) 0; 
 
    init = 1;                             /* must be set according to spec */ 
    return(0); 
} /* WSAStartup */ 
 
 
 
/* --- Windows Socket API --- */ 
 
 
/* socket - create a socket */ 
SOCKET PASCAL FAR socket(int domain, int type, int protocol) 
{    
    if ( init == 0 ) { 
	 lasterror = WSANOTINITIALISED; 
	 return(INVALID_SOCKET) ; 
    } 
    lasterror = wat_socket(domain, type, protocol); 
    if( lasterror > WSABASEERR ) 
	 return(INVALID_SOCKET); 
    return(lasterror) ; 
} /* socket */ 
 
 
/* connect - establish a connection to a peer */ 
int PASCAL FAR connect(SOCKET s, struct sockaddr FAR *name, int namelen) 
{ 
    if ( init == 0 ) { 
	 lasterror = WSANOTINITIALISED; 
	 return(SOCKET_ERROR) ; 
    } 
    lasterror = wat_connect(s, name, namelen) ; 
    if( lasterror > WSABASEERR ) 
	 return(SOCKET_ERROR); 
    return(lasterror) ; 
} /* connect */ 
 
 
/* closesocket - close a socket */ 
int PASCAL FAR closesocket(SOCKET s) 
{ 
   if ( init == 0 ) { 
	lasterror = WSANOTINITIALISED; 
	return(SOCKET_ERROR) ; 
   } 
   lasterror =  wat_closesocket(s) ; 
   if (lasterror > WSABASEERR) 
	return(SOCKET_ERROR); 
   return(lasterror); 
} /* closesocket */ 
 
 
 
/* select - determine the status of one of more sockets */ 
int PASCAL FAR select(int nfds, fd_set FAR *readfds, fd_set FAR *writefds, fd_set FAR *exceptfds, struct timeval FAR *timeout) 
{ 
   if ( init == 0 ) { 
	lasterror = WSANOTINITIALISED; 
	return(SOCKET_ERROR) ; 
   } 
   lasterror = wat_select(nfds, readfds, writefds, exceptfds, timeout) ; 
   if( lasterror > WSABASEERR) 
	return(SOCKET_ERROR) ; 
   return(lasterror); 
} /* select */ 
 
 
/* recv - receive data from a socket */ 
int PASCAL FAR recv(SOCKET s, char FAR *buf, int len, int flags) 
{ 
   if ( init == 0 ) { 
	lasterror = WSANOTINITIALISED; 
	return(SOCKET_ERROR) ; 
   } 
   lasterror = wat_receive(s, buf, len, flags) ; 
   if(lasterror > WSABASEERR) 
	return(SOCKET_ERROR) ; 
   return(lasterror); 
} /* recv */ 
 
 
/* send - send data on a connected socket */ 
int PASCAL FAR send(SOCKET s, char FAR *buf, int len, int flags) 
{ 
   if ( init == 0 ) { 
	lasterror = WSANOTINITIALISED; 
	return(SOCKET_ERROR) ; 
   } 
   lasterror = wat_send(s, buf, len, flags) ; 
   if(lasterror > WSABASEERR) 
	return(SOCKET_ERROR) ; 
   return(lasterror); 
 
} /* send */ 
 
 
/* gethostbyname - get host information corresponding to a hostname */ 
struct hostent FAR * PASCAL FAR gethostbyname(char FAR *name) 
{ 
   if ( init == 0 ) { 
	lasterror = WSANOTINITIALISED; 
	return(NULL) ; 
   } 
   return( wat_gethostbyname(name)) ; 
} /* gethostbyname */ 
 
 
/* inet_addr - convert a string containin a dotted address */ 
unsigned long PASCAL FAR inet_addr(char FAR *cp) 
{ 
   unsigned long address ; 
   if( !(address = wat_inet_addr(cp)) ) 
	return ( INADDR_NONE ); 
    return ( address ) ; 
} /* inet_addr */ 
 
 
/* host to network byte order */ 
u_long PASCAL FAR htonl(u_long hostlong) 
{ 
    return(wat_htonl(hostlong)); 
} /* htonl */ 
 
u_short PASCAL FAR htons(u_short hostshort) 
{ 
    return(wat_htons(hostshort)); 
} /* htons */ 
 
/* network to host byte order */ 
u_long PASCAL FAR ntohl(u_long netlong) 
{ 
    return(wat_ntohl(netlong)); 
} /* ntohl */ 
 
u_short PASCAL FAR ntohs(u_short netshort) 
{ 
    return(wat_ntohs(netshort)); 
} /* ntohs */ 
 
 
/* FD_ISSET supporting function; not for use by applications */ 
int PASCAL FAR __WSAFDIsSet(SOCKET fd, fd_set FAR *set) 
{ 
    int i; 
    if (set == (fd_set FAR *) 0) 
	return(0); 
    i = set->fd_count; 
    while (i--) 
	if (set->fd_array[i] == fd) 
	    return(1); 
    return(0); 
} /* __WSAFDIsSet */ 
 
 
int PASCAL FAR WSAGetLastError(void) 
{ 
   return(lasterror) ; 
} 
 
/* --- %%% Unsupported Routines --- */ 
 
SOCKET PASCAL FAR accept(SOCKET s, struct sockaddr FAR *addr, int FAR *addrlen) 
{ 
    return(INVALID_SOCKET); 
} /* accept */ 
 
int PASCAL FAR bind(SOCKET s, struct sockaddr FAR *name, int namelen) 
{ 
    return(SOCKET_ERROR); 
} /* bind */ 
 
int PASCAL FAR getpeername(SOCKET s, struct sockaddr FAR *name, int FAR *namelen) 
{ 
    return(SOCKET_ERROR); 
} /* getpeername */ 
 
int PASCAL FAR getsockname(SOCKET s, struct sockaddr FAR *name, int FAR *namelen) 
{ 
    return(SOCKET_ERROR); 
} /* getsockname */ 
 
int PASCAL FAR getsockopt(SOCKET s, int level, int optname, char FAR *optval, int FAR *optlen) 
{ 
    return(SOCKET_ERROR); 
} /* getsockopt */ 
 
int PASCAL FAR ioctlsocket(SOCKET s, long cmd, u_long FAR *argp) 
{ 
    return(SOCKET_ERROR); 
} /* ioctlsocket */ 
 
char FAR * PASCAL FAR inet_ntoa(struct in_addr in) 
{ 
    return((char FAR *) 0); 
} /* inet_ntoa */ 
 
int PASCAL FAR listen(SOCKET s, int backlog) 
{ 
    return(SOCKET_ERROR); 
} /* listen */ 
 
int PASCAL FAR recvfrom(SOCKET s, char FAR *buf, int len, int flags, struct sockaddr FAR *from, int FAR *fromlen) 
{ 
    return(SOCKET_ERROR); 
} /* recvfrom */ 
 
int PASCAL FAR sendto(SOCKET s, char FAR *buf, int len, int flags, struct sockaddr FAR *to, int tolen) 
{ 
    return(SOCKET_ERROR); 
} /* sendto */ 
 
int PASCAL FAR setsockopt(SOCKET s, int level, int optname, char FAR *optval, int optlen) 
{ 
    return(SOCKET_ERROR); 
} /* setsockopt */ 
 
int PASCAL FAR shutdown(SOCKET s, int how) 
{ 
    return(SOCKET_ERROR);   
} /* shutdown */; 
 
struct hostent FAR * PASCAL FAR gethostbyaddr(char FAR *addr, int len, int type) 
{ 
    return((struct hostent FAR *) 0); 
} /* gethostbyaddr */ 
 
int PASCAL FAR gethostname(char FAR *name, int namelen) 
{ 
    return(SOCKET_ERROR); 
} /* gethostname */ 
 
struct protoent FAR * PASCAL FAR getprotobyname(char FAR *name) 
{ 
    return((struct protoent FAR *) 0); 
} /* getprotobyname */ 
 
struct protoent FAR * PASCAL FAR getprotobynumber(int number) 
{ 
    return((struct protoent FAR *) 0); 
} /* getprotobynumber */ 
 
struct servent FAR * PASCAL FAR getservbyname(char FAR *name, char FAR *proto) 
{ 
    return((struct servent FAR *) 0); 
} /* getservbyname */ 
 
struct servent FAR * PASCAL FAR getservbyport(int port, char FAR *proto) 
{ 
    return((struct servent FAR *) 0); 
} /* getservbyport */ 
 
HANDLE PASCAL FAR WSAAsyncGetHostByAddr(HWND hWnd, unsigned int wMsg, char FAR *addr, int len, int type, char FAR *buf, int buflen) 
{ 
    return(0); 
} /* WSAAsyncGetHostByAddr */ 
 
HANDLE PASCAL FAR WSAAsyncGetHostByName(HWND hWnd, unsigned int wMsg, char FAR *name, char FAR *buf, int buflen) 
{ 
    return(0); 
} /* WSAAsyncGetHostByName */ 
 
HANDLE PASCAL FAR WSAAsyncGetProtoByName(HWND hWnd, unsigned int wMsg, char FAR *name, char FAR *buf, int buflen) 
{ 
    return(0); 
} /* WSAAsyncGetProtoByName */ 
 
HANDLE PASCAL FAR WSAAsyncGetProtoByNumber(HWND hWnd, unsigned int wMsg, int number, char FAR *buf, int buflen) 
{ 
    return(0); 
} /* WSAAsyncGetProtoByNumber */ 
 
HANDLE PASCAL FAR WSAAsyncGetServByName(HWND hWnd, unsigned int wMsg, char FAR *name, char FAR *proto, char FAR *buf, int buflen) 
{ 
    return(0); 
} /* WSAAsyncGetServByName */ 
 
HANDLE PASCAL FAR WSAAsyncGetServByPort(HWND hWnd, unsigned int wMsg, int port, char FAR *proto, char FAR *buf, int buflen) 
{ 
    return(0); 
} /* WSAAsyncGetServByPort */ 
 
int PASCAL FAR WSAAsyncSelect(SOCKET s, HWND hWnd, unsigned int wMsg, long lEvent) 
{ 
    return(SOCKET_ERROR); 
} /* WSAAsyncSelect */ 
 
int PASCAL FAR WSACancelAsyncRequest(HANDLE hAsyncTaskHandle) 
{ 
    return(SOCKET_ERROR); 
} /* WSACancelAsyncRequest */ 
 
int PASCAL FAR WSACancelBlockingCall(void) 
{ 
    return(SOCKET_ERROR); 
} /* WSACancelBlockingCall */ 
 
int PASCAL FAR WSACleanup(void) 
{ 
    init = 0 ; 
    return(wat_WSACleanup()) ; 
/*    return(SOCKET_ERROR);  */ 
} /* WSACleanup */ 
 
 
BOOL PASCAL FAR WSAIsBlocking(void) 
{ 
    return(FALSE); 
} /* WSAIsBlocking */ 
 
FARPROC PASCAL FAR WSASetBlockingHook(FARPROC lpBlockFunc) 
{ 
    return((FARPROC) 0); 
} /* WSASetBlockingHook */ 
 
void PASCAL FAR WSASetLastError(int iError) 
{ 
  iError = iError ; 
} /* WSASetLastError */ 
 
int PASCAL FAR WSAUnhookBlockingHook(void) 
{ 
    return(SOCKET_ERROR); 
} /* WSAUnhookBlockingHook */