summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJonas Ådahl <jadahl@gmail.com>2012-03-28 22:36:10 +0200
committerKristian Høgsberg <krh@bitplanet.net>2012-03-28 23:03:00 -0400
commit29a9cf0f9795274d01d77070134c2839d0d05388 (patch)
tree8bacae9a549a6c6b2f12a431364c688454bd9faa
parentc97af923d937aba4cec923169969b65b2d2710f4 (diff)
tty: Improve error handling in tty_create()
Signed-off-by: Jonas Ådahl <jadahl@gmail.com>
-rw-r--r--src/tty.c28
1 files changed, 25 insertions, 3 deletions
diff --git a/src/tty.c b/src/tty.c
index c5e9e8a4..85c16d8a 100644
--- a/src/tty.c
+++ b/src/tty.c
@@ -152,12 +152,13 @@ tty_create(struct weston_compositor *compositor, tty_vt_func_t vt_func,
if (tty->fd <= 0) {
fprintf(stderr, "failed to open tty: %m\n");
+ free(tty);
return NULL;
}
if (tcgetattr(tty->fd, &tty->terminal_attributes) < 0) {
fprintf(stderr, "could not get terminal attributes: %m\n");
- return NULL;
+ goto err;
}
/* Ignore control characters and disable echo */
@@ -174,11 +175,13 @@ tty_create(struct weston_compositor *compositor, tty_vt_func_t vt_func,
tty->input_source =
wl_event_loop_add_fd(loop, tty->fd,
WL_EVENT_READABLE, on_tty_input, tty);
+ if (!tty->input_source)
+ goto err_attr;
ret = ioctl(tty->fd, KDSETMODE, KD_GRAPHICS);
if (ret) {
fprintf(stderr, "failed to set KD_GRAPHICS mode on tty: %m\n");
- return NULL;
+ goto err_input_source;
}
tty->has_vt = 1;
@@ -187,13 +190,32 @@ tty_create(struct weston_compositor *compositor, tty_vt_func_t vt_func,
mode.acqsig = SIGUSR1;
if (ioctl(tty->fd, VT_SETMODE, &mode) < 0) {
fprintf(stderr, "failed to take control of vt handling\n");
- return NULL;
+ goto err_kdmode;
}
tty->vt_source =
wl_event_loop_add_signal(loop, SIGUSR1, vt_handler, tty);
+ if (!tty->vt_source)
+ goto err_vtmode;
return tty;
+
+err_vtmode:
+ ioctl(tty->fd, VT_SETMODE, &mode);
+
+err_kdmode:
+ ioctl(tty->fd, KDSETMODE, KD_TEXT);
+
+err_input_source:
+ wl_event_source_remove(tty->input_source);
+
+err_attr:
+ tcsetattr(tty->fd, TCSANOW, &tty->terminal_attributes);
+
+err:
+ close(tty->fd);
+ free(tty);
+ return NULL;
}
void