* $Id: sock.c,v 0.0.0.1 2003/08/21
*
* DEBUG: section 6 Socket
- * AUTHOR: Petr Smolik petr.smolik@wo.cz
*
- * ORTE - OCERA Real-Time Ethernet http://www.ocera.org/
+ * -------------------------------------------------------------------
+ * ORTE
+ * Open Real-Time Ethernet
+ *
+ * Copyright (C) 2001-2006
+ * Department of Control Engineering FEE CTU Prague, Czech Republic
+ * http://dce.felk.cvut.cz
+ * http://www.ocera.org
+ *
+ * Author: Petr Smolik petr.smolik@wo.cz
+ * Advisor: Pavel Pisa
+ * Project Responsible: Zdenek Hanzalek
* --------------------------------------------------------------------
*
* This program is free software; you can redistribute it and/or modify
/*********************************************************************/
int
sock_start(void) {
-#if defined(SOCK_BSD) || defined (SOCK_RTL)
+#if defined(SOCK_BSD) || defined (SOCK_RTLWIP)
return 0;
#elif defined (SOCK_WIN)
WORD wVersionRequested;
WSADATA wsaData;
- wVersionRequested = MAKEWORD(2, 0);
+ #ifdef SOCK_WIN_PHARLAP
+ wVersionRequested = MAKEWORD(1, 1);
+ #else
+ wVersionRequested = MAKEWORD(2, 0);
+ #endif
return WSAStartup(wVersionRequested, &wsaData);
#endif
}
sock_cleanup(sock_t *sock) {
#if defined(SOCK_BSD)
close(sock->fd);
-#elif defined(SOCK_RTL)
+#elif defined(SOCK_RTLWIP)
close_socket_np(sock->fd);
#elif defined(SOCK_WIN)
closesocket(sock->fd);
}
/*********************************************************************/
-int
-sock_setsockopt(sock_t *sock,int optname,const char *optval, int optlen) {
- if (setsockopt(sock->fd, IPPROTO_IP, optname,(void *)&optval, optlen)) {
+inline int
+sock_setsockopt(sock_t *sock,int level,int optname,const char *optval, int optlen) {
+ if (setsockopt(sock->fd, level, optname,(void *)optval, optlen)) {
sock_cleanup(sock);
return -1;
}
}
/*********************************************************************/
-int
-sock_getsockopt(sock_t *sock,int optname,char *optval, int *optlen) {
- if (getsockopt(sock->fd, IPPROTO_IP, optname,(void *)&optval, optlen)) {
+inline int
+sock_getsockopt(sock_t *sock,int level,int optname,char *optval, int *optlen) {
+ if (getsockopt(sock->fd, level, optname,(void *)optval, optlen)) {
sock_cleanup(sock);
return -1;
}
name.sin_family = AF_INET;
name.sin_port = htons(port);
name.sin_addr.s_addr = htonl(INADDR_ANY);
- if (bind(sock->fd, (struct sockaddr *)&name, sizeof(name)) < 0) {
+ if (bind(sock->fd,
+ #ifndef CONFIG_ORTE_RTL_ONETD
+ (struct sockaddr *)
+ #endif
+ &name, sizeof(name)) < 0) {
sock_cleanup(sock);
return -1;
}
size = sizeof(name);
- if (getsockname(sock->fd,(struct sockaddr *)&name, &size ) < 0) {
+ if (getsockname(sock->fd,
+ #ifndef CONFIG_ORTE_RTL_ONETD
+ (struct sockaddr *)
+ #endif
+ &name,
+ #ifndef CONFIG_ORTE_RTL_ONETD
+ &size
+ #else
+ size
+ #endif
+ ) < 0) {
sock_cleanup(sock);
return -1;
}
/*********************************************************************/
inline int
sock_recvfrom(sock_t *sock, void *buf, int max_len,struct sockaddr_in *des,int des_len) {
- return recvfrom(sock->fd, buf, max_len, 0,(struct sockaddr*)des,&des_len);
+ return recvfrom(sock->fd, buf, max_len, 0,
+ #ifndef CONFIG_ORTE_RTL_ONETD
+ (struct sockaddr*)
+ #endif
+ des,&des_len);
}
/*********************************************************************/
inline int
sock_sendto(sock_t *sock, void *buf, int len,struct sockaddr_in *des,int des_len) {
- return sendto(sock->fd, buf, len, 0,(struct sockaddr*)des,des_len);
+ return sendto(sock->fd, buf, len, 0,
+ #ifndef CONFIG_ORTE_RTL_ONETD
+ (struct sockaddr*)
+ #endif
+ des,des_len);
}
/*********************************************************************/
}
}
return 0;
-#elif defined(SOCK_RTL)
+#elif defined(SOCK_RTLWIP)
/* loopback iface is recognized if it has this address */
char ip_address [] = "127.0.0.1";
struct in_addr loopaddr;
- int i;
+ int i;
*IFCount=0;
if (inet_aton(ip_address, &loopaddr) != 0) return -1;
}
}
return 0;
+#elif defined(SOCK_WIN_PHARLAP)
+ DEVHANDLE hDev;
+ EK_TCPIPCFG *pCfg;
+ union {
+ EK_TCPETHSTATUS eth;
+ EK_TCPSLIPSTATUS slip;
+ EK_TCPPPPSTATUS ppp;
+ } status;
+ *IFCount = 0;
+ hDev = NULL;
+
+ while (hDev = EtsTCPIterateDeviceList(hDev)) {
+ pCfg = EtsTCPGetDeviceCfg(hDev);
+
+ if (pCfg->nwIPAddress == 0x0100007F) // 127.0.0.1 localhost
+ continue;
+
+ status.eth.length = sizeof(EK_TCPETHSTATUS);
+ EtsTCPGetDeviceStatus(hDev, &status);
+ if (status.eth.DevStatus.Flags & ETS_TCP_DEV_ONLINE) {
+ IFProp->ifFlags = IFF_UP;
+ IFProp->ipAddress = ntohl(pCfg->nwIPAddress);
+ (*IFCount)++;
+ }
+ }
+ return 0;
#elif defined(SOCK_WIN)
INTERFACE_INFO InterfaceList[MAX_INTERFACES];
struct sockaddr_in* pAddress;