@node Changes in 2.04, Changes in 2.05, Changes in 2.03, What Changed
@section Changes in 2.04

Here is a list of changes from DJGPP V2.03 to V2.04.

@findex uname@r{, CPU type detection}
Ability to report the exact CPU type in @code{uname}.

@findex _creat@r{, and @acronym{FAT32}}
@findex _creatnew@r{, and @acronym{FAT32}}
@findex _open@r{, and @acronym{FAT32}}
The functions @code{_creat}, @code{_creatnew} and @code{_open} now set
extended size flag in @acronym{DOS} calls to be able to create files with size up
to @math{2^32-1}, supported on @acronym{FAT32} volumes.

@findex llseek@r{, and @acronym{FAT32}}
The function @code{llseek} added with type @code{offset_t} to support
file seeks up to @math{2^32-2}.

@findex statfs@r{, and @acronym{FAT32}}
The function @code{statfs} have been made to report correct values >
@math{2^31} on @acronym{FAT32} partitions.

@findex _invent_inode@r{, and @acronym{FAT32}}
The function @code{_invent_inode} has been changed to start numbering
invented inodes from @code{USHRT_MAX+1} to @math{2^28+1}.

@findex _is_cdrom_drive
@findex _is_ram_drive
@findex _media_type
Functions @code{_is_cdrom_drive}, @code{_is_ram_drive} and
@code{_media_type} has been taken out of @file{mntent.c} and made
externally callable.

@findex _get_fat_size
@findex _get_fs_type
@findex _is_fat32
New functions @code{_get_fat_size}, @code{_get_fs_type} and
@code{_is_fat32} added.

@cindex @file{stdarg.h}, implemented with GCC builtins
@cindex @file{varargs.h}, implemented with GCC builtins
@findex va_list@r{, implemented with GCC builtins}
@findex va_start@r{, implemented with GCC builtins}
@findex va_arg@r{, implemented with GCC builtins}
@findex va_end@r{, implemented with GCC builtins}
@findex va_alist@r{, implemented with GCC builtins}
@findex va_dcl@r{, implemented with GCC builtins}

When used together with GCC 2.96 or later, va_list facilities
in @file{stdarg.h} and @file{varargs.h} are implemented using new
builtins from GCC 2.96.

@pindex fsdb@r{, check for EXE extension}
@code{fsdb} checks for executables and loads them even if
the extension @file{.exe} isn't given in the command line.

@findex div@r{, and negative arguments}
@findex ldiv@r{, and negative arguments}
@findex lldiv@r{, and negative arguments}
@code{div}, @code{ldiv} and @code{lldiv} return properly signed remainders
for negative arguments.

@findex remove@r{, and write-protected floppies}
The function @code{remove} works around a @acronym{DOS} bug, whereby @acronym{DOS}
returns a ``File not found'' error for write-protected floppy disks.

@findex rand@r{, increased period}
The series produced by @code{rand} have a longer period.

@findex drand48@r{, increased speed}
@findex erand48@r{, increased speed}
The execution speed of @code{drand48} and @code{erand48} has been improved.

@findex __dpmi_simulate_real_mode_procedure_retf_stack@r{, stack corruption}
@code{__dpmi_simulate_real_mode_procedure_retf_stack} no longer corrupts
the caller's stack.

@findex getlogin@r{, and @code{USERNAME} variable}
@code{getlogin} now examines the environment variable @env{USERNAME} to
determine the user's name, in addition to @env{USER} and @env{LOGNAME}.

@findex stpncpy@r{, added to the library}
New function @code{stpncpy} has been added, thanks to
@email{restone@@skypoint.com, Richard E. Stone}.

@findex setitimer@r{, and zero @code{it_interval.tv_usec}}
Calling the @code{setitimer} function with both
@code{it_interval.tv_sec} and @code{it_interval.tv_usec} members of
@code{struct itimerval} set to zero no longer causes the timer to behave
as if @code{it_interval.tv_usec} were set to the system clock
granularity (55@dmn{msec} by default).

@findex __internal_readlink@r{, added to the library}
@findex __solve_dir_symlinks@r{, added to the library}
@findex __solve_symlinks@r{, added to the library}
@findex lchown@r{, added to the library}
@findex lstat@r{, added to the library}
@findex readlink@r{, added to the library}
@findex S_ISLNK@r{, added to the library}
@findex S_IFLNK@r{, added to the library}
UNIX-style symbolic links are fully emulated by library.  As a part of
this, new functions @code{__internal_readlink}, @code{__solve_symlinks},
@code{__solve_dir_symlinks}, @code{lchown}, @code{lstat} and @code{readlink};
new macros @code{S_ISLNK} and @code{S_IFLNK} have been added to library.

@findex O_NOLINK@r{, new flag accepted by @code{open}}
@findex O_NOFOLLOW@r{, new flag accepted by @code{open}}
@findex open@r{, supports symlinks}
@code{open} now follows symlinks when opening file.  Also, it honors two new
mode flags: @code{O_NOLINK} and @code{O_NOFOLLOW}.

@findex symlink@r{, supports symlinks}
As a part of symlink emulation, @code{symlink} no longer emulates symlinks
to executables by creating stubs.  It creates symlinks to all files instead.

@findex syms_init@r{, crashes for large programs}
@pindex symify@r{, crashes for large programs}
A subtle bug was corrected in function @code{process_coff} used by
@code{syms_init} from @file{libdbg.a} to read and sort the symbols from
a @sc{coff} image.  As a result, the @code{symify} utility should no
longer crash in rare cases, especially when invoked on large programs.

@cindex @file{lib/djgpp.djl}, polluting the namespace unnecessarily
@cindex linker script, polluting the namespace unnecessarily
@cindex @code{etext}, polluting the namespace unnecessarily
@cindex @code{edata}, polluting the namespace unnecessarily
@cindex @code{end}, polluting the namespace unnecessarily
@cindex profiling, polluting the namespace unnecessarily
The linker script @file{lib/djgpp.djl} corrected to not unnecessarily
pollute the name space with the symbols @code{etext}, @code{edata} and
@code{end}.  The profiling code was also changed to not pollute the name
space with @code{etext}.

