Fixed time conversion issue due to different timezones and DST

Now UTC is used.
This commit is contained in:
wiire 2016-01-04 10:05:16 +01:00
parent b6ef342b71
commit 00e4b59bfb
2 changed files with 61 additions and 28 deletions

View File

@ -79,7 +79,7 @@ memory_err:
return MEM_ERROR;
}
time_t start_p = 0, end_p = 0;
time_t start_p = (time_t) -1, end_p = (time_t) -1;
clock_t c_start = 0, c_end;
int opt = 0;
@ -185,9 +185,10 @@ memory_err:
struct tm ts;
char buffer[30];
r_time = t_current.tv_sec;
ts = *localtime(&r_time);
ts = *gmtime(&r_time);
strftime(buffer, 30, "%c", &ts);
fprintf(stderr, "\n Pixiewps %s\n\n [*] System time: %s\n\n", LONG_VERSION, buffer);
fprintf(stderr, "\n Pixiewps %s\n\n [*] System time: %lu (%s UTC)\n\n",
LONG_VERSION, (unsigned long) t_current.tv_sec, buffer);
free(wps->error);
free(wps);
return ARG_ERROR;
@ -290,11 +291,9 @@ usage_err:
}
/* Cannot specify --start or --end if --force is selected */
if (wps->bruteforce && (start_p || end_p)) {
if (start_p || end_p) {
snprintf(wps->error, 256, "\n [!] Cannot specify --start or --end if --force is selected!\n\n");
goto usage_err;
}
if (wps->bruteforce && ((start_p != (time_t) -1) || (end_p != (time_t) -1))) {
snprintf(wps->error, 256, "\n [!] Cannot specify --start or --end if --force is selected!\n\n");
goto usage_err;
}
if (wps->mode_auto) { /* Mode auto */
@ -337,8 +336,8 @@ usage_err:
wps->end = t_now.tv_sec - MODE3_DAYS * SEC_PER_DAY;
/* Attributes --start and --end can be switched start > end or end > start */
if (start_p) {
if (end_p) {
if (start_p != (time_t) -1) {
if (end_p != (time_t) -1) {
/* Attributes --start and --end must be different */
if (start_p == end_p) {
@ -361,7 +360,7 @@ usage_err:
}
}
} else {
if (end_p) {
if (end_p != (time_t) -1) {
if (end_p >= wps->start) {
snprintf(wps->error, 256, "\n [!] Bad Ending point!\n\n");
goto usage_err;
@ -589,14 +588,14 @@ usage_err:
{
struct tm ts;
char buffer[30];
ts = *localtime(&wps->start);
ts = *gmtime(&wps->start);
strftime(buffer, 30, "%c", &ts);
printf("\n [DEBUG] %s:%d:%s(): Start: %10ld (%s)",
__FILE__, __LINE__, __func__, (long) wps->start, buffer);
ts = *localtime(&wps->end);
printf("\n [DEBUG] %s:%d:%s(): Start: %10lu (%s UTC)",
__FILE__, __LINE__, __func__, (unsigned long) wps->start, buffer);
ts = *gmtime(&wps->end);
strftime(buffer, 30, "%c", &ts);
printf("\n [DEBUG] %s:%d:%s(): End: %10ld (%s)",
__FILE__, __LINE__, __func__, (long) wps->end, buffer);
printf("\n [DEBUG] %s:%d:%s(): End: %10lu (%s UTC)",
__FILE__, __LINE__, __func__, (unsigned long) wps->end, buffer);
fflush(stdout);
}
#endif
@ -812,9 +811,9 @@ usage_err:
char buffer[30];
seed_time = print_seed;
ts = *localtime(&seed_time);
ts = *gmtime(&seed_time);
strftime(buffer, 30, "%c", &ts);
printf(" (%s)", buffer);
printf(" (%s UTC)", buffer);
}
}
}

View File

@ -74,11 +74,43 @@ int get_int(char *in, int *out) {
return 0;
};
/* Custom timegm function made by Eric S Raymond */
time_t c_timegm(register struct tm *t) {
register long year;
register time_t result;
#define MONTHS_PER_YEAR 12 /* Months per calendar year */
static const int cumdays[MONTHS_PER_YEAR] =
{ 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334 };
year = 1900 + t->tm_year + t->tm_mon / MONTHS_PER_YEAR;
result = (year - 1970) * 365 + cumdays[t->tm_mon % MONTHS_PER_YEAR];
result += (year - 1968) / 4;
result -= (year - 1900) / 100;
result += (year - 1600) / 400;
if ((year % 4) == 0 && ((year % 100) != 0 || (year % 400) == 0) &&
(t->tm_mon % MONTHS_PER_YEAR) < 2) {
result--;
}
result += t->tm_mday - 1;
result *= 24;
result += t->tm_hour;
result *= 60;
result += t->tm_min;
result *= 60;
result += t->tm_sec;
if (t->tm_isdst == 1)
result -= 3600;
return result;
}
/* Converts a [mm/]yyyy string to Unix date time */
unsigned int get_unix_datetime(char *s, time_t *datetime) {
unsigned int len = strlen(s);
int month = 0, year;
struct tm tm;
struct tm t;
if (len == 4) {
if (get_int(s, &year))
@ -106,18 +138,20 @@ unsigned int get_unix_datetime(char *s, time_t *datetime) {
if (get_int(s_month, &month) || get_int(s_year, &year))
return 1;
if ((year < 1970 && year > 2037) || (month < 1 && month > 12))
return 1;
} else {
return 1;
}
tm.tm_sec = 0;
tm.tm_min = 0;
tm.tm_hour = 0;
tm.tm_mday = 1;
tm.tm_mon = month - 1;
tm.tm_year = year - 1900;
tm.tm_isdst = -1;
*datetime = mktime(&tm);
t.tm_sec = 0;
t.tm_min = 0;
t.tm_hour = 0;
t.tm_mday = 1;
t.tm_mon = month - 1;
t.tm_year = year - 1900;
t.tm_isdst = 0;
*datetime = c_timegm(&t);
if (*datetime < 0)
return 1;