[FFmpeg-devel] [PATCH 3/3] lavf/ftp: implement NLST method

Michael Niedermayer michael at niedermayer.cc
Mon Aug 10 18:41:38 CEST 2015


On Sun, Aug 09, 2015 at 02:38:12AM +0200, Mariusz SzczepaƄczyk wrote:
> ---
>  libavformat/ftp.c | 98 +++++++++++++++++++++++++++++++++++++++++++++++--------
>  1 file changed, 84 insertions(+), 14 deletions(-)
> 
> diff --git a/libavformat/ftp.c b/libavformat/ftp.c
> index 542cf6a..5a312b9 100644
> --- a/libavformat/ftp.c
> +++ b/libavformat/ftp.c
> @@ -38,6 +38,12 @@ typedef enum {
>      DISCONNECTED
>  } FTPState;
>  
> +typedef enum {
> +    UNKNOWN_METHOD,
> +    NLST,
> +    MLSD
> +} FTPListingMethod;
> +
>  typedef struct {
>      const AVClass *class;
>      URLContext *conn_control;                    /**< Control connection */
> @@ -56,6 +62,8 @@ typedef struct {
>      const char *anonymous_password;              /**< Password to be used for anonymous user. An email should be used. */
>      int write_seekable;                          /**< Control seekability, 0 = disable, 1 = enable. */
>      FTPState state;                              /**< State of data connection */
> +    FTPListingMethod listing_method;             /**< Called listing method */
> +    char *features;                              /**< List of server's features represented as raw response */
>      char *dir_buffer;
>      size_t dir_buffer_size;
>      size_t dir_buffer_offset;
> @@ -192,6 +200,8 @@ static int ftp_send_command(FTPContext *s, const char *command,
>  {
>      int err;
>  
> +    av_dlog(s, "%s", command);
> +
>      if (response)
>          *response = NULL;
>  
> @@ -449,32 +459,68 @@ static int ftp_set_dir(FTPContext *s)
>      return 0;
>  }
>  
> -static int ftp_list(FTPContext *s)
> +static int ftp_list_mlsd(FTPContext *s)
>  {
>      static const char *command = "MLSD\r\n";
>      static const int mlsd_codes[] = {150, 500, 0}; /* 500 is incorrect code */
>  
>      if (ftp_send_command(s, command, mlsd_codes, NULL) != 150)
>          return AVERROR(ENOSYS);
> -    s->state = LISTING_DIR;
> +    s->listing_method = MLSD;
> +    return 0;
> +}
> +
> +static int ftp_list_nlst(FTPContext *s)
> +{
> +    static const char *command = "NLST\r\n";
> +    static const int nlst_codes[] = {226, 425, 426, 451, 450, 550, 0};
> +
> +    if (ftp_send_command(s, command, nlst_codes, NULL) != 226)
> +        return AVERROR(ENOSYS);
> +    s->listing_method = NLST;
>      return 0;
>  }
>  
> +static int ftp_has_feature(FTPContext *s, const char *feature_name);
> +
> +static int ftp_list(FTPContext *s)
> +{
> +    s->state = LISTING_DIR;
> +
> +    if (ftp_has_feature(s, "MLSD"))
> +        return ftp_list_mlsd(s);
> +
> +    return ftp_list_nlst(s);
> +}
> +
> +static int ftp_has_feature(FTPContext *s, const char *feature_name)
> +{
> +    if (!s->features)
> +        return 0;
> +
> +    return av_stristr(s->features, feature_name) != NULL;
> +}
> +
>  static int ftp_features(FTPContext *s)
>  {
>      static const char *feat_command        = "FEAT\r\n";
>      static const char *enable_utf8_command = "OPTS UTF8 ON\r\n";
>      static const int feat_codes[] = {211, 0};
>      static const int opts_codes[] = {200, 451, 0};
> -    char *feat = NULL;

> +    if (s->features) {
> +        av_freep(&s->features);
> +        s->features = NULL;
> +    }

the if and NULL setting is uneeded

also please explain how each patch can be tested

>  
> -    if (ftp_send_command(s, feat_command, feat_codes, &feat) == 211) {
> -        if (av_stristr(feat, "UTF8")) {
> -            if (ftp_send_command(s, enable_utf8_command, opts_codes, NULL) == 200)
> -                s->utf8 = 1;
> -        }
> +    if (ftp_send_command(s, feat_command, feat_codes, &s->features) != 211) {

> +        av_freep(&s->features);
> +        s->features = NULL;

same


[...]
-- 
Michael     GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB

Old school: Use the lowest level language in which you can solve the problem
            conveniently.
New school: Use the highest level language in which the latest supercomputer
            can solve the problem without the user falling asleep waiting.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 181 bytes
Desc: Digital signature
URL: <http://ffmpeg.org/pipermail/ffmpeg-devel/attachments/20150810/e8b761ea/attachment.sig>


More information about the ffmpeg-devel mailing list