/* Time zone functions such as tzalloc and localtime_rz
- Copyright 2015 Free Software Foundation, Inc.
+ Copyright 2015-2016 Free Software Foundation, Inc.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
used. */
enum { ABBR_SIZE_MIN = DEFAULT_MXFAST - offsetof (struct tm_zone, abbrs) };
-static char const TZ[] = "TZ";
-
/* Magic cookie timezone_t value, for local time. It differs from
NULL and from all other timezone_t values. Only the address
matters; the pointer is never dereferenced. */
}
/* Return a newly allocated time zone for NAME, or NULL on failure.
- As a special case, return a nonzero constant for wall clock time, a
- constant that survives freeing. */
+ A null NAME stands for wall clock time (which is like unset TZ). */
timezone_t
tzalloc (char const *name)
{
tz->tzname_copy[0] = tz->tzname_copy[1] = NULL;
#endif
tz->tz_is_set = !!name;
- extend_abbrs (tz->abbrs, name, name_size);
+ tz->abbrs[0] = '\0';
+ if (name)
+ extend_abbrs (tz->abbrs, name, name_size);
}
return tz;
}
static char *
getenv_TZ (void)
{
- return getenv (TZ);
+ return getenv ("TZ");
}
#endif
static int
setenv_TZ (char const *tz)
{
- return tz ? setenv (TZ, tz, 1) : unsetenv (TZ);
+ return tz ? setenv ("TZ", tz, 1) : unsetenv ("TZ");
}
#endif
timezone_t old_tz = set_tz (tz);
if (old_tz)
{
- tm = localtime_r (t, tm);
- if (tm && !save_abbr (tz, tm))
- tm = NULL;
- if (revert_tz (old_tz))
+ bool abbr_saved = localtime_r (t, tm) && save_abbr (tz, tm);
+ if (revert_tz (old_tz) && abbr_saved)
return tm;
}
return NULL;