#include <assert.h>
#include <ctype.h>
#include <errno.h>
+#include <limits.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "common.h"
+const size_t TIMESTAMP_LEN = 19;
+
typedef struct expectation {
time_t a, b;
const char *message;
return expectation(start, end, content);
}
+static void verify_timestamp(const ex_t *ex, const char *line) {
+ struct tm tm;
+
+ /* localtime_r to set tm's timezone */
+ time_t now_time = time(NULL);
+ if (localtime_r(&now_time, &tm) == NULL)
+ die_err("Can't unpack current time?");
+
+ const char *strptime_result = strptime(line, "%Y %m %d %H %M %S", &tm);
+ if (strptime_result == NULL || strptime_result != &line[TIMESTAMP_LEN])
+ die("Wrong contents in log file: Couldn't parse timestamp");
+ time_t t = mktime(&tm);
+ int t_in_range = ex->a <= t && t <= ex->b;
+ if (!t_in_range)
+ die("Wrong contents in log file: Wrong time");
+}
+
static void verify_line(const ex_t *ex, const char *line) {
- if (strncmp(ex->message, line, strlen(ex->message) + 1) != 0)
+ size_t line_len = strlen(line);
+ if (line_len < TIMESTAMP_LEN + 1)
+ die("Wrong contents in log file: Line too short");
+ verify_timestamp(ex, line);
+ if (line[TIMESTAMP_LEN] != ' ')
+ die("Wrong contents in log file: Bad format");
+ if (strncmp(ex->message, &line[TIMESTAMP_LEN + 1], strlen(ex->message) + 1) !=
+ 0)
die("Wrong contents in log file");
}
if (f == NULL)
die_err("Error opening log file");
for (size_t i = 0; !is_end(exps[i]); i++) {
- size_t len = strlen(exps[i].message);
+ size_t len = TIMESTAMP_LEN + 1 + strlen(exps[i].message);
+ if (len > INT_MAX - 1)
+ die("message too long");
char *buf = (char *)malloc(len + 2);
if (fgets(buf, len + 1, f) == NULL)
die("Error reading log file");