1998.12.28 21:35 "TIFFOpen error in tif_win32.c", by Larry Reeve
I have run into a problem with the TIFFOpen(tif_win32.c) function in the v3.4beta037 distribution that causes a failure when the incoming mode character is 'a' to append to an existing file. In this case the _TIFFgetMode call returns O_RDWR|O_CREAT and the subsequent switch sets the dwMode variable to CREATE_NEW. The Win32 CreateFile function then fails to open the existing file because the dwCreationDisposition parameter of CREATE_NEW fails the function on an existing file. Setting the dwMode variable to OPEN_ALWAYS fixes this problem and the image can then be appended to the existing image.
I have attached an updated version of the function.
Larry Reeve
/*
* Open a TIFF file for read/writing.
*/
TIFF*
TIFFOpen(const char* name, const char* mode)
{
static const char module[] = "TIFFOpen";
thandle_t fd;
int m;
DWORD dwMode;
m = _TIFFgetMode(mode, module);
switch(m)
{
case O_RDONLY:
dwMode = OPEN_EXISTING;
break;
case O_RDWR:
dwMode = OPEN_ALWAYS;
break;
case O_RDWR|O_CREAT:
dwMode = OPEN_ALWAYS;//CREATE_NEW;
break;
case O_RDWR|O_TRUNC:
dwMode = CREATE_ALWAYS;
break;
case O_RDWR|O_CREAT|O_TRUNC:
dwMode = CREATE_ALWAYS;
break;
default:
return ((TIFF*)0);
}
fd = (thandle_t)CreateFile(name, (m == O_RDONLY) ? GENERIC_READ :
(GENERIC_READ | GENERIC_WRITE), FILE_SHARE_READ, NULL, dwMode,
(m == O_RDONLY) ? FILE_ATTRIBUTE_READONLY : FILE_ATTRIBUTE_NORMAL, NULL);
if (fd == INVALID_HANDLE_VALUE) {
TIFFError(module, "%s: Cannot open", name);
return ((TIFF *)0);
}
return (TIFFFdOpen((int)fd, name, mode));
}