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