]> git.lizzy.rs Git - plan9front.git/blob - sys/src/libstdio/setvbuf.c
kernel: clear FPillegal in pexit() and before pprint()
[plan9front.git] / sys / src / libstdio / setvbuf.c
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 static int
35 isatty(int fd)
36 {
37         char buf[64];
38
39         if(fd2path(fd, buf, sizeof buf) != 0)
40                 return 0;
41
42         /* might be /mnt/term/dev/cons */
43         return strlen(buf) >= 9 && strcmp(buf+strlen(buf)-9, "/dev/cons") == 0;
44 }
45 int _IO_setvbuf(FILE *f){
46         if(f==stderr || (f==stdout && isatty(1)))
47                 return setvbuf(f, (char *)0, _IOLBF, BUFSIZ);
48         else return setvbuf(f, (char *)0, _IOFBF, BUFSIZ);
49 }