mirror of
git://git.gnupg.org/gnupg.git
synced 2025-07-02 22:46:30 +02:00
gpg: Make progress work for large files on Windows.
* common/iobuf.c (iobuf_get_filelength): Change return type to
uint64_t and remove the overflow args. For Windows always use
GetFileSizeEx which is available since the long EOL-ed Windows XP.
* g10/sign.c (write_plaintext_packet): Adjust for changed
iobuf_get_filelength.
* g10/encrypt.c (encrypt_simple, encrypt_crypt): Ditto.
* g10/photoid.c (generate_photo_id): Ditto. Also add an upper limit.
* g10/filter.h (progress_filter_context_t): Change amount values to
use uint64_t.
* g10/progress.c (write_status_progress): Change accordingly.
--
GnuPG-bug-id: 6534
Backported-from: 808494b485
This commit is contained in:
parent
8425cdcc8e
commit
1b60aab2c4
10 changed files with 58 additions and 91 deletions
|
@ -2365,13 +2365,10 @@ iobuf_set_limit (iobuf_t a, off_t nlimit)
|
|||
}
|
||||
|
||||
|
||||
|
||||
off_t
|
||||
iobuf_get_filelength (iobuf_t a, int *overflow)
|
||||
/* Return the length of the file behind A. If there is no file, return 0. */
|
||||
uint64_t
|
||||
iobuf_get_filelength (iobuf_t a)
|
||||
{
|
||||
if (overflow)
|
||||
*overflow = 0;
|
||||
|
||||
/* Hmmm: file_filter may have already been removed */
|
||||
for ( ; a->chain; a = a->chain )
|
||||
;
|
||||
|
@ -2384,56 +2381,18 @@ iobuf_get_filelength (iobuf_t a, int *overflow)
|
|||
gnupg_fd_t fp = b->fp;
|
||||
|
||||
#if defined(HAVE_W32_SYSTEM)
|
||||
ulong size;
|
||||
static int (* __stdcall get_file_size_ex) (void *handle,
|
||||
LARGE_INTEGER *r_size);
|
||||
static int get_file_size_ex_initialized;
|
||||
LARGE_INTEGER exsize;
|
||||
|
||||
if (!get_file_size_ex_initialized)
|
||||
{
|
||||
void *handle;
|
||||
|
||||
handle = dlopen ("kernel32.dll", RTLD_LAZY);
|
||||
if (handle)
|
||||
{
|
||||
get_file_size_ex = dlsym (handle, "GetFileSizeEx");
|
||||
if (!get_file_size_ex)
|
||||
dlclose (handle);
|
||||
}
|
||||
get_file_size_ex_initialized = 1;
|
||||
}
|
||||
|
||||
if (get_file_size_ex)
|
||||
{
|
||||
/* This is a newer system with GetFileSizeEx; we use this
|
||||
then because it seem that GetFileSize won't return a
|
||||
proper error in case a file is larger than 4GB. */
|
||||
LARGE_INTEGER exsize;
|
||||
|
||||
if (get_file_size_ex (fp, &exsize))
|
||||
{
|
||||
if (!exsize.u.HighPart)
|
||||
return exsize.u.LowPart;
|
||||
if (overflow)
|
||||
*overflow = 1;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if ((size=GetFileSize (fp, NULL)) != 0xffffffff)
|
||||
return size;
|
||||
}
|
||||
if (GetFileSizeEx (fp, &exsize))
|
||||
return exsize.QuadPart;
|
||||
log_error ("GetFileSize for handle %p failed: %s\n",
|
||||
fp, w32_strerror (-1));
|
||||
#else /*!HAVE_W32_SYSTEM*/
|
||||
{
|
||||
struct stat st;
|
||||
struct stat st;
|
||||
|
||||
if ( !fstat (FD2INT (fp), &st) )
|
||||
return st.st_size;
|
||||
log_error("fstat() failed: %s\n", strerror(errno) );
|
||||
}
|
||||
if ( !fstat (fp, &st) )
|
||||
return st.st_size;
|
||||
log_error("fstat() failed: %s\n", strerror(errno) );
|
||||
#endif /*!HAVE_W32_SYSTEM*/
|
||||
}
|
||||
|
||||
|
|
|
@ -556,12 +556,8 @@ size_t iobuf_temp_to_buffer (iobuf_t a, byte * buffer, size_t buflen);
|
|||
size_t iobuf_copy (iobuf_t dest, iobuf_t source);
|
||||
|
||||
/* Return the size of any underlying file. This only works with
|
||||
file_filter based pipelines.
|
||||
|
||||
On Win32, it is sometimes not possible to determine the size of
|
||||
files larger than 4GB. In this case, *OVERFLOW (if not NULL) is
|
||||
set to 1. Otherwise, *OVERFLOW is set to 0. */
|
||||
off_t iobuf_get_filelength (iobuf_t a, int *overflow);
|
||||
file_filter based pipelines. */
|
||||
uint64_t iobuf_get_filelength (iobuf_t a);
|
||||
#define IOBUF_FILELENGTH_LIMIT 0xffffffff
|
||||
|
||||
/* Return the file descriptor designating the underlying file. This
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue