X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?p=dosdemo;a=blobdiff_plain;f=src%2Fdos%2Flogger.c;fp=src%2Fdos%2Flogger.c;h=2d610704e4a9ed0013878b940e3989f71f03bd55;hp=70489ad8c09da828b78153433422191635411ea6;hb=dfc6ebacd7bcc1e6b9e7168c3e4824d241d2d5c8;hpb=0aeee13aa695ec617ec22253824f17209660bd39 diff --git a/src/dos/logger.c b/src/dos/logger.c index 70489ad..2d61070 100644 --- a/src/dos/logger.c +++ b/src/dos/logger.c @@ -5,17 +5,63 @@ #include #include "logger.h" +static int logfd = -1, orig_fd1 = -1; + int init_logger(const char *fname) { - int fd; - if((fd = open(fname, O_CREAT | O_WRONLY | O_TRUNC, 0644)) == -1) { + if(logfd != -1) return -1; + + if((logfd = open(fname, O_CREAT | O_WRONLY | O_TRUNC, 0644)) == -1) { fprintf(stderr, "init_logger: failed to open %s: %s\n", fname, strerror(errno)); return -1; } + orig_fd1 = dup(1); close(1); close(2); - dup(fd); - dup(fd); + dup(logfd); + dup(logfd); + return 0; +} + +void stop_logger(void) +{ + if(logfd >= 0) { + close(logfd); + logfd = -1; + } + if(orig_fd1 >= 0) { + close(1); + close(2); + dup(orig_fd1); + dup(orig_fd1); + orig_fd1 = -1; + } +} + +int print_tail(const char *fname) +{ + FILE *fp; + char buf[64]; + long lineoffs[16]; + int wr, rd, c; + + if(!(fp = fopen(fname, "r"))) { + return -1; + } + lineoffs[wr++] = 0; + while(fgets(buf, sizeof buf, fp)) { + lineoffs[wr] = ftell(fp); + wr = (wr + 1) & 0xf; + if(wr == rd) { + rd = (rd + 1) & 0xf; + } + } + + fseek(fp, lineoffs[rd], SEEK_SET); + while((c = fgetc(fp)) != -1) { + fputc(c, stdout); + } + fclose(fp); return 0; }