jehanne/sys/src/lib/stdio/setvbuf.c

61 lines
1.3 KiB
C

/*
* This file is part of the UCB release of Plan 9. It is subject to the license
* terms in the LICENSE file found in the top-level directory of this
* distribution and at http://akaros.cs.berkeley.edu/files/Plan9License. No
* part of the UCB release of Plan 9, including this file, may be copied,
* modified, propagated, or distributed except according to the terms contained
* in the LICENSE file.
*/
/*
* pANS stdio -- setvbuf
*/
#include "iolib.h"
int setvbuf(FILE *f, char *buf, int mode, int32_t size){
if(f->state!=OPEN){
f->state=ERR;
return -1;
}
f->state=RDWR;
switch(mode){
case _IOLBF:
f->flags|=LINEBUF;
case _IOFBF:
if(buf==0){
buf=malloc(size);
if(buf==0){
f->state=ERR;
return -1;
}
f->flags|=BALLOC;
}
f->bufl=size;
break;
case _IONBF:
buf=f->unbuf;
f->bufl=0;
break;
}
f->rp=f->wp=f->lp=f->buf=buf;
f->state=RDWR;
return 0;
}
static int
isatty(int fd)
{
char buf[64];
if(fd2path(fd, buf, sizeof buf) != 0)
return 0;
/* might be /mnt/term/dev/cons */
return strlen(buf) >= 9 && strcmp(buf+strlen(buf)-9, "/dev/cons") == 0;
}
int _IO_setvbuf(FILE *f){
//static int isatty(int);
if(f==stderr || (f==stdout && isatty(1)))
return setvbuf(f, (char *)0, _IOLBF, BUFSIZ);
else return setvbuf(f, (char *)0, _IOFBF, BUFSIZ);
}