]> git.sesse.net Git - vlc/blobdiff - modules/control/telnet.c
video_chroma: a few SSE2 fixes
[vlc] / modules / control / telnet.c
index b0f1f1216e7a21fbbdd79b396746da632dfcd9ee..e8ce4a4c155a9b90bc4fd091183d2093a9ab1b09 100644 (file)
@@ -116,7 +116,7 @@ typedef struct
 } telnet_client_t;
 
 static char *MessageToString( vlm_message_t *, int );
-static void Write_message( telnet_client_t *, vlm_message_t *, char *, int );
+static void Write_message( telnet_client_t *, vlm_message_t *, const char *, int );
 
 struct intf_sys_t
 {
@@ -251,45 +251,25 @@ static void Run( intf_thread_t *p_intf )
 
         /* if a new client wants to communicate */
         fd = net_Accept( p_intf, p_sys->pi_fd, p_sys->i_clients > 0 ? 0 : -1 );
-        if( fd > 0 )
+        if( fd != -1 )
         {
-            telnet_client_t *cl = NULL;
-
-            /* to be non blocking */
-#if defined( WIN32 ) || defined( UNDER_CE )
-            {
-                unsigned long i_dummy = 1;
-                ioctlsocket( fd, FIONBIO, &i_dummy );
-            }
-#else
-            fcntl( fd, F_SETFL, O_NONBLOCK );
-#endif
-            cl = malloc( sizeof( telnet_client_t ));
+            telnet_client_t *cl = malloc( sizeof( telnet_client_t ));
             if( cl )
             {
-                char   *psz_pwd = strdup( "Password" );
-                char   *psz_tmp = NULL;
-                size_t ctrl_len = strlen( ": \xff\xfb\x01" );
-                size_t passwd_len = strlen( psz_pwd );
-
                 memset( cl, 0, sizeof(telnet_client_t) );
                 cl->i_tel_cmd = 0;
                 cl->fd = fd;
                 cl->buffer_write = NULL;
                 cl->p_buffer_write = cl->buffer_write;
-                psz_tmp = malloc( passwd_len + ctrl_len + 1 );
-                if( !psz_tmp )
-                {
-                    free( psz_pwd );
-                    continue;
-                }
-                memset( psz_tmp, 0, passwd_len + ctrl_len + 1 );
-                memcpy( psz_tmp, psz_pwd, passwd_len );
-                memcpy( psz_tmp + passwd_len, ": \xff\xfb\x01", ctrl_len );
-                Write_message( cl, NULL, psz_tmp, WRITE_MODE_PWD );
+                Write_message( cl, NULL,
+                               "Password: \xff\xfb\x01" , WRITE_MODE_PWD );
+
                 TAB_APPEND( p_sys->i_clients, p_sys->clients, cl );
-                free( psz_pwd );
-                free( psz_tmp );
+            }
+            else
+            {
+                net_Close( fd );
+                continue;
             }
         }
 
@@ -399,7 +379,7 @@ static void Run( intf_thread_t *p_intf )
                                    cl->i_mode + 2 );
                 }
 
