Home | History | Annotate | Download | only in stdio
      1     0  stevel /*
      2     0  stevel  * CDDL HEADER START
      3     0  stevel  *
      4     0  stevel  * The contents of this file are subject to the terms of the
      5  1846  craigm  * Common Development and Distribution License (the "License").
      6  1846  craigm  * You may not use this file except in compliance with the License.
      7     0  stevel  *
      8     0  stevel  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
      9     0  stevel  * or http://www.opensolaris.org/os/licensing.
     10     0  stevel  * See the License for the specific language governing permissions
     11     0  stevel  * and limitations under the License.
     12     0  stevel  *
     13     0  stevel  * When distributing Covered Code, include this CDDL HEADER in each
     14     0  stevel  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
     15     0  stevel  * If applicable, add the following below this CDDL HEADER, with the
     16     0  stevel  * fields enclosed by brackets "[]" replaced with your own identifying
     17     0  stevel  * information: Portions Copyright [yyyy] [name of copyright owner]
     18     0  stevel  *
     19     0  stevel  * CDDL HEADER END
     20     0  stevel  */
     21  1846  craigm 
     22     0  stevel /*
     23  5891     raf  * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
     24     0  stevel  * Use is subject to license terms.
     25     0  stevel  */
     26     0  stevel 
     27     0  stevel /*	Copyright (c) 1988 AT&T	*/
     28     0  stevel /*	  All Rights Reserved  	*/
     29  1846  craigm 
     30  1846  craigm #pragma ident	"%Z%%M%	%I%	%E% SMI"
     31     0  stevel 
     32     0  stevel 
     33     0  stevel /*
     34     0  stevel  * Ptr args aren't checked for NULL because the program would be a
     35     0  stevel  * catastrophic mess anyway.  Better to abort than just to return NULL.
     36     0  stevel  */
     37  6812     raf #include "lint.h"
     38     0  stevel #include "file64.h"
     39     0  stevel #include "mtlib.h"
     40     0  stevel #include <stdio.h>
     41     0  stevel #include <string.h>
     42     0  stevel #include <thread.h>
     43     0  stevel #include <synch.h>
     44     0  stevel #include <sys/types.h>
     45     0  stevel #include <unistd.h>
     46     0  stevel #include <limits.h>
     47     0  stevel #include "stdiom.h"
     48     0  stevel #include "mse.h"
     49     0  stevel 
     50     0  stevel int
     51     0  stevel fputs(const char *ptr, FILE *iop)
     52     0  stevel {
     53     0  stevel 	ssize_t ndone = 0L, n;
     54     0  stevel 	unsigned char *cptr, *bufend;
     55     0  stevel 	rmutex_t *lk;
     56     0  stevel 	size_t	ptrlen;
     57     0  stevel 	size_t	len = 0;
     58     0  stevel 	int	c;
     59     0  stevel 
     60     0  stevel 	FLOCKFILE(lk, iop);
     61     0  stevel 
     62     0  stevel 	_SET_ORIENTATION_BYTE(iop);
     63     0  stevel 
     64     0  stevel 	if (_WRTCHK(iop)) {
     65     0  stevel 		FUNLOCKFILE(lk);
     66     0  stevel 		return (EOF);
     67     0  stevel 	}
     68     0  stevel 	bufend = _bufend(iop);
     69     0  stevel 
     70     0  stevel 	ptrlen = strlen(ptr);
     71     0  stevel 	if ((iop->_flag & _IONBF) == 0) {
     72     0  stevel 		for (; ; ptr += len, ptrlen -= len) {
     73     0  stevel 			while ((n = bufend - (cptr = iop->_ptr)) <= 0) {
     74     0  stevel 				/* full buf */
     75     0  stevel 				if (_xflsbuf(iop) == EOF) {
     76     0  stevel 					FUNLOCKFILE(lk);
     77     0  stevel 					return (EOF);
     78     0  stevel 				}
     79     0  stevel 			}
     80     0  stevel 			/*
     81     0  stevel 			 * n: number of available bytes in the buffer of 'iop'
     82     0  stevel 			 * ptrlen: number of remaining bytes in 'ptr' string
     83     0  stevel 			 *
     84     0  stevel 			 * If all remaining bytes in 'ptr' can be copied into
     85     0  stevel 			 * the buffer of 'iop' (ptrlen <= n), 'len' is set to
     86     0  stevel 			 * 'ptrlen'.  Otherwise, 'len' is set to 'n'.
     87     0  stevel 			 * Then, copies 'len' bytes from 'ptr' to the buffer
     88     0  stevel 			 * of 'iop'.
     89     0  stevel 			 */
     90     0  stevel 			len = (c = (ptrlen <= n)) ? ptrlen : n;
     91     0  stevel 			(void) memcpy(cptr, ptr, len);
     92     0  stevel 			iop->_cnt -= len;
     93     0  stevel 			iop->_ptr += len;
     94     0  stevel 			if (_needsync(iop, bufend))
     95     0  stevel 				_bufsync(iop, bufend);
     96     0  stevel 			ndone += len;
     97     0  stevel 			if (c) {
     98     0  stevel 				/*
     99     0  stevel 				 * All bytes in 'ptr' have been copied into
    100     0  stevel 				 * the buffer of 'iop'.
    101     0  stevel 				 * Flush buffer if line-buffered
    102     0  stevel 				 */
    103     0  stevel 				if (iop->_flag & _IOLBF)
    104     0  stevel 					if (_xflsbuf(iop) == EOF) {
    105     0  stevel 						FUNLOCKFILE(lk);
    106     0  stevel 						return (EOF);
    107     0  stevel 					}
    108     0  stevel 				FUNLOCKFILE(lk);
    109     0  stevel 				if (ndone <= INT_MAX)
    110     0  stevel 					return ((int)ndone);
    111     0  stevel 				else
    112     0  stevel 					return (EOF);
    113     0  stevel 			}
    114     0  stevel 		}
    115     0  stevel 	}
    116     0  stevel 	else
    117     0  stevel 	{
    118     0  stevel 		/* write out to an unbuffered file */
    119     0  stevel 		ssize_t num_wrote;
    120     0  stevel 		ssize_t count = (ssize_t)ptrlen;
    121  1846  craigm 		int fd = GET_FD(iop);
    122     0  stevel 
    123  1846  craigm 		while ((num_wrote = write(fd, ptr, (size_t)count)) != count) {
    124  5891     raf 			if (num_wrote <= 0) {
    125  5891     raf 				if (!cancel_active())
    126     0  stevel 					iop->_flag |= _IOERR;
    127  5891     raf 				FUNLOCKFILE(lk);
    128  5891     raf 				return (EOF);
    129  5891     raf 			}
    130  5891     raf 			count -= num_wrote;
    131  5891     raf 			ptr += num_wrote;
    132     0  stevel 		}
    133     0  stevel 		FUNLOCKFILE(lk);
    134     0  stevel 		if (ptrlen <= INT_MAX)
    135     0  stevel 			return ((int)ptrlen);
    136     0  stevel 		else
    137     0  stevel 			return (EOF);
    138     0  stevel 	}
    139     0  stevel }
    140