1 /* clog - log console */ 2 #include <u.h> 3 #include <libc.h> 4 #include <bio.h> 5 6 char *argv0; 7 8 int 9 openlog(char *name) 10 { 11 int fd; 12 13 fd = open(name, OWRITE); 14 if(fd < 0) 15 fd = create(name, OWRITE, DMAPPEND|0666); 16 if(fd < 0){ 17 fprint(2, "%s: can't open %s: %r\n", argv0, name); 18 return -1; 19 } 20 seek(fd, 0, 2); 21 return fd; 22 } 23 24 void 25 main(int argc, char **argv) 26 { 27 Biobuf in; 28 int fd; 29 char *p, *t; 30 char buf[Bsize]; 31 32 argv0 = argv[0]; 33 if(argc < 3){ 34 fprint(2, "usage: %s console logfile \n", argv0); 35 exits("usage"); 36 } 37 38 fd = open(argv[1], OREAD); 39 if(fd < 0){ 40 fprint(2, "%s: can't open %s: %r\n", argv0, argv[1]); 41 exits("open"); 42 } 43 Binit(&in, fd, OREAD); 44 45 fd = openlog(argv[2]); 46 47 for(;;){ 48 if(p = Brdline(&in, '\n')){ 49 p[Blinelen(&in)-1] = 0; 50 t = ctime(time(0)); 51 t[19] = 0; 52 while(fprint(fd, "%s: %s\n", t, p) < 0) { 53 close(fd); 54 sleep(500); 55 fd = openlog(argv[2]); 56 } 57 } else if(Blinelen(&in) == 0) /* true eof or error */ 58 break; 59 /* discard partial buffer? perhaps due to very long line */ 60 else if (Bread(&in, buf, sizeof buf) < 0) 61 break; 62 } 63 exits(0); 64 } 65