void shell_keyboardListener(){ unsigned char c; while((c=getchar())!=0){ if(c == '\b'){ shell_backspace(); } else if(c == '\n'){ shell_enter(); } else if(c == UP){ shell_up(); } else if(c == DOWN){ shell_down(); } else if(c == LEFT){ shell_left(); } else if(c == RIGHT){ shell_right(); } else if(c == PGDN){ shell_pagedown(); } else if(c == DEL){ shell_delete(); } else if(c == F1){ shell_f1(); }else{ shell_print(c); } } return; }
void shell_keyboardListener(){ unsigned char c; while((c=getchar())!=0){ if(c == '\b'){ shell_backspace(); } else if(c == '\n'){ shell_enter(); } else if(c == S_UP){ shell_up(); } else if(c == S_DOWN){ shell_down(); } else if(c == S_LEFT){ shell_left(); } else if(c == S_RIGHT){ shell_right(); } else if(c == S_PGDN){ shell_pagedown(); } else if(c == S_DEL){ shell_delete(); } else if(c == S_INS){ shell_insert(); } else if(c == S_HOME){ shell_home(); } else if(c == S_END){ shell_end(); } else if(c == S_F1){ shell_f1(); }else{ shell_print(c); } } return; }
int run_vpn(shadowvpn_args_t *args) { fd_set readset; int tun, sock, max_fd; ssize_t r; unsigned char *tun_buf; unsigned char *udp_buf; struct sockaddr_storage remote_addr; struct sockaddr *remote_addrp = (struct sockaddr *)&remote_addr; socklen_t remote_addrlen; struct sockaddr *src_addrp = NULL; socklen_t *src_addrlen = NULL; if (args->mode == SHADOWVPN_MODE_SERVER) { // if we are running a server, update server address from recv_from src_addrp = remote_addrp; src_addrlen = &remote_addrlen; } if (-1 == (tun = tun_alloc(args->intf))) { errf("failed to create tun device"); return -1; } if (-1 == (sock = udp_alloc(args->mode == SHADOWVPN_MODE_SERVER, args->server, args->port, remote_addrp, &remote_addrlen))) { errf("failed to create UDP socket"); close(tun); return -1; } shell_up(args); tun_buf = malloc(args->mtu + SHADOWVPN_ZERO_BYTES); udp_buf = malloc(args->mtu + SHADOWVPN_ZERO_BYTES); memset(tun_buf, 0, SHADOWVPN_ZERO_BYTES); memset(udp_buf, 0, SHADOWVPN_ZERO_BYTES); for(;;) { FD_ZERO(&readset); FD_SET(tun, &readset); FD_SET(sock, &readset); max_fd = max(tun, sock) + 1; if (-1 == select(max_fd, &readset, NULL, NULL, NULL)) { if (errno == EINTR) continue; err("select"); break; } if (FD_ISSET(tun, &readset)) { r = read(tun, tun_buf + SHADOWVPN_ZERO_BYTES, args->mtu); if (r == -1) { if (errno == EAGAIN || errno == EWOULDBLOCK) { // do nothing } else if (errno == EPERM || errno == EINTR) { // just log, do nothing err("read from tun"); } else { err("read from tun"); break; } } if (remote_addrlen) { crypto_encrypt(udp_buf, tun_buf, r); r = sendto(sock, udp_buf + SHADOWVPN_PACKET_OFFSET, SHADOWVPN_OVERHEAD_LEN + r, 0, remote_addrp, remote_addrlen); if (r == -1) { if (errno == EAGAIN || errno == EWOULDBLOCK) { // do nothing } else if (errno == ENETUNREACH || errno == ENETDOWN || errno == EPERM || errno == EINTR || errno == EMSGSIZE) { // just log, do nothing err("sendto"); } else { err("sendto"); // TODO rebuild socket break; } } } } if (FD_ISSET(sock, &readset)) { r = recvfrom(sock, udp_buf + SHADOWVPN_PACKET_OFFSET, SHADOWVPN_OVERHEAD_LEN + args->mtu, 0, src_addrp, src_addrlen); if (r == -1) { if (errno == EAGAIN || errno == EWOULDBLOCK) { // do nothing } else if (errno == ENETUNREACH || errno == ENETDOWN || errno == EPERM || errno == EINTR) { // just log, do nothing err("recvfrom"); } else { err("recvfrom"); // TODO rebuild socket break; } } if (-1 == crypto_decrypt(tun_buf, udp_buf, r - SHADOWVPN_OVERHEAD_LEN)) { errf("invalid packet, drop"); } else { if (-1 == write(tun, tun_buf + SHADOWVPN_ZERO_BYTES, r - SHADOWVPN_OVERHEAD_LEN)) { if (errno == EAGAIN || errno == EWOULDBLOCK) { // do nothing } else if (errno == EPERM || errno == EINTR || errno == EINVAL) { // just log, do nothing err("write to tun"); } else { err("write to tun"); break; } } } } } free(tun_buf); free(udp_buf); shell_down(args); close(tun); close(sock); return -1; }