⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 telnet.c

📁 video linux conference
💻 C
📖 第 1 页 / 共 2 页
字号:
            i_handle_max = __MAX( i_handle_max, cl->fd );        }        timeout.tv_sec = 0;        timeout.tv_usec = 500*1000;        i_ret = select( i_handle_max + 1, &fds_read, &fds_write, 0, &timeout );        if( i_ret == -1 && errno != EINTR )        {            msg_Warn( p_intf, "cannot select sockets" );            msleep( 1000 );            continue;        }        else if( i_ret <= 0 )        {            continue;        }        /* check if there is something to do with the socket */        for( i = 0 ; i < p_sys->i_clients ; i++ )        {            telnet_client_t *cl = p_sys->clients[i];            if( FD_ISSET(cl->fd , &fds_write) && cl->i_buffer_write > 0 )            {                i_len = send( cl->fd , cl->p_buffer_write ,                              cl->i_buffer_write , 0 );                if( i_len > 0 )                {                    cl->p_buffer_write += i_len;                    cl->i_buffer_write -= i_len;                }            }            else if( FD_ISSET( cl->fd, &fds_read) )            {                int i_end = 0;                int i_recv;                while( (i_recv=recv( cl->fd, cl->p_buffer_read, 1, 0 )) > 0 &&                       cl->p_buffer_read - cl->buffer_read < 999 )                {                    switch( cl->i_tel_cmd )                    {                    case 0:                        switch( *cl->p_buffer_read )                        {                        case '\r':                            break;                        case '\n':                            *cl->p_buffer_read = '\n';                            i_end = 1;                            break;                        case TEL_IAC: // telnet specific command                            cl->i_tel_cmd = 1;                            cl->p_buffer_read++;                            break;                        default:                            cl->p_buffer_read++;                            break;                        }                        break;                    case 1:                        switch( *cl->p_buffer_read )                        {                        case TEL_WILL: case TEL_WONT:                        case TEL_DO: case TEL_DONT:                            cl->i_tel_cmd++;                            cl->p_buffer_read++;                            break;                        default:                            cl->i_tel_cmd = 0;                            cl->p_buffer_read--;                            break;                        }                        break;                    case 2:                        cl->i_tel_cmd = 0;                        cl->p_buffer_read -= 2;                        break;                    }                    if( i_end != 0 ) break;                }                if( cl->p_buffer_read - cl->buffer_read == 999 )                {                    Write_message( cl, NULL, "Line too long\r\n",                                   cl->i_mode + 2 );                }                if (i_recv == 0)                {                    net_Close( cl->fd );                    TAB_REMOVE( p_intf->p_sys->i_clients ,                                p_intf->p_sys->clients , cl );                    free( cl );                }            }        }        /* and now we should bidouille the data we received / send */        for( i = 0 ; i < p_sys->i_clients ; i++ )        {            telnet_client_t *cl = p_sys->clients[i];            if( cl->i_mode >= WRITE_MODE_PWD && cl->i_buffer_write == 0 )            {               // we have finished to send               cl->i_mode -= 2; // corresponding READ MODE            }            else if( cl->i_mode == READ_MODE_PWD &&                     *cl->p_buffer_read == '\n' )            {                *cl->p_buffer_read = '\0';                if( strcmp( psz_password, cl->buffer_read ) == 0 )                {                    Write_message( cl, NULL, "\xff\xfc\x01\r\nWelcome, "                                   "Master\r\n> ", WRITE_MODE_CMD );                }                else                {                    /* wrong password */                    Write_message( cl, NULL, "\r\nTry again, you polio:",                                   WRITE_MODE_PWD );                }            }            else if( cl->i_mode == READ_MODE_CMD &&                     *cl->p_buffer_read == '\n' )            {                /* ok, here is a command line */                if( !strncmp( cl->buffer_read, "logout", 6 ) ||                    !strncmp( cl->buffer_read, "quit", 4 )  ||                    !strncmp( cl->buffer_read, "exit", 4 ) )                {                    net_Close( cl->fd );                    TAB_REMOVE( p_intf->p_sys->i_clients ,                                p_intf->p_sys->clients , cl );                    free( cl );                }                else if( !strncmp( cl->buffer_read, "shutdown", 8 ) )                {                    msg_Err( p_intf, "shutdown requested" );                    p_intf->p_vlc->b_die = VLC_TRUE;                }                else                {                    vlm_message_t *message;                    /* create a standard string */                    *cl->p_buffer_read = '\0';                    vlm_ExecuteCommand( p_sys->mediatheque, cl->buffer_read,                                        &message );                    Write_message( cl, message, NULL, WRITE_MODE_CMD );                    vlm_MessageDelete( message );                }            }        }    }}static void Write_message( telnet_client_t *client, vlm_message_t *message,                           char *string_message, int i_mode ){    char *psz_message;    client->p_buffer_read = client->buffer_read;    (client->p_buffer_read)[0] = 0; // if (cl->p_buffer_read)[0] = '\n'    if( client->buffer_write ) free( client->buffer_write );    /* generate the psz_message string */    if( message )    {        /* ok, look for vlm_message_t */        psz_message = MessageToString( message, 0 );    }    else    {        /* it is a basic string_message */        psz_message = strdup( string_message );    }    client->buffer_write = client->p_buffer_write = psz_message;    client->i_buffer_write = strlen( psz_message );    client->i_mode = i_mode;}/* We need the level of the message to put a beautiful indentation. * first level is 0 */static char *MessageToString( vlm_message_t *message, int i_level ){#define STRING_CR "\r\n"#define STRING_TAIL "> "    char *psz_message;    int i, i_message = sizeof( STRING_TAIL );    if( !message || !message->psz_name )    {        return strdup( STRING_CR STRING_TAIL );    }    else if( !i_level && !message->i_child && !message->psz_value  )    {        /* A command is successful. Don't write anything */        return strdup( STRING_CR STRING_TAIL );    }    i_message += strlen( message->psz_name ) + i_level * sizeof( "    " ) + 1;    psz_message = malloc( i_message ); *psz_message = 0;    for( i = 0; i < i_level; i++ ) strcat( psz_message, "    " );    strcat( psz_message, message->psz_name );    if( message->psz_value )    {        i_message += sizeof( " : " ) + strlen( message->psz_value ) +            sizeof( STRING_CR );        psz_message = realloc( psz_message, i_message );        strcat( psz_message, " : " );        strcat( psz_message, message->psz_value );        strcat( psz_message, STRING_CR );    }    else    {        i_message += sizeof( STRING_CR );        psz_message = realloc( psz_message, i_message );        strcat( psz_message, STRING_CR );    }    for( i = 0; i < message->i_child; i++ )    {        char *child_message =            MessageToString( message->child[i], i_level + 1 );        i_message += strlen( child_message );        psz_message = realloc( psz_message, i_message );        strcat( psz_message, child_message );        free( child_message );    }    if( i_level == 0 ) strcat( psz_message, STRING_TAIL );    return psz_message;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -