Re: [systemd-devel] [RFC 12/12] console: add systemd-consoled
Hi On Wed, Nov 27, 2013 at 11:39 PM, Lennart Poettering lenn...@poettering.net wrote: 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... Closed-source developers get paid by number of lines, why don't get open-source developers honored by number of lines? I would excel in that category! Fixed. Thanks David ___ systemd-devel mailing list systemd-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/systemd-devel
[systemd-devel] [RFC 12/12] console: add systemd-consoled
systemd-consoled is a very basic terminal-emulator to replace the in-kernel VT layer. It is based on libtsm as emulation layer (which itself has no external dependencies). systemd-consoled expects to be run in a logind-session. The caller must have already setup the session and prepared it for systemd-consoled. This is usually done by login-managers. --- .gitignore | 1 + Makefile.am | 24 +++ configure.ac| 17 ++ src/console/Makefile| 1 + src/console/consoled-pty.c | 391 src/console/consoled-screen.c | 170 + src/console/consoled-terminal.c | 371 ++ src/console/consoled.c | 278 src/console/consoled.h | 128 + 9 files changed, 1381 insertions(+) create mode 12 src/console/Makefile create mode 100644 src/console/consoled-pty.c create mode 100644 src/console/consoled-screen.c create mode 100644 src/console/consoled-terminal.c create mode 100644 src/console/consoled.c create mode 100644 src/console/consoled.h diff --git a/.gitignore b/.gitignore index c856412..0f563c3 100644 --- a/.gitignore +++ b/.gitignore @@ -36,6 +36,7 @@ /systemd-cgls /systemd-cgroups-agent /systemd-cgtop +/systemd-consoled /systemd-coredump /systemd-coredumpctl /systemd-cryptsetup diff --git a/Makefile.am b/Makefile.am index 1e8aeed..b5f1fd9 100644 --- a/Makefile.am +++ b/Makefile.am @@ -3937,6 +3937,30 @@ update-unifont: src/libsystemd-gfx/unifont.bin src/libsystemd-gfx/unifont.cmp endif # -- +if ENABLE_CONSOLED +rootlibexec_PROGRAMS += \ + systemd-consoled + +systemd_consoled_SOURCES = \ + src/console/consoled.h \ + src/console/consoled.c \ + src/console/consoled-pty.c \ + src/console/consoled-screen.c \ + src/console/consoled-terminal.c + +systemd_consoled_CFLAGS = \ + $(AM_CFLAGS) \ + $(CONSOLED_CFLAGS) + +systemd_consoled_LDADD = \ + $(CONSOLED_LIBS) \ + libsystemd-bus.la \ + libsystemd-daemon.la \ + libsystemd-gfx.la \ + libsystemd-shared.la +endif + +# -- if ENABLE_NETWORKD rootlibexec_PROGRAMS += \ systemd-networkd diff --git a/configure.ac b/configure.ac index bf3fce3..924637c 100644 --- a/configure.ac +++ b/configure.ac @@ -306,6 +306,22 @@ AM_CONDITIONAL(HAVE_GFX, [test $have_gfx = yes]) AM_CONDITIONAL(HAVE_GFX_GL, [test $have_gfx_gl = yes]) # -- +have_consoled=no +AC_ARG_ENABLE(consoled, AS_HELP_STRING([--disable-consoled], [disable system console])) +if test x$enable_consoled != xno; then +if test x$have_gfx = xno -a x$enable_consoled = xyes; then +AC_MSG_ERROR([*** consoled support requested, but libraries not found]) +elif test x$have_gfx = xyes ; then +PKG_CHECK_MODULES(CONSOLED, [ libtsm = 3 ], +[AC_DEFINE(ENABLE_CONSOLED, 1, [Define if system console is built]) have_consoled=yes], have_consoled=no) +if test x$have_consoled = xno -a x$enable_consoled = xyes; then +AC_MSG_ERROR([*** consoled support requested, but libraries not found]) +fi +fi +fi +AM_CONDITIONAL(ENABLE_CONSOLED, [test $have_consoled = yes]) + +# -- have_blkid=no AC_ARG_ENABLE(blkid, AS_HELP_STRING([--disable-blkid], [disable blkid support])) if test x$enable_blkid != xno; then @@ -1095,6 +,7 @@ AC_MSG_RESULT([ efi: ${have_efi} kmod:${have_kmod} sd-gfx: ${have_gfx} +consoled:${have_consoled} blkid: ${have_blkid} nss-myhostname: ${have_myhostname} gudev: ${enable_gudev} diff --git a/src/console/Makefile b/src/console/Makefile new file mode 12 index 000..d0b0e8e --- /dev/null +++ b/src/console/Makefile @@ -0,0 +1 @@ +../Makefile \ No newline at end of file diff --git a/src/console/consoled-pty.c b/src/console/consoled-pty.c new file mode 100644 index 000..c3defc1 --- /dev/null +++ b/src/console/consoled-pty.c @@ -0,0 +1,391 @@ +/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/ + +/*** + This file is part of systemd. + + Copyright 2013 David Herrmann dh.herrm...@gmail.com + + systemd is free software; you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + systemd is distributed in
Re: [systemd-devel] [RFC 12/12] console: add systemd-consoled
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