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 #pragma ident "%Z%%M% %I% %E% SMI" 40 41 /*LINTLIBRARY*/ 42 43 #include <sys/types.h> 44 #include "file64.h" 45 #include <stdio.h> 46 #include "stdiom.h" 47 #include <stdlib.h> 48 49 extern Uchar _smbuf[][_NFILE]; 50 51 void 52 setbuffer(FILE *iop, char *abuf, int asize) 53 { 54 Uchar *buf = (Uchar *)abuf; 55 int fno = fileno(iop); /* file number */ 56 int size = asize - _SMBFSZ; 57 Uchar *temp; 58 59 if (iop->_base != 0 && iop->_flag & _IOMYBUF) 60 free((char *)iop->_base - PUSHBACK); 61 iop->_flag &= ~(_IOMYBUF | _IONBF | _IOLBF); 62 if (buf == 0) { 63 iop->_flag |= _IONBF; 64 #ifndef _STDIO_ALLOCATE 65 if (fno < 2) { 66 /* use special buffer for std{in,out} */ 67 buf = (fno == 0) ? _sibuf : _sobuf; 68 size = BUFSIZ - _SMBFSZ; 69 } else /* needed for ifdef */ 70 #endif 71 if (fno < _NFILE) { 72 buf = _smbuf[fno]; 73 size = _SMBFSZ - PUSHBACK; 74 } else if ((buf = (Uchar *)malloc(_SMBFSZ * sizeof (Uchar))) != 75 0) { 76 iop->_flag |= _IOMYBUF; 77 size = _SMBFSZ - PUSHBACK; 78 } 79 } else /* regular buffered I/O, specified buffer size */ { 80 if (size <= 0) 81 return; 82 } 83 if (buf == 0) 84 return; /* malloc() failed */ 85 temp = buf + PUSHBACK; 86 iop->_base = temp; 87 _setbufend(iop, temp + size); 88 iop->_ptr = temp; 89 iop->_cnt = 0; 90 } 91 92 /* 93 * set line buffering 94 */ 95 96 int 97 setlinebuf(FILE *iop) 98 { 99 char *buf; 100 101 (void) fflush(iop); 102 setbuffer(iop, (char *)NULL, 0); 103 buf = (char *)malloc(128); 104 if (buf != NULL) { 105 setbuffer(iop, buf, 128); 106 iop->_flag |= _IOLBF|_IOMYBUF; 107 } 108 return (0); /* returns no useful value, keep the same prototype */ 109 } 110