--- ncftp-3.1.1/libncftp/io_listmem.c.y Sun Jan 20 23:46:43 2002 +++ ncftp-3.1.1/libncftp/io_listmem.c Sun Jan 20 23:48:54 2002 @@ -31,6 +31,52 @@ # endif #endif + + + +void parseEPLF(char *line) { + char newline[512]; + char *name=0; + time_t mtime=0,now=time(0); + char type=0; /* 0=file, 1=dir */ + unsigned long size=0; + char *ptr=line; + struct tm *t; + char date[20]; + char *months[12]={"Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"}; + while (*ptr) + switch (*ptr) { + case '\t': + { + char *tmp=strchr(ptr,'\n'); + if (tmp) *tmp=0; + } + t=localtime(&mtime); + if ((mtime<=now) && (mtime>=now-(60*60*24*7*26))) { + sprintf(date,"%s %-2d %02d:%02d",months[t->tm_mon],t->tm_mday,t->tm_hour,t->tm_min); + } else { + sprintf(date,"%s %-2d %5d",months[t->tm_mon],t->tm_mday,t->tm_year+1900); + } + snprintf(newline,511,"%s 1 mirror mirror %8d %s %s", + type?"drwxr-xr-x":"-rw-r--r--",size,date,ptr+1); + newline[511]=0; + strcpy(line,newline); + return; + case 's': + while (*++ptr && (*ptr != ',')) + size = size * 10 + (*ptr - '0'); + break; + case 'm': + while (*++ptr && (*ptr != ',')) + mtime = mtime * 10 + (*ptr - '0'); + break; + case '/': + type=1; + default: + while (*ptr) if (*ptr++ == ',') break; + } +} + int FTPListToMemory2(const FTPCIPtr cip, const char *const pattern, const LineListPtr llines, const char *const lsflags, const int blankLines, int *const tryMLSD) { @@ -149,6 +195,10 @@ /* Valid directory listing line of output */ if ((line[0] == '.') && ((line[1] == '\0') || ((line[1] == '.') && ((line[2] == '\0') || (iscntrl((int) line[2])))))) continue; /* Skip . and .. */ + + if (line[0] == '+') { /* EPLF */ + parseEPLF(line); + } (void) AddLine(llines, line); }