From 98504410b7f77cad7457bfdfcd593e2898c3b461 Mon Sep 17 00:00:00 2001 From: Felix Janda Date: Mon, 23 Mar 2015 21:03:12 +0100 Subject: [PATCH] Provide fallback for systems without TEMP_FAILURE_RETRY Reviewed-by: Luke Yelavich --- include/safe_io.h | 55 ++++++++++++++++++++++++++++++++++++++++++++++ src/modules/cicero.c | 6 ++--- src/server/output.c | 18 +-------------- src/server/sem_functions.c | 5 +++-- src/server/speaking.c | 5 ++--- 5 files changed, 63 insertions(+), 26 deletions(-) create mode 100644 include/safe_io.h diff --git a/include/safe_io.h b/include/safe_io.h new file mode 100644 index 0000000..37cfe7f --- /dev/null +++ b/include/safe_io.h @@ -0,0 +1,55 @@ +/* + * safe_io.h - Wrapper around read and write + * + * Copyright (C) 2001, 2002, 2003, 2007 Brailcom, o.p.s. + * + * This is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This software 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 + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this package; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301, USA. + * + */ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include + +#ifdef TEMP_FAILURE_RETRY /* GNU libc */ +#define safe_read(fd, buf, count) TEMP_FAILURE_RETRY(read(fd, buf, count)) +#define safe_write(fd, buf, count) TEMP_FAILURE_RETRY(write(fd, buf, count)) +#else /* TEMP_FAILURE_RETRY */ +#ifdef HAVE_UNISTD_H +#include +#endif +static inline ssize_t +safe_read(int fd, void *buf, size_t count) { + do { + ssize_t w = read(fd, buf, count); + + if (w == -1 && errno == EINTR) continue; + return w; + } while (1); +} +static inline ssize_t +safe_write(int fd, const void *buf, size_t count) { + do { + ssize_t w = write(fd, buf, count); + + if (w == -1 && errno == EINTR) continue; + return w; + } while (1); +} +#endif /* TEMP_FAILURE_RETRY */ diff --git a/src/modules/cicero.c b/src/modules/cicero.c index 237796e..62332a5 100644 --- a/src/modules/cicero.c +++ b/src/modules/cicero.c @@ -26,6 +26,7 @@ #endif #include +#include #include #include #include @@ -376,10 +377,7 @@ void *_cicero_speak(void *nothing) cicero_speaking = 0; break; } - if (ret > 0) - TEMP_FAILURE_RETRY(read - (fd1[0], b, - 2)); + if (ret > 0) safe_read(fd1[0], b, 2); if (cicero_stop) { cicero_speaking = 0; module_report_event_stop(); diff --git a/src/server/output.c b/src/server/output.c index 40b7e8c..ef98a45 100644 --- a/src/server/output.c +++ b/src/server/output.c @@ -26,27 +26,11 @@ #endif #include +#include #include #include "output.h" #include "parse.h" -#ifdef TEMP_FAILURE_RETRY /* GNU libc */ -#define safe_write(fd, buf, count) TEMP_FAILURE_RETRY(write(fd, buf, count)) -#else /* TEMP_FAILURE_RETRY */ -#ifdef HAVE_UNISTD_H -#include -#endif -static inline ssize_t -safe_write(int fd, const void *buf, size_t count) { - do { - ssize_t w = write(fd, buf, count); - - if (w == -1 && errno == EINTR) continue; - return w; - } while (1); -} -#endif /* TEMP_FAILURE_RETRY */ - #if !(defined(__GLIBC__) && defined(_GNU_SOURCE)) /* Added by Willie Walker - strndup is a gcc-ism */ diff --git a/src/server/sem_functions.c b/src/server/sem_functions.c index 0a86f56..430e74c 100644 --- a/src/server/sem_functions.c +++ b/src/server/sem_functions.c @@ -26,6 +26,8 @@ #include #endif +#include + #include "speechd.h" #include "sem_functions.h" @@ -33,8 +35,7 @@ void speaking_semaphore_post(void) { char buf[1]; buf[0] = 42; - const ssize_t wr_bytes = - TEMP_FAILURE_RETRY(write(speaking_pipe[1], buf, 1)); + const ssize_t wr_bytes = safe_write(speaking_pipe[1], buf, 1); if (wr_bytes != 1) FATAL("write to polled fd: could not write 1 byte"); } diff --git a/src/server/speaking.c b/src/server/speaking.c index bd27008..f2dc289 100644 --- a/src/server/speaking.c +++ b/src/server/speaking.c @@ -29,6 +29,7 @@ #include #include #include +#include #include "speechd.h" #include "server.h" #include "index_marking.h" @@ -88,9 +89,7 @@ void *speak(void *data) MSG(5, "wait_for_poll: activity in Speech Dispatcher"); const ssize_t rd_bytes = - TEMP_FAILURE_RETRY(read - (poll_fds[0].fd, buf, - 1)); + safe_read(poll_fds[0].fd, buf, 1); if (rd_bytes != 1) FATAL ("read from polled fd: could not read 1 byte"); -- 2.4.0