static void trans_data_sock2pty() { char buf[512]; int ret; ret=read_reliable(fd_conn, buf, sizeof(buf)); // DBG_PRINT("ret=%d", ret); if (ret<=0) { term_session(); return; } remove_iacs((void *)buf, ret, &ret); if (ret>0) write_certain_bytes(fd_pty_master, buf, ret); //for (i=0;i<ret;i++) // DBG_PRINT("%02hhx-%c", buf[i], buf[i]); }
static int send_session_term(int s, enum dlep_status_code sc, uint8_t** msg, uint32_t modem_heartbeat_interval) { uint16_t msg_len = 0; uint8_t* p; /* Make sure we have room for the header */ uint8_t* new_msg = realloc(*msg,9); if (!new_msg) { printf("Failed to allocate message buffer"); return -1; } *msg = new_msg; /* Write the message header */ p = write_message_header(*msg,DLEP_SESSION_TERM); /* Write out our Status Code */ p = write_status_code(p,sc); msg_len = p - *msg; /* Octet 2 and 3 are the message length, minus the length of the header */ write_uint16(msg_len - 4,*msg + 2); printf("Sending Session Termination message\n"); if (send(s,*msg,msg_len,0) != msg_len) { printf("Failed to send Session Termination message: %s\n",strerror(errno)); return -1; } /* Now enter the Session termination state */ return term_session(s,msg,modem_heartbeat_interval); }
static void *misc_thread_func(void *arg) { fd_set r_fds,w_fds,except_fds; struct timeval tv; int retval, max_fd, tmp_fd; save_ori_io(); fd_server=tcp_socket_init(NULL, server_port); if (fd_server<0) { ERR_DBG_PRINT_QUIT("create telnetd server socket failed."); } listen(fd_server,0); while (1) { FD_ZERO(&r_fds); FD_ZERO(&w_fds); FD_ZERO(&except_fds); FD_SET(fd_server, &r_fds); max_fd=fd_server; if (fd_conn>0) { FD_SET(fd_conn, &r_fds); FD_SET(fd_conn, &except_fds); max_fd=(fd_conn>max_fd)?fd_conn:max_fd; FD_SET(fd_pty_master, &r_fds); max_fd=(fd_pty_master>max_fd)?fd_pty_master:max_fd; } tv.tv_sec = 0; tv.tv_usec = 200000; retval = select(max_fd + 1, &r_fds, &w_fds, &except_fds, &tv); if (retval <= 0) { continue; } if (FD_ISSET(fd_server, &r_fds)) { tmp_fd=accept(fd_server, NULL, NULL); if (tmp_fd<0) { continue; } if (fd_conn>0) { printf_to_fd(fd_conn, "A new login happens, so we shutdown your session...\r\n"); } term_session(); if (make_new_session(tmp_fd)) { close(tmp_fd); } continue; } if (shell_quit_occurred || FD_ISSET(fd_conn, &except_fds)) { term_session(); continue; } if (FD_ISSET(fd_conn, &r_fds)) { trans_data_sock2pty(); } if (FD_ISSET(fd_pty_master, &r_fds)|| (pty2sock_cache_len>0)) { if (trans_data_pty2sock()) { term_session(); continue; } } } return NULL; }