static void rx_loop() { int ret; while (!the_working_paras.need_exit) { ret=fd_readable(the_working_paras.sockfd, 0, 10000); if (ret<=0) { if (ret<0 && !the_working_paras.no_verbose) ERR_DBG_PRINT("test fd failed"); continue; } ret=read(the_working_paras.sockfd ,the_working_paras.buf ,sizeof(the_working_paras.buf)); INC_STAT(the_stat_data.rx_times_total); if (ret>0) { INC_STAT(the_stat_data.rx_times_succ); INC_STAT_VALUE(the_stat_data.rx_bytes, ret); if (!the_working_paras.no_verbose) { printf("[%"PRIu64"]got %d bytes\n" ,the_stat_data.rx_times_succ ,ret); if (!the_working_paras.no_prt_pkt) { printf("the data contents is:\n"); print_mem(the_working_paras.buf, ret); } } } else { INC_STAT(the_stat_data.rx_times_fail); if (!the_working_paras.no_verbose) ERR_DBG_PRINT("rx failed"); break; } printf("\n\n"); continue; } }
int read_input(int is_password) { char c, two_byes[2]; int ret; READ_BYTE: if (!fd_readable(fd_pty_slave, 0, 50000)) return 0; ret=read_reliable(fd_pty_slave, &c, 1); if (ret<0) return -1; if (ret!=1) goto READ_BYTE; if (c==0x00 || c==0x0a) goto READ_BYTE; if (c==0x08 && shell_buf_cur_len>0) { back_input(1); goto READ_BYTE; } if (c==0x1b) { ret=read_certain_bytes(fd_pty_slave, two_byes, 2); if (ret<0) return -1; if (two_byes[0]==0x5b && two_byes[1]==0x41) history_cmd_roll_prev(); else if (two_byes[0]==0x5b && two_byes[1]==0x42) history_cmd_roll_next(); goto READ_BYTE; } if (c==0x0d) goto EXIT; if (c!=' ' && !isgraph(c)) goto READ_BYTE; shell_buf[shell_buf_cur_len++]=c; if (is_password) c='*'; printf_to_fd(fd_pty_slave, "%c", c); goto READ_BYTE; EXIT: printf_to_fd(fd_pty_slave, "\n"); shell_buf[shell_buf_cur_len] = 0; return 1; }
static void rxtx_loop() { int ret, send_ret; struct sockaddr_in peer_addr; char peer_ip[32]; uint16_t peer_port; while (!the_working_paras.need_exit) { ret=fd_readable(the_working_paras.sockfd, 0, 10000); if (ret<=0) { if (ret<0 && !the_working_paras.no_verbose) ERR_DBG_PRINT("test fd failed"); continue; } ret=udp_socket_recvfrom(the_working_paras.sockfd ,the_working_paras.buf ,sizeof(the_working_paras.buf) ,&peer_addr); INC_STAT(the_stat_data.rx_times_total); if (ret>0) { INC_STAT(the_stat_data.rx_pkts); INC_STAT_VALUE(the_stat_data.rx_bytes, ret); if (!the_working_paras.no_verbose) { resolve_sockaddr(&peer_addr, peer_ip, sizeof(peer_ip), &peer_port); printf("[%"PRIu64"]got %d bytes from %s:%d\n" ,the_stat_data.rx_pkts ,ret ,peer_ip ,(int)peer_port); if (!the_working_paras.no_prt_pkt) { printf("the data contents is:\n"); print_mem(the_working_paras.buf, ret); } } if (!the_working_paras.only_recv) { if (!the_working_paras.no_verbose) { printf("try send back %d bytes to %s:%d\n" ,ret ,peer_ip ,(int)peer_port); } send_ret=udp_socket_sendto(the_working_paras.sockfd, the_working_paras.buf, ret, &peer_addr); INC_STAT(the_stat_data.tx_pkts_total); INC_STAT_VALUE(the_stat_data.tx_bytes_total, ret); if (send_ret==ret) { INC_STAT(the_stat_data.tx_pkts_succ); INC_STAT_VALUE(the_stat_data.tx_bytes_succ, ret); } else if (send_ret<=0) { INC_STAT(the_stat_data.tx_pkts_fail); INC_STAT_VALUE(the_stat_data.tx_bytes_fail, ret); if (!the_working_paras.no_verbose) ERR_DBG_PRINT("tx failed"); } else DBG_PRINT_QUIT("abnormal event: udp packet was partly sent!"); } } else { INC_STAT(the_stat_data.rx_times_fail); if (!the_working_paras.no_verbose) ERR_DBG_PRINT("rx failed"); } printf("\n\n"); continue; } }