int LastModifiedFile(const char *name, double *tp) { #ifdef __WINDOWS__ HANDLE hFile; wchar_t wfile[MAXPATHLEN]; #define nano * 0.000000001 #define ntick 100.0 #define SEC_TO_UNIX_EPOCH 11644473600.0 if ( !_xos_os_filenameW(name, wfile, MAXPATHLEN) ) return FALSE; if ( (hFile=CreateFileW(wfile, 0, FILE_SHARE_DELETE|FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL)) != INVALID_HANDLE_VALUE ) { FILETIME wt; int rc; rc = GetFileTime(hFile, NULL, NULL, &wt); CloseHandle(hFile); if ( rc ) { double t; t = (double)wt.dwHighDateTime * (4294967296.0 * ntick nano); t += (double)wt.dwLowDateTime * (ntick nano); t -= SEC_TO_UNIX_EPOCH; *tp = t; return TRUE; } } set_posix_error(GetLastError()); return FALSE; #else char tmp[MAXPATHLEN]; statstruct buf; if ( statfunc(OsPath(name, tmp), &buf) < 0 ) return FALSE; #ifdef HAVE_STRUCT_STAT_ST_MTIM *tp = (double)buf.st_mtim.tv_sec + (double)buf.st_mtim.tv_nsec/1.0e9; #else *tp = (double)buf.st_mtime; #endif return TRUE; #endif }
static int attach_archive(RcArchive rca) { #if MAPPED_ARCHIVE #ifdef HAVE_MMAP int fd; if ( (fd = open(rca->path, O_RDONLY)) >= 0 ) { struct stat buf; if ( fstat(fd, &buf) == 0 ) { rca->map_size = buf.st_size; rca->size = rca->map_size; rca->offset = 0; if ( (rca->map_start = mmap(NULL, rca->size, PROT_READ, MAP_SHARED, fd, 0)) != MAP_FAILED ) { close(fd); rca->data = rca->map_start; return scan_archive(rca); } } } rc_errno = RCE_ERRNO; return FALSE; #else /*HAVE_MMAP*/ #ifdef __WINDOWS__ DWORD fsize; wchar_t buf[PATH_MAX]; if ( !_xos_os_filenameW(rca->path, buf, PATH_MAX) ) goto errio; rca->hfile = CreateFileW(buf, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if ( !rca->hfile ) goto errio; if ( (fsize = GetFileSize(rca->hfile, NULL)) == (DWORD)~0L ) goto errio; rca->map_size = fsize; rca->size = rca->map_size; rca->offset = 0; rca->hmap = CreateFileMapping(rca->hfile, NULL, PAGE_READONLY, 0L, (DWORD)rca->size, /* WIN64: Truncated! */ NULL); if ( !rca->hmap ) goto errio; rca->map_start = MapViewOfFile(rca->hmap, FILE_MAP_READ, 0L, 0L, /* offset */ 0L); /* size (0=all) */ if ( !rca->map_start ) goto errio; rca->data = rca->map_start; return scan_archive(rca); errio: { if ( rca->hmap ) CloseHandle(rca->hmap); if ( rca->hfile ) CloseHandle(rca->hfile); rca->map_start = NULL; rca->hfile = NULL; rca->hmap = NULL; rc_errno = RCE_WINERRNO; return FALSE; } #endif /*__WINDOWS__*/ #endif /*HAVE_MMAP*/ #else /*MAPPED_ARCHIVE*/ /* bottom line, use files */ if ( (rca->fd = fopen(rca->path, "rb")) ) { struct stat buf; if ( fstat(fileno(rca->fd), &buf) == 0 ) { rca->size = buf.st_size; rca->offset = 0; } return scan_archive(rca); } rc_errno = RCE_ERRNO; return FALSE; #endif /*MAPPED_ARCHIVE*/ }
static int LastModifiedFile64(const char *name, int64_t *tp) { #ifdef __WINDOWS__ HANDLE hFile; wchar_t wfile[MAXPATHLEN]; #define nano * 0.000000001 #define ntick 100.0 #define SEC_TO_UNIX_EPOCH 11644473600.0 if ( !_xos_os_filenameW(name, wfile, MAXPATHLEN) ) return FALSE; if ( (hFile=CreateFileW(wfile, 0, FILE_SHARE_DELETE|FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL)) != INVALID_HANDLE_VALUE ) { FILETIME wt; int rc; rc = GetFileTime(hFile, NULL, NULL, (FILETIME *)&wt); CloseHandle(hFile); if ( rc ) { LARGE_INTEGER date, adjust; date.HighPart = wt.dwHighDateTime; date.LowPart = wt.dwLowDateTime; adjust.QuadPart = 11644473600000 * 10000; date.QuadPart -= adjust.QuadPart; date.QuadPart /= 10000000; *tp = date.QuadPart; return TRUE; } } set_posix_error(GetLastError()); return FALSE; #else char tmp[MAXPATHLEN]; statstruct buf; #ifdef __ANDROID__ if (Yap_isAsset(name)) { if ( statfunc(OsPath("/", tmp), &buf) < 0 ) { return FALSE; } *tp = (int64_t)buf.st_mtime; return Yap_AccessAsset(name, R_OK); } #endif if ( statfunc(OsPath(name, tmp), &buf) < 0 ){ return FALSE; } *tp = (int64_t)buf.st_mtime; return TRUE; #endif }