| #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; |
| |
| } |
| } |