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; 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; clock_t c_start = 0, c_end;
int opt = 0; int opt = 0;
@ -185,9 +185,10 @@ memory_err:
struct tm ts; struct tm ts;
char buffer[30]; char buffer[30];
r_time = t_current.tv_sec; r_time = t_current.tv_sec;
ts = *localtime(&r_time); ts = *gmtime(&r_time);
strftime(buffer, 30, "%c", &ts); 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->error);
free(wps); free(wps);
return ARG_ERROR; return ARG_ERROR;
@ -290,12 +291,10 @@ usage_err:
} }
/* Cannot specify --start or --end if --force is selected */ /* Cannot specify --start or --end if --force is selected */
if (wps->bruteforce && (start_p || end_p)) { if (wps->bruteforce && ((start_p != (time_t) -1) || (end_p != (time_t) -1))) {
if (start_p || end_p) {
snprintf(wps->error, 256, "\n [!] Cannot specify --start or --end if --force is selected!\n\n"); snprintf(wps->error, 256, "\n [!] Cannot specify --start or --end if --force is selected!\n\n");
goto usage_err; goto usage_err;
} }
}
if (wps->mode_auto) { /* Mode auto */ if (wps->mode_auto) { /* Mode auto */
if (wps->pke && !memcmp(wps->pke, wps_rtl_pke, WPS_PKEY_LEN)) { if (wps->pke && !memcmp(wps->pke, wps_rtl_pke, WPS_PKEY_LEN)) {
@ -337,8 +336,8 @@ usage_err:
wps->end = t_now.tv_sec - MODE3_DAYS * SEC_PER_DAY; wps->end = t_now.tv_sec - MODE3_DAYS * SEC_PER_DAY;
/* Attributes --start and --end can be switched start > end or end > start */ /* Attributes --start and --end can be switched start > end or end > start */
if (start_p) { if (start_p != (time_t) -1) {
if (end_p) { if (end_p != (time_t) -1) {
/* Attributes --start and --end must be different */ /* Attributes --start and --end must be different */
if (start_p == end_p) { if (start_p == end_p) {
@ -361,7 +360,7 @@ usage_err:
} }
} }
} else { } else {
if (end_p) { if (end_p != (time_t) -1) {
if (end_p >= wps->start) { if (end_p >= wps->start) {
snprintf(wps->error, 256, "\n [!] Bad Ending point!\n\n"); snprintf(wps->error, 256, "\n [!] Bad Ending point!\n\n");
goto usage_err; goto usage_err;
@ -589,14 +588,14 @@ usage_err:
{ {
struct tm ts; struct tm ts;
char buffer[30]; char buffer[30];
ts = *localtime(&wps->start); ts = *gmtime(&wps->start);
strftime(buffer, 30, "%c", &ts); strftime(buffer, 30, "%c", &ts);
printf("\n [DEBUG] %s:%d:%s(): Start: %10ld (%s)", printf("\n [DEBUG] %s:%d:%s(): Start: %10lu (%s UTC)",
__FILE__, __LINE__, __func__, (long) wps->start, buffer); __FILE__, __LINE__, __func__, (unsigned long) wps->start, buffer);
ts = *localtime(&wps->end); ts = *gmtime(&wps->end);
strftime(buffer, 30, "%c", &ts); strftime(buffer, 30, "%c", &ts);
printf("\n [DEBUG] %s:%d:%s(): End: %10ld (%s)", printf("\n [DEBUG] %s:%d:%s(): End: %10lu (%s UTC)",
__FILE__, __LINE__, __func__, (long) wps->end, buffer); __FILE__, __LINE__, __func__, (unsigned long) wps->end, buffer);
fflush(stdout); fflush(stdout);
} }
#endif #endif
@ -812,9 +811,9 @@ usage_err:
char buffer[30]; char buffer[30];
seed_time = print_seed; seed_time = print_seed;
ts = *localtime(&seed_time); ts = *gmtime(&seed_time);
strftime(buffer, 30, "%c", &ts); 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; 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 */ /* Converts a [mm/]yyyy string to Unix date time */
unsigned int get_unix_datetime(char *s, time_t *datetime) { unsigned int get_unix_datetime(char *s, time_t *datetime) {
unsigned int len = strlen(s); unsigned int len = strlen(s);
int month = 0, year; int month = 0, year;
struct tm tm; struct tm t;
if (len == 4) { if (len == 4) {
if (get_int(s, &year)) 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)) if (get_int(s_month, &month) || get_int(s_year, &year))
return 1; return 1;
if ((year < 1970 && year > 2037) || (month < 1 && month > 12))
return 1;
} else { } else {
return 1; return 1;
} }
tm.tm_sec = 0; t.tm_sec = 0;
tm.tm_min = 0; t.tm_min = 0;
tm.tm_hour = 0; t.tm_hour = 0;
tm.tm_mday = 1; t.tm_mday = 1;
tm.tm_mon = month - 1; t.tm_mon = month - 1;
tm.tm_year = year - 1900; t.tm_year = year - 1900;
tm.tm_isdst = -1; t.tm_isdst = 0;
*datetime = mktime(&tm); *datetime = c_timegm(&t);
if (*datetime < 0) if (*datetime < 0)
return 1; return 1;