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*46272Storek static char sccsid[] = "@(#)funopen.c 5.2 (Berkeley) 02/05/91"; 1346111Sbostic #endif /* LIBC_SCCS and not lint */ 1446111Sbostic 1546111Sbostic #include <stdio.h> 1646111Sbostic #include <errno.h> 1746111Sbostic #include "local.h" 1846111Sbostic 1946111Sbostic FILE * 2046111Sbostic funopen(cookie, readfn, writefn, seekfn, closefn) 21*46272Storek const void *cookie; 2246111Sbostic int (*readfn)(), (*writefn)(); 2346111Sbostic #if __STDC__ 24*46272Storek fpos_t (*seekfn)(void *cookie, fpos_t off, int whence); 2546111Sbostic #else 2646111Sbostic fpos_t (*seekfn)(); 2746111Sbostic #endif 2846111Sbostic int (*closefn)(); 2946111Sbostic { 3046111Sbostic register FILE *fp; 3146111Sbostic int flags; 3246111Sbostic 3346111Sbostic if (readfn == NULL) { 3446111Sbostic if (writefn == NULL) { /* illegal */ 3546111Sbostic errno = EINVAL; 3646111Sbostic return (NULL); 3746111Sbostic } else 3846111Sbostic flags = __SWR; /* write only */ 3946111Sbostic } else { 4046111Sbostic if (writefn == NULL) 4146111Sbostic flags = __SRD; /* read only */ 4246111Sbostic else 4346111Sbostic flags = __SRW; /* read-write */ 4446111Sbostic } 4546111Sbostic if ((fp = __sfp()) == NULL) 4646111Sbostic return (NULL); 4746111Sbostic fp->_flags = flags; 4846111Sbostic fp->_file = -1; 49*46272Storek fp->_cookie = (void *)cookie; 5046111Sbostic fp->_read = readfn; 5146111Sbostic fp->_write = writefn; 5246111Sbostic fp->_seek = seekfn; 5346111Sbostic fp->_close = closefn; 5446111Sbostic return (fp); 5546111Sbostic } 56