[vte] pty: Use helper class to restore errno



commit ce8fc367e8c2f947d377a3258bd1b25435cd1c72
Author: Christian Persch <chpe gnome org>
Date:   Sun Nov 29 20:57:55 2015 +0100

    pty: Use helper class to restore errno

 src/pty.cc      |   56 +++++++++++++++++-------------------------------------
 src/vtetypes.cc |   12 +++++++++++
 src/vtetypes.hh |   14 +++++++++++++
 3 files changed, 44 insertions(+), 38 deletions(-)
---
diff --git a/src/pty.cc b/src/pty.cc
index b897f3e..920937c 100644
--- a/src/pty.cc
+++ b/src/pty.cc
@@ -30,6 +30,7 @@
 
 #include <vte/vte.h>
 #include "vtepty-private.h"
+#include "vtetypes.hh"
 
 #include <sys/types.h>
 #include <sys/ioctl.h>
@@ -530,7 +531,7 @@ vte_pty_set_size(VtePty *pty,
                        master, columns, rows);
        ret = ioctl(master, TIOCSWINSZ, &size);
        if (ret != 0) {
-                int errsv = errno;
+                vte::util::restore_errno errsv;
 
                 g_set_error(error, G_IO_ERROR,
                             g_io_error_from_errno(errsv),
@@ -540,9 +541,6 @@ vte_pty_set_size(VtePty *pty,
                _vte_debug_print(VTE_DEBUG_PTY,
                                "Failed to set size on %d: %s.\n",
                                master, g_strerror(errsv));
-
-                errno = errsv;
-
                 return FALSE;
        }
 
@@ -590,7 +588,7 @@ vte_pty_get_size(VtePty *pty,
                                master, size.ws_col, size.ws_row);
                 return TRUE;
        } else {
-                int errsv = errno;
+                vte::util::restore_errno errsv;
 
                 g_set_error(error, G_IO_ERROR,
                             g_io_error_from_errno(errsv),
@@ -600,9 +598,6 @@ vte_pty_get_size(VtePty *pty,
                _vte_debug_print(VTE_DEBUG_PTY,
                                "Failed to read size from fd %d: %s\n",
                                master, g_strerror(errsv));
-
-                errno = errsv;
-
                 return FALSE;
        }
 }
@@ -658,48 +653,43 @@ _vte_pty_open_posix(void)
                 fd = posix_openpt(O_RDWR | O_NOCTTY | O_NONBLOCK);
                 if (fd != -1 &&
                     fd_set_cloexec(fd) < 0) {
-                        int errsv = errno;
+                        vte::util::restore_errno errsv;
                         _vte_debug_print(VTE_DEBUG_PTY,
                                          "%s failed: %s", "Setting CLOEXEC flag", g_strerror(errsv));
                         close(fd);
-                        errno = errsv;
                         return -1;
                 }
         }
 
         if (fd == -1) {
-                int errsv = errno;
+                vte::util::restore_errno errsv;
                 _vte_debug_print(VTE_DEBUG_PTY,
                                  "%s failed: %s", "posix_openpt", g_strerror(errsv));
-                errno = errsv;
                 return -1;
         }
 
         if (fd_set_cpkt(fd) < 0) {
-                int errsv = errno;
+                vte::util::restore_errno errsv;
                 _vte_debug_print(VTE_DEBUG_PTY,
                                  "%s failed: %s", "ioctl(TIOCPKT)", g_strerror(errsv));
                 close(fd);
-                errno = errsv;
                 return -1;
         }
 
         /* Read the slave number and unlock it. */
         if (grantpt(fd) != 0) {
-                int errsv = errno;
+                vte::util::restore_errno errsv;
                 _vte_debug_print(VTE_DEBUG_PTY,
                                  "%s failed: %s", "grantpt", g_strerror(errsv));
                 close(fd);
-                errno = errsv;
                 return -1;
         }
 
        if (unlockpt(fd) != 0) {
-                int errsv = errno;
+                vte::util::restore_errno errsv;
                 _vte_debug_print(VTE_DEBUG_PTY,
                                  "%s failed: %s", "unlockpt", g_strerror(errsv));
                 close(fd);
-                errno = errsv;
                 return -1;
         }
 
@@ -724,10 +714,9 @@ _vte_pty_open_bsd(void)
 {
        int parentfd, childfd;
        if (openpty(&parentfd, &childfd, NULL, NULL, NULL) != 0) {
-               int errsv = errno;
+                vte::util::restore_errno errsv;
                 _vte_debug_print(VTE_DEBUG_PTY,
                                  "%s failed: %s", "openpty", g_strerror(errsv));
-               errno = errsv;
                return -1;
        }
 
@@ -735,29 +724,26 @@ _vte_pty_open_bsd(void)
         (void)close(childfd);
 
         if (fd_set_cloexec(parentfd) < 0) {
-                int errsv = errno;
+                vte::util::restore_errno errsv;
                 _vte_debug_print(VTE_DEBUG_PTY,
                                  "%s failed: %s", "Setting CLOEXEC flag", g_strerror(errsv));
                 close(parentfd);
-                errno = errsv;
                 return -1;
         }
 
         if (fd_set_nonblocking(parentfd) < 0) {
-                int errsv = errno;
+                vte::util::restore_errno errsv;
                 _vte_debug_print(VTE_DEBUG_PTY,
                                  "%s failed: %s", "Setting O_NONBLOCK flag", g_strerror(errsv));
                 close(parentfd);
-                errno = errsv;
                 return -1;
         }
 
         if (fd_set_cpkt(parentfd) < 0) {
-                int errsv = errno;
+                vte::util::restore_errno errsv;
                 _vte_debug_print(VTE_DEBUG_PTY,
                                  "%s failed: %s", "ioctl(TIOCPKT)", g_strerror(errsv));
                 close(parentfd);
-                errno = errsv;
                 return -1;
         }
 
@@ -777,29 +763,26 @@ _vte_pty_open_foreign(int fd)
         }
 
         if (fd_set_cpkt(fd) < 0) {
-                int errsv = errno;
+                vte::util::restore_errno errsv;
                 _vte_debug_print(VTE_DEBUG_PTY,
                                  "%s failed: %s", "ioctl(TIOCPKT)", g_strerror(errsv));
                 close(fd);
-                errno = errsv;
                 return -1;
         }
 
         if (fd_set_cloexec(fd) < 0) {
-                int errsv = errno;
+                vte::util::restore_errno errsv;
                 _vte_debug_print(VTE_DEBUG_PTY,
                                  "%s failed: %s", "Setting CLOEXEC flag", g_strerror(errsv));
                 close(fd);
-                errno = errsv;
                 return -1;
         }
 
         if (fd_set_nonblocking(fd) < 0) {
-                int errsv = errno;
+                vte::util::restore_errno errsv;
                 _vte_debug_print(VTE_DEBUG_PTY,
                                  "%s failed: %s", "Setting O_NONBLOCK flag", g_strerror(errsv));
                 close(fd);
-                errno = errsv;
                 return -1;
         }
 
@@ -834,10 +817,9 @@ vte_pty_set_utf8(VtePty *pty,
         g_return_val_if_fail (priv->pty_fd != -1, FALSE);
 
         if (tcgetattr(priv->pty_fd, &tio) == -1) {
-                int errsv = errno;
+                vte::util::restore_errno errsv;
                 g_set_error(error, G_IO_ERROR, g_io_error_from_errno(errsv),
                             "%s failed: %s", "tcgetattr", g_strerror(errsv));
-                errno = errsv;
                 return FALSE;
         }
 
@@ -851,10 +833,9 @@ vte_pty_set_utf8(VtePty *pty,
         /* Only set the flag if it changes */
         if (saved_cflag != tio.c_iflag &&
             tcsetattr(priv->pty_fd, TCSANOW, &tio) == -1) {
-                int errsv = errno;
+                vte::util::restore_errno errsv;
                 g_set_error(error, G_IO_ERROR, g_io_error_from_errno(errsv),
                             "%s failed: %s", "tcgetattr", g_strerror(errsv));
-                errno = errsv;
                 return FALSE;
        }
 #endif
@@ -913,10 +894,9 @@ vte_pty_initable_init (GInitable *initable,
         }
 
         if (fd == -1) {
-                int errsv = errno;
+                vte::util::restore_errno errsv;
                 g_set_error(error, G_IO_ERROR, g_io_error_from_errno(errsv),
                             "Failed to open PTY: %s", g_strerror(errsv));
-                errno = errsv;
                 return FALSE;
         }
 
diff --git a/src/vtetypes.cc b/src/vtetypes.cc
index 92b2a18..40116b3 100644
--- a/src/vtetypes.cc
+++ b/src/vtetypes.cc
@@ -290,6 +290,17 @@ test_color_rgb (void)
 {
 }
 
+static void
+test_util_restore_errno(void)
+{
+        errno = -42;
+        {
+                vte::util::restore_errno errsv;
+                errno = 36;
+        }
+        g_assert_cmpint(errno, ==, -42);
+}
+
 int
 main(int argc, char *argv[])
 {
@@ -299,6 +310,7 @@ main(int argc, char *argv[])
         g_test_add_func("/vte/c++/grid/span", test_grid_span);
         g_test_add_func("/vte/c++/color/rgb", test_color_rgb);
         g_test_add_func("/vte/c++/view/coords", test_view_coords);
+        g_test_add_func("/vte/c++/util/restore-errno", test_util_restore_errno);
 
         return g_test_run();
 }
diff --git a/src/vtetypes.hh b/src/vtetypes.hh
index 94e6ef0..6acc86c 100644
--- a/src/vtetypes.hh
+++ b/src/vtetypes.hh
@@ -19,6 +19,7 @@
 
 #include <pango/pango.h>
 #include <gdk/gdk.h>
+#include <errno.h>
 
 namespace vte {
 
@@ -133,4 +134,17 @@ namespace color {
 
 } /* namespace color */
 
+namespace util {
+
+        class restore_errno {
+        public:
+                restore_errno() { m_errsv = errno; }
+                ~restore_errno() { errno = m_errsv; }
+                operator int () const { return m_errsv; }
+        private:
+                int m_errsv;
+        };
+
+} /* namespace util */
+
 } /* namespace vte */


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