/* On idle we spin checking for the terminals. Gives us more responsiveness for the polled ports */ void platform_idle(void) { irqflags_t irq = di(); tty_poll(); sync_clock(); irqrestore(irq); }
int main() { //inits int sock; struct sockaddr_in bind_addr; //create socket file descriptor( AF_INET = ipv4 address family; SOCK_DGRAM = UDP; 0 = default protocol) sock = socket(AF_INET, SOCK_DGRAM, 0); if(unlikely(sock == -1)) { ERROR("ERROR creating socket!"); exit(EXIT_FAILURE); } else { printf("Socket created!\n"); } //set details for socket to bind memset(&bind_addr, '\0', sizeof(bind_addr)); bind_addr.sin_family = AF_INET; bind_addr.sin_addr.s_addr = INADDR_ANY; //bind to all interfaces //htons = host to network byte order, necessary for universal understanding by all machines bind_addr.sin_port = htons(PORT); //bind socket if(unlikely(bind(sock, (struct sockaddr *) &bind_addr, sizeof(bind_addr)) < 0)) { close_socket(sock); ERROR("ERROR binding!\n"); exit(EXIT_FAILURE); } else { printf("Bound successfully!\n"); } //signal handling to elegantly exit and close socket on ctrl+c struct sigaction sa; sa.sa_handler = sig_handler; sigemptyset(&sa.sa_mask); sa.sa_flags = 0; sigaction(SIGINT, &sa, NULL); //determine what to do while(1) { printf("\nReady to receive requests on port %d...\n", PORT); struct sockaddr_in addr = {0}; char buffer[FIXED_BUFFER] = {0}; receive_packet(&sock, buffer, sizeof(buffer), NULL, &addr); if(strcmp(buffer, "sync") == 0) { send_packet(&sock, "ready", 5, NULL, &addr); int t = 0; receive_packet(&sock, &t, sizeof(t), NULL, NULL); sync_clock(t, &sock, &addr); } else { printf("Received invalid request...\n"); send_packet(&sock, HELLO, sizeof(HELLO), NULL, &addr); } } return 0; }