xref: /plan9/sys/src/ape/lib/ap/stdio/fseeko.c (revision d9dc5dd1222af33cc62eadd05bf208e8fc0098de)
1*d9dc5dd1SDavid du Colombier /*
2*d9dc5dd1SDavid du Colombier  * pANS stdio -- fseeko
3*d9dc5dd1SDavid du Colombier  */
4*d9dc5dd1SDavid du Colombier #include "iolib.h"
fseeko(FILE * f,off_t offs,int type)5*d9dc5dd1SDavid du Colombier int fseeko(FILE *f, off_t offs, int type){
6*d9dc5dd1SDavid du Colombier 	switch(f->state){
7*d9dc5dd1SDavid du Colombier 	case ERR:
8*d9dc5dd1SDavid du Colombier 	case CLOSED:
9*d9dc5dd1SDavid du Colombier 		return -1;
10*d9dc5dd1SDavid du Colombier 	case WR:
11*d9dc5dd1SDavid du Colombier 		fflush(f);
12*d9dc5dd1SDavid du Colombier 		break;
13*d9dc5dd1SDavid du Colombier 	case RD:
14*d9dc5dd1SDavid du Colombier 		if(type==1 && f->buf!=f->unbuf)
15*d9dc5dd1SDavid du Colombier 			offs-=f->wp-f->rp;
16*d9dc5dd1SDavid du Colombier 		break;
17*d9dc5dd1SDavid du Colombier 	}
18*d9dc5dd1SDavid du Colombier 	if(f->flags&STRING || lseek(f->fd, offs, type)==-1)
19*d9dc5dd1SDavid du Colombier 		return -1;
20*d9dc5dd1SDavid du Colombier 	if(f->state==RD) f->rp=f->wp=f->buf;
21*d9dc5dd1SDavid du Colombier 	if(f->state!=OPEN)
22*d9dc5dd1SDavid du Colombier 		f->state=RDWR;
23*d9dc5dd1SDavid du Colombier 	return 0;
24*d9dc5dd1SDavid du Colombier }
25