-                if( i_recv == 0 )
+                if( i_recv == 0  || ( i_recv == -1 &&  errno != EAGAIN && errno != 0 ) )
                 {
                     net_Close( cl->fd );
                     TAB_REMOVE( p_intf->p_sys->i_clients ,
@@ -414,35 +394,19 @@ static void Run( intf_thread_t *p_intf )
         {
             telnet_client_t *cl = p_sys->clients[i];
 
-            if( (cl->i_mode >= WRITE_MODE_PWD) && (cl->i_buffer_write == 0) )
+            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') )
+            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 )
+                if( !psz_password || !strcmp( psz_password, cl->buffer_read ) )
                 {
-                    char *psz_welcome = strdup( "Welcome, Master" );
-                    char *psz_tmp = NULL;
-                    size_t welcome_len = strlen( psz_welcome );
-                    size_t ctrl_len = strlen("\xff\xfc\x01\r\n");
-
-                    psz_tmp = malloc( welcome_len + ctrl_len + 4 + 1 );
-                    if( !psz_tmp )
-                    {
-                        free( psz_welcome );
-                        continue;
-                    }
-                    memset( psz_tmp, 0, welcome_len + ctrl_len + 4 + 1 );
-                    memcpy( psz_tmp, "\xff\xfc\x01\r\n", ctrl_len );
-                    memcpy( psz_tmp + ctrl_len, psz_welcome, welcome_len );
-                    memcpy( psz_tmp + ctrl_len + welcome_len, "\r\n> ", 4 );
-                    Write_message( cl, NULL, psz_tmp, WRITE_MODE_CMD );
-                    free( psz_welcome );
-                    free( psz_tmp );
+                    Write_message( cl, NULL, "\xff\xfc\x01\r\nWelcome, "
+                                   "Master\r\n> ", WRITE_MODE_CMD );
                 }
                 else
                 {
@@ -452,8 +416,8 @@ static void Run( intf_thread_t *p_intf )
                                    WRITE_MODE_PWD );
                 }
             }
-            else if( (cl->i_mode == READ_MODE_CMD) &&
-                     (*cl->p_buffer_read == '\n') )
+            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 ) ||
@@ -468,7 +432,39 @@ static void Run( intf_thread_t *p_intf )
                 else if( !strncmp( cl->buffer_read, "shutdown", 8 ) )
                 {
                     msg_Err( p_intf, "shutdown requested" );
-                    p_intf->p_libvlc->b_die = VLC_TRUE;
+                    vlc_object_kill( p_intf->p_libvlc );
+                }
+                else if( *cl->buffer_read == '@'
+                          && strchr( cl->buffer_read, ' ' ) )
+                {
+                    /* Module specific commands (use same syntax as in the
+                     * rc interface) */
+                    char *psz_name = cl->buffer_read + 1;
+                    char *psz_cmd, *psz_arg, *psz_msg;
+                    int i_ret;
+
+                    psz_cmd = strchr( cl->buffer_read, ' ' );
+                    *psz_cmd = '\0';  psz_cmd++;
+                    if( ( psz_arg = strchr( psz_cmd, '\n' ) ) ) *psz_arg = '\0';
+                    if( ( psz_arg = strchr( psz_cmd, '\r' ) ) ) *psz_arg = '\0';
+                    if( ( psz_arg = strchr( psz_cmd, ' ' ) )
+                        && *psz_arg )
+                    {
+                        *psz_arg = '\0';
+                        psz_arg++;
+                    }
+
+                    i_ret = var_Command( p_intf, psz_name, psz_cmd, psz_arg,
+                                         &psz_msg );
+
+                    if( psz_msg )
+                    {
+                        vlm_message_t *message;
+                        message = vlm_MessageNew( "Module command", psz_msg );
+                        Write_message( cl, message, NULL, WRITE_MODE_CMD );
+                        vlm_MessageDelete( message );
+                        free( psz_msg );
+                    }
                 }
                 else
                 {
@@ -487,6 +483,9 @@ static void Run( intf_thread_t *p_intf )
                             vlm_MessageNew( "logout, quit, exit" , NULL ) );
                         vlm_MessageAdd( p_my_help,
                             vlm_MessageNew( "shutdown" , NULL ) );
+                        vlm_MessageAdd( p_my_help,
+                            vlm_MessageNew( "@moduleinstance command argument",
+                                             NULL) );
                         vlm_MessageAdd( message, p_my_help );
                     }
                     Write_message( cl, message, NULL, WRITE_MODE_CMD );
@@ -496,10 +495,12 @@ static void Run( intf_thread_t *p_intf )
             }
         }
     }
+    if( psz_password )
+        free( psz_password );
 }
 
 static void Write_message( telnet_client_t *client, vlm_message_t *message,
-                           char *string_message, int i_mode )
+                           const char *string_message, int i_mode )
 {
     char *psz_message;