END_TEST START_TEST(test_parse_date_string) { #if !defined(NO_CACHING) time_t now = time(0); struct tm *tm = gmtime(&now); char date[64] = {0}; unsigned long i; ck_assert_uint_eq((unsigned long)parse_date_string("1/Jan/1970 00:01:02"), 62ul); ck_assert_uint_eq((unsigned long)parse_date_string("1 Jan 1970 00:02:03"), 123ul); ck_assert_uint_eq((unsigned long)parse_date_string("1-Jan-1970 00:03:04"), 184ul); ck_assert_uint_eq((unsigned long)parse_date_string( "Xyz, 1 Jan 1970 00:04:05"), 245ul); gmt_time_string(date, sizeof(date), &now); ck_assert_uint_eq((uintmax_t)parse_date_string(date), (uintmax_t)now); sprintf(date, "%02u %s %04u %02u:%02u:%02u", tm->tm_mday, month_names[tm->tm_mon], tm->tm_year + 1900, tm->tm_hour, tm->tm_min, tm->tm_sec); ck_assert_uint_eq((uintmax_t)parse_date_string(date), (uintmax_t)now); gmt_time_string(date, 1, NULL); ck_assert_str_eq(date, ""); gmt_time_string(date, 6, NULL); ck_assert_str_eq(date, "Thu, "); /* part of "Thu, 01 Jan 1970 00:00:00 GMT" */ gmt_time_string(date, sizeof(date), NULL); ck_assert_str_eq(date, "Thu, 01 Jan 1970 00:00:00 GMT"); for (i = 2ul; i < 0x8000000ul; i += i / 2) { now = (time_t)i; gmt_time_string(date, sizeof(date), &now); ck_assert_uint_eq((uintmax_t)parse_date_string(date), (uintmax_t)now); tm = gmtime(&now); sprintf(date, "%02u-%s-%04u %02u:%02u:%02u", tm->tm_mday, month_names[tm->tm_mon], tm->tm_year + 1900, tm->tm_hour, tm->tm_min, tm->tm_sec); ck_assert_uint_eq((uintmax_t)parse_date_string(date), (uintmax_t)now); } #endif }
/* Function which parses command options; returns true if it ate an option */ static int parse(int c, char **argv, int invert, unsigned int *flags, const struct ipt_entry *entry, unsigned int *nfcache, struct ipt_entry_match **match) { struct ipt_time_info *timeinfo = (struct ipt_time_info *)(*match)->data; int hours, minutes; time_t temp_date; switch (c) { /* timestart */ case '1': if (invert) exit_error(PARAMETER_PROBLEM, "unexpected '!' with --timestart"); if (*flags & IPT_TIME_START) exit_error(PARAMETER_PROBLEM, "Can't specify --timestart twice"); parse_time_string(&hours, &minutes, optarg); timeinfo->time_start = (hours * 60) + minutes; *flags |= IPT_TIME_START; break; /* timestop */ case '2': if (invert) exit_error(PARAMETER_PROBLEM, "unexpected '!' with --timestop"); if (*flags & IPT_TIME_STOP) exit_error(PARAMETER_PROBLEM, "Can't specify --timestop twice"); parse_time_string(&hours, &minutes, optarg); timeinfo->time_stop = (hours * 60) + minutes; *flags |= IPT_TIME_STOP; break; /* days */ case '3': if (invert) exit_error(PARAMETER_PROBLEM, "unexpected '!' with --days"); if (*flags & IPT_TIME_DAYS) exit_error(PARAMETER_PROBLEM, "Can't specify --days twice"); parse_days_string(&globaldays, optarg); timeinfo->days_match = globaldays; *flags |= IPT_TIME_DAYS; break; /* datestart */ case '4': if (invert) exit_error(PARAMETER_PROBLEM, "unexpected '!' with --datestart"); if (*flags & IPT_DATE_START) exit_error(PARAMETER_PROBLEM, "Can't specify --datestart twice"); temp_date = parse_date_string(optarg); timeinfo->date_start = temp_date; *flags |= IPT_DATE_START; break; /* datestop*/ case '5': if (invert) exit_error(PARAMETER_PROBLEM, "unexpected '!' with --datestop"); if (*flags & IPT_DATE_STOP) exit_error(PARAMETER_PROBLEM, "Can't specify --datestop twice"); temp_date = parse_date_string(optarg); timeinfo->date_stop = temp_date; *flags |= IPT_DATE_STOP; break; default: return 0; } return 1; }