X-Git-Url: http://git.liburcu.org/?a=blobdiff_plain;f=snprintf%2Fpatient_write.c;h=b6620cb2acc56f861f098df0cf4e1f2260e3d4a1;hb=HEAD;hp=4f344ec97d1af588e877142f02822abbb40f9588;hpb=c0c0989ab70574e09b2f7e8b48c2da6af664a849;p=lttng-ust.git diff --git a/snprintf/patient_write.c b/snprintf/patient_write.c deleted file mode 100644 index 4f344ec9..00000000 --- a/snprintf/patient_write.c +++ /dev/null @@ -1,120 +0,0 @@ -/* - * SPDX-License-Identifier: LGPL-2.1-or-later - * - * Copyright (C) 2009 Pierre-Marc Fournier - * Copyright (C) 2011 Mathieu Desnoyers - */ - -#include - -/* write() */ -#include - -/* writev() */ -#include - -/* send() */ -#include -#include - -#include - -#include - -/* - * This write is patient because it restarts if it was incomplete. - */ - -ssize_t patient_write(int fd, const void *buf, size_t count) -{ - const char *bufc = (const char *) buf; - int result; - - for(;;) { - result = write(fd, bufc, count); - if (result == -1 && errno == EINTR) { - continue; - } - if (result <= 0) { - return result; - } - count -= result; - bufc += result; - - if (count == 0) { - break; - } - } - - return bufc-(const char *)buf; -} - -/* - * The `struct iovec *iov` is not `const` because we modify it to support - * partial writes. - */ -ssize_t patient_writev(int fd, struct iovec *iov, int iovcnt) -{ - ssize_t written, total_written = 0; - int curr_element_idx = 0; - - for(;;) { - written = writev(fd, iov + curr_element_idx, - iovcnt - curr_element_idx); - if (written == -1 && errno == EINTR) { - continue; - } - if (written <= 0) { - return written; - } - - total_written += written; - - /* - * If it's not the last element in the vector and we have - * written more than the current element size, then increment - * the current element index until we reach the element that - * was partially written. - */ - while (curr_element_idx < iovcnt && - written >= iov[curr_element_idx].iov_len) { - written -= iov[curr_element_idx].iov_len; - curr_element_idx++; - } - - /* Maybe we are done. */ - if (curr_element_idx >= iovcnt) { - break; - } - - /* Update the current element base and size. */ - iov[curr_element_idx].iov_base += written; - iov[curr_element_idx].iov_len -= written; - } - - return total_written; -} - -ssize_t patient_send(int fd, const void *buf, size_t count, int flags) -{ - const char *bufc = (const char *) buf; - int result; - - for(;;) { - result = send(fd, bufc, count, flags); - if (result == -1 && errno == EINTR) { - continue; - } - if (result <= 0) { - return result; - } - count -= result; - bufc += result; - - if (count == 0) { - break; - } - } - - return bufc - (const char *) buf; -}