xref: /plan9-contrib/sys/src/libstdio/setvbuf.c (revision 219b2ee8daee37f4aad58d63f21287faa8e4ffdc)
1 /*
2  * pANS stdio -- setvbuf
3  */
4 #include "iolib.h"
5 int setvbuf(FILE *f, char *buf, int mode, long size){
6 	if(f->state!=OPEN){
7 		f->state=ERR;
8 		return -1;
9 	}
10 	f->state=RDWR;
11 	switch(mode){
12 	case _IOLBF:
13 		f->flags|=LINEBUF;
14 	case _IOFBF:
15 		if(buf==0){
16 			buf=malloc(size);
17 			if(buf==0){
18 				f->state=ERR;
19 				return -1;
20 			}
21 			f->flags|=BALLOC;
22 		}
23 		f->bufl=size;
24 		break;
25 	case _IONBF:
26 		buf=f->unbuf;
27 		f->bufl=0;
28 		break;
29 	}
30 	f->rp=f->wp=f->lp=f->buf=buf;
31 	f->state=RDWR;
32 	return 0;
33 }
34 int _IO_setvbuf(FILE *f){
35 	static int isatty(int);
36 	if(f==stderr || (f==stdout && isatty(1)))
37 		setvbuf(f, (char *)0, _IOLBF, BUFSIZ);
38 	else setvbuf(f, (char *)0, _IOFBF, BUFSIZ);
39 }
40 static int
41 isatty(int fd)
42 {
43 	Dir d1, d2;
44 
45 	if(dirfstat(fd, &d1) >= 0 && dirstat("/dev/cons", &d2) >= 0)
46 		return (d1.qid.path == d2.qid.path) &&
47 			(d1.type == d2.type) &&
48 			(d1.dev == d2.dev);
49 	return 0;
50 }
51