@pindex dtou@r{, new command-line options}
The @code{dtou} program accepts new command-line options for verbose
operation, backup file creation, and control of file timestamp
preservation.  Its source can now be compiled on a @acronym{Unix} or @acronym{GNU/Linux}
system.

@cindex header files and GCC
The protection against multiple redefinitions of various
types like @code{size_t} has been rewriten to make DJGPP
header files compatible with GCC provided ones.

@cindex @code{bzip2} archives
@pindex djtar@r{, support for unpacking @code{bzip2} archives}
The djtar program can now unpack @file{.tar.bz2} archives
compressed with the bzip2 program.

@findex system@r{, invokes Windows programs with long command lines}
@findex spawn*@r{ functions, invoke Windows programs with long command lines}
@cindex startup code, supports long command lines passed by Windows programs
@vindex CMDLINE@r{, environment variable}
@pindex 4DOS@r{, support for long command lines}
@pindex NDOS@r{, support for long command lines}
The functions @code{system} and @code{spawn*} can invoke Windows
programs and advanced shells, such as 4DOS and NDOS, with
command lines longer than 126 characters.  For Windows programs, the
command line can be up to 1015 characters long; 4DOS and
NDOS can be passed up to 247 characters.  This is done by
defining the @env{CMDLINE} environment variable whose value is the
command line.  The DJGPP startup code also supports @env{CMDLINE}
method of passing long command lines, so DJGPP programs can now be
invoked with long command lines from the @file{COMMAND.COM}'s prompt,
and also from other Windows programs which support @code{CMDLINE}.
The functions @code{system} and @code{spawn*} have also been enhanced
to free @acronym{DPMI} selectors leaked by many @acronym{DPMI} hosts.  This fixes the
problem with large makefiles failing before completion under Windows.
@findex spawn*@r{, no longer leak selectors on Windows and DOSEmu}
@findex system@r{, no longer leaks selectors on Windows and DOSEmu}
@pindex make@r{, no longer fails on large jobs due to selector leaks}

@findex _rename@r{, change letter-case of a file name}
@findex rename@r{, change letter-case of a file name}
The functions @code{rename} and @code{_rename} can now be used to change
the letter case of a file name, like in this snippet:

@example
 rename ("makefile", "Makefile");
@end example

@noindent
(This only works when the @acronym{LFN} support is available, of course.)

@cindex search for executables, some extensions omitted
@cindex @file{.sh}, @file{.ksh}, @file{.pl}, @file{.sed} extensions
@findex __dosexec_find_on_path@r{, some extensions excluded from search}
@findex system@r{, some extensions excluded from @code{PATH} search}
@findex popen@r{, some extensions excluded from @code{PATH} search}
@findex pclose@r{, some extensions excluded from @code{PATH} search}
@findex spawn@r{, some extensions excluded from @code{PATH} search}
The function @code{__dosexec_find_on_path} no longer looks for files
with the @file{.sh}, @file{.ksh}, @file{.pl}, and @file{.sed} extensions
before the files without those extensions.  This is so e.g.@: @file{foo}
is found @emph{before} @file{file.sh} if both of them are present in the
same directory.  The previous code was known to cause Bash to run the
wrong script in some cases.

This change affects all library functions which search for executables
along the @code{PATH}: @code{system}, @code{popen}, @code{pclose}, and
the functions from the @code{spawn*} family.

The @acronym{DOS} standard extensions @file{.com}, @file{.exe}, @file{.bat}, and
@file{.btm} are still included in the search @emph{before} looking for
the file name itself, for compatibility with stock DOS/Windows shells.

@findex valloc@r{, added to the library}
@findex memalign@r{, added to the library}
The functions @code{valloc} and @code{memalign} have been added to the
library to support allocating memory at power-of-2 addresses.

