This makes RO's patching tool go a tad bit further... It still fails, but there are some progresses :-) Lionel Changelog: - fix spec file for FTPFindFirstFileA/W functions - implement parsing of NT directory format -- Lionel Ulmer - http://www.bbrox.org/
Index: dlls/wininet/ftp.c =================================================================== RCS file: /home/wine/wine/dlls/wininet/ftp.c,v retrieving revision 1.28 diff -u -r1.28 ftp.c --- dlls/wininet/ftp.c 14 Jan 2003 23:43:42 -0000 1.28 +++ dlls/wininet/ftp.c 15 Jul 2003 18:14:50 -0000 @@ -2521,83 +2521,137 @@ pszToken = strtok(pszLine, " \t" ); /* HACK! If this is not a file listing skip the line */ - if (!pszToken || 10 != strlen(pszToken) || nBufLen <= MIN_LEN_DIR_ENTRY) + if (!pszToken || nBufLen <= MIN_LEN_DIR_ENTRY) { nBufLen = MAX_REPLY_LEN; continue; } - - FTP_ParsePermission(pszToken, curFileProp); - - nTokenToSkip = 3; - nCount = 0; - do - { - pszToken = strtok( NULL, " \t" ); - nCount++; - } while( nCount <= nTokenToSkip ); - - /* Store the size of the file in the param list. */ - TRACE("nSize-> %s\n", pszToken); - if (pszToken != NULL) - curFileProp->nSize = atol(pszToken); - - /* Parse last modified time. */ - nSeconds = 0; - nMinutes = 0; - nHour = 0; - nDay = 0; - nMonth = 0; - nYear = 0; - - pszToken = strtok( NULL, " \t" ); - strncpy(pszMonth, pszToken, MAX_MONTH_LEN); - CharUpperA(pszMonth); - pszMatch = strstr(szMonths, pszMonth); - if( pszMatch != NULL ) - nMonth = (pszMatch - szMonths) / 3; - - pszToken = strtok(NULL, " \t"); - TRACE("nDay -> %s\n", pszToken); - if (pszToken != NULL) - nDay = atoi(pszToken); - - pszToken = strtok(NULL, " \t"); - pszMinutes = strchr(pszToken, ':'); - if( pszMinutes != NULL ) - { - pszMinutes++; - nMinutes = atoi(pszMinutes); - pszHour = pszMinutes - 3; - if (pszHour != NULL) - nHour = atoi(pszHour); - time(&aTime); - apTM = localtime( &aTime ); - nYear = apTM->tm_year; - } - else - { - nYear = atoi(pszToken); - nYear -= 1900; - nHour = 12; - } - - curFileProp->tmLastModified.tm_sec = nSeconds; - curFileProp->tmLastModified.tm_min = nMinutes; - curFileProp->tmLastModified.tm_hour = nHour; - curFileProp->tmLastModified.tm_mday = nDay; - curFileProp->tmLastModified.tm_mon = nMonth; - curFileProp->tmLastModified.tm_year = nYear; - - pszToken = strtok(NULL, " \t"); - if(pszToken != NULL) - { - curFileProp->lpszName = FTP_strdup(pszToken); - TRACE(": %s\n", curFileProp->lpszName); - } - - nBufLen = MAX_REPLY_LEN; - indexFilePropArray++; + if (10 == strlen(pszToken)) { + /* Unix way of parsing ... */ + FTP_ParsePermission(pszToken, curFileProp); + + nTokenToSkip = 3; + nCount = 0; + do { + pszToken = strtok( NULL, " \t" ); + nCount++; + } while( nCount <= nTokenToSkip ); + + /* Store the size of the file in the param list. */ + TRACE("nSize-> %s\n", pszToken); + if (pszToken != NULL) + curFileProp->nSize = atol(pszToken); + + /* Parse last modified time. */ + nSeconds = 0; + nMinutes = 0; + nHour = 0; + nDay = 0; + nMonth = 0; + nYear = 0; + + pszToken = strtok( NULL, " \t" ); + strncpy(pszMonth, pszToken, MAX_MONTH_LEN); + CharUpperA(pszMonth); + pszMatch = strstr(szMonths, pszMonth); + if( pszMatch != NULL ) + nMonth = (pszMatch - szMonths) / 3; + + pszToken = strtok(NULL, " \t"); + TRACE("nDay -> %s\n", pszToken); + if (pszToken != NULL) + nDay = atoi(pszToken); + + pszToken = strtok(NULL, " \t"); + pszMinutes = strchr(pszToken, ':'); + if( pszMinutes != NULL ) { + pszMinutes++; + nMinutes = atoi(pszMinutes); + pszHour = pszMinutes - 3; + if (pszHour != NULL) + nHour = atoi(pszHour); + time(&aTime); + apTM = localtime( &aTime ); + nYear = apTM->tm_year; + } else { + nYear = atoi(pszToken); + nYear -= 1900; + nHour = 12; + } + + curFileProp->tmLastModified.tm_sec = nSeconds; + curFileProp->tmLastModified.tm_min = nMinutes; + curFileProp->tmLastModified.tm_hour = nHour; + curFileProp->tmLastModified.tm_mday = nDay; + curFileProp->tmLastModified.tm_mon = nMonth; + curFileProp->tmLastModified.tm_year = nYear; + + pszToken = strtok(NULL, " \t"); + if(pszToken != NULL) { + curFileProp->lpszName = FTP_strdup(pszToken); + TRACE(": %s\n", curFileProp->lpszName); + } + + nBufLen = MAX_REPLY_LEN; + indexFilePropArray++; + } else if (8 == strlen(pszToken)) { + /* NT way of parsing ... : + + 07-13-03 08:55PM <DIR> sakpatch + 05-09-03 06:02PM 12656686 2003-04-21bgm_cmd_e.rgz + */ + + curFileProp->permissions = 0xFFFF; /* No idea, put full permission :-) */ + + sscanf(pszToken, "%d-%d-%d", + &curFileProp->tmLastModified.tm_mon, + &curFileProp->tmLastModified.tm_mday, + &curFileProp->tmLastModified.tm_year); /* Do we check for Y2K problems ? */ + + pszToken = strtok(NULL, " \t"); + if (pszToken == NULL) { + nBufLen = MAX_REPLY_LEN; + continue; + } + sscanf(pszToken, "%d:%d", + &curFileProp->tmLastModified.tm_hour, + &curFileProp->tmLastModified.tm_min); + if ((pszToken[5] == 'P') && (pszToken[6] == 'M')) { + curFileProp->tmLastModified.tm_hour += 12; + } + curFileProp->tmLastModified.tm_sec = 0; + + TRACE("Mod time: %2d:%2d:%2d %2d/%2d/%2d\n", + curFileProp->tmLastModified.tm_hour, curFileProp->tmLastModified.tm_min, curFileProp->tmLastModified.tm_sec, + curFileProp->tmLastModified.tm_year, curFileProp->tmLastModified.tm_mon, curFileProp->tmLastModified.tm_mday); + + pszToken = strtok(NULL, " \t"); + if (pszToken == NULL) { + nBufLen = MAX_REPLY_LEN; + continue; + } + if (!strcasecmp(pszToken, "<DIR>")) { + curFileProp->bIsDirectory = TRUE; + TRACE("Is directory\n"); + } else { + curFileProp->bIsDirectory = FALSE; + curFileProp->nSize = atol(pszToken); + TRACE("nSize: %ld\n", curFileProp->nSize); + } + + pszToken = strtok(NULL, " \t"); + if (pszToken == NULL) { + nBufLen = MAX_REPLY_LEN; + continue; + } + curFileProp->lpszName = FTP_strdup(pszToken); + TRACE("Name: %s\n", curFileProp->lpszName); + + nBufLen = MAX_REPLY_LEN; + indexFilePropArray++; + } else { + nBufLen = MAX_REPLY_LEN; + } } if (bSuccess && indexFilePropArray) Index: dlls/wininet/wininet.spec =================================================================== RCS file: /home/wine/wine/dlls/wininet/wininet.spec,v retrieving revision 1.39 diff -u -r1.39 wininet.spec --- dlls/wininet/wininet.spec 16 Jun 2003 19:40:27 -0000 1.39 +++ dlls/wininet/wininet.spec 15 Jul 2003 18:14:51 -0000 @@ -35,8 +35,8 @@ @ stdcall FtpCreateDirectoryW(ptr wstr) @ stdcall FtpDeleteFileA(ptr str) @ stub FtpDeleteFileW -@ stdcall FtpFindFirstFileA(ptr str str long long) -@ stdcall FtpFindFirstFileW(ptr wstr wstr long long) +@ stdcall FtpFindFirstFileA(ptr str ptr long long) +@ stdcall FtpFindFirstFileW(ptr wstr ptr long long) @ stdcall FtpGetCurrentDirectoryA(ptr str ptr) @ stdcall FtpGetCurrentDirectoryW(ptr wstr ptr) @ stdcall FtpGetFileA(ptr str str long long long long)