From 022dbcb343bc6af443fada22820b00f77270971f Mon Sep 17 00:00:00 2001 From: Nikolay Merinov Date: Sat, 29 Sep 2012 16:49:30 +0600 Subject: [PATCH] Support new WinNT ftp listing format --- src/ChangeLog | 5 +++++ src/ftp-ls.c | 35 +++++++++++++++++++++++------------ 2 files changed, 28 insertions(+), 12 deletions(-) diff --git a/src/ChangeLog b/src/ChangeLog index 07ff19c5..069478bb 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,8 @@ +2012-09-29 Merinov Nikolay + + * ftp-ls.c (ftp_parse_winnt_ls): Support filename extracting with + new listing format. + 2012-09-29 Tim Ruehsen * url.h (CHOMP_BUFFER): Add definition. diff --git a/src/ftp-ls.c b/src/ftp-ls.c index 40c11f39..3056651b 100644 --- a/src/ftp-ls.c +++ b/src/ftp-ls.c @@ -434,6 +434,7 @@ ftp_parse_winnt_ls (const char *file) struct tm timestruct; char *line, *tok; /* tokenizer */ + char *filename; struct fileinfo *dir, *l, cur; /* list creation */ fp = fopen (file, "rb"); @@ -449,19 +450,16 @@ ftp_parse_winnt_ls (const char *file) { len = clean_line (line); - /* Extracting name is a bit of black magic and we have to do it - before `strtok' inserted extra \0 characters in the line - string. For the moment let us just suppose that the name starts at - column 39 of the listing. This way we could also recognize - filenames that begin with a series of space characters (but who - really wants to use such filenames anyway?). */ + /* Name begins at 39 column of the listing if date presented in `mm-dd-yy' + format or at 41 column if date presented in `mm-dd-yyyy' format. Thus, + we cannot extract name before we parse date. Using this information we + also can recognize filenames that begin with a series of space + characters (but who really wants to use such filenames anyway?). */ if (len < 40) goto continue_loop; - tok = line + 39; - cur.name = xstrdup(tok); - DEBUGP (("Name: '%s'\n", cur.name)); + filename = line + 39; - /* First column: mm-dd-yy. Should atoi() on the month fail, january - will be assumed. */ + /* First column: mm-dd-yy or mm-dd-yyyy. Should atoi() on the month fail, + january will be assumed. */ tok = strtok(line, "-"); if (tok == NULL) goto continue_loop; month = atoi(tok) - 1; @@ -473,7 +471,20 @@ ftp_parse_winnt_ls (const char *file) if (tok == NULL) goto continue_loop; year = atoi(tok); /* Assuming the epoch starting at 1.1.1970 */ - if (year <= 70) year += 100; + if (year <= 70) + { + year += 100; + } + else if (year >= 1900) + { + year -= 1900; + filename += 2; + } + /* Now it is possible to determine the position of the first symbol in + filename. */ + cur.name = xstrdup(filename); + DEBUGP (("Name: '%s'\n", cur.name)); + /* Second column: hh:mm[AP]M, listing does not contain value for seconds */