xref: /plan9/sys/src/cmd/aux/clog.c (revision 43aadf5e5598b9159a98f64e309c3ae860328a56)
1*43aadf5eSDavid du Colombier /* clog - log console */
27dd7cddfSDavid du Colombier #include <u.h>
37dd7cddfSDavid du Colombier #include <libc.h>
47dd7cddfSDavid du Colombier #include <bio.h>
57dd7cddfSDavid du Colombier 
67dd7cddfSDavid du Colombier char *argv0;
77dd7cddfSDavid du Colombier 
87dd7cddfSDavid du Colombier int
openlog(char * name)97dd7cddfSDavid du Colombier openlog(char *name)
107dd7cddfSDavid du Colombier {
117dd7cddfSDavid du Colombier 	int fd;
127dd7cddfSDavid du Colombier 
137dd7cddfSDavid du Colombier 	fd = open(name, OWRITE);
147dd7cddfSDavid du Colombier 	if(fd < 0)
159a747e4fSDavid du Colombier 		fd = create(name, OWRITE, DMAPPEND|0666);
167dd7cddfSDavid du Colombier 	if(fd < 0){
177dd7cddfSDavid du Colombier 		fprint(2, "%s: can't open %s: %r\n", argv0, name);
187dd7cddfSDavid du Colombier 		return -1;
197dd7cddfSDavid du Colombier 	}
207dd7cddfSDavid du Colombier 	seek(fd, 0, 2);
217dd7cddfSDavid du Colombier 	return fd;
227dd7cddfSDavid du Colombier }
237dd7cddfSDavid du Colombier 
247dd7cddfSDavid du Colombier void
main(int argc,char ** argv)257dd7cddfSDavid du Colombier main(int argc, char **argv)
267dd7cddfSDavid du Colombier {
277dd7cddfSDavid du Colombier 	Biobuf in;
287dd7cddfSDavid du Colombier 	int fd;
297dd7cddfSDavid du Colombier 	char *p, *t;
30*43aadf5eSDavid du Colombier 	char buf[Bsize];
317dd7cddfSDavid du Colombier 
327dd7cddfSDavid du Colombier 	argv0 = argv[0];
337dd7cddfSDavid du Colombier 	if(argc < 3){
347dd7cddfSDavid du Colombier 		fprint(2, "usage: %s console logfile \n", argv0);
357dd7cddfSDavid du Colombier 		exits("usage");
367dd7cddfSDavid du Colombier 	}
377dd7cddfSDavid du Colombier 
387dd7cddfSDavid du Colombier 	fd = open(argv[1], OREAD);
397dd7cddfSDavid du Colombier 	if(fd < 0){
407dd7cddfSDavid du Colombier 		fprint(2, "%s: can't open %s: %r\n", argv0, argv[1]);
417dd7cddfSDavid du Colombier 		exits("open");
427dd7cddfSDavid du Colombier 	}
437dd7cddfSDavid du Colombier 	Binit(&in, fd, OREAD);
447dd7cddfSDavid du Colombier 
457dd7cddfSDavid du Colombier 	fd = openlog(argv[2]);
467dd7cddfSDavid du Colombier 
477dd7cddfSDavid du Colombier 	for(;;){
487dd7cddfSDavid du Colombier 		if(p = Brdline(&in, '\n')){
497dd7cddfSDavid du Colombier 			p[Blinelen(&in)-1] = 0;
507dd7cddfSDavid du Colombier 			t = ctime(time(0));
517dd7cddfSDavid du Colombier 			t[19] = 0;
52*43aadf5eSDavid du Colombier 			while(fprint(fd, "%s: %s\n", t, p) < 0) {
537dd7cddfSDavid du Colombier 				close(fd);
54*43aadf5eSDavid du Colombier 				sleep(500);
557dd7cddfSDavid du Colombier 				fd = openlog(argv[2]);
567dd7cddfSDavid du Colombier 			}
57*43aadf5eSDavid du Colombier 		} else if(Blinelen(&in) == 0)	/* true eof or error */
587dd7cddfSDavid du Colombier 			break;
59*43aadf5eSDavid du Colombier 		/* discard partial buffer? perhaps due to very long line */
60*43aadf5eSDavid du Colombier 		else if (Bread(&in, buf, sizeof buf) < 0)
61*43aadf5eSDavid du Colombier 			break;
627dd7cddfSDavid du Colombier 	}
637dd7cddfSDavid du Colombier 	exits(0);
647dd7cddfSDavid du Colombier }
65