speechd-discuss
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH 1/2] Provide fallback for systems without TEMP_FAILURE_RETRY


From: Felix Janda
Subject: [PATCH 1/2] Provide fallback for systems without TEMP_FAILURE_RETRY
Date: Mon, 23 Mar 2015 21:03:12 +0100

---
Feel free to change the license header in safe_io.h to whatever you like
(or put the definitions into another header). The header text is taken
from server/output.c.
---
 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 <config.h>
+#endif
+
+#include <unistd.h>
+#include <errno.h>
+
+#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 <unistd.h>
+#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 <speechd_types.h>
+#include <safe_io.h>
 #include <errno.h>
 #include <sys/poll.h>
 #include <fcntl.h>
@@ -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 <fdsetconv.h>
+#include <safe_io.h>
 #include <spd_utils.h>
 #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 <unistd.h>
-#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 <config.h>
 #endif
 
+#include <safe_io.h>
+
 #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 <glib.h>
 #include <poll.h>
 #include <unistd.h>
+#include <safe_io.h>
 #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.0.5




reply via email to

[Prev in Thread] Current Thread [Next in Thread]