diff options
Diffstat (limited to 'contrib/sendmail/libsm/fwrite.c')
-rw-r--r-- | contrib/sendmail/libsm/fwrite.c | 67 |
1 files changed, 67 insertions, 0 deletions
diff --git a/contrib/sendmail/libsm/fwrite.c b/contrib/sendmail/libsm/fwrite.c new file mode 100644 index 0000000..372f75d --- /dev/null +++ b/contrib/sendmail/libsm/fwrite.c @@ -0,0 +1,67 @@ +/* + * Copyright (c) 2000-2001 Sendmail, Inc. and its suppliers. + * All rights reserved. + * Copyright (c) 1990, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Chris Torek. + * + * By using this file, you agree to the terms and conditions set + * forth in the LICENSE file which can be found at the top level of + * the sendmail distribution. + */ + +#include <sm/gen.h> +SM_RCSID("@(#)$Id: fwrite.c,v 1.24 2001/09/11 04:04:48 gshapiro Exp $") +#include <errno.h> +#include <sm/io.h> +#include <sm/assert.h> +#include "local.h" +#include "fvwrite.h" + +/* +** SM_IO_WRITE -- write to a file pointer +** +** Parameters: +** fp -- file pointer writing to +** timeout -- time to complete the write +** buf -- location of data to be written +** size -- number of bytes to be written +** +** Result: +** Failure: returns 0 _and_ sets errno +** Success: returns >=0 with errno unchanged, where the +** number returned is the number of bytes written. +*/ + +size_t +sm_io_write(fp, timeout, buf, size) + SM_FILE_T *fp; + int timeout; + const void *buf; + size_t size; +{ + struct sm_uio uio; + struct sm_iov iov; + + SM_REQUIRE_ISA(fp, SmFileMagic); + + if (fp->f_write == NULL) + { + errno = ENODEV; + return 0; + } + + iov.iov_base = (void *) buf; + uio.uio_resid = iov.iov_len = size; + uio.uio_iov = &iov; + uio.uio_iovcnt = 1; + + /* The usual case is success (sm_fvwrite returns 0) */ + if (sm_fvwrite(fp, timeout, &uio) == 0) + return size; + + /* else return number of bytes actually written */ + return size - uio.uio_resid; +} |