http://bugs.winehq.org/show_bug.cgi?id=2292
Summary: Corrupted file problem Wine20040613,20040505 with Xilinx XST 6.2i Product: Wine Version: CVS Platform: PC OS/Version: Linux Status: UNCONFIRMED Severity: normal Priority: P2 Component: wine-files AssignedTo: wine-bugs@winehq.org ReportedBy: Oli1417@gmx.net
I've a strange problem with Xilinx XST (ISE) 6.2i, a Software for FPGA developement. A sort of silicon compiler for Xilinx Fpgas chips.
System is: Suse 9.1, Linux cassix 2.6.4-52-default #1 Wed Apr 7 02:08:30 UTC 2004 i686 i686 i386 GNU/Linux
The XST program while running usually does a lot of file processing and creates libraries-files etc and so on.
One of those files is a simple ascii file called "hdllib.ref". It usually looks like more or less like this, size around some k-bytes.
[...] AR hex2led hex2led_arch F:/Test/watchvhd_u/hex2led.vhd sub00/vhpl09 EN hex2led NULL F:/Test/watchvhd_u/hex2led.vhd sub00/vhpl08 AR smallcntr inside F:/Test/watchvhd_u/smallcntr.vhd sub00/vhpl01 [...]
When I'm running the XST program with wine, this file gets corrupted by leading zero-bytes in the beginning of the file:
[0x00 0x00 0x00 0x00 ... all bytes are zero until some time the text starts.] AR hex2led hex2led_arch F:/Test/watchvhd_u/hex2led.vhd sub00/vhpl09 EN hex2led NULL F:/Test/watchvhd_u/hex2led.vhd sub00/vhpl08 AR smallcntr inside F:/Test/watchvhd_u/smallcntr.vhd sub00/vhpl01 [...]
I debugged a bit and found out, that this file is 'rewritten' several times during the program run (see debugging output below).
The problem seems to be, that each time is written new, the new data is appended to the end of the file, instead of being put in the beginning !? For some reason the previous data in the file is put to 0x00.
The problem does not occure under Win XP.
While debugging I grepped through the wine source, to track down what's happening - I don't know the wine internals at all (now more then before) - and changed following file:
wine20040613/wine/server/file.c [...] static struct object *create_file( const char *nameptr, size_t len, unsigned int access, unsigned int sharing, int create, unsigned int options, unsigned int attrs ) [...] switch(create) { case FILE_CREATE: flags = O_CREAT | O_EXCL; break; case FILE_OVERWRITE_IF: /* FIXME: the difference is whether we trash existing attr or not */ case FILE_SUPERSEDE: flags = O_CREAT | O_TRUNC; break; case FILE_OPEN: flags = 0; break;
case FILE_OPEN_IF: flags = O_CREAT | O_TRUNC; break; ^^^^^^^^^ CHANGED here case FILE_OVERWRITE: flags = O_TRUNC; break; default: set_error( STATUS_INVALID_PARAMETER ); goto error; }
=>> Now it works ;) !?!?
Well - I know that in fact I don't know really what I did (that's life) ... perhaps I did break something else now.
But it might give a hint for the Wine Pros here, for a possible improvement. IT'S A GREAT PROJECT BTW!!!
Fell free to ask for more info, in case.
Cheerio,
Oliver