OpenVMS VMS721H1_ACRTL-V0200 Alpha V7.2-1H1 Compaq C RTL ECO Summary
TITLE: OpenVMS VMS721H1_ACRTL-V0200 Alpha V7.2-1H1 Compaq C RTL ECO Summary
New Kit Date : 23-APR-2001
Modification Date: Not Applicable
Modification Type: New Kit
NOTE: An OpenVMS saveset or PCSI installation file is stored
on the Internet in a self-expanding compressed file.
For OpenVMS savesets, the name of the compressed saveset
file will be kit_name.a-dcx_vaxexe for OpenVMS VAX or
kit_name.a-dcx_axpexe for OpenVMS Alpha. Once the OpenVMS
saveset is copied to your system, expand the compressed
saveset by typing RUN kitname.dcx_vaxexe or kitname.dcx_alpexe.
For PCSI files, once the PCSI file is copied to your system,
rename the PCSI file to kitname-dcx_axpexe.pcsi, then it can
be expanded by typing RUN kitname-dcx_axpexe.pcsi. The resultant
file will be the PCSI installation file which can be used to install
the ECO.
Copyright (c) Compaq Computer Corporation 2001. All rights reserved.
OP/SYS: OpenVMS Alpha
COMPONENT: DECC$SHR (Compaq C RTL)
SOURCE: Compaq Computer Corporation
ECO INFORMATION:
ECO Kit Name: VMS721H1_ACRTL-V0200
DEC-AXPVMS-VMS721H1_ACRTL-V0200--4.PCSI
ECO Kits Superseded by This ECO Kit: VMS721H1_ACRTL-V0100
ECO Kit Approximate Size: 15456 Blocks
Kit Applies To: OpenVMS Alpha V7.2-1H1
System/Cluster Reboot Necessary: Yes
Rolling Re-boot Supported: Yes
Installation Rating: INSTALL_3
3 - To be installed on all systems running
the listed versions of OpenVMS which
are experiencing the problems described.
Kit Dependencies:
The following remedial kit(s) must be installed BEFORE
installation of this kit:
VMS721H1_UPDATE-V0400
In order to receive all the corrections listed in this
kit, the following remedial kits should also be installed:
None
ECO KIT SUMMARY:
An ECO kit exists for Compaq C on OpenVMS Alpha V7.2-1H1. This kit
addresses the following problems:
PROBLEMS ADDRESSED IN KIT VMS721H1_ACRTL-V0200
o After installation of previous CRTL ECO kits, user sees:
%LINK-I-DATMISMCH, creation date of in shareable
image SYS$COMMON:[SYSLIB]DECC$SHR.EXE;1
differs from date of in shareable image library
SYS$COMMON:[SYSLIB]IMAGELIB.OLB
Previous ECO kits did not correctly replace DECC$SHR.EXE in
the system IMAGELIB.OLB, which resulted in this message.
This change is Alpha only.
DECC 3262
o The linker reported multiple definitions when linking programs
referencing the following symbols.
This was because C$ERRNO was not inserted in STARLET.OLB for
Selective search.
o C$_SIG0
o C$_SIGN
o C$_SIGPIPE
o C$_SIGCHLD
o C$_HOST_NOT_FOUND
o C$_TRY_AGAIN
o C$_NO_RECOVERY
o C$_NO_DATA
o C$_NO_ADDRESS
o C$_NO_TCP
o C$_NOSYSSHR
o C$_EXIT1
o C$_EXIT255
o C$_ILLSYSTDF
o C$_QSORT2BIG
This was a problem with previous CRTL ECO kits.
This change is Alpha only.
o Function mktime()'s algorithm locked thread specific data,
which didn't need to be done. This change uses stack
allocated data, and improves performance.
CRTL_INTERNAL 2684
o Function open() had unnecessary calls to SYS$GETJPI. These
were removed.
o Several problems in function mmap() and munmap() were
addressed.
- Calling function mmap() could result in memory corruption,
when specifying specific addresses in parameter addr.
Under complex conditions the CRTL sometimes allocated
internal memory needed by the CRTL for mmap() related
routines in the address space mapped, which could result
in memory corruption.
This change is Alpha only.
- Function mmap(), with parameter addr set to 0, now returns
the first available chunk of memory from the freelist (if
any). It previously returned a "best fit" chunk from the
freelist.
This change is Alpha only.
- Function munmap() would sometimes fail when releasing
memory allocated with MAP_ANON. This is because it
wrongly tried to deassign a file channel that was not
associated with the memory range.
- Function mmap() was incorrectly specifying global memory
when MAP_ANON is specified.
Change will only do this with flag MAP_SHARED specified.
CRTL_INTERNAL 2760
CRTL_INTERNAL 2747
o Function gettimeofday() now sets errno and vaxc$errno
appropriately if UTC time functions fail because of a system
service failure.
CRTL_INTERNAL 2730
o In UNIX mode, getcwd() returns uppercase for the device.
This problem was introduced in CRTL kits VMS721_ACRTL-V0200
and VMS721H1_ACRTL-V0100.
Case preservation in files names was introduced in
VMS721_ACRTL-V0200. This only applies to files saved or
reported from ODS-5 devices. The case of the logical name or
device name was preserved using this same rule.
PTR 117-1-15638
Problems Addressed in VMS721H1_ACRTL-V0100:
o The Compaq C RTL functions which make calls to RMS have been
modified to better support ODS-5 disks. This is an extensive
set of changes throughout the RTL to support case preservation,
long file names, and non-standard file name characters. The
default behavior of the RTL has not changed.
The Compaq C RTL supports case preservation in file names on
ODS level 5 disks. This applies when creating or reporting
file names. By default, this feature is disabled. To enable
this feature define the logical name DECC$EFS_CASE_PRESERVE to
"ENABLE". If file names are all in upper case, define
DECC$EFS_CASE_SPECIAL to "ENABLE" to convert the names into
lower case when reporting the name in UNIX style. If file
names are not all in upper case, then the case is preserved.
Most C RTL functions now accept long OpenVMS-style file names
as arguments. For OpenVMS Alpha Version 7.2, some basic
Compaq C RTL I/O functions (creat, stat, and the functions
from the open family of functions) were enhanced to accept
long OpenVMS-style file names for an ODS-5 device.
In this ECO kit, all other Compaq C RTL functions, except
chdir and the functions from the exec family of functions,
were also enhanced to accept long OpenVMS-style file names for
an ODS-5 device.
All C RTL functions that accept or report full file specifications
will process file specifications up to 4095 bytes long, subject to
the rules defined for the media format. For file specifications in
OpenVMS format, there are no special restrictions. In situations
where a full file specification cannot be reported because the
buffer is too short, the function attempts to report the abbreviated
name.
There are restrictions with UNIX file names. Names containing
special characters, such as multiple periods, caret, or
multinational characters, may be rejected. A function call
may report failure if the output buffer is not large enough to
receive the full name. For OpenVMS-style names, the reported
name would contain a FID-abbreviated name. There is no
representation of FID-abbreviated names defined for UNIX.
o The Compaq C RTL was enhanced to allow interpreting the
leading part of a UNIX-style file specification as either a
subdirectory name or a device name.
The translation of the UNIX-style file name "foo/bar" to the
OpenVMS-style file name "foo:bar" was the only translation in
previous versions OpenVMS. It remains the default.
To request translation of the UNIX-style name "foo/bar" to the
OpenVMS-style name "[.foo]bar", DEFINE the following logical
name to any value:
$ DEFINE DECC$DISABLE_TO_VMS_LOGNAME_TRANSLATION ENABLE
To return to the default file-name translation, DEASSIGN the
logical name. The logical name is checked only once per image
activation, not on a file-by-file basis.
o The file creation functions (fopen, open, creat) have been
corrected to not inherit file attributes if a directory by the
same name exists for the file being created. For example,
creating a file named "foo." in a directory which contained a
"foo.dir" would incorrectly inherit file attributes from this
directory file.
o The stat function no longer puts the wrong values into
st_?time members of the stat structure. More precisely,
during daylight savings time the values of st_?time are no
longer one hour ahead from file creation/modification time
reported by the $DIRECTORY command.
o Nonquoted command-line arguments passed to C and C++ programs
(argv arguments) can now optionally have their case preserved,
rather than being lowercased as in previous versions. By
default, this feature is disabled.
To enable this case preservation feature, define the logical
name DECC$ARGV_PARSE_STYLE to "ENABLE" and set the
process-level DCL parse style flag to "EXTENDED" in the
process running the program. Enabling this feature also
ensures that the image name returned in argv[0] is also
case-preserved.
o The time functions time, ftime, gettimeofday and getclock
would fail for a TDF (time differential factor) of -13 hours,
the value required in New Zealand. According to the U.S.
Naval Observatory information the valid range for the TDF is
-13.75 to +13, inclusive. The C RTL now allows this full
range.
o The _malloc64 function was corrected to allow initialization
of this function in a threadsafe manner. Prior to this
change, if the first call occurs after the program has created
multiple threads and more than one thread calls the _malloc64
routine, an access violation may occur.
o In the previous ECO kit, a change was introduced to the
function strptime() for XPG5-compatibility to handle
expressions for the 2-digit year format %y when the century
was not specified. The requirement is for 2-digit years in
the range 0-68 to be treated as 21st century and years in the
range 69-99 as 20th century. The 2-digit years in the range
69-99 were incorrectly being treated as 21st century.
o The execlp and execvp functions were unconditionally prefixing
the file specification of the image to be run in the child
process with "VAXC$PATH:" string. When passed a fully
qualified file specification, this would result in an invalid
file specification.
o The behavior of lseek() and fseek() at positions beyond the
end of data in a file were not conforming to the POSIX/ANSI
standard. The file was being physically null padded on disk
even though the standard only requires this null padding if
data is actually written at this point. In the case reported
by the user, seeking to the end of a file by using a large
offset would take a long time and may exhaust available disk
space. To get the POSIX behavior, you must define
DECC$POSIX_SEEK_STREAM_FILE as "ENABLE". The default behavior
is unchanged.
o The Compaq C RTL was enhanced to open all files for shared
access as if the "shr=del,get,put,upd" option was specified in
the open* or creat call. To enable this feature, define the
logical name DECC$FILE_SHARING to the value "ENABLE". The
value is case-insensitive and is checked only once per image
activation, not on a file-by-file basis.
o The Compaq C RTL was failing when the amount of data written
to a pipe exceeded the buffer size of that pipe. The RTL now
breaks the large write into a sequence of writes whose size is
the size of the underlying mailbox used to implement pipes.
o The opendir function now accepts ".." to be equivalent to both
"../" and "[-]".
o A problem was reported that the RTL could hang if exit were
called while threads were continuing to do I/O. Analysis
showed that the hang was caused by a thread holding the lock
necessary to close the file and the exit handler blocking on
this lock. The change implemented was to not attempt to close
files whose locks were currently in use.
o When a stream file is extended using ftruncate() it is
documented that the extended area will be filled with zeroes.
This is now done correctly. Prior to this change, the file
was not extended.
o The documentation of the select function states that it
returns either when a socket is ready to be read or written,
when the timeout period expires, or when exceptions occur.
It was not properly terminating when an exception occurred.
This problem was corrected by dynamically linking to and calling
an abort function in the socket library. A complete correction
to interrupting the select function will also require an ECO
kit from the Compaq TCP/IP product which includes this new
abort function.
o The fstat function was corrected to not access violate when
called with stdin, stdout, stderr, or a directory specification.
o The chdir function was not well-behaved when the calling
program passed an argument which was a search list logical.
The chdir function was unconditionally changing the logical
sys$disk to the first member of the search list was
effectively dropping the remaining members. The change in
behavior is seen as a step in the right direction, but there
are plans for more work in this area.
o The stat functions were not correctly handling files which
were not directories but did use a .dir extension. This
problem was discovered when porting a UNIX application which
used a .dir extension to store application specific information.
o The RTL functions which process file specifications were not
correctly processing files which contained a hyphen character.
The RTL was incorrectly assuming that hyphens were only
allowed to specify a relative directory path.
Problems Addressed in VMS721_ACRT-V0100:
o The getenv() function has been corrected to check for a CLI
symbol only when called in user access mode. While DEC C RTL
is a user-mode run time library, we decided to correct
getenv() in order to make the library more robust. This is
because calling CLI from within exec or kernel mode may result
in an access violation.
With this fix, when called from inner access mode, the
getenv() function will search only the C environment list and
VMS logical names.
This fix does not mean, however, that the user-mode only
restriction was lifted. It is still unsupported to call the
DEC C RTL functions, including getenv(), in any access mode
other than in user-mode.
o The strptime() function has been modified to comply with
X/Open CAE Specification System Interfaces and Headers Issue 5
(commonly known as XPG5). In XPG5, it was changed how the
strptime() function processes the "%y" directive for a
two-digit year within the century if no century is specified.
According to XPG5, for the "%y" directive when a century is
not otherwise specified, values in the range 69-99 refer to
years in the twentieth century (1969 to 1999 inclusive) while
values in the range 00-68 refer to years in the twenty-first
century (2000 to 2068 inclusive). Essentially, for the "%y"
directive, strptime() became a "pivoting" function with 69
being a pivoting year.
Before this change, the strptime() function was always
interpreting two-digit year with no century as a year within
the twentieth century.
With the current ECO kit, XPG5-compliant strptime() becomes a
default strptime() function in the DEC C RTL. However, for
compatibility reasons, the previous "non-pivoting" XPG4-compliant
strptime() function was retained.
The "pivoting" is controlled by the DECC$XPG4_STRPTIME logical
name. Defining this logical name prior to invoking the
application (any equivalence string) will cause the DEC C RTL
to use the "non-pivoting" flavor of strptime(). Also
"non-pivoting" strptime() can be called directly as
decc$strptime_xpg4() function.
While there is an easy way to disable "pivoting" by just
defining a logical name, you should be aware that if the
application ceases to work correctly due to the change in the
strptime() function, it almost certainly means, that there is
a Y2K problem in the application. Y2K-safe applications
should not be affected by the change in strptime().
o The stat() function has been corrected to process file
specifications such as "foo:[000000]" where foo is defined as
a concealed device like the following:
$ define/trans=(conc) foo device:[bar.]
Prior to this fix, the stat() function would fail for such a
file specification with errno set to ENOENT (No such file or
directory).
o Both flavors of system() function were corrected to ensure
that the function always returns the correct status.
The POSIX-compliant system() function has been corrected to
always return status corresponding to the signal which
terminated the child process if the child process was
terminated due to receiving a signal.
Prior to this fix, there was a small timing window when the
function could return the status corresponding to the child
process completion code even in the case when the child
process was terminated by a signal.
The Non-POSIX system() function has been corrected to always
return the VMS completion code of the child process.
Prior to this fix, there was a small timing window when the
function could return the status from LIB$SPAWN() instead of
the completion code of the child process.
None of these problems were ever reported by a customer.
o Opendir() and readdir() functions have been corrected to
process directories on a remote node specified using the
following DECnet file specification:
nodename"username password"::device:[directory]
Prior to this fix, opendir() could fail with errno set to
ENOTDIR (Not a directory). In the case when opendir() could
successfully open the directory, readdir() function could
return incorrect file names.
o Times() and clock() functions have been modified to be both
thread-safe and AST-reentrant.
Prior to this change, these functions belonged to the class of
functions which are thread safe, but not AST-reentrant (see
section 1.7.2 Multithread Restrictions in the DEC C RTL
Reference Manual).
The change in the reentrancy status of the times() and clock()
functions will be reflected in the next release of the Manual.
o The stat() function no longer fails due to the failure of the
mktime() function.
It was reported that the stat() function fails for a file
created on April 4th 1999 at 2:04 a.m. EST which is the
"missing hour" in the transition from standard to daylight
saving time in Eastern time zone.
The failure was due to the failure of the mktime() function to
process the "missing hour" (stat() calls mktime() to fill
st_?time members of the stat structure with UTC time).
While the mktime() function was not fixed, the stat() function
was corrected to handle the failure of mktime() and set
st_?time fields correctly even if mktime() fails.
Note, that, strictly speaking, "missing hour" is an invalid
input for mktime(): there is no such time as "April 4th 1999
2:04 a.m.", for example, in Eastern time zone. Given the
possibility of calling mktime() with invalid time, the stat()
function, probably, should not have used mktime() in the first
place or at least should have been prepared for mktime()
failure.
o The CRTL I/O subsystem was enhanced to lift eight nested
directory levels restriction for an ODS-5 device. It affects
such DEC C RTL functions as access, mkdir, opendir, rmdir, and
stat.
The following program example shows different VMS and
Unix-style deep directory specifications.
#include
#include
#include
#include
#include
#include
#define DIM(_s) (sizeof(_s) / sizeof(_s[0]))
/*
** we assume presence of root$ concieled device:
**
** define/NoLog/Tran=(Conceal,Terminal) root$ node$dka0:[000000.]
**
*/
static char *filename[] = {
"node$dka0:[w.x.y.z.a.b.c.d.e.f.g.h.i.j]", /* (1) */
"node$dka0:[w.x.y.z.a.b.c.d.e.f.g.h.i]j.dir", /* (2) */
"root$/w/x/y/z/a/b/c/d/e/f/g/h/i/j", /* (3) */
};
main()
{
struct stat s;
int i;
char *name;
for(i=0; i < DIM(filename); ++i) {
name = filename[i];
if ( mkdir(name,0) == -1 )
printf("%d? mkdir(): %s\n", i+1, strerror(errno));
if ( stat(name,&s) )
printf("%d? stat(): %s\n", i+1, strerror(errno));
else if ( !S_ISDIR(s.st_mode) )
printf("%d? stat(): %s\n", i+1, "not a directory???");
if ( !opendir(name) )
printf("%d? opendir(): %s\n", i+1, strerror(errno));
if ( access(name,F_OK) == -1 )
printf("%d? access(): %s\n", i+1, strerror(errno));
if ( rmdir(name) == -1 )
printf("%d? rmdir(): %s\n", i+1, strerror(errno));
}
}
Please note, that the DEC C RTL still does not support mixed
UNIX/VMS-style file names coded using extended ODS-5 syntax
like "doc/foo.bar.bar", "~foo^.bar" and "./tmp/foo.bar.b^_ar".
o The select() function has been corrected to return failure
status if either invalid file descriptor or file descriptor
not associated with a socket is found in one of the specified
file descriptor sets. In case of invalid file descriptor, the
select() function sets errno to EBADF. In case of a file
descriptor not associated with a socket, the function sets
errno to ENOTSOCK.
Failure with errno set to EBADF is the standard requirement
for the select() function. Failure with errno set to ENOTSOCK
is because currently the select() function can operate only on
sockets.
Prior to this fix, the function was setting errno as described
above, but otherwise was ignoring invalid file descriptors and
file descriptors not associated with sockets.
The old behavior can be requested by defining the logical name
DECC$SELECT_IGNORES_INVALID_FD prior to invoking the
application (any equivalence string).
o The bug in printf() "engine" introduced in ALPACRT07_071 kit
has been fixed. The bug was that when minimal field width or
precision specified in the format directive was greater than
1024, the "engine" could write beyond the end of allocated
internal conversion buffer. It could happen only in X_FLOAT
floating point mode (/L_DOUBLE_SIZE=128, which is the default
on Alpha). The bug affected all functions from the printf()
family of functions.
o The problem commonly known as the "Y2038 bug" has been ofixed.
The C run-time library time functions which access the current
time using the VMS time functions have been corrected to
handle times after 19-Jan-2038 3:14:07. Data type time_t is
defined on VMS as an unsigned 32-bit integer. However, some
of the functions which retrieve current time from the system
and convert it to time_t format were using signed arithmetic.
This fix affects the functions:
o decc$fix_time()
o time()
o ftime()
o gettimeofday()
o getclock()
With this fix, DEC C RTL time functions will handle times
successfully until 07-Feb-2106 06:28:15.
o The printf() family of functions have been enhanced to perform
better when the calling application has exhausted available
memory.
o The file access functions have been corrected to process file
names on UNIX systems over DECnet. The file name for a file
on a UNIX system accessed over DECnet was being converted to
uppercase, even when the name was enclosed in double quotes.
This problem was introduced on OpenVMS V7.2 and also affects
OpenVMS V7.1-2 and OpenVMS V7.2-1. File names of the form
node::"dir/name" are now processed correctly.
INSTALLATION NOTES:
The images in this kit will not take effect until the system is
rebooted. If there are other nodes in the VMScluster, they must
also be rebooted in order to make use of the new image(s).
If it is not possible or convenient to reboot the entire cluster at
this time, a rolling re-boot may be performed.
During installation you may see the following message:
%INSTALL-E-NODELSHRADR, unable to delete image with shareable address
data
-INSTALL-I-PLSREBOOT, please reboot to install a new version of this
image
This is not a cause for concern. It simply means that DECC$SHR.EXE
was installed as a resident image, which is the standard configuration
for OpenVMS Alpha systems. The new image will not take effect until
the system is rebooted.
All trademarks are the property of their respective owners.
This patch can be found at any of these sites:
Colorado Site
Georgia Site
Files on this server are as follows:
dec-axpvms-vms721h1_acrtl-v0200--4.README
dec-axpvms-vms721h1_acrtl-v0200--4.CHKSUM
dec-axpvms-vms721h1_acrtl-v0200--4.pcsi-dcx_axpexe
vms721h1_acrtl-v0200.CVRLET_TXT