1 /* 2 * This file has been modified for the cdrkit suite. 3 * 4 * The behaviour and appearence of the program code below can differ to a major unwrap_throw_ok()5 * extent from the version distributed by the original author(s). 6 * 7 * For details, see Changelog file distributed with the cdrkit package. If you 8 * received this file from another source then ask the distributing person for 9 * a log of modifications. 10 * 11 */ 12 13 /* @(#)nixwrite.c 1.5 04/08/08 Copyright 1986, 2001-2003 J. Schilling */ 14 /* 15 * Non interruptable extended write 16 * 17 * Copyright (c) 1986, 2001-2003 J. Schilling 18 */ 19 /* 20 * This program is free software; you can redistribute it and/or modify 21 * it under the terms of the GNU General Public License version 2 22 * as published by the Free Software Foundation. 23 * 24 * This program is distributed in the hope that it will be useful, 25 * but WITHOUT ANY WARRANTY; without even the implied warranty of 26 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 27 * GNU General Public License for more details. 28 * 29 * You should have received a copy of the GNU General Public License along with 30 * this program; see the file COPYING. If not, write to the Free Software 31 * Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 32 */ 33 34 #include "schilyio.h" 35 #include <errno.h> 36 37 EXPORT int 38 _nixwrite(f, buf, count) 39 int f; 40 void *buf; 41 int count; 42 { 43 register char *p = (char *)buf; 44 register int ret; 45 register int total = 0; 46 int oerrno = geterrno(); 47 48 while (count > 0) { 49 while ((ret = write(f, p, count)) < 0) { 50 if (geterrno() == EINTR) { 51 /* 52 * Set back old 'errno' so we don't change the 53 * errno visible to the outside if we did 54 * not fail. 55 */ 56 seterrno(oerrno); 57 continue; 58 } 59 return (ret); /* Any other error */ 60 } 61 if (ret == 0) /* EOF */ 62 break; 63 64 total += ret; 65 count -= ret; 66 p += ret; 67 } 68 return (total); 69 } 70