The following example proves that the man page
pthread_attr_setschedparam.3 is incorrect when it claims that the
pthread_attr_setschedparam function always succeeds on linux:
int main() {
pthread_attr_t attr;
struct sched_param p = {-1}; /* invalid priority */
if (pthread_attr_init(&attr) == 0)
if (pthread_attr_setschedpolicy(&attr, SCHED_OTHER) == 0)
if (pthread_attr_setschedparam(&attr, &p) == EINVAL)
return 1;
return 0;
}
The program exits with exit code 1, therefore
pthread_attr_setschedparam() has returned error code EINVAL.
I could evoke this error on ubuntu 14.04, and verify it by
examining the eglibc-2.19 source code. The function is
implemented in file fbtl/pthread_attr_setschedparam.c. For
error checking, it calls the helper function
check_sched_priority_attr which is implemented inline in
file ./fbtl/pthreadP.h. This function returns EINVAL if a
range check fails.
Signed-off-by: Michael Kerrisk <mtk.manpages@gmail.com>
I (and some others) found that the original example code
did not seem to work as advertised. The new code (used by
permission of the original author, Jens Thoms Toerring)
was found on comp.os.linux.development.
Signed-off-by: Michael Kerrisk <mtk.manpages@gmail.com>
Fix tzset.3 regression, dst is optional.
$ date
Sun Feb 1 15:14:33 EST 2015
$ TZ=NZST-12 date
Mon Feb 2 08:14:38 NZST 2015
$ TZ=EST5 date
Sun Feb 1 15:15:02 EST 2015
Signed-off-by: J William Piggott <elseifthen@gmx.com>
Signed-off-by: Michael Kerrisk <mtk.manpages@gmail.com>
tzset(3) currently states that there are three TZ formats. The
first two it lists are actually variations of the POSIX-style
TZ format, of which there are at least five variations.
This patch corrects this to match the POSIX specification of
TZ having only two formats.
http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap08.html
Signed-off-by: J William Piggott <elseifthen@gmx.com>
Signed-off-by: Michael Kerrisk <mtk.manpages@gmail.com>
The TZ string representation indicates that the start/end
rules are required; this is incorrect.
Updated the TZ string format to the POSIX specification and
improve its readability by having only the optional parts in
italics.
http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap08.html
Signed-off-by: J William Piggott <elseifthen@gmx.com>
Signed-off-by: Michael Kerrisk <mtk.manpages@gmail.com>
Based upon reviewing the glibc source, the posixrules file is being used
for very specific TZ strings that can be represented as:
[:]stdoffsetdst[offset][,]
If anything follows the above string, even invalid data, posixrules will
not be used. Below is some shell output demonstrating this.
$ TZ="NZST-12:00:00NZDT-13:00:00,ANYTHING" \
strace -eopen date 2>&1 | grep -Ei 'posixrules|jan'
Thu Jan 29 06:53:35 NZDT 2015
$ TZ="NZST-12:00:00NZDT-13:00:00," \
strace -eopen date 2>&1 | grep -Ei 'posixrules|jan'
open("/usr/share/zoneinfo/posixrules", O_RDONLY|O_CLOEXEC) = 3
Thu Jan 29 05:54:58 NZST 2015
Signed-off-by: J William Piggott <elseifthen@gmx.com>
Signed-off-by: Michael Kerrisk <mtk.manpages@gmail.com>
FILES section was overly verbose and included
environment variables. Added ENVIRONMENT section,
removing ENV VARS from the FILES section.
As stated in commit 2c7f200, /usr/share/zoneinfo/localtime
is not used, nor recommended by glibc.
Signed-off-by: J William Piggott <elseifthen@gmx.com>
Signed-off-by: Michael Kerrisk <mtk.manpages@gmail.com>
POSIX.1-2001 did not have a specification for input streams,
but POSIX.1-2008 added one.
Reported-by: Sergey V. Zubkov <cubbi@cubbi.com>
Signed-off-by: Michael Kerrisk <mtk.manpages@gmail.com>
The manual incorrectly states the system timezone
path as /usr/share/zoneinfo/localtime. Glibc does
not use that file for anything, it uses
$(prefix)/etc/localtime.
There is an ambiguous reference in the man-page to
/etc/localtime, but it does not indicate that it
will be used. It states clearly that
/usr/share/zoneinfo/localtime is used.
A comment in the glibc Makeconfig even says that
file should not exist:
> ... relative to $(zonedir). It is a good idea
> to put this somewhere other than there, so the
> zoneinfo directory contains only universal data,
> localizing the configuration data elsewhere.
Furthermore, the man page does not indicate the
reason this file is being used; which is because
it is the configured system timezone.
A later patch in this series addresses the
possibility that /etc/localtime could be changed
during glibc's compilation. The language changed
in this patch points to the FILE section which is
where the explanation will be. There is no reason
to repeat that information multiple times
throughout the man-page.
EVIDENCE:
glibc/Makeconfig:256: sysconfdir = $(prefix)/etc
glibc/Makeconfig:272: localtime-file = $(sysconfdir)/localtime
FROM INFO LIBC:
C.2 Installing the C Library
============================
To configure the locally used timezone, set the `TZ' environment
variable. The script `tzselect' helps you to select the right value.
As an example, for Germany, `tzselect' would tell you to use
`TZ='Europe/Berlin''. For a system wide installation (the given paths
are for an installation with `--prefix=/usr'), link the timezone file
which is in `/usr/share/zoneinfo' to the file `/etc/localtime'. For
Germany, you might execute `ln -s /usr/share/zoneinfo/Europe/Berlin
/etc/localtime'.
STEPS TO REPRODUCE:
cd /usr/share/zoneinfo/
cp Antarctica/South_Pole localtime
cp /US/Eastern /etc/localtime
cd
date
Sun Jan 18 12:06:36 EST 2015
TZ=:/usr/share/zoneinfo/localtime date
Mon Jan 19 06:06:54 NZDT 2015
rm /etc/localtime
date
Sun Jan 18 17:08:37 UTC 2015
TZ=:/usr/share/zoneinfo/localtime date
Mon Jan 19 06:08:41 NZDT 2015
Signed-off-by: J William Piggott <elseifthen@gmx.com>
Signed-off-by: Michael Kerrisk <mtk.manpages@gmail.com>
If the TZ filespec omits the leading colon, glibc will parse
it for any valid format, i.e., it will still work.
STEPS TO REPRODUCE:
TZ=:Europe/Kiev date
Sun Jan 18 20:19:13 EET 2015
TZ=Europe/Kiev date
Sun Jan 18 20:19:20 EET 2015
Signed-off-by: J William Piggott <elseifthen@gmx.com>
Signed-off-by: Michael Kerrisk <mtk.manpages@gmail.com>
Paragraph three of the DESCRIPTION section says
that when TZ is set, but empty, then UTC is used.
Later it says if the TZ filespec is omitted then the file
/usr/share/zoneinfo/localtime is used. This is incorrect,
it will use UTC in that case as well.
Steps to reproduce:
cd /usr/share/zoneinfo/
cp Antarctica/South_Pole localtime
cd
date
Sun Jan 18 10:59:50 EST 2015
TZ=:Hongkong date
Sun Jan 18 23:59:56 HKT 2015
TZ=:/usr/share/zoneinfo/localtime date
Mon Jan 19 05:00:03 NZDT 2015
TZ=: date
Sun Jan 18 16:00:11 UTC 2015
TZ=":" date
Sun Jan 18 16:00:18 UTC 2015
TZ=':' date
Sun Jan 18 16:00:24 UTC 2015
TZ=:/ date
Sun Jan 18 16:00:34 2015
TZ=":/" date
Sun Jan 18 16:00:40 2015
TZ="" date
Sun Jan 18 16:00:45 UTC 2015
Signed-off-by: J William Piggott <elseifthen@gmx.com>
Signed-off-by: Michael Kerrisk <mtk.manpages@gmail.com>