xref: /haiku/src/servers/launch/InitRealTimeClockJob.cpp (revision e81a954787e50e56a7f06f72705b7859b6ab06d1)
1 /*
2  * Copyright 2015, Axel Dörfler, axeld@pinc-software.de.
3  * Copyright 2004, Jérôme Duval, jerome.duval@free.fr.
4  * Copyright 2010, 2012, Oliver Tappe <zooey@hirschkaefer.de>
5  * Distributed under the terms of the MIT License.
6  */
7 
8 
9 //! Initialize real time clock, and time zone offset
10 
11 
12 #include "InitRealTimeClockJob.h"
13 
14 #include <stdio.h>
15 
16 #include <File.h>
17 #include <FindDirectory.h>
18 #include <Message.h>
19 #include <TimeZone.h>
20 
21 #include <syscalls.h>
22 
23 
24 using BSupportKit::BJob;
25 
26 
27 InitRealTimeClockJob::InitRealTimeClockJob()
28 	:
29 	BJob("init real time clock")
30 {
31 }
32 
33 
34 status_t
35 InitRealTimeClockJob::Execute()
36 {
37 	BPath path;
38 	status_t status = find_directory(B_USER_SETTINGS_DIRECTORY, &path);
39 	if (status == B_OK) {
40 		_SetRealTimeClockIsGMT(path);
41 		_SetTimeZoneOffset(path);
42 	}
43 	return status;
44 }
45 
46 
47 void
48 InitRealTimeClockJob::_SetRealTimeClockIsGMT(BPath path) const
49 {
50 	path.Append("RTC_time_settings");
51 	BFile file;
52 	status_t status = file.SetTo(path.Path(), B_READ_ONLY);
53 	if (status != B_OK) {
54 		fprintf(stderr, "Can't open RTC settings file\n");
55 		return;
56 	}
57 
58 	char buffer[10];
59 	ssize_t bytesRead = file.Read(buffer, sizeof(buffer));
60 	if (bytesRead < 0) {
61 		fprintf(stderr, "Unable to read RTC settings file\n");
62 		return;
63 	}
64 	bool isGMT = strncmp(buffer, "local", 5) != 0;
65 
66 	_kern_set_real_time_clock_is_gmt(isGMT);
67 	printf("RTC stores %s time.\n", isGMT ? "GMT" : "local" );
68 }
69 
70 
71 void
72 InitRealTimeClockJob::_SetTimeZoneOffset(BPath path) const
73 {
74 	path.Append("Time settings");
75 	BFile file;
76 	status_t status = file.SetTo(path.Path(), B_READ_ONLY);
77 	if (status != B_OK) {
78 		fprintf(stderr, "Can't open Time settings file\n");
79 		return;
80 	}
81 
82 	BMessage settings;
83 	status = settings.Unflatten(&file);
84 	if (status != B_OK) {
85 		fprintf(stderr, "Unable to parse Time settings file\n");
86 		return;
87 	}
88 	BString timeZoneID;
89 	if (settings.FindString("timezone", &timeZoneID) != B_OK) {
90 		fprintf(stderr, "No timezone found\n");
91 		return;
92 	}
93 	int32 timeZoneOffset = BTimeZone(timeZoneID.String()).OffsetFromGMT();
94 
95 	_kern_set_timezone(timeZoneOffset, timeZoneID.String(),
96 		timeZoneID.Length());
97 	printf("timezone is %s, offset is %" B_PRId32 " seconds from GMT.\n",
98 		timeZoneID.String(), timeZoneOffset);
99 }
100