From acf4b7b83933abf6ff53ee3c4664cbbf7a9adab1 Mon Sep 17 00:00:00 2001
From: Andrew Tridgell <andrew@tridgell.net>
Date: Wed, 22 Apr 2026 12:53:13 +1000
Subject: [PATCH 32/60] call tzset() before chroot to cache timezone data

localtime/localtime_r need /etc/localtime for timezone info.
After chroot this file is inaccessible, causing log timestamps
to fall back to UTC. Calling tzset() before chroot ensures the
timezone data is cached by glibc for subsequent calls.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
---
 clientserver.c | 3 +++
 1 file changed, 3 insertions(+)

Index: rsync-3.2.3/clientserver.c
===================================================================
--- rsync-3.2.3.orig/clientserver.c
+++ rsync-3.2.3/clientserver.c
@@ -908,6 +908,8 @@ static int rsync_module(int f_in, int f_
 		 * a warning, unless a "require chroot" flag is set,
 		 * in which case we fail.
 		 */
+		/* Cache timezone data before chroot makes /etc/localtime inaccessible */
+		tzset();
 		if (chroot(module_chdir)) {
 			rsyserr(FLOG, errno, "chroot %s failed", module_chdir);
 			io_printf(f_out, "@ERROR: chroot failed\n");
@@ -1233,6 +1235,7 @@ int start_daemon(int f_in, int f_out)
 	p = lp_daemon_chroot();
 	if (*p) {
 		log_init(0); /* Make use we've initialized syslog before chrooting. */
+		tzset();
 		if (chroot(p) < 0 || chdir("/") < 0) {
 			rsyserr(FLOG, errno, "daemon chroot %s failed", p);
 			return -1;