@pindex djsplit@r{, preserves file's time stamp}
@pindex djmerge@r{, preserves file's time stamp}
The @code{djsplit} and @code{djmerge} utilities now preserve the
original file's time stamp and mode bits.  The @samp{-t} switch to those
programs restores the old behavior, where each file was created with the
current time stamp and default attribute bits.

@findex _put_path@r{, and the @file{/dev/env} directory}
The low-level function @code{_put_path} was changed to avoid referencing
an @file{env} directory in the current working directory when library
functions are passed the @file{/dev/env} file name.  This avoids
creating spurious @file{env} directories in any directory where the
standard @acronym{GNU} @code{mkinstalldirs} script is run.

@findex rename@r{, and Windows 2000}
@findex _rename@r{, and Windows 2000}
@cindex linking programs on Windows 2000
@pindex stubify@r{, and Windows 2000}
Functions @code{rename} and @code{_rename} work on Windows 2000 when the
file under the new name already exists.  This solves the problems with
linking DJGPP programs and with running the @code{stubify} utility on
that OS.

@findex lfilelength@r{, and @acronym{FAT32}}
The function @code{lfilelength} added with return type @code{long long}
to support file sizes of up to @math{2^63-1}.

@pindex djasm@r{, documentation}
Texinfo documentation (WIP) for @code{djasm} has been added.

@pindex djasm@r{, ISO dates}
The dates inserted into the object file by @code{djasm} now follow ISO
format.

@pindex djasm@r{, new executable header offset}
@code{djasm} now sets the offset of new executable field in the header
of executables to zero (meaning not used).

@pindex djasm@r{, space allocation with .union}
Allow one to allocate space in @code{djasm} using @code{.union}
(instead of @code{.struct}) when using a union.  As there is no
checking, @code{.struct} and @code{.union} are interchangeable.
This feature taken from a version of @code{djasm} maintained by
@email{bill@@taniwha.org, Bill Currie}.

The @code{fcntl} function has been significantly enhanced.  In
particular:

@itemize @minus{}
@item
@cindex file locking functions
@findex fcntl@r{, added file locking}
File locking functions (which were missing in every version up to
v2.03) now work, with some exceptions relating to the absence of any
read locking in DOS/Windows 9X environments.

@item
@findex fcntl@r{ commands @code{F_GETFD} and @code{F_SETFD}}
These functions now interrogate and use the value of the @acronym{DOS} flag
@code{_DEV_NO_INHERIT} to implement the @code{FD_CLOEXEC} flag;

@item
@findex fcntl@r{ commands @code{F_GETFL} and @code{F_SETFL}}
The @code{F_SETFL} function is still an effective no-op, since
DOS/Windows does not allow flags to be modified on an open file.
A small exception is made for @code{F_SETFL}:  You may use @code{F_SETFL}
to remove the@code{O_NONBLOCK} flag, because it is not supported
by DJGPP anyway, and it does no harm to allow this functionality.

The @code{F_GETFL} function now computes the open mode and status flags.
On Windows NT this cannot report the open mode correctly ---
@code{O_RDONLY} is always returned.

@item
Documentation has been updated to reflect the new functionality and
test programs have been provided for most new or changed functions.
@end itemize

@findex flock
@findex lockf
@findex llockf
@code{flock} has been implemented using the new @code{fcntl} locking
functions to implement file-level locking and unlocking.  @code{lockf}
(31-bit support) and @code{llockf} (@acronym{FAT32} support, 32-bit only) have
been added as compatible interfaces to the new @code{fcntl} locking
functions.

@findex dosexterr
@findex dostrerr
New function @code{dostrerr} has been coded to provide string
values for the error codes returned from function @code{dosexterr}.
Documentation and a test program have been provided.  This function is
an analogue of the @code{strerror} function for errno values, and is
intended to be used when coding functions or programs that call @acronym{DOS} and
want to print messages when errors occur.

@findex _dos_lk64
@findex _dos_unlk64
@findex lock64
@findex unlock64
New functions @code{_dos_lk64} and @code{_dos_unlk64} have been added to
provide a @acronym{FAT32}-compatible interface to the @acronym{DOS} locking code.
Compatible functions @code{lock64} and @code{unlock64} are direct
interfaces to these two new @code{_dos_*} functions.

@pindex djasm@r{, enumeration type}
Support for enumeration type added to @code{djasm}.
This feature taken from a version of @code{djasm} maintained by
@email{bill@@taniwha.org, Bill Currie}.

@cindex @acronym{C99} compliance, new header files
Header files, which are part of the new @acronym{ANSI/ISO} @acronym{C99} Standard, are now
available.  These include @file{stdint.h}.

@cindex namespace @code{std} support
When used in C@t{++} programs, the standard C header files now make
their contents visible in namespace @code{std} as well as in the global
namespace.

@findex setjmp@r{, also a macro}
@code{setjmp} is now a macro as well as a function.  This is required by
the C@t{++} standard, and also recommended by the C standard.

@findex _get_dos_version@r{, recognise FreeDOS}
@code{_get_dos_version} now recognises @acronym{OEM} number @code{0xfd}
as FreeDOS.

@findex strtol@r{, and 8-bit characters}
@findex strtoll@r{, and 8-bit characters}
@findex strtoul@r{, and 8-bit characters}
@findex strtoull@r{, and 8-bit characters}
@findex atoi@r{, and 8-bit characters}
@findex atol@r{, and 8-bit characters}
Functions which convert numeric strings to the corresponding integer
values no longer return non-zero values for strings which begin with
8-bit characters.

@findex O_TEMPORARY@r{, new flag accepted by @code{open}}
@findex open@r{, supports temporary files}
@code{open} now honors @code{O_TEMPORARY}.  A file opened with
@code{O_TEMPORARY} will be deleted when all file descriptors that refer
to it are closed.

@findex _rename@r{, on Windows ME}
@findex rename@r{, on Windows ME}
@findex mkdir@r{, on Windows ME}
@pindex stubify@r{, on Windows ME}
The functions @code{_rename} (and @code{rename} which calls it) and
@code{mkdir} no longer fail on Windows ME when long file names support
is disabled.  This solves the problem with failures to link programs if
the @env{LFN} variable is set to @samp{n} because @code{stubify.exe}
failed to rename the produced executable and reported @code{EINVAL}.

@findex write@r{, security fix and increased @acronym{POSIX} compliance}
@findex _write@r{, security fix}
When @code{write} and @code{_write} detect that a file pointer is past EOF,
that space will now be filled with zeroes to increase @acronym{POSIX} compliance
and plug a security hole on disks containing sensitive information.

@pindex djtar@r{, @acronym{DOS} batch file conversion}
If a tar archive contains @acronym{DOS} batch files that have been stored with
UNIX-style LF-only EOLs, djtar will now convert them
automatically to @acronym{DOS}-style EOLs.  This is because @file{COMMAND.COM}
refuses to run batch files that contain UNIX-style EOLs.

@findex pipe@r{, now implemented in the library}
The function @code{pipe} is now implemented in the library.

@findex spawn*@r{, invoking @file{.com} programs}
@file{.com} programs are now invoked by the @code{spawn*} family of
functions directly, thus making their exit status available to the
parent DJGPP program.  Previously, when long file names were supported,
@file{.com} programs were invoked through @file{COMMAND.COM}, which
would lose the exit status.

@findex select@r{, and termios emulation}
File handles connected to the console device are no longer reported by
the @code{select} function as not ready for input when termios functions
are used to read those handles in cooked mode.

@findex snprintf
@findex vsnprintf
New functions @code{snprintf} and @code{vsnprintf} added.

@pindex djasm@r{, double-precision shift}
The double-precision shift instructions @code{shld} and @code{shrd} are
removed from @code{djasm} because they violate the established convention
of using the @code{b}, @code{w}, or @code{d} mnemonic suffix to specify
the memory operand size.  (The result is that they use up two mnemonics
that should have been reserved for the basic shift/rotate instructions.)

@pindex djasm@r{, shift instructions}
@pindex djasm@r{, rotate instructions}
Completed the support in @code{djasm} for the byte/word/double
shift/rotate instructions.  This feature taken from a version of
@code{djasm} maintained by @email{bill@@taniwha.org, Bill Currie}.

@findex fopen@r{, append mode}
@findex freopen@r{, append mode}
@findex fputc@r{, append mode}
@findex fprintf@r{, append mode}
@findex fwrite@r{, append mode}
@findex write@r{, append mode}
@cindex @file{libc/dosio.h}, append mode
The functions @code{fopen} and @code{freopen} improved to handle the
append mode properly.
The functions @code{fputc}, @code{fprintf}, @code{fwrite} and
@code{write} always seek to end of file if the file has been opened in
append mode.
Type of @code{__file_handle_modes} extended to be able to hold the
@code{O_APPEND} flag.

@findex fdopen@r{, no longer uses _IOAPPEND flag}
@findex fflush@r{, no longer uses _IOAPPEND flag}
@findex flsbuf@r{, no longer uses _IOAPPEND flag}
@findex fopen@r{, no longer uses _IOAPPEND flag}
@findex freopen@r{, no longer uses _IOAPPEND flag}
@cindex @file{libc/file.h}, _IOAPPEND flag deleted
Due to the improved append mode implementation, the functions @code{fopen},
@code{fflush}, @code{_flsbuf}, @code{fopen}, and @code{freopen} no longer
use the @code{_IOAPPEND} flag.  And since the flag is no longer used, the
@code{_IOAPPEND} flag has been deleted from @file{libc/file.h}.

@findex getopt@r{, enhanced for @acronym{POSIX} compliance}
When the first character in the valid options string is a colon @samp{:},
@code{getopt} will now return a colon when a missing option argument is
detected and will not print error messages even when @code{opterr} is
non-zero.

@findex readdir@r{, reports file types}
@cindex @code{struct dirent}, @code{d_type} member
The function @code{readdir} now includes the file's type in the
@code{d_type} member of @code{struct dirent} it returns.  This member is
used by some @acronym{GNU} packages, such as Fileutils, to make directory
traversal more efficient.  @strong{WARNING: This makes some object files
built with DJGPP v2.03 incompatible with programs compiled with the
v2.04 library!}

@findex moncontrol@r{, added to the library}
@findex monstartup@r{, added to the library}
Two new functions, @code{monstartup} and @code{moncontrol}, allow to
control when profiling starts and ends, and what range of addresses is
recorded in the profiling data.

@findex mallinfo@r{, added to the library}
@findex malloc_verify@r{, added to the library}
@findex malloc_debug@r{, added to the library}
@findex mallocmap@r{, added to the library}
@findex malldbgdumpfile@r{, added to the library}
@findex malloc@r{, debug facilities}
There are new @code{malloc} debug facilities.  While not as powerful and
versatile as existing external packages, such as @acronym{YAMD}, these
facilities do allow to detect a wide variety of heap corruption
problems, and to report important heap usage statistics.  The new
functions are @code{mallinfo}, @code{malloc_debug},
@code{malloc_verify}, and @code{mallocmap}; these names are compatible
with many @acronym{Unix} and @acronym{GNU/Linux} systems.  In addition, special hooks, such
as @code{__libc_malloc_hook} and @code{__libc_free_hook}, are provided
for building custom @code{malloc} debugging packages.

@cindex startup code, and crashes on Windows
Nested DJGPP programs which are run by other DJGPP programs on Windows
should no longer crash (and take the @acronym{DOS} box with them) due to the fact
that Windows leaks selectors.  These crashes were caused by a failure to
allocate a selector for conventional memory, and subsequent use of the
invalid selector by the startup code itself.  This problem was typical
for Make, Bash, and any other program which can launch lots of child
programs without ever exiting to @acronym{DOS}.  To avoid this, the startup code
was fixed to print an error message and exit to @acronym{DOS} with an exit status
that indicates a failure, when a selector for @acronym{DOS} memory could not be
allocated by the @acronym{DPMI} host.

@findex confstr@r{, added to the library}
@code{confstr} has been added to the library to support returning
system-dependent configuration in strings.

@cindex @file{djgpp.env}, @code{ls} color settings for symlinks added
Colors for symlinks were added to the @env{LS_COLORS} environment variable
in @file{djgpp.env}.

@pindex djasm@r{, double-precision shift reinstated}

Double-precision shift instructions reinstated in @code{djasm},
using a simplified form of the implementation suggested by
@email{bill@@taniwha.org, Bill Currie}.  The new mnemonics are
@code{dshl} and @code{dshr}, and no memory operand-size suffix
is required.  Obsolete usage of @code{shld} and @code{shrd}
for double-precision shifts is flagged.

@findex l64a@r{, added to the library}
@findex a64l@r{, added to the library}
Two new functions, @code{l64a} and @code{a64l} (both part of the @sc{posix}
draft standard), allow you to convert a 32-bit integer value to and from a
base-64 encoding, respectively.
Note that the encoding used is the one mandated by the @sc{posix} spec, and
not the one used by either @command{uuencode} or the @sc{mime} base64
encoding.

@findex setenv@r{, minor changes for @sc{posix} compliance}
@findex putenv@r{, minor changes for @sc{posix} compliance}
@findex unsetenv@r{, added to the library}
The environment functions @code{setenv} and @code{putenv} are now both
part of the @sc{posix} draft standard and were updated to match the
specs set forth by that standard.  Both now set @code{errno} in case of
failure, and @code{putenv}'s argument is now a @code{char*} instead of
a @code{const char*}.
A new function, @code{unsetenv}, which is also part of that standard, was
added.

@findex struct group@r{, added @code{gr_passwd} field}
@code{struct group} has a new field, @code{gr_passwd}.  This helps out
porters, as many Unixy apps expect it to exist.  Since @sc{dos} is
basically an insecure environment, this field always contains the empty
string.
@findex struct passwd@r{, added @code{pw_gecos} field}
@findex struct passwd@r{, added @code{pw_passwd} field}
Similarly, @code{struct passwd} has two new fields, @code{pw_gecos} and
@code{pw_passwd}.  @code{pw_gecos} gets the same value as @code{pw_name}
(i.e. the value returned by @code{getlogin()}).  Like @code{gr_passwd},
@code{pw_passwd} gets the empty string as value.

@findex uname@r{, support for Pentium 4}
The function @code{uname} supports the new Pentium 4 CPU's by returning
@code{"i786"} in the @code{machine} member of @code{struct utsname} it
returns.

@findex gettext@r{, name clash, @file{conio.h} vs @acronym{GNU} Gettext}
A name conflict between @code{gettext} declared in @file{conio.h} and
@code{gettext} provided by @acronym{GNU} Gettext has been resolved.

@findex malloc@r{, and huge allocation requests}
@code{malloc} now declines ridiculously large allocation requests which
exceed 2GB - 64KB.  This is because anything larger is not supported by
@code{sbrk} and by most @acronym{DPMI} hosts.  Previously, @code{malloc} would
sometimes allocate a very small buffer due to wrap-around of large
unsigned numbers, and the calling program would then crash when it tried
to use that buffer.

@findex v2loadimage@r{, long command line support}
@code{v2loadimage} now supports long command lines, instead of being
restricted by the @acronym{DOS} 126-character limit.

@findex __djgpp_spawn@r{, added to the library}
A new function, @code{__djgpp_spawn}, has been added to allow control over
whether a search for executable extensions is performed.

@findex glob@r{, fixed buffer overrun}
The function @code{glob} and its helper functions have been changed to prevent
an internal buffer from being overrun when the pattern to be expanded has more
than 2000 characters.

@cindex nested DJGPP program on Windows 2000
There's now a work-around for the bug in NTVDM, the @acronym{DOS} emulator, which
ships with Windows 2000: nested DJGPP programs no longer cause NTVDM to
crash.  This allows to use GCC, Make, RHIDE, Bash, and other programs
which routinely invoke child programs.

@findex utime@r{, on Windows 2000 and XP}
@pindex touch@r{, on Windows 2000 and XP}
@pindex dtou@r{, on Windows 2000 and XP}
@pindex utod@r{, on Windows 2000 and XP}
@pindex recode@r{, on Windows 2000 and XP}
@cindex time stamp of directories, changing
The function @code{utime} now works on Windows 2000 and Windows XP.
Previously, it would fail with @code{errno} set to @code{EIO}; this
affected programs like @code{touch}, @code{dtou}, and @code{recode},
which set time stamps of files.  In addition, @code{utime} now allows to
set the time stamp of directories, but only on Windows 2000 or XP (other
versions of Windows do not allow to change time stamps of directories).

@findex sbrk@r{, fixed address wrap where illegal}
@cindex @file{crt0.h}, added new flag to control wrap
@cindex address wrap crashes on Windows NT, 2000, XP
A fix has been applied to the memory allocation routines in @code{sbrk}
to prevent use of memory which would require address wrap when the host
@acronym{DPMI} provider does not allow 4Gb address limits.  This feature may also
be enabled in other environments which do not require it to get better
memory protection.  @code{_CRT0_DISABLE_SBRK_ADDRESS_WRAP} flag was added
to @code{_crt0_startup_flags} in file @file{crt0.h}

@vindex __djgpp_memory_handle_size@r{, added to library}
@cindex @file{crt0.h}, declaration of memory size array
@cindex array of @acronym{DPMI} memory block sizes
A list of memory block sizes @code{__djgpp_memory_handle_size} was added for
use in core dumps of the address space.

@findex sbrk@r{, changed allocation size algorithm}
@cindex @acronym{DPMI} memory block allocation sizes dynamic
Change the round up size for memory block allocations in @code{sbrk} to increase with
the number of handles allocated.  This helps keep the number of handles
to the 256 allocated and reduce problems exhausting @acronym{DPMI} handle resources.

@findex dup@r{, duplicates @code{FSEXT} hooks}
@findex dup2@r{, duplicates @code{FSEXT} hooks}
The functions @code{dup} and @code{dup2} now copy to the new handle any
Filesystem Extensions which hooked the original handle.  Thus, the
duplicate handle now behaves exactly like the original one, in that it
is also hooked by the extension.

@findex fstat@r{, and Windows 2000/XP}
@findex link@r{, and Windows 2000/XP}
@pindex cp@r{, and Windows 2000/XP}
The function @code{fstat} now work arounds incompatibilities in @acronym{DOS}
IOCTL interface on Windows 2000 and Windows XP, and as a result returns
correct read/write permissions in @code{st_mode} and correct device code
in @code{st_dev} members of @code{struct stat}.  This was known to fail
functions like @code{link} and programs like @acronym{GNU} @code{cp} which tested
files for being on the same filesystem by calling @code{fstat}.

@findex open@r{, and Windows 2000/XP}
@findex _open@r{, and Windows 2000/XP}
@findex _creat@r{, and Windows 2000/XP}
@findex _creatnew@r{, and Windows 2000/XP}
The long file name support in Windows 2000 and XP have bugs which cause
handles returned with long name opens to give incorrect information in
many library routines.  Routines which open files now open using short
name calls under Windows NT, 2K and XP if long file names are enabled.

@pindex fsdb@r{, and Windows 2000/XP hardware breakpoints}
@pindex edebug32@r{, and Windows 2000/XP hardware breakpoints}
@findex _set_break_DPMI@r{, and Windows 2000/XP breakpoints}
The set break @acronym{DPMI} call under Windows 2000 and XP do not return the
break point handle, which prevented debuggers using break points from
working properly.  The handle is now guessed for this platforms which
allows the debuggers to work with hardware break points.

@findex getcwd@r{, and Windows 2000/XP long named directories}
@findex _fixpath@r{, and long named directories}
If the short name equivalent of the current path is greater than
64 characters, Windows 2000 and XP do not return the correct long
path name - they return the root directory instead without any
failure code.  Since this can be disastrous in deep directories
doing an rm -rf, we check for this bug and fix the path.  Long
directories can also cause @code{_fixpath} to fail on Windows 9x if LFN=n and
this is now handled by returning a relative path instead of root.
Many uses of @code{_fixpath} assume absolute directories so this
change may break code in rare cases (such as saving the value and
changing directories).

@findex getmntent@r{, and Windows 2000/XP}
Windows 2000/XP do not return the volume labels correctly using
findfirst calls so we force short name usage to fix the problem.
Drives higher than Z are suppressed.

@findex freopen@r{, and reusage of same handle}
@code{freopen} was modified to always use the same handle even if
it is not the first one available.

@vindex _os_trueversion@r{, added to the library}
This global variable declared in @file{dos.h} is a faster way to
get the result of @code{_get_dos_version(1)}.

@pindex djtar@r{, new option -e}
@pindex djtar@r{, multiple -o and -e options}
New option @samp{-e} has been added to djtar to skip specified files
and directories when extracting.  Also djtar can accept multiple
@samp{-o} and @samp{-e} options in a single command line.  Finally, the file
name change file format allows skipping files and directories.

@findex fgetpos
The function @code{fgetpos} will now fail, if it is unable to determine
the current offset for a stream.  Previously the failure would have been
silently ignored.

@findex _is_DOS83
New function @code{_is_DOS83} added to the library to support filename
case lowering.  This replaces the functionality used from @code{_lfn_gen_short_fname}
which is hopelessly buggy on Windows 2000 and XP.  New function used in
@file{srchpath.c}, @file{readdir.c}, @file{glob.c}, @file{fixpath.c},
@file{lstat.c} and @file{getcwd.c}.

@findex stat@r{, and block size}
@findex lstat@r{, and block size}
@findex fstat@r{, and block size}
The functions @code{stat}, @code{lstat} and @code{fstat} now fill
the @code{st_blksize} member of @code{struct stat} with the correct block
size for the device where the file is located.

@tindex blksize_t
@tindex blkcnt_t
@tindex struct stat@r{, and }blksize_t
The types @code{blksize_t} and @code{blkcnt_t} were added.
@code{blksize_t} is now used for the @code{st_blksize} member of
@code{struct stat}.

@cindex C libraries and profiling
@cindex libc and profiling
@cindex libm and profiling
@cindex @file{emu387.dxe} and profiling
@cindex @file{gcc.opt}, and profiling
The build system for the C libraries was modified, so that profiling
versions can be built.  Profiling options in @file{gcc.opt} are ignored
for certain files in the C libraries' sources.  The build system for
@file{emu387.dxe}, the math co-processor emulation library, was also
modified, so that it can be built against a profiled version of libc.

@findex strftime@r{, and z format}
Corrected problem with negative gmt offsets with z format in @code{strftime}.

@vindex DJGPP@r{, environment variable and memory corruption}
@cindex startup code, and memory corruption
The startup code was updated, to prevent memory corruption when
the @env{DJGPP} environment variable is not set.

@findex fstatvfs
@findex statvfs
The functions @code{fstatvfs} and @code{statvfs} have been added.
@code{statvfs} does much the same as @code{statfs}, but it is
@acronym{POSIX} -compliant.

@cindex @file{/dev/zero}
@findex __install_dev_zero@r{, install support for @file{/dev/zero}}
@cindex @file{/dev/full}
@findex __install_dev_full@r{, install support for @file{/dev/full}}
Optional support for the devices @file{/dev/zero} and @file{/dev/full} was
added.  This is enabled using the @code{__install_dev_zero} and
@code{__install_dev_full} functions.

@pindex mkdoc@r{, clearer style for portability information}
@pindex mkdoc@r{, support for multiple versions of standards}
The @code{mkdoc} program is used to build the C library documentation.
@code{mkdoc} now produces portability information in a clearer manner,
to avoid ambiguity.  @code{mkdoc} also now allows multiple versions of
standards to be specified in the portability information,
e.g.@: @acronym{ANSI} @acronym{C89} and @acronym{C99}.

@cindex debuggers, and exceptions 18 and 19
The debug support routines in @file{libdbg.a} now support exceptions
18 and 19 (in case the application being debugged hooks them), and no
longer overwrite memory when exceptions higher than 19 are used by
the debuggee.

@findex fchown
The function @code{fchown} was added.

@cindex File System Extensions, and large numbers of file descriptors
A bug was fixed in the File System Extensions mechanism that could be
exposed in environments where it is possible to have large numbers of
file descriptors (> 256) and low memory.

@findex __doserr_to_errno@r{, wildcards on Windows 2000 and XP}
The @code{errno} value is now set correctly when a file open fails
due to wildcard (illegal) characters in the name.  If a wildcarded
name failed to match the error message was EFAULT and misleading.

@findex pow
A bug was fixed in the function @code{pow} in @file{libm.a}.
Previously @code{pow(x,y)} returned 0 when @code{x} was very close to
-1.0 and @code{y} was very large.

A bug was fixed in the function @code{pow} in @file{libc.a}.
Previously @code{pow} may have failed for negative numbers with
a large magnitude.

@findex findfirst
A bug was fixed in the function @code{findfirst}.  Previously
unexpected behaviour may have resulted, if the attribute argument
had a value outside the range describable by the @code{FA_*} constants.

@findex realpath@r{, added to library to increase @sc{posix} compliance}
The function @code{realpath} was added. @code{realpath} does much the same
as @code{_fixpath}, but is @sc{posix} compliant and resolves symlinks.

@findex isblank
The function @code{isblank} was added.

@cindex @acronym{C99} compliance, @code{struct lconv}
@cindex @acronym{C99} compliance, @file{locale.h}
@tindex struct lconv
The @code{int_n_cs_precedes}, @code{int_n_sep_by_space},
@code{int_n_sign_posn}, @code{int_p_cs_precedes},
@code{int_p_sep_by_space} and @code{int_p_sign_posn} members were added
to @code{struct lconv}, to comply with the @acronym{C99} standard.

@findex _Exit
The function @code{_Exit} was added.

@findex atoll
The function @code{atoll} was added.

@findex strtold
The function @code{strtold} was added.

@findex scanf@r{, and the X type conversion and @acronym{C99}}
The behaviour of the @code{%X} type conversion for the @code{scanf}-family
of functions has changed.  Previously @code{%X} denoted
a @code{long} version of the @code{%x} type conversion.  Now @code{%X}
is equivalent to the @code{%x} type conversion, as required by @acronym{C99}.

@findex _doprnt@r{, and @acronym{C99} conversion qualifiers}
@findex printf@r{, and @acronym{C99} conversion qualifiers}
@findex _doscan@r{, and @acronym{C99} conversion qualifiers}
@findex scanf@r{, and @acronym{C99} conversion qualifiers}
The @code{hh}, @code{j}, @code{t} and @code{z} conversion qualifiers
are now supported by @code{_doprnt}, @code{_doscan},
the @code{printf} family of functions and the @code{scanf} family
of functions.

@findex delay@r{, and Windows 2000 and XP}
The @code{delay} function now works on Windows 2000 and XP.  However, the
accuracy in the delay is limited, by the timing method it has to use on
Windows 2000 and XP.

@findex imaxabs
@findex imaxdiv
@findex strtoimax
@findex strtoumax
@findex PRI
@findex SCN
The functions @code{imaxabs}, @code{imaxdiv}, @code{strtoimax}
and @code{strtoumax} were added.  The @code{PRI} and @code{SCN} families
of macros were added.

@findex _put_path@r{, and @file{/dev} directory on disk}
The low-level function @code{_put_path} was changed to retain the @file{/dev}
prefix if a @file{/dev} directory exists on the disk.  This allows DJGPP
images to work with directories by this name.  You should avoid using
the @file{/dev} prefix on @acronym{DOS} device names if possible since the behavior
will change if the directory exists (and file operations which use the
name will be slower).  You should avoid using a @file{/dev} directory
to avoid conflicts.

@findex ctime@r{, and calls to @code{getenv}}
Fix caching when environment variable @env{TZ} is not set.  Prevents many calls
to @code{getenv} which are not needed.

@findex strtof
The function @code{strtof} was added.

@findex strlcat
@findex strlcpy
The functions @code{strlcat} and @code{strlcpy} were added.

@pindex djasm@r{, wbinvd instruction}
The mnemonic @code{wbinvd} has been added to @code{djasm}.

@cindex @acronym{C99} compliance, mathematics
@vindex HUGE_VALF
@vindex HUGE_VALL
The constants @code{HUGE_VALF} and @code{HUGE_VALL} were added.

@tindex ssize_t
@code{ssize_t} was changed from an @code{int} to a @code{signed long int}.
@code{ssize_t} is now really a signed version of @code{size_t}.

@vindex errno@r{, and @acronym{C99} compliance}
@findex perror@r{, and @acronym{C99} compliance}
@findex strerror@r{, and @acronym{C99} compliance}
The error code @code{EILSEQ} was added --- @code{errno} may be assigned it.
@code{perror} and @code{strerror} were updated to display/return
an error message for @code{EILSEQ}.

@pindex stubify@r{, ability to set stub parameters}
It's possible to set stub parameters by passing
@option{-stubparams=@dots{}} to @command{stubify}.

@pindex go32-v2@r{, documentation}
@pindex stubify@r{, documentation}
@pindex stubedit@r{, documentation}
@pindex exe2coff@r{, documentation}
@pindex coff2exe@r{, documentation}
@pindex dxegen@r{, documentation}
@pindex symify@r{, documentation}
@pindex edebug32@r{, documentation}
@pindex fsdb@r{, documentation}
Info documentation was added for @command{go32-v2}, @command{stubify},
@command{stubedit}, @command{exe2coff}, @command{coff2exe},
@command{dxegen}, @command{symify}, @command{edebug32}, and @command{fsdb}.

@vindex __djgpp_ds_alias@r{, moved to crt0}
@vindex _crt0_startup_flags@r{, moved to crt0}
The internal declaration of these two variables was moved to @file{crt0.S}.
This change makes the new @file{crt0.o} incompatible with previous DJGPP
releases if you accidentally link crt0 with the wrong libc.
@code{__djgpp_ds_alias} used to be declared in the @code{.text} section
and locked by default.  It is now in @code{.data} and not locked.  If you
are referencing this value in a hardware interrupt handler, you should
lock the memory area or copy it to your handler's locked memory.

@findex _rdtsc@r{, new timer function}
Added @code{_rdtsc} as a direct call to the hardware instruction.  It 
will inline to a single instruction when compiled with optimization.

@cindex File System Extensions, and @code{chmod}
@cindex File System Extensions, and @code{chown}
@code{chmod} and @code{chown} can now be hooked by File System Extensions.

@findex isatty@r{, and invalid file descriptors}
The function @code{isatty} now checks whether the file descriptor
passed to it is a valid.  If not, it will set @code{errno}
to @code{EBADF}.

@findex perror
The function @code{perror} no longer prints a colon and blank if called
with a null pointer or a pointer to a null string.

@findex fchmod
The function @code{fchmod} was added.

@findex _tolower
@findex _toupper
The functions @code{_tolower} and @code{_toupper} were added.

@findex readv
@findex writev
The functions @code{readv} and @code{writev} were added.

@findex pwrite
The function @code{pwrite} was added.

@findex NAN
The macro @code{NAN} was added.

@findex fchdir
@findex open@r{, and directories}
@findex read@r{, and directories}
@findex write@r{, and directories}
@findex lseek@r{, and directories}
@findex ftruncate@r{, and directories}
@findex fstat@r{, and directories}
@findex select@r{, and directories}
@findex fsync@r{, and directories}
@findex fdopen@r{, and directories}
@findex fopen@r{, and directories}
@findex freopen@r{, and directories}
@findex fclose@r{, and directories}
@findex ftell@r{, and directories}
@findex fseek@r{, and directories}
@findex rewind@r{, and directories}
@cindex Opening directories with @code{open}
The function @code{fchdir} was added.  This required modifications
to the @acronym{POSIX} functions @code{open}, @code{read}, @code{write},
@code{lseek}, @code{ftruncate}, @code{fstat}, @code{select},
@code{fsync} and @code{fdopen} and the @acronym{ANSI} functions @code{fopen},
@code{freopen}, @code{fclose}, @code{ftell}, @code{fseek}
and @code{rewind}, to make them aware of file descriptors for directories.

@findex fstat@r{, and inodes}
@findex stat@r{, and inodes}
@strong{Simple temporary fix - TODO: more complete fix}: @code{fstat}
will now use the file name used to open the file, when inventing inodes.
This is done so that the same inode is generated irrespective
of the actual file path used to open the file.  This also fixes
the problem where multiple calls to fstat on the same file descriptor
would give different inodes.

@code{stat} and @code{fstat} should now return the same inode for a file
in most cases.

@findex dlopen@r{, added to the library}
@findex dlsym@r{, added to the library}
@findex dlclose@r{, added to the library}
@findex dlerror@r{, added to the library}
@pindex dxe3gen@r{ added}
@pindex dxe3res@r{ added}
New enhanced dynamic module support has been added with a Posix compliant
interface.  You can now create complex DXEs which depend on each other
and call code from the main image.  Converting libraries to standalone
DXEs which can be linked via library is as simple as a single command.

@findex uclock@r{, uses rdtsc on Windows NT, 2000, XP}
@code{uclock} now uses rdtsc under Windows NT, 2000 and XP (if it is 
available) to work around the bug with the interval timer not being 
syncronized with the timer tick.

@vindex __tb_size@r{ added}
The macro @code{__tb_size} was added, to represent the size
of the transfer buffer.  This complements the macro @code{__tb},
which gives the linear address of the transfer buffer.

@pindex djtar@r{, and single-span spanned archives}
djtar now copes with single-span spanned archives.

@findex strtod@r{, @code{Inf} and @code{NaN} in input}
@findex strtof@r{, @code{Inf} and @code{NaN} in input}
@findex strtold@r{, @code{Inf} and @code{NaN} in input}
@findex _strtold@r{, @code{Inf} and @code{NaN} in input}
The functions @code{strtod}, @code{strtof}, @code{strtold} and
@code{_strtold} now understand ``Inf'', ``Infinity'', ``NaN'',
``NaN()'', ``NaN(@var{hex-number})'' and any variations of case in the
input string.

@findex _truename_sfn
The @code{_truename_sfn} function was added.  Please use
@code{_truename_sfn} when comparing truenames, to avoid problems
when comparing the truenames of existing and non-existing files.

@findex rename@r{, and moving directories into themselves}
Fix a bug in moving directories into themselves.   Previously
@code{rename} failed to detect that a subdirectory was being moved
into itself, when the current directory was a short filename.

@findex fpclassify@r{, added to the library}
@findex __fpclassifyf@r{, added to the library}
@findex __fpclassifyd@r{, added to the library}
@findex __fpclassifyld@r{, added to the library}
The @acronym{C99} macro @code{fpclassify} and the supporting functions
@code{__fpclassifyf}, @code{__fpclassifyd} and @code{__fpclassifyld}
were added.

@findex nan@r{, added to the library}
@findex nanf@r{, added to the library}
@findex nanl@r{, added to the library}
The @acronym{C99} functions @code{nan}, @code{nanf} and @code{nanl} were added.

@findex _doprnt@r{, and the decimal point}
@findex printf@r{, and the decimal point}
@findex _doscan@r{, and the decimal point}
@findex scanf@r{, and the decimal point}
@findex strtod@r{, and the decimal point}
@findex strtof@r{, and the decimal point}
@findex strtold@r{, and the decimal point}
@findex _strtold@r{, and the decimal point}
The @code{_doprnt} and @code{_doscan} functions, the @code{printf}
family of functions, the @code{scanf} family of functions
and the @code{strto*} family of functions now honour the decimal point
from the current locale.

@findex strftime@r{, and the x type conversion}
@findex strftime@r{, and the X type conversion}
@code{strftime} now uses the date format (for @code{%x})
and time format (for @code{%X}) from the current locale.
This means that @code{%T} and @code{%X} are no longer equivalent.

@vindex __djgpp_stack_overflow_eip@r{ added}
@findex __djgpp_stack_overflow_exit@r{, added to the library}
A stack overflow handler was added.

@vindex math_errhandling@r{, added to the library}
@code{math_errhandling} was added.

@findex scanf@r{, and assignment suppression}
A bug was fixed in the @code{scanf} family of functions.
If a variable assignment was suppressed and the stream terminated
prematurely, these functions could incorrectly return the number of matches
instead of @code{EOF}.

@findex assert@r{, and function name}
Now @code{assert} prints also the name of the function where an assertion
fails, if that function is compiled with @acronym{C99} features enabled.
