Skip to content

Commit

Permalink
TCP sender for script API (untested)
Browse files Browse the repository at this point in the history
  • Loading branch information
BernardoGiordano committed Jan 24, 2019
1 parent 43a208d commit 1e8c81e
Show file tree
Hide file tree
Showing 4 changed files with 53 additions and 11 deletions.
2 changes: 1 addition & 1 deletion build/PKSM-Scripts
5 changes: 3 additions & 2 deletions include/picoc/pksm_api.h
Original file line number Diff line number Diff line change
Expand Up @@ -47,8 +47,9 @@ void gui_keyboard(struct ParseState*, struct Value*, struct Value**, int);
void gui_numpad(struct ParseState*, struct Value*, struct Value**, int);
void gui_boxes(struct ParseState*, struct Value*, struct Value**, int);
void net_ip(struct ParseState*, struct Value*, struct Value**, int);
void net_tcpServer(struct ParseState*, struct Value*, struct Value**, int);
void net_udpServer(struct ParseState*, struct Value*, struct Value**, int);
void net_tcp_receiver(struct ParseState*, struct Value*, struct Value**, int);
void net_tcp_sender(struct ParseState*, struct Value*, struct Value**, int);
void net_udp_receiver(struct ParseState*, struct Value*, struct Value**, int);
void sav_sbo(struct ParseState*, struct Value*, struct Value**, int);
void sav_gbo(struct ParseState*, struct Value*, struct Value**, int);
void sav_boxEncrypt(struct ParseState*, struct Value*, struct Value**, int);
Expand Down
5 changes: 3 additions & 2 deletions source/picoc/platform/library_unix.c
Original file line number Diff line number Diff line change
Expand Up @@ -28,8 +28,9 @@ struct LibraryFunction UnixFunctions[] =
{ cfg_default_month,"int cfg_default_month();" },
{ cfg_default_year, "int cfg_default_year();" },
{ net_ip, "char* net_ip();" },
{ net_tcpServer, "int net_tcp_server(char* buffer, int size, int* received);" },
{ net_udpServer, "int net_udp_server(char* buffer, int size, int* received);" },
{ net_tcp_receiver, "int net_tcp_recv(char* buffer, int size, int* received);" },
{ net_tcp_sender, "int net_tcp_send(char* ip, int port, char* buffer, int size);" },
{ net_udp_receiver, "int net_udp_recv(char* buffer, int size, int* received);" },
{ bank_inject_pkx, "void bank_inject_pkx(char* data, enum Generation type, int box, int slot);" },
{ NULL, NULL }
};
Expand Down
52 changes: 46 additions & 6 deletions source/picoc/platform/pksm_api.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -545,7 +545,7 @@ extern "C" {
ReturnValue->Val->Integer = std::get<0>(result) == 0 && std::get<1>(result) == -1 &&std::get<2>(result) == -1 ? -1 : 0;
}

void net_udpServer(struct ParseState *Parser, struct Value *ReturnValue, struct Value **Param, int NumArgs)
void net_udp_receiver(struct ParseState *Parser, struct Value *ReturnValue, struct Value **Param, int NumArgs)
{
char* buffer = (char*)Param[0]->Val->Pointer;
int size = (int)Param[1]->Val->Integer;
Expand All @@ -554,7 +554,7 @@ extern "C" {
struct sockaddr_in addr;
socklen_t addrlen = sizeof(addr);
int fd = socket(AF_INET, SOCK_DGRAM, 0);
if (fd == -1)
if (fd < 0)
{
ReturnValue->Val->Integer = errno;
return;
Expand All @@ -563,7 +563,7 @@ extern "C" {
addr.sin_family = AF_INET;
addr.sin_port = htons(PKSM_PORT);
addr.sin_addr.s_addr = INADDR_ANY;
if (bind(fd, (struct sockaddr*)&addr, addrlen) != 0)
if (bind(fd, (struct sockaddr*)&addr, addrlen) < 0)
{
ReturnValue->Val->Integer = errno;
close(fd);
Expand All @@ -580,7 +580,7 @@ extern "C" {
ReturnValue->Val->Integer = 0;
}

void net_tcpServer(struct ParseState *Parser, struct Value *ReturnValue, struct Value **Param, int NumArgs)
void net_tcp_receiver(struct ParseState *Parser, struct Value *ReturnValue, struct Value **Param, int NumArgs)
{
char* buffer = (char*)Param[0]->Val->Pointer;
int size = (int)Param[1]->Val->Integer;
Expand All @@ -589,7 +589,7 @@ extern "C" {
struct sockaddr_in addr;
socklen_t addrlen = sizeof(addr);
int fd = socket(AF_INET, SOCK_STREAM, IPPROTO_IP);
if (fd == -1)
if (fd < 0)
{
ReturnValue->Val->Integer = errno;
return;
Expand All @@ -598,7 +598,7 @@ extern "C" {
addr.sin_family = AF_INET;
addr.sin_port = htons(PKSM_PORT);
addr.sin_addr.s_addr = INADDR_ANY;
if (bind(fd, (struct sockaddr*)&addr, addrlen) != 0)
if (bind(fd, (struct sockaddr*)&addr, addrlen) < 0)
{
ReturnValue->Val->Integer = errno;
close(fd);
Expand Down Expand Up @@ -629,6 +629,46 @@ extern "C" {
ReturnValue->Val->Integer = 0;
}

void net_tcp_sender(struct ParseState *Parser, struct Value *ReturnValue, struct Value **Param, int NumArgs)
{
char* ip = (char*)Param[0]->Val->Pointer;
int port = (int)Param[1]->Val->Integer;
char* buffer = (char*)Param[2]->Val->Pointer;
int size = (int)Param[3]->Val->Integer;

struct sockaddr_in addr;
socklen_t addrlen = sizeof(addr);
int fd = socket(AF_INET, SOCK_STREAM, 0);
if (fd == -1)
{
ReturnValue->Val->Integer = errno;
return;
}
memset(&addr, 0, addrlen);
addr.sin_family = AF_INET;
addr.sin_port = htons(port);
inet_pton(AF_INET, ip, &addr.sin_addr);
if (connect(fd, (struct sockaddr*)&addr, addrlen) < 0)
{
ReturnValue->Val->Integer = errno;
close(fd);
return;
}

int total = 0;
int chunk = 1024;
int n;
while (total < size) {
size_t tosend = size - total > chunk ? chunk : size - total;
n = send(fd, buffer + total, tosend, 0);
if (n == -1) { break; }
total += n;
}

close(fd);
ReturnValue->Val->Integer = total == size ? 0 : errno;
}

void bank_inject_pkx(struct ParseState *Parser, struct Value *ReturnValue, struct Value **Param, int NumArgs)
{
u8* data = (u8*) Param[0]->Val->Pointer;
Expand Down

0 comments on commit 1e8c81e

Please sign in to comment.