140266059SGregory Neil Shapiro /* 25dd76dd0SGregory Neil Shapiro * Copyright (c) 2000-2001 Proofpoint, Inc. and its suppliers. 340266059SGregory Neil Shapiro * All rights reserved. 440266059SGregory Neil Shapiro * Copyright (c) 1990, 1993 540266059SGregory Neil Shapiro * The Regents of the University of California. All rights reserved. 640266059SGregory Neil Shapiro * 740266059SGregory Neil Shapiro * This code is derived from software contributed to Berkeley by 840266059SGregory Neil Shapiro * Chris Torek. 940266059SGregory Neil Shapiro * 1040266059SGregory Neil Shapiro * By using this file, you agree to the terms and conditions set 1140266059SGregory Neil Shapiro * forth in the LICENSE file which can be found at the top level of 1240266059SGregory Neil Shapiro * the sendmail distribution. 1340266059SGregory Neil Shapiro */ 1440266059SGregory Neil Shapiro 1540266059SGregory Neil Shapiro #include <sm/gen.h> 16*4313cc83SGregory Neil Shapiro SM_RCSID("@(#)$Id: fwrite.c,v 1.25 2013-11-22 20:51:43 ca Exp $") 1740266059SGregory Neil Shapiro #include <errno.h> 1840266059SGregory Neil Shapiro #include <sm/io.h> 1940266059SGregory Neil Shapiro #include <sm/assert.h> 2040266059SGregory Neil Shapiro #include "local.h" 2140266059SGregory Neil Shapiro #include "fvwrite.h" 2240266059SGregory Neil Shapiro 2340266059SGregory Neil Shapiro /* 2440266059SGregory Neil Shapiro ** SM_IO_WRITE -- write to a file pointer 2540266059SGregory Neil Shapiro ** 2640266059SGregory Neil Shapiro ** Parameters: 2740266059SGregory Neil Shapiro ** fp -- file pointer writing to 2840266059SGregory Neil Shapiro ** timeout -- time to complete the write 2940266059SGregory Neil Shapiro ** buf -- location of data to be written 3040266059SGregory Neil Shapiro ** size -- number of bytes to be written 3140266059SGregory Neil Shapiro ** 3240266059SGregory Neil Shapiro ** Result: 3340266059SGregory Neil Shapiro ** Failure: returns 0 _and_ sets errno 3440266059SGregory Neil Shapiro ** Success: returns >=0 with errno unchanged, where the 3540266059SGregory Neil Shapiro ** number returned is the number of bytes written. 3640266059SGregory Neil Shapiro */ 3740266059SGregory Neil Shapiro 3840266059SGregory Neil Shapiro size_t 3940266059SGregory Neil Shapiro sm_io_write(fp, timeout, buf, size) 4040266059SGregory Neil Shapiro SM_FILE_T *fp; 4140266059SGregory Neil Shapiro int timeout; 4240266059SGregory Neil Shapiro const void *buf; 4340266059SGregory Neil Shapiro size_t size; 4440266059SGregory Neil Shapiro { 4540266059SGregory Neil Shapiro struct sm_uio uio; 4640266059SGregory Neil Shapiro struct sm_iov iov; 4740266059SGregory Neil Shapiro 4840266059SGregory Neil Shapiro SM_REQUIRE_ISA(fp, SmFileMagic); 4940266059SGregory Neil Shapiro 5040266059SGregory Neil Shapiro if (fp->f_write == NULL) 5140266059SGregory Neil Shapiro { 5240266059SGregory Neil Shapiro errno = ENODEV; 5340266059SGregory Neil Shapiro return 0; 5440266059SGregory Neil Shapiro } 5540266059SGregory Neil Shapiro 5640266059SGregory Neil Shapiro iov.iov_base = (void *) buf; 5740266059SGregory Neil Shapiro uio.uio_resid = iov.iov_len = size; 5840266059SGregory Neil Shapiro uio.uio_iov = &iov; 5940266059SGregory Neil Shapiro uio.uio_iovcnt = 1; 6040266059SGregory Neil Shapiro 6140266059SGregory Neil Shapiro /* The usual case is success (sm_fvwrite returns 0) */ 6240266059SGregory Neil Shapiro if (sm_fvwrite(fp, timeout, &uio) == 0) 6340266059SGregory Neil Shapiro return size; 6440266059SGregory Neil Shapiro 6540266059SGregory Neil Shapiro /* else return number of bytes actually written */ 6640266059SGregory Neil Shapiro return size - uio.uio_resid; 6740266059SGregory Neil Shapiro } 68