1 /* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the 5 * Common Development and Distribution License (the "License"). 6 * You may not use this file except in compliance with the License. 7 * 8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9 * or http://www.opensolaris.org/os/licensing. 10 * See the License for the specific language governing permissions 11 * and limitations under the License. 12 * 13 * When distributing Covered Code, include this CDDL HEADER in each 14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15 * If applicable, add the following below this CDDL HEADER, with the 16 * fields enclosed by brackets "[]" replaced with your own identifying 17 * information: Portions Copyright [yyyy] [name of copyright owner] 18 * 19 * CDDL HEADER END 20 */ 21 /* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */ 22 /* All Rights Reserved */ 23 24 /* 25 * University Copyright- Copyright (c) 1982, 1986, 1988 26 * The Regents of the University of California 27 * All Rights Reserved 28 * 29 * University Acknowledgment- Portions of this document are derived from 30 * software developed by the University of California, Berkeley, and its 31 * contributors. 32 */ 33 34 /* 35 * Copyright 2006 Sun Microsystems, Inc. All rights reserved. 36 * Use is subject to license terms. 37 */ 38 39 /*LINTLIBRARY*/ 40 41 #include <sys/types.h> 42 #include "file64.h" 43 #include <stdio.h> 44 #include "stdiom.h" 45 #include <stdlib.h> 46 47 extern Uchar _smbuf[][_NFILE]; 48 49 void 50 setbuffer(FILE *iop, char *abuf, int asize) 51 { 52 Uchar *buf = (Uchar *)abuf; 53 int fno = fileno(iop); /* file number */ 54 int size = asize - _SMBFSZ; 55 Uchar *temp; 56 57 if (iop->_base != 0 && iop->_flag & _IOMYBUF) 58 free((char *)iop->_base - PUSHBACK); 59 iop->_flag &= ~(_IOMYBUF | _IONBF | _IOLBF); 60 if (buf == 0) { 61 iop->_flag |= _IONBF; 62 if (fno < 2) { 63 /* use special buffer for std{in,out} */ 64 buf = (fno == 0) ? _sibuf : _sobuf; 65 size = BUFSIZ - _SMBFSZ; 66 } else if (fno < _NFILE) { 67 buf = _smbuf[fno]; 68 size = _SMBFSZ - PUSHBACK; 69 } else if ((buf = (Uchar *)malloc(_SMBFSZ * sizeof (Uchar))) != 70 0) { 71 iop->_flag |= _IOMYBUF; 72 size = _SMBFSZ - PUSHBACK; 73 } 74 } else /* regular buffered I/O, specified buffer size */ { 75 if (size <= 0) 76 return; 77 } 78 if (buf == 0) 79 return; /* malloc() failed */ 80 temp = buf + PUSHBACK; 81 iop->_base = temp; 82 _setbufend(iop, temp + size); 83 iop->_ptr = temp; 84 iop->_cnt = 0; 85 } 86 87 /* 88 * set line buffering 89 */ 90 91 int 92 setlinebuf(FILE *iop) 93 { 94 char *buf; 95 96 (void) fflush(iop); 97 setbuffer(iop, (char *)NULL, 0); 98 buf = (char *)malloc(128); 99 if (buf != NULL) { 100 setbuffer(iop, buf, 128); 101 iop->_flag |= _IOLBF|_IOMYBUF; 102 } 103 return (0); /* returns no useful value, keep the same prototype */ 104 } 105