time: Try to figure out some sensible timezone names from the TZ offset, and collect that from ip-api
This commit is contained in:
parent
9d21d48ecf
commit
6510dd73bd
34
apps/find-timezone.c
Normal file
34
apps/find-timezone.c
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <math.h>
|
||||||
|
#include <time.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <sys/time.h>
|
||||||
|
#include <toaru/json.h>
|
||||||
|
#include <toaru/hashmap.h>
|
||||||
|
#include <toaru/list.h>
|
||||||
|
|
||||||
|
typedef struct JSON_Value Value;
|
||||||
|
|
||||||
|
#define LOCATION_DATA_PATH "/tmp/location-data.json"
|
||||||
|
|
||||||
|
int main(int argc, char * argv[]) {
|
||||||
|
/* See if the location data already exists... */
|
||||||
|
char cmdline[1024];
|
||||||
|
Value * locationData = json_parse_file(LOCATION_DATA_PATH);
|
||||||
|
if (!locationData) {
|
||||||
|
sprintf(cmdline, "fetch -o \"" LOCATION_DATA_PATH "\" \"http://ip-api.com/json/?fields=lat,lon,city,offset\"");
|
||||||
|
system(cmdline);
|
||||||
|
locationData = json_parse_file(LOCATION_DATA_PATH);
|
||||||
|
}
|
||||||
|
/* If we still failed to load it, then bail. */
|
||||||
|
if (!locationData) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
double offset = JSON_KEY(locationData, "offset")->number;
|
||||||
|
|
||||||
|
printf("%d\n", (int)offset);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
@ -33,7 +33,7 @@ int main(int argc, char * argv[]) {
|
|||||||
/* See if the location data already exists... */
|
/* See if the location data already exists... */
|
||||||
Value * locationData = json_parse_file(LOCATION_DATA_PATH);
|
Value * locationData = json_parse_file(LOCATION_DATA_PATH);
|
||||||
if (!locationData) {
|
if (!locationData) {
|
||||||
sprintf(cmdline, "fetch -o \"" LOCATION_DATA_PATH "\" \"http://ip-api.com/json/?fields=lat,lon,city\"");
|
sprintf(cmdline, "fetch -o \"" LOCATION_DATA_PATH "\" \"http://ip-api.com/json/?fields=lat,lon,city,offset\"");
|
||||||
system(cmdline);
|
system(cmdline);
|
||||||
locationData = json_parse_file(LOCATION_DATA_PATH);
|
locationData = json_parse_file(LOCATION_DATA_PATH);
|
||||||
}
|
}
|
||||||
|
@ -6,9 +6,7 @@ export-cmd START kcmdline -g start
|
|||||||
export USER=root
|
export USER=root
|
||||||
export HOME=/home/root
|
export HOME=/home/root
|
||||||
|
|
||||||
export TZ=JST
|
export-cmd TZ_OFFSET find-timezone
|
||||||
export TZ_OFFSET=32400
|
|
||||||
|
|
||||||
export-cmd GETTY_ARGS qemu-fwcfg opt/org.toaruos.gettyargs
|
export-cmd GETTY_ARGS qemu-fwcfg opt/org.toaruos.gettyargs
|
||||||
|
|
||||||
echo -n "Launching startup application..." > /dev/pex/splash
|
echo -n "Launching startup application..." > /dev/pex/splash
|
||||||
|
@ -122,12 +122,6 @@ static struct tm * fill_time(const time_t * timep, struct tm * _timevalue, const
|
|||||||
#define HOURS 3600
|
#define HOURS 3600
|
||||||
#define MINUTES 60
|
#define MINUTES 60
|
||||||
|
|
||||||
static char * get_timezone(void) {
|
|
||||||
char * tzEnv = getenv("TZ");
|
|
||||||
if (!tzEnv || strlen(tzEnv) != 3) return "UTC";
|
|
||||||
return tzEnv;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int get_timezone_offset(void) {
|
static int get_timezone_offset(void) {
|
||||||
char * tzOff = getenv("TZ_OFFSET");
|
char * tzOff = getenv("TZ_OFFSET");
|
||||||
if (!tzOff) return 0;
|
if (!tzOff) return 0;
|
||||||
@ -137,6 +131,47 @@ static int get_timezone_offset(void) {
|
|||||||
return out;
|
return out;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct timezone_offset_db {
|
||||||
|
int offset;
|
||||||
|
const char * abbrev;
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct timezone_offset_db common_offsets[] = {
|
||||||
|
{0, "UTC"},
|
||||||
|
{1 * HOURS, "CEST"}, /* Central Europe Standard Time */
|
||||||
|
{8 * HOURS, "SST"}, /* Singapore Standard Time */
|
||||||
|
{9 * HOURS, "JST"}, /* Japan Standard Time */
|
||||||
|
{-5 * HOURS, "EST"}, /* US Eastern Standard */
|
||||||
|
{-6 * HOURS, "CST"}, /* US Central Standard */
|
||||||
|
{-7 * HOURS, "MST"}, /* US Mountain Standard */
|
||||||
|
{-8 * HOURS, "PST"}, /* US Pacific Standard */
|
||||||
|
{0, NULL},
|
||||||
|
};
|
||||||
|
|
||||||
|
static char * get_timezone(void) {
|
||||||
|
static char buf[20];
|
||||||
|
char * tzEnv = getenv("TZ");
|
||||||
|
if (!tzEnv) {
|
||||||
|
/* Is there an offset? */
|
||||||
|
int offset = get_timezone_offset();
|
||||||
|
for (struct timezone_offset_db * db = common_offsets; db->abbrev; db++) {
|
||||||
|
if (offset == db->offset) return (char*)db->abbrev;
|
||||||
|
}
|
||||||
|
/* Is it some number of hours? */
|
||||||
|
if (offset % HOURS == 0) {
|
||||||
|
if (offset > 0) {
|
||||||
|
snprintf(buf, 20, "UTC+%d", offset / HOURS);
|
||||||
|
} else {
|
||||||
|
snprintf(buf, 20, "UTC-%d", -offset / HOURS);
|
||||||
|
}
|
||||||
|
return buf;
|
||||||
|
}
|
||||||
|
return "???";
|
||||||
|
}
|
||||||
|
return tzEnv;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
struct tm *localtime_r(const time_t *timep, struct tm * _timevalue) {
|
struct tm *localtime_r(const time_t *timep, struct tm * _timevalue) {
|
||||||
return fill_time(timep, _timevalue, get_timezone(), get_timezone_offset());
|
return fill_time(timep, _timevalue, get_timezone(), get_timezone_offset());
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user