From c3f3da695878ab03afe0b821b36db8414c52b47b Mon Sep 17 00:00:00 2001 From: Ron Williams Date: Sat, 6 May 2023 02:55:36 -0700 Subject: [PATCH 1/2] fix tzset cbindgen declarations --- src/header/time/mod.rs | 8 ++++---- tests/Makefile | 1 + tests/expected/bins_static/time/tzset.stderr | 0 tests/expected/bins_static/time/tzset.stdout | 1 + tests/time/tzset.c | 16 ++++++++++++++++ 5 files changed, 22 insertions(+), 4 deletions(-) create mode 100644 tests/expected/bins_static/time/tzset.stderr create mode 100644 tests/expected/bins_static/time/tzset.stdout create mode 100644 tests/time/tzset.c diff --git a/src/header/time/mod.rs b/src/header/time/mod.rs index ff0c2a2283..2c5a611097 100644 --- a/src/header/time/mod.rs +++ b/src/header/time/mod.rs @@ -66,7 +66,7 @@ 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], } @@ -75,13 +75,13 @@ unsafe impl Sync for TzName {} #[allow(non_upper_case_globals)] #[no_mangle] -pub static tzname: TzName = TzName { tz: [UTC, UTC] }; +pub static mut tzname: TzName = TzName { tz: [UTC, UTC] }; #[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 { 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..f48c9e050b --- /dev/null +++ b/tests/time/tzset.c @@ -0,0 +1,16 @@ +#include +#include +#include +#include + +extern int daylight; +extern long timezone; +extern const 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; +} From 95e9162d2296f12e0572cdfe53f9c7b1fef5929b Mon Sep 17 00:00:00 2001 From: Ron Williams Date: Sat, 6 May 2023 13:20:30 -0700 Subject: [PATCH 2/2] change tzname to be mut --- src/header/time/mod.rs | 14 +++++++++++--- tests/time/tzset.c | 2 +- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/src/header/time/mod.rs b/src/header/time/mod.rs index 2c5a611097..cebe2ac512 100644 --- a/src/header/time/mod.rs +++ b/src/header/time/mod.rs @@ -68,14 +68,22 @@ static mut ASCTIME: [c_char; 26] = [0; 26]; // TODO: timezones #[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 mut 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 mut daylight: c_int = 0; @@ -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/time/tzset.c b/tests/time/tzset.c index f48c9e050b..87fa15f719 100644 --- a/tests/time/tzset.c +++ b/tests/time/tzset.c @@ -5,7 +5,7 @@ extern int daylight; extern long timezone; -extern const char *tzname[2]; +extern char *tzname[2]; void tzset(void); int main(void) {