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

📄 ftp.c

📁 video linux conference
💻 C
📖 第 1 页 / 共 2 页
字号:
/***************************************************************************** * ftp.c: FTP input module ***************************************************************************** * Copyright (C) 2001-2005 VideoLAN * $Id: ftp.c 11096 2005-05-21 19:05:14Z courmisch $ * * Authors: Laurent Aimar <fenrir@via.ecp.fr> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111, USA. *****************************************************************************//***************************************************************************** * Preamble *****************************************************************************/#include <stdlib.h>#include <vlc/vlc.h>#include <vlc/input.h>#include "network.h"/***************************************************************************** * Module descriptor *****************************************************************************/static int     Open ( vlc_object_t * );static void    Close( vlc_object_t * );#define CACHING_TEXT N_("Caching value in ms")#define CACHING_LONGTEXT N_( \    "Allows you to modify the default caching value for FTP streams. This " \    "value should be set in millisecond units." )#define USER_TEXT N_("FTP user name")#define USER_LONGTEXT N_("Allows you to modify the user name that will " \    "be used for the connection.")#define PASS_TEXT N_("FTP password")#define PASS_LONGTEXT N_("Allows you to modify the password that will be " \    "used for the connection.")#define ACCOUNT_TEXT N_("FTP account")#define ACCOUNT_LONGTEXT N_("Allows you to modify the account that will be " \    "used for the connection.")vlc_module_begin();    set_shortname( "FTP" );    set_description( _("FTP input") );    set_capability( "access2", 0 );    set_category( CAT_INPUT );    set_subcategory( SUBCAT_INPUT_ACCESS );    add_integer( "ftp-caching", 2 * DEFAULT_PTS_DELAY / 1000, NULL,                 CACHING_TEXT, CACHING_LONGTEXT, VLC_TRUE );    add_string( "ftp-user", "anonymous", NULL, USER_TEXT, USER_LONGTEXT,                VLC_FALSE );    add_string( "ftp-pwd", "anonymous@dummy.org", NULL, PASS_TEXT,                PASS_LONGTEXT, VLC_FALSE );    add_string( "ftp-account", "anonymous", NULL, ACCOUNT_TEXT,                ACCOUNT_LONGTEXT, VLC_FALSE );    add_shortcut( "ftp" );    set_callbacks( Open, Close );vlc_module_end();/***************************************************************************** * Local prototypes *****************************************************************************/static int Read( access_t *, uint8_t *, int );static int Seek( access_t *, int64_t );static int Control( access_t *, int, va_list );struct access_sys_t{    vlc_url_t  url;    int        fd_cmd;    int        fd_data;        vlc_bool_t b_epsv;};static int  ftp_SendCommand( access_t *, char *, ... );static int  ftp_ReadCommand( access_t *, int *, char ** );static int  ftp_StartStream( access_t *, int64_t );static int  ftp_StopStream ( access_t *);/**************************************************************************** * Open: connect to ftp server and ask for file ****************************************************************************/static int Open( vlc_object_t *p_this ){    access_t     *p_access = (access_t*)p_this;    access_sys_t *p_sys;    char         *psz;    int          i_answer;    char         *psz_arg;    /* Init p_access */    p_access->pf_read = Read;    p_access->pf_block = NULL;    p_access->pf_seek = Seek;    p_access->pf_control = Control;    p_access->info.i_update = 0;    p_access->info.i_size = 0;    p_access->info.i_pos = 0;    p_access->info.b_eof = VLC_FALSE;    p_access->info.i_title = 0;    p_access->info.i_seekpoint = 0;    p_access->p_sys = p_sys = malloc( sizeof( access_sys_t ) );    memset( p_sys, 0, sizeof( access_sys_t ) );    p_sys->fd_cmd = -1;    p_sys->fd_data = -1;    /* *** Parse URL and get server addr/port and path *** */    psz = p_access->psz_path;    while( *psz == '/' )    {        psz++;    }    vlc_UrlParse( &p_sys->url, psz, 0 );    if( p_sys->url.psz_host == NULL || *p_sys->url.psz_host == '\0' )    {        msg_Err( p_access, "invalid server name" );        goto exit_error;    }    if( p_sys->url.i_port <= 0 )    {        p_sys->url.i_port = 21; /* default port */    }    /* *** Open a TCP connection with server *** */    msg_Dbg( p_access, "waiting for connection..." );    p_sys->fd_cmd = net_OpenTCP( p_access, p_sys->url.psz_host,                                 p_sys->url.i_port );    if( p_sys->fd_cmd < 0 )    {        msg_Err( p_access, "failed to connect with server" );        goto exit_error;    }    for( ;; )    {        if( ftp_ReadCommand( p_access, &i_answer, NULL ) != 1 )        {            break;        }    }    if( i_answer / 100 != 2 )    {        msg_Err( p_access, "connection rejected" );        goto exit_error;    }    msg_Dbg( p_access, "connection accepted (%d)", i_answer );    psz = var_CreateGetString( p_access, "ftp-user" );    if( ftp_SendCommand( p_access, "USER %s", psz ) < 0 ||        ftp_ReadCommand( p_access, &i_answer, NULL ) < 0 )    {        free( psz );        goto exit_error;    }    free( psz );    switch( i_answer / 100 )    {        case 2:            msg_Dbg( p_access, "user accepted" );            break;        case 3:            msg_Dbg( p_access, "password needed" );            psz = var_CreateGetString( p_access, "ftp-pwd" );            if( ftp_SendCommand( p_access, "PASS %s", psz ) < 0 ||                ftp_ReadCommand( p_access, &i_answer, NULL ) < 0 )            {                free( psz );                goto exit_error;            }            free( psz );            switch( i_answer / 100 )            {                case 2:                    msg_Dbg( p_access, "password accepted" );                    break;                case 3:                    msg_Dbg( p_access, "account needed" );                    psz = var_CreateGetString( p_access, "ftp-account" );                    if( ftp_SendCommand( p_access, "ACCT %s",                                         psz ) < 0 ||                        ftp_ReadCommand( p_access, &i_answer, NULL ) < 0 )                    {                        free( psz );                        goto exit_error;                    }                    free( psz );                    if( i_answer / 100 != 2 )                    {                        msg_Err( p_access, "account rejected" );                        goto exit_error;                    }                    msg_Dbg( p_access, "account accepted" );                    break;                default:                    msg_Err( p_access, "password rejected" );                    goto exit_error;            }            break;        default:            msg_Err( p_access, "user rejected" );            goto exit_error;    }    /* Extended passive mode */    if( ftp_SendCommand( p_access, "EPSV ALL" ) < 0 )    {        msg_Err( p_access, "cannot request extended passive mode" );        goto exit_error;    }    if( ftp_ReadCommand( p_access, &i_answer, NULL ) != 2 )    {        p_sys->b_epsv = VLC_FALSE;        msg_Warn( p_access, "Extended passive mode not supported" );    }    else        p_sys->b_epsv = VLC_TRUE;    /* binary mode */    if( ftp_SendCommand( p_access, "TYPE I" ) < 0 ||        ftp_ReadCommand( p_access, &i_answer, NULL ) != 2 )    {        msg_Err( p_access, "cannot set binary transfer mode" );        goto exit_error;    }    /* get size */    if( ftp_SendCommand( p_access, "SIZE %s", p_sys->url.psz_path ) < 0 ||        ftp_ReadCommand( p_access, &i_answer, &psz_arg ) != 2 )    {        msg_Err( p_access, "cannot get file size" );        goto exit_error;    }    p_access->info.i_size = atoll( &psz_arg[4] );    free( psz_arg );    msg_Dbg( p_access, "file size: "I64Fd, p_access->info.i_size );    /* Start the 'stream' */    if( ftp_StartStream( p_access, 0 ) < 0 )    {        msg_Err( p_access, "cannot retrieve file" );        goto exit_error;    }    /* Update default_pts to a suitable value for ftp access */    var_Create( p_access, "ftp-caching", VLC_VAR_INTEGER | VLC_VAR_DOINHERIT );    return VLC_SUCCESS;exit_error:    if( p_sys->fd_cmd > 0 )    {        net_Close( p_sys->fd_cmd );    }    vlc_UrlClean( &p_sys->url );    free( p_sys );    return VLC_EGENERIC;}/***************************************************************************** * Close: free unused data structures *****************************************************************************/static void Close( vlc_object_t *p_this ){    access_t      *p_access = (access_t*)p_this;    access_sys_t  *p_sys = p_access->p_sys;    msg_Dbg( p_access, "stopping stream" );    ftp_StopStream( p_access );    if( ftp_SendCommand( p_access, "QUIT" ) < 0 )    {        msg_Warn( p_access, "cannot quit" );    }    else    {        ftp_ReadCommand( p_access, NULL, NULL );    }    net_Close( p_sys->fd_cmd );    /* free memory */    vlc_UrlClean( &p_sys->url );    free( p_sys );}/***************************************************************************** * Seek: try to go at the right place *****************************************************************************/static int Seek( access_t *p_access, int64_t i_pos ){    if( i_pos < 0 )    {        return VLC_EGENERIC;    }

⌨️ 快捷键说明

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