tzname doesn't always get set.  Assuming it's meant to be
POSIX-compliant (not necessarily XSI/SUS here, but POSIX) then the
following behavior is buggy:
Doing the following:

export TZ=CAT0
cat > daytime.c <<EOF
#include <stdio.h>
#include <time.h>

int main(void)
{
        tzset();
        printf("tzname[0]: %s\n", tzname[0]);
        printf("tzname[1]: %s\n", tzname[1]);
        /*
        printf("daylight: %d\n", daylight);
        printf("timezone: %ld\n", timezone);
        */
}
EOF
cc daytime.c
./a.out

The following is the output:

tzname[0]:
tzname[1]:

nota bene: both of those aren't null/empty, they're three spaces.
This is incorrect, as CAT0 is a valid value of TZ.  If we set it to
CAT0DOG0 instead, the output changes dramatically:

tzname[0]: CAT
tzname[1]: DOG

This is the expected output for when TZ is CAT0DOG0.
Back to TZ just being CAT0, a friend using GNU/Linux was able to show
me the output there:

tzname[0]: CAT
tzname[1]: CAT

If I read POSIX correctly, GNU's implementation and output are correct
here.  This is the output I expect.

I found FreeBSD's output was also buggy, in a different way:

tzname[0]: EST
tzname[1]:

I'll be sending them a bug report too.

References:
https://man.openbsd.org/ctime.3
https://pubs.opengroup.org/onlinepubs/9699919799/functions/tzset.html

Reply via email to