#define _POSIX_C_SOURCE 2 #include #include #include #include static void die(const char *message) { fputs(message, stderr); fputc('\n', stderr); exit(1); } static void die_err(const char *message) { perror(message); exit(1); } static void remove_logfile() { if (remove("tl.log") != 0) { if (errno != ENOENT) { die_err("Error removing log file"); } } } static void write_to_tl_append(const char *content) { FILE *p = popen("./tl-append", "w"); if (p == NULL) die_err("Couldn't run tl-append"); if (fputs(content, p) == EOF) die("Couldn't write to pipe"); int status = pclose(p); if (status < 0) die_err("Error closing pipe"); if (status != 0) die("tl-append exited abnormally"); } static void verify_log_contents(const char *contents) { char buf[10]; FILE *f = fopen("tl.log", "r"); if (f == NULL) die_err("Error opening log file"); buf[fread(buf, 1, sizeof(buf), f)] = '\0'; if (ferror(f)) die("Error reading log file"); if (strncmp(contents, buf, sizeof(buf)) != 0) die("Wrong contents in log file"); if (fclose(f) != 0) die_err("Error closing log file"); } static void write_and_read_line() { remove_logfile(); write_to_tl_append("foo\n"); verify_log_contents("foo\n"); } static void write_and_read_two_lines() { remove_logfile(); write_to_tl_append("foo\n"); write_to_tl_append("bar\n"); verify_log_contents("foo\nbar\n"); } int main() { write_and_read_line(); write_and_read_two_lines(); }