Mail Archives: djgpp-workers/2001/08/17/05:58:19
This is a multi-part message in MIME format.
------=_NextPart_000_002D_01C12756.1E6CC4C0
Content-Type: text/plain;
charset="iso-8859-1"
Content-Transfer-Encoding: 7bit
Please find attached a patch for fstat that works on Win 98 and Win 2K. I
tested it with File Utils cp.exe and it fixed the crash on the crash after
the 71a6 call if dos_mem_base was not setup.
The changes are:
1) Replace dos_mem_base with _dos_ds
2) Replace our_mem_base with _my_ds()
3) Change if clause for the 71a6 call to execute if LFN is enabled, don't
care about DOS version anymore.
I hope this the final patch attempt for fstat. Another one bites the dust I
hope.
Andrew
------=_NextPart_000_002D_01C12756.1E6CC4C0
Content-Type: application/octet-stream;
name="fstat_17AUG2001.dif"
Content-Transfer-Encoding: quoted-printable
Content-Disposition: attachment;
filename="fstat_17AUG2001.dif"
*** fstatold.c Wed Aug 15 21:34:42 2001
--- fstat.c Fri Aug 17 19:40:24 2001
***************
*** 1,3 ****
--- 1,4 ----
+ /* Copyright (C) 2001 DJ Delorie, see COPYING.DJ for details */
/* Copyright (C) 2000 DJ Delorie, see COPYING.DJ for details */
/* Copyright (C) 1998 DJ Delorie, see COPYING.DJ for details */
/* Copyright (C) 1997 DJ Delorie, see COPYING.DJ for details */
***************
*** 139,147 ****
* came with ``Undocumented DOS'', 1st edition.
*/
=20
- /* Selectors for conventional memory and our program's memory. */
- static unsigned short dos_mem_base, our_mem_base;
-=20
/* Array of SFT entry sizes as function of DOS version. */
static size_t sft_size_list[] =3D {0, 0x28, 0x35, 0x3b};
=20
--- 140,145 ----
***************
*** 187,196 ****
int sft_ptr_addr;
unsigned short true_dos_version;
=20
- /* Selectors for _farXXX() functions. */
- dos_mem_base =3D _dos_ds;
- our_mem_base =3D _my_ds();
-=20
/* Each DOS program has a table of file handles which are used by
* DOS open() call. This table holds, for each handle which is in
* use, the index into the System File Tables' list which contains
--- 185,190 ----
***************
*** 236,243 ****
}
=20
/* Segment and offset of start of SFT list. */
! sft_start_off =3D _farpeekw(dos_mem_base, sft_ptr_addr);
! sft_start_seg =3D _farpeekw(dos_mem_base, sft_ptr_addr + 2);
=20
return 1;
}
--- 230,237 ----
}
=20
/* Segment and offset of start of SFT list. */
! sft_start_off =3D _farpeekw(_dos_ds, sft_ptr_addr);
! sft_start_seg =3D _farpeekw(_dos_ds, sft_ptr_addr + 2);
=20
return 1;
}
***************
*** 284,298 ****
if (fhandle < 0
|| fhandle >=3D (_osmajor < 3 ?
20
! : _farpeekw(dos_mem_base, psp_addr + 0x32)))
return -1;
=20
/* Linear address of the handle table. */
! htbl_addr =3D MK_FOFF(_farpeekw(dos_mem_base, htbl_ptr_addr + 2),
! _farpeekw(dos_mem_base, htbl_ptr_addr));
=20
/* Index of the entry for our file handle in the SFT array. */
! retval =3D sft_idx =3D _farpeekb(dos_mem_base, htbl_addr + fhandle);
=20
if (sft_idx < 0) /* invalid file handle or bad handle table */
{
--- 278,292 ----
if (fhandle < 0
|| fhandle >=3D (_osmajor < 3 ?
20
! : _farpeekw(_dos_ds, psp_addr + 0x32)))
return -1;
=20
/* Linear address of the handle table. */
! htbl_addr =3D MK_FOFF(_farpeekw(_dos_ds, htbl_ptr_addr + 2),
! _farpeekw(_dos_ds, htbl_ptr_addr));
=20
/* Index of the entry for our file handle in the SFT array. */
! retval =3D sft_idx =3D _farpeekb(_dos_ds, htbl_addr + fhandle);
=20
if (sft_idx < 0) /* invalid file handle or bad handle table */
{
***************
*** 316,330 ****
while (sft_off !=3D 0xFFFF)
{
unsigned long entry_addr =3D sft_seg + sft_off;
! short subtable_len =3D _farpeekw(dos_mem_base, =
entry_addr + 4);
=20
if (sft_idx < subtable_len)
{ /* Our target is in this sub-table. Pull in the entire
* SFT entry for use by fstat_assist().
*/
! movedata(dos_mem_base,
entry_addr + 6 + sft_idx * sft_size,
! our_mem_base, (unsigned int)sft_buf, sft_size);
return retval;
}
/* Our target not in this subtable.
--- 310,324 ----
while (sft_off !=3D 0xFFFF)
{
unsigned long entry_addr =3D sft_seg + sft_off;
! short subtable_len =3D _farpeekw(_dos_ds, entry_addr + 4);
=20
if (sft_idx < subtable_len)
{ /* Our target is in this sub-table. Pull in the entire
* SFT entry for use by fstat_assist().
*/
! movedata(_dos_ds,
entry_addr + 6 + sft_idx * sft_size,
! _my_ds(), (unsigned int)sft_buf, sft_size);
return retval;
}
/* Our target not in this subtable.
***************
*** 332,339 ****
* index of our entry, and proceed to next sub-table.
*/
sft_idx -=3D subtable_len;
! sft_off =3D _farpeekw(dos_mem_base, entry_addr);
! sft_seg =3D MK_FOFF(_farpeekw(dos_mem_base, entry_addr + 2), =
0);
}
=20
/* Get here only by error, which probably means unsupported DOS =
version. */
--- 326,333 ----
* index of our entry, and proceed to next sub-table.
*/
sft_idx -=3D subtable_len;
! sft_off =3D _farpeekw(_dos_ds, entry_addr);
! sft_seg =3D MK_FOFF(_farpeekw(_dos_ds, entry_addr + 2), 0);
}
=20
/* Get here only by error, which probably means unsupported DOS =
version. */
***************
*** 816,827 ****
if (_djstat_flags & _STAT_ACCESS)
_djstat_fail_bits |=3D _STFAIL_WRITEBIT;
=20
! /* If we run on Windows 9X, and LFN is enabled, try =
harder.
! Note that we deliberately do NOT use this call when =
LFN is
! disabled, even if we are on Windows 9X, because then =
we
! open the file with function 3Ch, and such handles =
aren't
! supported by 71A6h call we use here. */
! if (dos_major >=3D 7 && _USE_LFN)
{
__dpmi_regs r;
=20
--- 810,821 ----
if (_djstat_flags & _STAT_ACCESS)
_djstat_fail_bits |=3D _STFAIL_WRITEBIT;
=20
! /* If we are runing on Windows 9X, NT 4.0 with LFN or 2000 or =
XP
! with LFN is enabled, try harder. Note that we deliberately do=20
! NOT use this call when LFN is disabled, even if we are on=20
! Windows, because then we open the file with function 3Ch,=20
! and such handles aren't supported by 71A6h call we use here. */
! if (_USE_LFN)
{
__dpmi_regs r;
=20
***************
*** 831,837 ****
r.x.dx =3D 0;
__dpmi_int(0x21, &r);
if ((r.x.flags & 1) =3D=3D 0
! && (_farpeekl(dos_mem_base, __tb) & 0x07) =3D=3D 0)
stat_buf->st_mode |=3D WRITE_ACCESS; /* no R, S or H bits set =
*/
}
=20
--- 825,831 ----
r.x.dx =3D 0;
__dpmi_int(0x21, &r);
if ((r.x.flags & 1) =3D=3D 0
! && (_farpeekl(_dos_ds, __tb) & 0x07) =3D=3D 0)
stat_buf->st_mode |=3D WRITE_ACCESS; /* no R, S or H bits set */
}
=20
------=_NextPart_000_002D_01C12756.1E6CC4C0--
- Raw text -