146111Sbostic /*- 246111Sbostic * Copyright (c) 1990 The Regents of the University of California. 346111Sbostic * All rights reserved. 446111Sbostic * 546111Sbostic * This code is derived from software contributed to Berkeley by 646111Sbostic * Chris Torek. 746111Sbostic * 846111Sbostic * %sccs.include.redist.c% 946111Sbostic */ 1046111Sbostic 1146111Sbostic #if defined(LIBC_SCCS) && !defined(lint) 12*46611Sbostic static char sccsid[] = "@(#)stdio.c 5.3 (Berkeley) 02/24/91"; 1346111Sbostic #endif /* LIBC_SCCS and not lint */ 1446111Sbostic 15*46611Sbostic #include <fcntl.h> 16*46611Sbostic #include <unistd.h> 1746111Sbostic #include <stdio.h> 1846111Sbostic #include "local.h" 1946111Sbostic 2046111Sbostic /* 2146111Sbostic * Small standard I/O/seek/close functions. 2246111Sbostic * These maintain the `known seek offset' for seek optimisation. 2346111Sbostic */ 2446111Sbostic __sread(cookie, buf, n) 2546111Sbostic void *cookie; 2646111Sbostic char *buf; 2746111Sbostic int n; 2846111Sbostic { 2946111Sbostic register FILE *fp = cookie; 3046111Sbostic register int ret; 3146111Sbostic 3246111Sbostic ret = read(fp->_file, buf, n); 3346111Sbostic /* if the read succeeded, update the current offset */ 3446111Sbostic if (ret >= 0) 3546111Sbostic fp->_offset += ret; 3646111Sbostic else 3746111Sbostic fp->_flags &= ~__SOFF; /* paranoia */ 3846111Sbostic return (ret); 3946111Sbostic } 4046111Sbostic 4146111Sbostic __swrite(cookie, buf, n) 4246111Sbostic void *cookie; 4346111Sbostic char const *buf; 4446111Sbostic int n; 4546111Sbostic { 4646111Sbostic register FILE *fp = cookie; 4746111Sbostic 4846111Sbostic if (fp->_flags & __SAPP) 4946111Sbostic (void) lseek(fp->_file, (off_t)0, SEEK_END); 5046111Sbostic fp->_flags &= ~__SOFF; /* in case FAPPEND mode is set */ 5146111Sbostic return (write(fp->_file, buf, n)); 5246111Sbostic } 5346111Sbostic 5446111Sbostic fpos_t 5546111Sbostic __sseek(cookie, offset, whence) 5646111Sbostic void *cookie; 5746111Sbostic fpos_t offset; 5846111Sbostic int whence; 5946111Sbostic { 6046111Sbostic register FILE *fp = cookie; 6146111Sbostic register off_t ret; 6246111Sbostic 6346111Sbostic ret = lseek(fp->_file, (off_t)offset, whence); 6446111Sbostic if (ret == -1L) 6546111Sbostic fp->_flags &= ~__SOFF; 6646111Sbostic else { 6746111Sbostic fp->_flags |= __SOFF; 6846111Sbostic fp->_offset = ret; 6946111Sbostic } 7046111Sbostic return (ret); 7146111Sbostic } 7246111Sbostic 7346111Sbostic __sclose(cookie) 7446111Sbostic void *cookie; 7546111Sbostic { 7646111Sbostic 7746111Sbostic return (close(((FILE *)cookie)->_file)); 7846111Sbostic } 79