📄 telnet.c
字号:
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 + -