[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Dotgnu-pnet-commits] CVS: pnet/support socket.c,1.10,1.11
From: |
Rhys Weatherley <address@hidden> |
Subject: |
[Dotgnu-pnet-commits] CVS: pnet/support socket.c,1.10,1.11 |
Date: |
Tue, 27 May 2003 22:14:28 -0400 |
Update of /cvsroot/dotgnu-pnet/pnet/support
In directory subversions:/tmp/cvs-serv21036/support
Modified Files:
socket.c
Log Message:
Modify the internalcall interface for sockets to match the
changes to pnetlib; IPv6 and IrDA socket addresses should now work.
Index: socket.c
===================================================================
RCS file: /cvsroot/dotgnu-pnet/pnet/support/socket.c,v
retrieving revision 1.10
retrieving revision 1.11
diff -C2 -r1.10 -r1.11
*** socket.c 15 May 2003 02:46:28 -0000 1.10
--- socket.c 28 May 2003 02:14:25 -0000 1.11
***************
*** 56,59 ****
--- 56,62 ----
#include <winsock.h>
#endif
+ #if HAVE_LINUX_IRDA_H
+ #include <linux/irda.h>
+ #endif
#ifdef __cplusplus
***************
*** 62,98 ****
/*
! Note: IP addresses are in network byte order.
! Port numbers are in host byte order.
! */
ILSysIOHandle ILSysIOSocket(ILInt32 domain, ILInt32 type, ILInt32 protocol)
{
return (ILSysIOHandle)(ILNativeInt)(socket(domain, type, protocol));
}
! int ILSysIOSocketBind(ILSysIOHandle sockfd, ILSysIOSockAddr *local_addr)
{
! struct sockaddr_in addr;
! ILMemZero(&addr, sizeof(addr));
! addr.sin_port = htons(local_addr->port);
! addr.sin_family = local_addr->family;
! addr.sin_addr.s_addr = local_addr->addr;
! return (bind((int)(ILNativeInt)sockfd, (struct sockaddr *)&addr,
! sizeof(struct sockaddr_in)) == 0);
}
! int ILSysIOSocketConnect(ILSysIOHandle sockfd, ILSysIOSockAddr *serv_addr)
{
! struct sockaddr_in addr;
! ILMemZero(&addr, sizeof(addr));
! addr.sin_port = htons(serv_addr->port);
! addr.sin_family = serv_addr->family;
! addr.sin_addr.s_addr = serv_addr->addr;
! return (connect((int)(ILNativeInt)sockfd, (struct sockaddr *)&addr,
! sizeof(struct sockaddr_in)) == 0);
}
--- 65,364 ----
/*
! * See if the platform appears to have IPv6 and IrDA support.
! * We assume that all platforms support IPv4.
! */
! #ifdef IN6ADDR_ANY_INIT
! #define IL_IPV6_PRESENT 1
! #endif
! #ifdef LSAP_ANY
! #define IL_IRDA_PRESENT 1
! #endif
!
! /*
! * Address families at the C# level, which may not be the same
! * as those at the operating system level.
! */
! #define IL_AF_INET 2
! #define IL_AF_INET6 23
! #define IL_AF_IRDA 26
!
! /*
! * Combined socket address structure.
! */
! typedef union
! {
! struct sockaddr addr;
! struct sockaddr_in ipv4_addr;
! #ifdef IL_IPV6_PRESENT
! struct sockaddr_in6 ipv6_addr;
! #endif
! #ifdef IL_IRDA_PRESENT
! struct sockaddr_irda irda_addr;
! #endif
!
! } CombinedSockAddr;
!
! /*
! * Convert a serialized address buffer into a combined socket address.
! * Returns zero if there is something wrong with the buffer.
! *
! * Note: the serialized format must match the one used in the IPEndPoint
! * and IrDAEndPoint classes.
! */
! static int SerializedToCombined(unsigned char *buf, ILInt32 len,
!
CombinedSockAddr *addr, int *addrlen)
! {
! int af, port, value;
!
! /* Clear the result */
! ILMemZero(addr, sizeof(CombinedSockAddr));
!
! /* Get the address family, which is stored in little-endian order */
! if(len < 2)
! {
! return 0;
! }
! af = ((((int)(buf[1])) << 8) | ((int)(buf[0])));
!
! /* Determine how to convert the buffer based on the address family */
! if(af == IL_AF_INET)
! {
! if(len < 8)
! {
! return 0;
! }
! addr->ipv4_addr.sin_family = AF_INET;
! port = ((((int)(buf[2])) << 8) | ((int)(buf[3])));
! addr->ipv4_addr.sin_port = htons((unsigned short)port);
! value = ((((long)(buf[4])) << 24) |
! (((long)(buf[5])) << 16) |
! (((long)(buf[6])) << 8) |
! ((long)(buf[7])));
! addr->ipv4_addr.sin_addr.s_addr = htonl((long)value);
! *addrlen = sizeof(struct sockaddr_in);
! return 1;
! }
! #ifdef IL_IPV6_PRESENT
! else if(af == IL_AF_INET6)
! {
! if(len < 28)
! {
! return 0;
! }
! addr->ipv6_addr.sin6_family = AF_INET6;
! port = ((((int)(buf[2])) << 8) | ((int)(buf[3])));
! addr->ipv6_addr.sin6_port = htons((unsigned short)port);
! value = ((((long)(buf[4])) << 24) |
! (((long)(buf[5])) << 16) |
! (((long)(buf[6])) << 8) |
! ((long)(buf[7])));
! addr->ipv6_addr.sin6_flowinfo = htonl((long)value);
! ILMemCpy(&(addr->ipv6_addr.sin6_addr), buf + 8, 16);
! value = ((((long)(buf[24])) << 24) |
! (((long)(buf[25])) << 16) |
! (((long)(buf[26])) << 8) |
! ((long)(buf[27])));
! addr->ipv6_addr.sin6_scope_id = htonl((long)value);
! *addrlen = sizeof(struct sockaddr_in6);
! return 1;
! }
! #endif
! #ifdef IL_IRDA_PRESENT
! else if(af == IL_AF_IRDA)
! {
! if(len < 32)
! {
! return 0;
! }
! addr->irda_addr.sir_family = AF_IRDA;
! addr->irda_addr.sir_lsap_sel = LSAP_ANY;
! value = ((((long)(buf[2])) << 24) |
! (((long)(buf[3])) << 16) |
! (((long)(buf[4])) << 8) |
! ((long)(buf[5])));
! addr->irda_addr.sir_addr = htonl((long)value);
! ILMemCpy(addr->irda_addr.sir_name, buf + 6, 24);
! *addrlen = sizeof(struct sockaddr_irda);
! return 1;
! }
! #endif
!
! /* If we get here, then the address cannot be converted */
! return 0;
! }
!
! /*
! * Convert a combined socket address into its serialized form.
! * Returns zero if the buffer isn't big enough.
! */
! static int CombinedToSerialized(unsigned char *buf, ILInt32 len,
!
CombinedSockAddr *addr)
! {
! int af, port, value;
!
! /* Clear the result */
! ILMemZero(buf, len);
!
! /* Map and store the address family, in little-endian order */
! if(len < 2)
! {
! return 0;
! }
! af = addr->addr.sa_family;
! if(af == AF_INET)
! {
! af = IL_AF_INET;
! }
! #ifdef IL_IPV6_PRESENT
! else if(af == AF_INET6)
! {
! af = IL_AF_INET6;
! }
! #endif
! #ifdef IL_IRDA_PRESENT
! else if(af == AF_IRDA)
! {
! af = IL_AF_IRDA;
! }
! #endif
! buf[0] = (unsigned char)af;
! buf[1] = (unsigned char)(af >> 8);
!
! /* Determine how to convert the address based on the address family */
! if(af == IL_AF_INET)
! {
! if(len < 8)
! {
! return 0;
! }
! port = (int)(ntohs(addr->ipv4_addr.sin_port));
! buf[2] = (unsigned char)(port >> 8);
! buf[3] = (unsigned char)port;
! value = (long)(ntohl(addr->ipv4_addr.sin_addr.s_addr));
! buf[4] = (unsigned char)(value >> 24);
! buf[5] = (unsigned char)(value >> 16);
! buf[6] = (unsigned char)(value >> 8);
! buf[7] = (unsigned char)value;
! return 1;
! }
! #ifdef IL_IPV6_PRESENT
! else if(af == IL_AF_INET6)
! {
! if(len < 28)
! {
! return 0;
! }
! port = (int)(ntohs(addr->ipv6_addr.sin6_port));
! buf[2] = (unsigned char)(port >> 8);
! buf[3] = (unsigned char)port;
! value = (long)(ntohl(addr->ipv6_addr.sin6_flowinfo));
! buf[4] = (unsigned char)(value >> 24);
! buf[5] = (unsigned char)(value >> 16);
! buf[6] = (unsigned char)(value >> 8);
! buf[7] = (unsigned char)value;
! ILMemCpy(buf + 8, &(addr->ipv6_addr.sin6_addr), 16);
! value = (long)(ntohl(addr->ipv6_addr.sin6_scope_id));
! buf[24] = (unsigned char)(value >> 24);
! buf[25] = (unsigned char)(value >> 16);
! buf[26] = (unsigned char)(value >> 8);
! buf[27] = (unsigned char)value;
! return 1;
! }
! #endif
! #ifdef IL_IRDA_PRESENT
! else if(af == IL_AF_IRDA)
! {
! if(len < 32)
! {
! return 0;
! }
! value = (long)(ntohl(addr->irda_addr.sir_addr));
! buf[2] = (unsigned char)(value >> 24);
! buf[3] = (unsigned char)(value >> 16);
! buf[4] = (unsigned char)(value >> 8);
! buf[5] = (unsigned char)value;
! ILMemCpy(buf + 6, addr->irda_addr.sir_name, 24);
! return 1;
! }
! #endif
!
! /* If we get here, then the address cannot be converted */
! return 0;
! }
!
! int ILSysIOAddressFamilySupported(ILInt32 af)
! {
! if(af == IL_AF_INET)
! {
! return 1;
! }
! #ifdef IL_IPV6_PRESENT
! if(af == IL_AF_INET6)
! {
! return 1;
! }
! #endif
! #ifdef IL_IRDA_PRESENT
! if(af == IL_AF_IRDA)
! {
! return 1;
! }
! #endif
! return 0;
! }
ILSysIOHandle ILSysIOSocket(ILInt32 domain, ILInt32 type, ILInt32 protocol)
{
+ if(domain == IL_AF_INET)
+ {
+ domain = AF_INET;
+ }
+ #ifdef IL_IPV6_PRESENT
+ else if(domain == IL_AF_INET6)
+ {
+ domain = AF_INET6;
+ }
+ #endif
+ #ifdef IL_IRDA_PRESENT
+ else if(domain == IL_AF_IRDA)
+ {
+ domain = AF_IRDA;
+ }
+ #endif
return (ILSysIOHandle)(ILNativeInt)(socket(domain, type, protocol));
}
! int ILSysIOSocketBind(ILSysIOHandle sockfd, unsigned char *addr,
! ILInt32 addrLen)
{
! CombinedSockAddr sa_addr;
! int sa_len;
! /* Convert the socket address into its platform version */
! if(!SerializedToCombined(addr, addrLen, &sa_addr, &sa_len))
! {
! ILSysIOSetErrno(IL_ERRNO_EINVAL);
! return 0;
! }
! /* Perform the bind operation */
! return (bind((int)(ILNativeInt)sockfd, &sa_addr.addr, sa_len) == 0);
}
! int ILSysIOSocketConnect(ILSysIOHandle sockfd, unsigned char *addr,
! ILInt32 addrLen)
{
! CombinedSockAddr sa_addr;
! int sa_len;
! /* Convert the socket address into its platform version */
! if(!SerializedToCombined(addr, addrLen, &sa_addr, &sa_len))
! {
! ILSysIOSetErrno(IL_ERRNO_EINVAL);
! return 0;
! }
! /* Perform the connect operation */
! return (connect((int)(ILNativeInt)sockfd, &sa_addr.addr, sa_len) == 0);
}
***************
*** 102,119 ****
}
! ILSysIOHandle ILSysIOSocketAccept(ILSysIOHandle sockfd, ILSysIOSockAddr *out)
{
! int newfd, size;
! struct sockaddr_in addr;
! size = sizeof(struct sockaddr_in);
! ILMemZero(&addr, sizeof(addr));
!
! newfd = accept((int)(ILNativeInt)sockfd, (struct sockaddr *)&addr,
&size);
!
! out->port = ntohs(addr.sin_port);
! out->family = addr.sin_family;
! out->addr = addr.sin_addr.s_addr;
return (ILSysIOHandle)(ILNativeInt)newfd;
}
--- 368,396 ----
}
! ILSysIOHandle ILSysIOSocketAccept(ILSysIOHandle sockfd, unsigned char *addr,
! ILInt32
addrLen)
{
! CombinedSockAddr sa_addr;
! int sa_len;
! int newfd;
! /* Accept the incoming connection */
! sa_len = sizeof(CombinedSockAddr);
! ILMemZero(&sa_addr, sizeof(sa_addr));
! newfd = accept((int)(ILNativeInt)sockfd, &sa_addr.addr, &sa_len);
! if(newfd < 0)
! {
! return (ILSysIOHandle)(ILNativeInt)newfd;
! }
+ /* Convert the platform address into its serialized form */
+ if(!CombinedToSerialized(addr, addrLen, &sa_addr))
+ {
+ close(newfd);
+ ILSysIOSetErrno(IL_ERRNO_EINVAL);
+ return (ILSysIOHandle)(ILNativeInt)(-1);
+ }
+
+ /* Return the file descriptor to the caller */
return (ILSysIOHandle)(ILNativeInt)newfd;
}
***************
*** 133,166 ****
ILInt32 ILSysIOSocketSendTo(ILSysIOHandle sockfd, const void *msg,
ILInt32 len, ILInt32 flags,
! const ILSysIOSockAddr *to)
{
! struct sockaddr_in addr;
! ILMemZero(&addr, sizeof(addr));
! addr.sin_port = htons(to->port);
! addr.sin_family = to->family;
! addr.sin_addr.s_addr = to->addr;
return sendto((int)(ILNativeInt)sockfd, msg, len, flags,
! (struct sockaddr *)&addr, sizeof(struct
sockaddr_in));
}
ILInt32 ILSysIOSocketRecvFrom(ILSysIOHandle sockfd, void *buf,
ILInt32 len, ILInt32
flags,
! ILSysIOSockAddr *from)
{
! int fromlen, result;
! struct sockaddr_in addr;
!
! ILMemZero(&addr, sizeof(addr));
! fromlen = sizeof(struct sockaddr_in);
!
result = recvfrom((int)(ILNativeInt)sockfd, buf, len, flags,
! (struct sockaddr *)&addr, &fromlen);
!
! from->port = ntohs(addr.sin_port);
! from->family = addr.sin_family;
! from->addr = addr.sin_addr.s_addr;
return (ILInt32)result;
}
--- 410,456 ----
ILInt32 ILSysIOSocketSendTo(ILSysIOHandle sockfd, const void *msg,
ILInt32 len, ILInt32 flags,
! unsigned char *addr,
ILInt32 addrLen)
{
! CombinedSockAddr sa_addr;
! int sa_len;
! /* Convert the socket address into its platform version */
! if(!SerializedToCombined(addr, addrLen, &sa_addr, &sa_len))
! {
! ILSysIOSetErrno(IL_ERRNO_EINVAL);
! return 0;
! }
+ /* Perform the sendto operation */
return sendto((int)(ILNativeInt)sockfd, msg, len, flags,
! &sa_addr.addr, sa_len);
}
ILInt32 ILSysIOSocketRecvFrom(ILSysIOHandle sockfd, void *buf,
ILInt32 len, ILInt32
flags,
! unsigned char *addr,
ILInt32 addrLen)
{
! CombinedSockAddr sa_addr;
! int sa_len;
! int result;
!
! /* Receive the incoming data */
! sa_len = sizeof(CombinedSockAddr);
! ILMemZero(&sa_addr, sizeof(sa_addr));
result = recvfrom((int)(ILNativeInt)sockfd, buf, len, flags,
! &sa_addr.addr, &sa_len);
! if(result < 0)
! {
! return (ILInt32)result;
! }
+ /* Convert the platform address into its serialized form */
+ if(!CombinedToSerialized(addr, addrLen, &sa_addr))
+ {
+ ILSysIOSetErrno(IL_ERRNO_EINVAL);
+ return (ILInt32)(-1);
+ }
+
+ /* Return the receive result to the caller */
return (ILInt32)result;
}
***************
*** 403,423 ****
}
! int ILSysIOSocketGetName(ILSysIOHandle sockfd, ILSysIOSockAddr *addr)
{
! struct sockaddr_in iaddr;
! int size = sizeof(iaddr);
! ILMemZero(&iaddr, sizeof(iaddr));
! if(getsockname((int)(ILNativeInt)sockfd,
! (struct sockaddr *)&addr, &size) >= 0)
! {
! addr->family = (int)(iaddr.sin_family);
! addr->addr = (unsigned long)(iaddr.sin_addr.s_addr);
! addr->port = ntohs(iaddr.sin_port);
! return 1;
}
! else
{
return 0;
}
}
--- 693,717 ----
}
! int ILSysIOSocketGetName(ILSysIOHandle sockfd, unsigned char *addr,
! ILInt32 addrLen)
{
! CombinedSockAddr sa_addr;
! int sa_len;
!
! /* Accept the incoming connection */
! sa_len = sizeof(CombinedSockAddr);
! ILMemZero(&sa_addr, sizeof(sa_addr));
! if(getsockname((int)(ILNativeInt)sockfd, &sa_addr.addr, &sa_len) < 0)
! {
! return 0;
}
!
! /* Convert the platform address into its serialized form */
! if(!CombinedToSerialized(addr, addrLen, &sa_addr))
{
+ ILSysIOSetErrno(IL_ERRNO_EINVAL);
return 0;
}
+ return 1;
}
***************
*** 483,489 ****
}
! int ILSysIOSocketSetMulticast(ILSysIOHandle handle, ILInt32 name,
! ILSysIOSockAddr
*group,
! ILSysIOSockAddr
*mcint)
{
/* TODO */
--- 777,792 ----
}
! int ILSysIOSocketSetMulticast(ILSysIOHandle handle, ILInt32 af, ILInt32 name,
! unsigned char *group,
ILInt32 groupLen,
! unsigned char *mcint,
ILInt32 mcintLen)
! {
! /* TODO */
! ILSysIOSetErrno(IL_ERRNO_EINVAL);
! return 0;
! }
!
! int ILSysIOSocketGetMulticast(ILSysIOHandle handle, ILInt32 af, ILInt32 name,
! unsigned char *group,
ILInt32 groupLen,
! unsigned char *mcint,
ILInt32 mcintLen)
{
/* TODO */
***************
*** 492,498 ****
}
! int ILSysIOSocketGetMulticast(ILSysIOHandle handle, ILInt32 name,
! ILSysIOSockAddr
*group,
! ILSysIOSockAddr
*mcint)
{
/* TODO */
--- 795,800 ----
}
! int ILSysIODiscoverIrDADevices(ILSysIOHandle handle, unsigned char *buf,
! ILInt32 bufLen)
{
/* TODO */
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Dotgnu-pnet-commits] CVS: pnet/support socket.c,1.10,1.11,
Rhys Weatherley <address@hidden> <=
- Prev by Date:
[Dotgnu-pnet-commits] CVS: pnet/ilnative ilinternal.c,1.6,1.7
- Next by Date:
[Dotgnu-pnet-commits] CVS: pnet/engine int_proto.h,1.61,1.62 int_table.c,1.63,1.64 lib_socket.c,1.12,1.13
- Previous by thread:
[Dotgnu-pnet-commits] CVS: pnet/ilnative ilinternal.c,1.6,1.7
- Next by thread:
[Dotgnu-pnet-commits] CVS: pnet/engine int_proto.h,1.61,1.62 int_table.c,1.63,1.64 lib_socket.c,1.12,1.13
- Index(es):