xref: /plan9/sys/src/cmd/aux/clog.c (revision 43aadf5e5598b9159a98f64e309c3ae860328a56)
1 /* clog - log console */
2 #include <u.h>
3 #include <libc.h>
4 #include <bio.h>
5 
6 char *argv0;
7 
8 int
openlog(char * name)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
main(int argc,char ** argv)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