From 33b141366b29aa086ecb8d06808d7ba91f83cb1e Mon Sep 17 00:00:00 2001 From: Mathieu Desnoyers Date: Mon, 11 Nov 2013 12:42:08 -0500 Subject: [PATCH] Implement lttng_read()/lttng_write() Handle EINTR and partial read/write in wrapper functions. Signed-off-by: Mathieu Desnoyers --- src/common/Makefile.am | 2 +- src/common/common.h | 1 + src/common/readwrite.c | 81 ++++++++++++++++++++++++++++++++++++++++++ src/common/readwrite.h | 34 ++++++++++++++++++ 4 files changed, 117 insertions(+), 1 deletion(-) create mode 100644 src/common/readwrite.c create mode 100644 src/common/readwrite.h diff --git a/src/common/Makefile.am b/src/common/Makefile.am index 0c02d533c..7817b40ae 100644 --- a/src/common/Makefile.am +++ b/src/common/Makefile.am @@ -14,7 +14,7 @@ noinst_LTLIBRARIES = libcommon.la libcommon_la_SOURCES = error.h error.c utils.c utils.h runas.c runas.h \ common.h futex.c futex.h uri.c uri.h defaults.c \ - pipe.c pipe.h + pipe.c pipe.h readwrite.c readwrite.h libcommon_la_LIBADD = -luuid # Consumer library diff --git a/src/common/common.h b/src/common/common.h index 2b2081c48..41eb03613 100644 --- a/src/common/common.h +++ b/src/common/common.h @@ -22,5 +22,6 @@ #include "error.h" #include "macros.h" #include "runas.h" +#include "readwrite.h" #endif /* _COMMON_H */ diff --git a/src/common/readwrite.c b/src/common/readwrite.c new file mode 100644 index 000000000..43d4e39ee --- /dev/null +++ b/src/common/readwrite.c @@ -0,0 +1,81 @@ +/* + * Copyright (C) 2013 - Mathieu Desnoyers + * + * This library is free software; you can redistribute it and/or modify it + * under the terms of the GNU Lesser General Public License, version 2.1 only, + * as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License + * for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include +#include "readwrite.h" + +/* + * lttng_read and lttng_write take care of EINTR and partial read/write. + * Upon success, they return the "count" received as parameter. + * They can return a negative value if an error occurs. + * If a value lower than the requested "count" is returned, it means an + * error occured. + * The error can be checked by querying errno. + */ +ssize_t lttng_read(int fd, void *buf, size_t count) +{ + size_t i = 0; + ssize_t ret; + + do { + ret = read(fd, &buf[i], count - i); + if (ret < 0) { + if (errno == EINTR) { + continue; /* retry operation */ + } else { + goto error; + } + } + i += ret; + assert(i <= count); + } while (count - i > 0 && ret > 0); + return i; + +error: + if (i == 0) { + return -1; + } else { + return i; + } +} + +ssize_t lttng_write(int fd, const void *buf, size_t count) +{ + size_t i = 0; + ssize_t ret; + + do { + ret = write(fd, &buf[i], count - i); + if (ret < 0) { + if (errno == EINTR) { + continue; /* retry operation */ + } else { + goto error; + } + } + i += ret; + assert(i <= count); + } while (count - i > 0 && ret > 0); + return i; + +error: + if (i == 0) { + return -1; + } else { + return i; + } +} diff --git a/src/common/readwrite.h b/src/common/readwrite.h new file mode 100644 index 000000000..39f5a1135 --- /dev/null +++ b/src/common/readwrite.h @@ -0,0 +1,34 @@ +#ifndef LTTNG_COMMON_READWRITE_H +#define LTTNG_COMMON_READWRITE_H + +/* + * Copyright (C) 2013 - Mathieu Desnoyers + * + * This library is free software; you can redistribute it and/or modify it + * under the terms of the GNU Lesser General Public License, version 2.1 only, + * as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License + * for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include + +/* + * lttng_read and lttng_write take care of EINTR and partial read/write. + * Upon success, they return the "count" received as parameter. + * They can return a negative value if an error occurs. + * If a value lower than the requested "count" is returned, it means an + * error occured. + * The error can be checked by querying errno. + */ +ssize_t lttng_read(int fd, void *buf, size_t count); +ssize_t lttng_write(int fd, const void *buf, size_t count); + +#endif /* LTTNG_COMMON_READWRITE_H */ -- 2.34.1