13e12c5d1SDavid du Colombier /*
23e12c5d1SDavid du Colombier * pANS stdio -- setvbuf
33e12c5d1SDavid du Colombier */
43e12c5d1SDavid du Colombier #include "iolib.h"
setvbuf(FILE * f,char * buf,int mode,long size)53e12c5d1SDavid du Colombier int setvbuf(FILE *f, char *buf, int mode, long size){
63e12c5d1SDavid du Colombier if(f->state!=OPEN){
73e12c5d1SDavid du Colombier f->state=ERR;
83e12c5d1SDavid du Colombier return -1;
93e12c5d1SDavid du Colombier }
103e12c5d1SDavid du Colombier f->state=RDWR;
113e12c5d1SDavid du Colombier switch(mode){
123e12c5d1SDavid du Colombier case _IOLBF:
133e12c5d1SDavid du Colombier f->flags|=LINEBUF;
143e12c5d1SDavid du Colombier case _IOFBF:
153e12c5d1SDavid du Colombier if(buf==0){
163e12c5d1SDavid du Colombier buf=malloc(size);
173e12c5d1SDavid du Colombier if(buf==0){
183e12c5d1SDavid du Colombier f->state=ERR;
193e12c5d1SDavid du Colombier return -1;
203e12c5d1SDavid du Colombier }
213e12c5d1SDavid du Colombier f->flags|=BALLOC;
223e12c5d1SDavid du Colombier }
233e12c5d1SDavid du Colombier f->bufl=size;
243e12c5d1SDavid du Colombier break;
253e12c5d1SDavid du Colombier case _IONBF:
263e12c5d1SDavid du Colombier buf=f->unbuf;
273e12c5d1SDavid du Colombier f->bufl=0;
283e12c5d1SDavid du Colombier break;
293e12c5d1SDavid du Colombier }
303e12c5d1SDavid du Colombier f->rp=f->wp=f->lp=f->buf=buf;
313e12c5d1SDavid du Colombier f->state=RDWR;
323e12c5d1SDavid du Colombier return 0;
333e12c5d1SDavid du Colombier }
_IO_setvbuf(FILE * f)343e12c5d1SDavid du Colombier int _IO_setvbuf(FILE *f){
353e12c5d1SDavid du Colombier static int isatty(int);
363e12c5d1SDavid du Colombier if(f==stderr || (f==stdout && isatty(1)))
375d459b5aSDavid du Colombier return setvbuf(f, (char *)0, _IOLBF, BUFSIZ);
385d459b5aSDavid du Colombier else return setvbuf(f, (char *)0, _IOFBF, BUFSIZ);
393e12c5d1SDavid du Colombier }
403e12c5d1SDavid du Colombier static int
isatty(int fd)413e12c5d1SDavid du Colombier isatty(int fd)
423e12c5d1SDavid du Colombier {
43*4f281771SDavid du Colombier char buf[64];
443e12c5d1SDavid du Colombier
45*4f281771SDavid du Colombier if(fd2path(fd, buf, sizeof buf) != 0)
463e12c5d1SDavid du Colombier return 0;
47*4f281771SDavid du Colombier
48*4f281771SDavid du Colombier /* might be /mnt/term/dev/cons */
49*4f281771SDavid du Colombier return strlen(buf) >= 9 && strcmp(buf+strlen(buf)-9, "/dev/cons") == 0;
503e12c5d1SDavid du Colombier }
51