185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho/****************************************************************************** 259d709d503bab6e2b61931737e662dd293b40578ccornelius * Copyright (C) 2009-2013, International Business Machines 385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho * Corporation and others. All Rights Reserved. 485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho ******************************************************************************* 585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho */ 685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 759d709d503bab6e2b61931737e662dd293b40578ccornelius#if U_PLATFORM == U_PF_MINGW 859d709d503bab6e2b61931737e662dd293b40578ccornelius// *cough* - for struct stat 959d709d503bab6e2b61931737e662dd293b40578ccornelius#ifdef __STRICT_ANSI__ 1059d709d503bab6e2b61931737e662dd293b40578ccornelius#undef __STRICT_ANSI__ 1159d709d503bab6e2b61931737e662dd293b40578ccornelius#endif 1259d709d503bab6e2b61931737e662dd293b40578ccornelius#endif 1359d709d503bab6e2b61931737e662dd293b40578ccornelius 1485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#include "filetools.h" 1585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#include "filestrm.h" 1685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#include "cstring.h" 1785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#include "unicode/putil.h" 1883a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius#include "putilimp.h" 1985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 2085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#include <stdio.h> 2185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#include <stdlib.h> 2285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#include <sys/stat.h> 2385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#include <time.h> 2485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#include <string.h> 2585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 2685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#if U_HAVE_DIRENT_H 2785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#include <dirent.h> 2885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hotypedef struct dirent DIRENT; 2985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 3085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#define MAX_PATH_SIZE 4096 /* Set the limit for the size of the path. */ 3185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 3285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#define SKIP1 "." 3385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#define SKIP2 ".." 3485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#endif 3585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 3685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hostatic int32_t whichFileModTimeIsLater(const char *file1, const char *file2); 3785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 3885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho/* 3985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho * Goes through the given directory recursive to compare each file's modification time with that of the file given. 4085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho * Also can be given just one file to check against. Default value for isDir is FALSE. 4185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho */ 4285bf2e2fbc60a9f938064abc8127d61da7d19882Claire HoU_CAPI UBool U_EXPORT2 4385bf2e2fbc60a9f938064abc8127d61da7d19882Claire HoisFileModTimeLater(const char *filePath, const char *checkAgainst, UBool isDir) { 4485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho UBool isLatest = TRUE; 4585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 4685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (filePath == NULL || checkAgainst == NULL) { 4785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho return FALSE; 4885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 4985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 5085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (isDir == TRUE) { 5185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#if U_HAVE_DIRENT_H 5285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho DIR *pDir = NULL; 5385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if ((pDir= opendir(checkAgainst)) != NULL) { 5485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho DIR *subDirp = NULL; 5585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho DIRENT *dirEntry = NULL; 5685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 5785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho while ((dirEntry = readdir(pDir)) != NULL) { 5885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (uprv_strcmp(dirEntry->d_name, SKIP1) != 0 && uprv_strcmp(dirEntry->d_name, SKIP2) != 0) { 5985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho char newpath[MAX_PATH_SIZE] = ""; 6085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho uprv_strcpy(newpath, checkAgainst); 6185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho uprv_strcat(newpath, U_FILE_SEP_STRING); 6285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho uprv_strcat(newpath, dirEntry->d_name); 6385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 6485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if ((subDirp = opendir(newpath)) != NULL) { 6585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /* If this new path is a directory, make a recursive call with the newpath. */ 6685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho closedir(subDirp); 6785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho isLatest = isFileModTimeLater(filePath, newpath, isDir); 6885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (!isLatest) { 6985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho break; 7085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 7185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } else { 7285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho int32_t latest = whichFileModTimeIsLater(filePath, newpath); 7385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (latest < 0 || latest == 2) { 7485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho isLatest = FALSE; 7585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho break; 7685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 7785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 7885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 7985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 8085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 8185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho closedir(pDir); 8285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } else { 8385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho fprintf(stderr, "Unable to open directory: %s\n", checkAgainst); 8485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho return FALSE; 8585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 8685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#endif 8785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } else { 8885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (T_FileStream_file_exists(checkAgainst)) { 8985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho int32_t latest = whichFileModTimeIsLater(filePath, checkAgainst); 9085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (latest < 0 || latest == 2) { 9185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho isLatest = FALSE; 9285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 9385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } else { 9485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho isLatest = FALSE; 9585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 9685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 9785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 9885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho return isLatest; 9985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho} 10085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 10185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho/* Compares the mod time of both files returning a number indicating which one is later. -1 if error ocurs. */ 10285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hostatic int32_t whichFileModTimeIsLater(const char *file1, const char *file2) { 10385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho int32_t result = 0; 10485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho struct stat stbuf1, stbuf2; 10585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 10685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (stat(file1, &stbuf1) == 0 && stat(file2, &stbuf2) == 0) { 10785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho time_t modtime1, modtime2; 10885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho double diff; 10985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 11085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho modtime1 = stbuf1.st_mtime; 11185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho modtime2 = stbuf2.st_mtime; 11285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 11385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho diff = difftime(modtime1, modtime2); 11485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (diff < 0.0) { 11585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho result = 2; 11685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } else if (diff > 0.0) { 11785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho result = 1; 11885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 11985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 12085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } else { 12185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho fprintf(stderr, "Unable to get stats from file: %s or %s\n", file1, file2); 12285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho result = -1; 12385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 12485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 12585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho return result; 12685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho} 12785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 12885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho/* Swap the file separater character given with the new one in the file path. */ 12985bf2e2fbc60a9f938064abc8127d61da7d19882Claire HoU_CAPI void U_EXPORT2 13085bf2e2fbc60a9f938064abc8127d61da7d19882Claire HoswapFileSepChar(char *filePath, const char oldFileSepChar, const char newFileSepChar) { 13185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho for (int32_t i = 0, length = uprv_strlen(filePath); i < length; i++) { 13285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho filePath[i] = (filePath[i] == oldFileSepChar ) ? newFileSepChar : filePath[i]; 13385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 13485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho} 135