Example #1
0
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
}
Example #2
0
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*/
}
Example #3
0
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
}