fixed issue with timezone and dst handling on openwrt platforms, thx !gm

This commit is contained in:
Steffen Vogel 2013-05-03 18:27:33 +02:00
parent e442504a6f
commit 1363655b59

View file

@ -25,6 +25,8 @@
* along with sun. If not, see <http://www.gnu.org/licenses/>. * along with sun. If not, see <http://www.gnu.org/licenses/>.
*/ */
#define _BSD_SOURCE 1 /* for tm_gmtoff field in struct tm */
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <stdbool.h> #include <stdbool.h>
@ -32,7 +34,8 @@
#include <getopt.h> #include <getopt.h>
#include <float.h> #include <float.h>
#include <math.h> #include <math.h>
#include <sys/time.h> #include <time.h>
#include <limits.h>
#include "../config.h" #include "../config.h"
#include "sun.h" #include "sun.h"
@ -120,7 +123,7 @@ int main(int argc, char *argv[]) {
char *format = "%H:%M"; char *format = "%H:%M";
char *query = NULL; char *query = NULL;
bool error = false; bool error = false;
int timezone = 0; int timezone = INT_MAX; /* magic value for system default with dst */
enum mode mode = INVALID; enum mode mode = INVALID;
struct tm date; struct tm date;
@ -131,12 +134,6 @@ int main(int argc, char *argv[]) {
time(&t); time(&t);
localtime_r(&t, &date); localtime_r(&t, &date);
/* default timezone: system */
struct timezone tz;
if (gettimeofday(NULL, &tz) == 0) {
timezone = -tz.tz_minuteswest / 60.0;
}
/* parse mode */ /* parse mode */
if (argc > 1 && argv[1][0] != '-') { if (argc > 1 && argv[1][0] != '-') {
if (strcmp(argv[1], "rise") == 0) mode = RISE; if (strcmp(argv[1], "rise") == 0) mode = RISE;
@ -179,6 +176,9 @@ int main(int argc, char *argv[]) {
fprintf(stderr, "invalid date: %s\n", optarg); fprintf(stderr, "invalid date: %s\n", optarg);
error = true; error = true;
} }
else {
mktime(&date); /* update date.tm_gmtoff */
}
break; break;
case 'f': case 'f':
@ -217,6 +217,10 @@ int main(int argc, char *argv[]) {
} }
} }
if (timezone == INT_MAX) {
timezone = date.tm_gmtoff / 3600;
}
/* validate mode */ /* validate mode */
if (mode == INVALID) { if (mode == INVALID) {
fprintf(stderr, "invalid mode\n"); fprintf(stderr, "invalid mode\n");
@ -268,6 +272,7 @@ int main(int argc, char *argv[]) {
printf("calculate for: %s\n", date_str); printf("calculate for: %s\n", date_str);
printf("for position: %f, %f\n", pos.lat, pos.lon); printf("for position: %f, %f\n", pos.lat, pos.lon);
printf("with twilight: %f\n", twilight); printf("with twilight: %f\n", twilight);
printf("with timezone: %d\n", timezone);
#endif #endif
/* start the calculation */ /* start the calculation */