xref: /plan9/sys/src/libstdio/setvbuf.c (revision 4f28177105e14bc5c70ae9ec986773133c757004)
1 /*
2  * pANS stdio -- setvbuf
3  */
4 #include "iolib.h"
setvbuf(FILE * f,char * buf,int mode,long size)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 }
_IO_setvbuf(FILE * f)34 int _IO_setvbuf(FILE *f){
35 	static int isatty(int);
36 	if(f==stderr || (f==stdout && isatty(1)))
37 		return setvbuf(f, (char *)0, _IOLBF, BUFSIZ);
38 	else return setvbuf(f, (char *)0, _IOFBF, BUFSIZ);
39 }
40 static int
isatty(int fd)41 isatty(int fd)
42 {
43 	char buf[64];
44 
45 	if(fd2path(fd, buf, sizeof buf) != 0)
46 		return 0;
47 
48 	/* might be /mnt/term/dev/cons */
49 	return strlen(buf) >= 9 && strcmp(buf+strlen(buf)-9, "/dev/cons") == 0;
50 }
51