removed clang-format and clang_complete files from the repo
[dosdemo] / src / dos / logger.c
1 #include <stdio.h>
2 #include <string.h>
3 #include <errno.h>
4 #include <unistd.h>
5 #include <fcntl.h>
6 #include "logger.h"
7
8 static int logfd = -1, orig_fd1 = -1;
9
10 int init_logger(const char *fname)
11 {
12         if(logfd != -1) return -1;
13
14         if((logfd = open(fname, O_CREAT | O_WRONLY | O_TRUNC, 0644)) == -1) {
15                 fprintf(stderr, "init_logger: failed to open %s: %s\n", fname, strerror(errno));
16                 return -1;
17         }
18
19         orig_fd1 = dup(1);
20         close(1);
21         close(2);
22         dup(logfd);
23         dup(logfd);
24         return 0;
25 }
26
27 void stop_logger(void)
28 {
29         if(logfd >= 0) {
30                 close(logfd);
31                 logfd = -1;
32         }
33         if(orig_fd1 >= 0) {
34                 close(1);
35                 close(2);
36                 dup(orig_fd1);
37                 dup(orig_fd1);
38                 orig_fd1 = -1;
39         }
40 }
41
42 int print_tail(const char *fname)
43 {
44         FILE *fp;
45         char buf[64];
46         long lineoffs[16];
47         int wr, rd, c;
48
49         if(!(fp = fopen(fname, "r"))) {
50                 return -1;
51         }
52         wr = rd = 0;
53         lineoffs[wr++] = 0;
54         while(fgets(buf, sizeof buf, fp)) {
55                 lineoffs[wr] = ftell(fp);
56                 wr = (wr + 1) & 0xf;
57                 if(wr == rd) {
58                         rd = (rd + 1) & 0xf;
59                 }
60         }
61
62         fseek(fp, lineoffs[rd], SEEK_SET);
63         while((c = fgetc(fp)) != -1) {
64                 fputc(c, stdout);
65         }
66         fclose(fp);
67         return 0;
68 }