#include "parser.hpp" #include #if defined(GEKKO) int net_initialized = 0; char bba_local_ip[16]; char bba_netmask[16]; char bba_gateway[16]; #if defined(HW_DOL) #include int bba_exists = 0; unsigned int exi_get_id(int chn, int dev) { u32 cid = 0; EXI_GetID(chn,dev,&cid); return cid; } int exi_bba_exists() { return exi_get_id(EXI_CHANNEL_0,EXI_DEVICE_2) == EXI_BBA_ID; } #endif #endif namespace BoxScript { void sockets_free() { #if defined(HW_RVL) && defined(LIBWIISOCKET) wiisocket_deinit(); #elif defined(HW_RVL) && !defined(LIBWIISOCKET) net_deinit(); #elif defined(_WIN32) || defined(WIN32) WSACleanup(); #endif } int NetworkInit() { #if defined(LIBWIISOCKET) return wiisocket_init(); #endif #if defined(GEKKO) && !defined(LIBWIISOCKET) int res; #if defined(HW_DOL) bba_exists = exi_bba_exists(); if(bba_exists && !net_initialized) { #else if(!net_initialized){ #endif res = if_config(bba_local_ip, bba_netmask, bba_gateway, true,20); if(res >= 0 && strcmp("255.255.255.255", bba_local_ip)) { net_initialized = 1; } else { net_initialized = 0; } } #elif defined(_WIN32) || defined(WIN32) int err= WSAStartup(0x202, &wsaData); if (err != 0) { /* Tell the user that we could not find a usable */ /* Winsock DLL. */ printf("WSAStartup failed with error: %d\n", err); return 1; } /* Confirm that the WinSock DLL supports 2.2.*/ /* Note that if the DLL supports versions greater */ /* than 2.2 in addition to 2.2, it will still return */ /* 2.2 in wVersion since that is the version we */ /* requested. */ if (LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 2) { /* Tell the user that we could not find a usable */ /* WinSock DLL. */ printf("Could not find a usable version of Winsock.dll\n"); WSACleanup(); return 1; } #else #endif return 0; } NetworkStream::NetworkStream(SOCKET i) { this->fd = i; } void NetworkStream::Write(uint8_t* data,size_t len) { #if defined(OGC_NETWORKING) net_send(this->fd,data,len,0); #else int flags=0; #if __linux__ flags=MSG_NOSIGNAL; #endif send(this->fd,data,len,flags); #endif } size_t NetworkStream::Read(uint8_t* data,size_t len) { #if defined(OGC_NETWORKING) ssize_t v=(ssize_t)net_recv(this->fd,data,len,0); if(v < 0) return 0; return (size_t)v; #else int flags=0; #if __linux__ flags=MSG_NOSIGNAL; #endif ssize_t v=recv(this->fd,data,len,flags); if(v < 0) return 0; return (size_t)v; #endif } int64_t NetworkStream::GetPosition() { return 0; } int64_t NetworkStream::GetLength() { return 0; } void NetworkStream::SetPosition(int64_t pos) { } void NetworkStream::Flush() { } void NetworkStream::Close() { #if defined(OGC_NETWORKING) net_close(this->fd); #else close(this->fd); #endif } bool NetworkStream::CanRead() { return true; } bool NetworkStream::CanWrite() { return true; } bool NetworkStream::CanSeek() { return false; } struct hostent* _______ghbn(string ip) { #if defined(GEKKO) && !defined(LIBWIISOCKET) return net_gethostbyname(ip.c_str()); #else return gethostbyname(ip.c_str()); #endif } NetworkStream* NetClient(string ip,int64_t port,SOCKET fd) { struct sockaddr_in serv_addr; serv_addr.sin_family = AF_INET; serv_addr.sin_port = htons((uint16_t)port); if (inet_aton( ip.c_str(), &serv_addr.sin_addr) <= 0) { struct hostent* host=_______ghbn(ip); struct in_addr **addr_list; addr_list = (struct in_addr **)host->h_addr_list; if(host->h_length > 0) { memcpy(&serv_addr.sin_addr,addr_list[0],sizeof(struct in_addr)); }else{ return NULL; } } #if defined(GEKKO) && !defined(LIBWIISOCKET) if(net_connect(fd,(struct sockaddr*)&serv_addr,sizeof(struct sockaddr_in))) { return NULL; } #else if(connect(fd,(struct sockaddr*)&serv_addr,sizeof(struct sockaddr_in))) { return NULL; } #endif return new NetworkStream(fd); } SOCKET NetServerInit(string ip,int64_t port,int fd) { struct sockaddr_in serv_addr; serv_addr.sin_family = AF_INET; serv_addr.sin_port = htons(port); if (inet_aton( ip.c_str(), &serv_addr.sin_addr) <= 0) { struct hostent* host=_______ghbn(ip); struct in_addr **addr_list; addr_list = (struct in_addr **)host->h_addr_list; if(host->h_length > 0) { memcpy(&serv_addr.sin_addr,addr_list[0],sizeof(struct in_addr)); }else{ throw exception(); } } #if defined(GEKKO) && !defined(LIBWIISOCKET) if(net_bind(fd,(struct sockaddr*)&serv_addr,sizeof(struct sockaddr_in))< 0) { printf("bind error, is your computer already listening on that port\n"); throw exception(); } if(net_listen(fd,100) > 0) { printf("listen error"); throw exception(); } #else if(bind(fd,(struct sockaddr*)&serv_addr,sizeof(struct sockaddr_in))< 0) { printf("bind error, is your computer already listening on that port\n"); throw exception(); } if(listen(fd,100) > 0) { printf("listen error"); throw exception(); } #endif return fd; } SOCKET TcpServerInit(string ip,int64_t port) { SOCKET fd; #if defined(GEKKO) && !defined(LIBWIISOCKET) if ((fd = net_socket(AF_INET, SOCK_STREAM, 0)) < 0) { printf("\n Socket creation error \n"); return -1; } #else if ((fd = socket(AF_INET, SOCK_STREAM, 0)) < 0) { printf("\n Socket creation error \n"); return -1; } #endif return NetServerInit(ip,port,fd); } SOCKET UdpServerInit(string ip,int64_t port) { SOCKET fd; #if defined(GEKKO) && !defined(LIBWIISOCKET) if ((fd = net_socket(AF_INET, SOCK_DGRAM, 0)) < 0) { printf("\n Socket creation error \n"); return -1; } #else if ((fd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) { printf("\n Socket creation error \n"); return -1; } #endif return NetServerInit(ip,port,fd); } Stream* AcceptClient(SOCKET fd,string* ip) { struct sockaddr_in clt_addr; socklen_t clt_addr_len = sizeof(struct sockaddr_in); #if defined(GEKKO) && !defined(LIBWIISOCKET) int cltFd=net_accept(fd,(struct sockaddr*)&clt_addr,&clt_addr_len); #else #if defined(_WIN32) || defined(WIN32) SOCKET cltFd=accept(fd,(struct sockaddr*)&clt_addr,&clt_addr_len); #else int cltFd=accept(fd,(struct sockaddr*)&clt_addr,&clt_addr_len); #endif #endif ip->append(inet_ntoa(clt_addr.sin_addr)); return new NetworkStream(cltFd); } NetworkStream* TcpClient(string ip,int64_t port) { #if defined(_WIN32) || defined(WIN32) SOCKET fd; #else int fd; #endif #if defined(GEKKO) && !defined(LIBWIISOCKET) if ((fd = net_socket(AF_INET, SOCK_STREAM, 0)) < 0) { printf("\n Socket creation error \n"); return NULL; } #else if ((fd = socket(AF_INET, SOCK_STREAM, 0)) < 0) { printf("\n Socket creation error \n"); return NULL; } #endif return NetClient(ip,port,fd); } NetworkStream* UdpClient(string ip,int64_t port) { #if defined(_WIN32) || defined(WIN32) SOCKET fd; #else int fd; #endif #if defined(GEKKO) && !defined(LIBWIISOCKET) if ((fd = net_socket(AF_INET, SOCK_DGRAM, 0)) < 0) { printf("\n Socket creation error \n"); return NULL; } #else if ((fd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) { printf("\n Socket creation error \n"); return NULL; } #endif return NetClient(ip,port,fd); } };