Add more 3ds socket logic

This commit is contained in:
meepingsnesroms
2018-06-01 11:19:10 -07:00
parent 8846b5b85c
commit 2da265666e

View File

@@ -11,62 +11,178 @@
#define SOC_BUFFERSIZE 0x100000
bool relayInited = false;
static u32* irBuffer = NULL;
static u32* socketBuffer = NULL;
static s32 sock = -1;
bool relayInited = false;
bool irInited;
bool socketInited;
static u32* irBuffer;
static u32* socketBuffer;
static s32 sock;
static s32 csock;
static struct sockaddr_in client;
static struct sockaddr_in server;
static u32 clientLen = sizeof(client);
static const char loginQuery[] = "I am a Palm OS command transmitter.";
static const char loginAnswer[] = "I want to login to a Palm OS Device!";
static void failCleanup(){
static inline int8_t makeCodeFromBaud(uint32_t baud){
switch(baud){
case 115200:
return 3;
case 96000:
return 4;
case 72000:
return 5;
case 57600:
return 14;
case 48000:
return 6;
case 38400:
return 15;
case 36000:
return 7;
case 24000:
return 8;
case 19200:
return 16;
case 18000:
return 9;
case 12000:
return 10;
case 9600:
return 11;
case 7200:
return 17;
case 6000:
return 12;
case 4800:
return 18;
case 3000:
return 13;
}
return -1;
}
static void cleanup(){
if(csock >= 0)
close(csock);
if(sock >= 0)
close(sock);
if(irInited)
iruExit();
if(socketInited)
socExit();
if(irBuffer)
free(irBuffer);
if(socketBuffer)
free(socketBuffer);
}
bool relayInit(){
bool relayInit(uint32_t irBaud){
if(!relayInited){
uint8_t commandBuffer[sizeof(loginAnswer)];
int8_t irBaudCode = makeCodeFromBaud(irBaud);
Result systemCallValue;
int ret;
if(irBaudCode == -1)
return false;
irInited = false;
socketInited = false;
socketBuffer = (u32*)memalign(SOC_ALIGN, SOC_BUFFERSIZE);
irBuffer = (u32*)memalign(SOC_ALIGN, SOC_BUFFERSIZE);
if(!irBuffer || !socketBuffer){
failCleanup();
cleanup();
return false;
}
ret = iruInit(irBuffer, SOC_BUFFERSIZE);
if(ret != RL_SUCCESS){
failCleanup();
systemCallValue = iruInit(irBuffer, SOC_BUFFERSIZE);
if(systemCallValue != RL_SUCCESS){
cleanup();
return false;
}
irInited = true;
systemCallValue = IRU_SetBitRate((uint8_t)irBaudCode);
if(systemCallValue != RL_SUCCESS){
cleanup();
return false;
}
ret = socInit(socketBuffer, SOC_BUFFERSIZE)
if(ret != RL_SUCCESS){
failCleanup();
systemCallValue = socInit(socketBuffer, SOC_BUFFERSIZE)
if(systemCallValue != RL_SUCCESS){
cleanup();
return false;
}
socketInited = true;
sock = socket(AF_INET, SOCK_STREAM, IPPROTO_IP);
csock = accept(sock, (struct sockaddr *) &client, &clientlen);
if(sock < 0){
cleanup();
return false;
}
memset(&server, 0, sizeof(server));
memset(&client, 0, sizeof(client));
server.sin_family = AF_INET;
server.sin_port = htons(80);
server.sin_addr.s_addr = gethostid();
ret = bind(sock, (struct sockaddr*)&server, sizeof(server)));
if(ret != 0){
cleanup();
return false;
}
fcntl(sock, F_SETFL, fcntl(sock, F_GETFL, 0) | O_NONBLOCK);
ret = listen(sock, 5);
if(ret != 0){
cleanup();
return false;
}
relayInited = true;
}
return true;//already inited return success
return true;//already inited returns success
}
void relayExit(){
if(relayInited){
iruExit();
socExit();
free(irBuffer);
free(socketBuffer);
relayInited = false;
}
if(relayInited)
cleanup();
}
void relayRun
bool relayAttemptConnection(){
if(relayInited){
if(csock)
close(csock);
csock = accept(sock, (struct sockaddr*)&client, &clientLen);
//check if this is an internet scanner bot or a login
send(csock, loginQuery, strlen(loginQuery), 0);
//check if responce matches
sleep(3);
ret = recv(csock, commandBuffer, sizeof(loginAnswer), 0);
if(ret < 0){
cleanup();
return false;
}
return true;
}
return false;
}
void relayRun(){
//simply copys all data from WIFI to IR and IR to WIFI
}