1
0
Fork 0
mirror of git://git.gnupg.org/gnupg.git synced 2025-07-03 22:56:33 +02:00

Improved detection of ketrings specified several times.

This commit is contained in:
Werner Koch 2007-08-24 09:51:58 +00:00
parent 587104ae42
commit d1a13319bb
8 changed files with 109 additions and 26 deletions

View file

@ -1,3 +1,9 @@
2007-08-24 Werner Koch <wk@g10code.com>
* fileutil.c (same_file_p): New. Taken from SVN trunk.
(compare_filenames) [HAVE_DRIVE_LETTERS]: Take drive letters and
backslashes in account.
2007-04-16 David Shaw <dshaw@jabberwocky.com>
* strgutil.c (ascii_toupper, ascii_tolower, ascii_strcasecmp,

View file

@ -1,5 +1,5 @@
/* fileutil.c - file utilities
* Copyright (C) 1998, 2003, 2005 Free Software Foundation, Inc.
* Copyright (C) 1998, 2003, 2005, 2007 Free Software Foundation, Inc.
*
* This file is part of GnuPG.
*
@ -30,6 +30,17 @@
#ifdef HAVE_PWD_H
#include <pwd.h>
#endif
#include <ctype.h>
#ifdef HAVE_W32_SYSTEM
# define WIN32_LEAN_AND_MEAN
# include <windows.h>
#else /*!HAVE_W32_SYSTEM*/
# include <sys/types.h>
# include <sys/stat.h>
# include <unistd.h>
#endif /*!HAVE_W32_SYSTEM*/
#include "util.h"
#include "memory.h"
#include "ttyio.h"
@ -194,32 +205,87 @@ make_filename( const char *first_part, ... )
}
/* Compare whether the filenames are identical. This is a
special version of strcmp() taking the semantics of filenames in
account. Note that this function works only on the supplied names
without considereing any context like the current directory. See
also same_file_p(). */
int
compare_filenames( const char *a, const char *b )
compare_filenames (const char *a, const char *b)
{
/* ? check whether this is an absolute filename and
* resolve symlinks?
*/
#ifndef __riscos__
#ifdef HAVE_DRIVE_LETTERS
return ascii_strcasecmp(a,b);
#else
return strcmp(a,b);
#ifdef __riscos__
int c = 0;
char *abuf, *bbuf;
abuf = riscos_gstrans(a);
bbuf = riscos_gstrans(b);
c = ascii_strcasecmp (abuf, bbuf);
xfree(abuf);
xfree(bbuf);
return c;
#elif defined (HAVE_DRIVE_LETTERS)
for ( ; *a && *b; a++, b++ )
{
if (*a != *b
&& (toupper (*(const unsigned char*)a)
!= toupper (*(const unsigned char*)b) )
&& !((*a == '/' && *b == '\\') || (*a == '\\' && *b == '/')))
break;
}
if ((*a == '/' && *b == '\\') || (*a == '\\' && *b == '/'))
return 0;
else
return (toupper (*(const unsigned char*)a)
- toupper (*(const unsigned char*)b));
#else /*!HAVE_DRIVE_LETTERS*/
return strcmp (a,b);
#endif
#else /* __riscos__ */
int c = 0;
char *abuf, *bbuf;
}
abuf = riscos_gstrans(a);
bbuf = riscos_gstrans(b);
c = ascii_strcasecmp (abuf, bbuf);
xfree(abuf);
xfree(bbuf);
return c;
#endif /* __riscos__ */
/* Check whether the files NAME1 and NAME2 are identical. This is for
example achieved by comparing the inode numbers of the files. */
int
same_file_p (const char *name1, const char *name2)
{
int yes;
/* First try a shortcut. */
if (!compare_filenames (name1, name2))
yes = 1;
else
{
#ifdef HAVE_W32_SYSTEM
HANDLE file1, file2;
BY_HANDLE_FILE_INFORMATION info1, info2;
file1 = CreateFile (name1, 0, 0, NULL, OPEN_EXISTING, 0, NULL);
if (file1 == INVALID_HANDLE_VALUE)
yes = 0; /* If we can't open the file, it is not the same. */
else
{
file2 = CreateFile (name2, 0, 0, NULL, OPEN_EXISTING, 0, NULL);
if (file1 == INVALID_HANDLE_VALUE)
yes = 0; /* If we can't open the file, it is not the same. */
else
{
yes = (GetFileInformationByHandle (file1, &info1)
&& GetFileInformationByHandle (file2, &info2)
&& info1.dwVolumeSerialNumber==info2.dwVolumeSerialNumber
&& info1.nFileIndexHigh == info2.nFileIndexHigh
&& info1.nFileIndexLow == info2.nFileIndexLow);
CloseHandle (file2);
}
CloseHandle (file1);
}
#else /*!HAVE_W32_SYSTEM*/
struct stat info1, info2;
yes = (!stat (name1, &info1) && !stat (name2, &info2)
&& info1.st_dev == info2.st_dev && info1.st_ino == info2.st_ino);
#endif /*!HAVE_W32_SYSTEM*/
}
return yes;
}