blob: 8e99d13fe2e06ba3a5362e8498eee11a5c8ea6be [file] [log] [blame]
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <netdb.h>
#include <sys/socket.h>
#include <netinet/in.h>
#define UDP_ARR_SIZE 4096
int port = 44444;
char udp_arr[UDP_ARR_SIZE];
int udp_buf_len = 0;
int udp_cur_pos = 0;
struct sockaddr_in ret_addr;
int init_syscall_server(int* fd_read, int* fd_write) {
int listen_socket;
// Address structures
struct sockaddr_in server_addr;
// Size of our address structure
unsigned int addr_len = sizeof(struct sockaddr_in);
if ((listen_socket = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0)
{
printf("Error: PORT: %i. Could not create socket.\n", port);
exit(1);
}
// Setup sockaddr_in
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(port);
server_addr.sin_addr.s_addr=INADDR_ANY;
bzero(&(server_addr.sin_zero), 8); // This is apparently a source of bugs? Who knew.
// Bind to the given port.
if (bind(listen_socket, (struct sockaddr *) &server_addr, sizeof(struct sockaddr)))
{
printf("Error: Spawned Process, PORT: %i. Could not bind to port.\n", port);
exit(1);
}
struct hostent *hp;
hp = gethostbyname("192.168.0.10");
memset(&ret_addr, 0, sizeof(ret_addr));
ret_addr.sin_family = AF_INET;
memcpy(&ret_addr.sin_addr, hp->h_addr, hp->h_length);
ret_addr.sin_port = htons(44443);
*fd_read = listen_socket;
*fd_write = listen_socket;
return listen_socket + listen_socket;
}
int read_syscall_server(int fd, char* buf, int len) {
if (udp_buf_len == 0) {
udp_buf_len = recvfrom(fd, udp_arr, UDP_ARR_SIZE, 0, 0, 0);
if (udp_buf_len== 0)
return -1;
}
if ((udp_cur_pos + len) > udp_buf_len)
return -1;
memcpy(buf, udp_arr + udp_cur_pos, len);
udp_cur_pos = udp_cur_pos + len;
if (udp_cur_pos == udp_buf_len) {
udp_cur_pos = 0;
udp_buf_len = 0;
}
return len;
}
int write_syscall_server(int fd, char* buf, int len, int bytes_to_follow) {
static int bytes_buffered = 0;
static char* internal_buffer = NULL;
static int buffer_size = 0;
if (bytes_to_follow != 0) {
if (internal_buffer != NULL) {
printf("Called buffered write after a buffered write. Illegal.\n");
exit(1);
}
internal_buffer = malloc(len + bytes_to_follow);
if (internal_buffer == NULL) {
printf("Could not malloc send buffer.\n");
exit(1);
}
buffer_size = len + bytes_to_follow;
memcpy(internal_buffer, buf, len);
bytes_buffered = len;
return bytes_buffered;
} else if (bytes_buffered == 0) {
return sendto(fd, buf, len, 0, (struct sockaddr *)&ret_addr, sizeof(ret_addr));
} else {
if ((len + bytes_buffered) != buffer_size) {
printf("Buffered size does not match actual size\n");
exit(1);
}
if (internal_buffer == NULL) {
printf("Bytes bufferd out of sync with buffer\n");
exit(1);
}
memcpy(internal_buffer + bytes_buffered, buf, len);
int ret_val = sendto(fd, internal_buffer, len + bytes_buffered, 0,
(struct sockaddr *)&ret_addr, sizeof(ret_addr));
free(internal_buffer);
internal_buffer = NULL;
bytes_buffered = 0;
buffer_size = 0;
return ret_val;
}
}