#include #include #include #include #include #include #include #include #include #include "common.h" #include "key_tracker.h" #include "report.h" FILE* report_fp; FILE* evdev_fp; void handler(int _) { gen_report(report_fp); fclose(report_fp); fclose(evdev_fp); exit(0); } void wait_thread(pid_t keypress_pid) { time_t start_time = time(NULL); struct tm* start_tm = localtime(&start_time); int start_hour = start_tm->tm_hour; while (1) { time_t now = time(NULL); struct tm* now_tm = localtime(&now); if (now_tm->tm_hour != start_hour) { kill(keypress_pid, SIGQUIT); exit(0); } sleep(1); } } int main(int argc, char* argv[]) { pid_t keypress_pid = getpid(); pid_t wait_pid = fork(); if (wait_pid == 0) wait_thread(keypress_pid); evdev_fp = fopen(KEYBOARD_EVDEV, "r"); report_fp = NULL; char* report_path = NULL; struct input_event pressed_key; int perkey_pressed[PERKEY_LEN + 1]; int keys_pressed = 0; struct timeval start_time; struct timeval press_time; gettimeofday(&start_time, NULL); struct tm* start_tm = localtime(&start_time.tv_sec); asprintf(&report_path, REPORT_PATH, start_tm->tm_year + 1900, start_tm->tm_mon + 1, start_tm->tm_mday, start_tm->tm_hour); report_fp = fopen(report_path, "w"); signal(SIGHUP, handler); signal(SIGQUIT, handler); signal(SIGTERM, handler); do { fread(&pressed_key, sizeof(pressed_key), 1, evdev_fp); if (pressed_key.value == 1) { log_key(pressed_key.code); } } while (1); return 0; }