Exemplo n.º 1
0
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]);
}
Exemplo n.º 2
0
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);
}
Exemplo n.º 3
0
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;
}