summaryrefslogtreecommitdiffstats
path: root/contrib/sendmail/libsm/fwrite.c
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/sendmail/libsm/fwrite.c')
-rw-r--r--contrib/sendmail/libsm/fwrite.c67
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;
+}
OpenPOWER on IntegriCloud