[vte] pty: Use helper class to restore errno
- From: Christian Persch <chpe src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [vte] pty: Use helper class to restore errno
- Date: Sun, 29 Nov 2015 19:59:08 +0000 (UTC)
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]