60 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			60 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/* Copyright (c) 2013 Red Hat, Inc. All rights reserved.
 | 
						|
 | 
						|
   This copyrighted material is made available to anyone wishing to use, modify,
 | 
						|
   copy, or redistribute it subject to the terms and conditions of the BSD
 | 
						|
   License.   This program is distributed in the hope that it will be useful,
 | 
						|
   but WITHOUT ANY WARRANTY expressed or implied, including the implied warranties
 | 
						|
   of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  A copy of this license
 | 
						|
   is available at http://www.opensource.org/licenses. Any Red Hat trademarks that
 | 
						|
   are incorporated in the source code or documentation are not subject to the BSD
 | 
						|
   License and may only be used or replicated with the express permission of
 | 
						|
   Red Hat, Inc.
 | 
						|
*/
 | 
						|
 | 
						|
#include <string.h>
 | 
						|
 | 
						|
#include "cio.h"
 | 
						|
 | 
						|
static int
 | 
						|
write_chunk (int fd, char *buf, int len)
 | 
						|
{
 | 
						|
  __CIOBUF__.length[0] = len;
 | 
						|
  __CIOBUF__.length[1] = len >> 8;
 | 
						|
  __CIOBUF__.parms[0] = CIO_WRITE;
 | 
						|
  __CIOBUF__.parms[1] = fd;
 | 
						|
  __CIOBUF__.parms[2] = fd >> 8;
 | 
						|
  __CIOBUF__.parms[3] = len;
 | 
						|
  __CIOBUF__.parms[4] = len >> 8;
 | 
						|
  memcpy (__CIOBUF__.buf, buf, len);
 | 
						|
 | 
						|
  _libgloss_cio_hook ();
 | 
						|
 | 
						|
  return __CIOBUF__.parms[0] + __CIOBUF__.parms[1] * 256;
 | 
						|
}
 | 
						|
 | 
						|
#include <stdio.h>
 | 
						|
 | 
						|
int
 | 
						|
write (int fd, char *buf, int len)
 | 
						|
{
 | 
						|
  int rv = 0;
 | 
						|
  int c;
 | 
						|
#if 0
 | 
						|
  if (fd == 2)
 | 
						|
    fprintf (stderr, "%.*s", buf, len);
 | 
						|
  else if (fd == 1)
 | 
						|
    printf ("%.*s", buf, len);
 | 
						|
#endif
 | 
						|
  while (len > 0)
 | 
						|
    {
 | 
						|
      int l = (len > CIO_BUF_SIZE) ? CIO_BUF_SIZE : len;
 | 
						|
      c = write_chunk (fd, buf, l);
 | 
						|
      if (c < 0)
 | 
						|
	return c;
 | 
						|
      rv += l;
 | 
						|
      len -= l;
 | 
						|
      buf += l;
 | 
						|
    }
 | 
						|
  return rv;
 | 
						|
}
 |