libbb: safe_write should not return EINTR
[oweals/busybox.git] / libbb / safe_write.c
1 /* vi: set sw=4 ts=4: */
2 /*
3  * Utility routines.
4  *
5  * Copyright (C) 1999-2004 by Erik Andersen <andersen@codepoet.org>
6  *
7  * Licensed under GPLv2 or later, see file LICENSE in this source tree.
8  */
9
10 #include "libbb.h"
11
12 ssize_t FAST_FUNC safe_write(int fd, const void *buf, size_t count)
13 {
14         ssize_t n;
15
16         for (;;) {
17                 n = write(fd, buf, count);
18                 if (n >= 0 || errno != EINTR)
19                         break;
20                 /* Some callers set errno=0, are upset when they see EINTR.
21                  * Returning EINTR is wrong since we retry write(),
22                  * the "error" was transient.
23                  */
24                 errno = 0;
25                 /* repeat the write() */
26         }
27
28         return n;
29 }