On Wed, 27.11.13 19:48, David Herrmann (dh.herrm...@gmail.com) wrote: > + > +pid_t pty_new(unsigned short term_width, unsigned short term_height, > Terminal *t, Pty **out) { > + Pty *pty; > + pid_t pid; > + int fd, comm[2], slave, r; > + char d; > + > + pty = calloc(1, sizeof(*pty)); > + if (!pty) > + return -ENOMEM; > + > + fd = posix_openpt(O_RDWR | O_NOCTTY | O_CLOEXEC | O_NONBLOCK); > + if (fd < 0) { > + free(pty); > + return -errno; > + } > + > + r = sd_event_add_io(t->m->event, > + fd, > + EPOLLHUP | EPOLLERR | EPOLLIN | EPOLLOUT | > EPOLLET, > + pty_io_fn, > + pty, > + &pty->fd_source); > + if (r < 0) { > + close(fd); > + free(pty); > + return r; > + } > + > + r = sd_event_add_defer(t->m->event, pty_idle_fn, pty, > &pty->idle_source); > + if (r < 0) { > + sd_event_source_set_enabled(pty->fd_source, SD_EVENT_OFF); > + sd_event_source_unref(pty->fd_source); > + close(fd); > + free(pty); > + return r; > + } > + > + r = pipe2(comm, O_CLOEXEC); > + if (r < 0) { > + r = -errno; > + sd_event_source_set_enabled(pty->idle_source, SD_EVENT_OFF); > + sd_event_source_unref(pty->idle_source); > + sd_event_source_set_enabled(pty->fd_source, SD_EVENT_OFF); > + sd_event_source_unref(pty->fd_source); > + close(fd); > + free(pty); > + return r; > + } > + > + pid = fork(); > + if (pid < 0) { > + /* error */ > + pid = -errno; > + close(comm[0]); > + close(comm[1]); > + sd_event_source_set_enabled(pty->idle_source, SD_EVENT_OFF); > + sd_event_source_unref(pty->idle_source); > + sd_event_source_set_enabled(pty->fd_source, SD_EVENT_OFF); > + sd_event_source_unref(pty->fd_source); > + close(fd); > + free(pty); > + return pid;
Grr. Just define a label to jump to to clean everything up that is initialized, and skip over the bits that isn't. Duplicating the destruction logic on every if block is just wrong... Lennart -- Lennart Poettering, Red Hat _______________________________________________ systemd-devel mailing list systemd-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/systemd-devel