From 10505e3ce5097fe3677c9ad1ab3f859e3a2c5869 Mon Sep 17 00:00:00 2001 From: Pavel Timofeev Date: Thu, 10 Oct 2024 14:21:33 -0600 Subject: [PATCH] system-timezone: keep looking for timezone name if it's not in region/city format `plugins/datetime/system-timezone.c` finds timezone name out based on system timezone config - `/etc/localtime` file. Upstream python code in `cinnamon-setting calendar` expects timezone name in `Region/City` format. `/etc/localtime` file itself doesn't container this data. To figure the name out `plugins/datetime/system-timezone.c` code is searching in `SYSTEM_ZONEINFODIR` (/usr/share/zoneinfo) directory. The timezone name is determined based on filename path with `SYSTEM_ZONEINFODIR` prefix cut. there are multiple instances of the same timezone file under different names and subfolders in the `SYSTEM_ZONEINFODIR` folder. I. e a timezone may have several names, i. e. files in that `SYSTEM_ZONEINFODIR` folder. For example, `/usr/share/zoneinfo/Navajo` and `/usr/share/zoneinfo/America/Denver` are the same timezones. In some operating systems `/etc/localtime` is a symlink to `/usr/share/zoneinfo/Navajo` which is the symlink to `/usr/share/zoneinfo/America/Denver`. In other operating systems those may be hardlinks. In third operating system those files might be just simple copies of each other. Of course there might be a combination of all those scenarios. The code in `plugins/datetime/system-timezone.c` does its best to determine timezone name by following links, comparing files content, etc. It covers those different scenarios with sym-, hard- links, copied, etc described above. This patch is for the case when all timezone files are copies. Currently `recursive_compare()` in `plugins/datetime/system-timezone.c` gives up when it finds first copy of `/etc/localtime` under `SYSTEM_ZONEINFODIR` folder. Which is unfortunately `/usr/share/zoneinfo/Navajo` in my example, not `/usr/share/zoneinfo/America/Denver`. So upstream python code in `cinnamon-setting calendar` gets timezone name as `Navajo`, while it expects rather `America/Denver`. Fix it by checking if timezone name has a slash "/" in its name. If it doesn't then keep running `recursive_compare()` against `SYSTEM_ZONEINFODIR` (/usr/share/zoneinfo) directory to find a better name. --- plugins/datetime/system-timezone.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/plugins/datetime/system-timezone.c b/plugins/datetime/system-timezone.c index bb555fca..61919e03 100644 --- a/plugins/datetime/system-timezone.c +++ b/plugins/datetime/system-timezone.c @@ -547,11 +547,19 @@ recursive_compare (struct stat *localtime_stat, CompareFiles compare_func) { struct stat file_stat; + char *relpath = NULL; if (g_stat (file, &file_stat) != 0) return NULL; if (S_ISREG (file_stat.st_mode)) { + relpath = system_timezone_strip_path_if_valid (file); + if (g_strstr_len (relpath, -1, "/") == NULL) { + g_free (relpath); + return NULL; + } + g_free (relpath); + if (compare_func (localtime_stat, &file_stat, localtime_content,