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.
signature.asc
Description: Digital signature
_______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel