diff --git a/src/header/time/mod.rs b/src/header/time/mod.rs index ff0c2a2283..cebe2ac512 100644 --- a/src/header/time/mod.rs +++ b/src/header/time/mod.rs @@ -66,22 +66,30 @@ static mut ASCTIME: [c_char; 26] = [0; 26]; // We don't handle timezones, so just initialize the timezone info to GMT // TODO: timezones -#[repr(C)] +#[repr(transparent)] pub struct TzName { - tz: [*const c_char; 2], + tz: [*mut c_char; 2], } unsafe impl Sync for TzName {} +static mut TZ_STD: [c_char; 8] = [b'U' as c_char, b'T' as c_char, b'C' as c_char, 0, 0, 0, 0, 0]; +static mut TZ_DST: [c_char; 8] = [b'U' as c_char, b'T' as c_char, b'C' as c_char, 0, 0, 0, 0, 0]; + #[allow(non_upper_case_globals)] #[no_mangle] -pub static tzname: TzName = TzName { tz: [UTC, UTC] }; +pub static mut tzname: TzName = TzName { + tz: [ + unsafe { TZ_DST.as_mut_ptr() }, + unsafe { TZ_DST.as_mut_ptr() }, + ] }; + #[allow(non_upper_case_globals)] #[no_mangle] -pub static daylight: c_int = 0; +pub static mut daylight: c_int = 0; #[allow(non_upper_case_globals)] #[no_mangle] -pub static timezone: c_long = 0; +pub static mut timezone: c_long = 0; #[repr(C)] pub struct itimerspec { @@ -487,7 +495,7 @@ pub extern "C" fn timer_delete(timerid: timer_t) -> c_int { #[no_mangle] pub extern "C" fn tzset() { - // no-op because we only do GMT + // no-op because we only do UTC // TODO: timezones, parse env var TZ } diff --git a/tests/Makefile b/tests/Makefile index 4c08211820..d28dc313b9 100644 --- a/tests/Makefile +++ b/tests/Makefile @@ -84,6 +84,7 @@ EXPECT_NAMES=\ time/mktime \ time/strftime \ time/time \ + time/tzset \ tls \ unistd/access \ unistd/brk \ diff --git a/tests/expected/bins_static/time/tzset.stderr b/tests/expected/bins_static/time/tzset.stderr new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tests/expected/bins_static/time/tzset.stdout b/tests/expected/bins_static/time/tzset.stdout new file mode 100644 index 0000000000..9962d8acc0 --- /dev/null +++ b/tests/expected/bins_static/time/tzset.stdout @@ -0,0 +1 @@ +tzname[0] UTC, tzname[1] UTC, daylight 0, timezone 0 diff --git a/tests/time/tzset.c b/tests/time/tzset.c new file mode 100644 index 0000000000..87fa15f719 --- /dev/null +++ b/tests/time/tzset.c @@ -0,0 +1,16 @@ +#include +#include +#include +#include + +extern int daylight; +extern long timezone; +extern char *tzname[2]; +void tzset(void); + +int main(void) { + tzset(); + printf("tzname[0] %s, tzname[1] %s, daylight %d, timezone %ld\n", + tzname[0], tzname[1], daylight, timezone); + return 0; +}