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