55 Commits

Author SHA1 Message Date
David Herrmann
dd481c2fa6 pty: add env_reset property
This property controls whether the environment should be reset before
spawning the child process. Defaults to "no" and affects whether "-p" is
passed as default argument to /bin/login.

Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
2012-12-12 21:20:45 +01:00
David Herrmann
d50f80a72f pty: add "colorterm" property
The colorterm property is used (if set) as COLORTERM environment variable.
Note that this variable (despite the name) is not used with
terminfo/termcap. Instead, it's solely used to identify the running
terminal.

Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
2012-12-12 20:12:21 +01:00
David Herrmann
b78244e1ab pty: use /bin/login by default
kmscon does always pass a proper argv array so the default is never used.
However, for security reasons we shouldn't hardcode /bin/login. If some
other program uses the pty layer and forgets to pass in a suitable argv
all the time, they mind end up with opening a root shell.

Hence, use /bin/login as default.

Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
2012-12-09 18:33:03 +01:00
David Herrmann
e74f0de0b6 pty: use the new child-reaper sources
Instead of registering for SIGCHLD we should use the child-reaper sources
to avoid nasty race-conditions.

Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
2012-12-02 15:08:07 +01:00
David Herrmann
715287427d pty: simplify pty_close()
The old logic is no longer needed as we use edge-triggered fd notification
now. Therefore, simplify the helpers to make them more readable.

Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
2012-12-02 13:42:15 +01:00
David Herrmann
4199d3331e pty: free seat argument on destruction
We didn't correctly free this parameter even though we dup'ed it earlier.

Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
2012-12-02 13:40:16 +01:00
David Herrmann
0d8102a286 pty: downgrade error to debug message on I/O errors
I/O errors aren't fatal or important on PTYs so ignore them and mark it as
debug message.

Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
2012-12-01 13:15:01 +01:00
David Herrmann
0b9fa6aa29 pty: fix ignoring HUP on pty-master files
A HUP is reported whenever there is no client listening on the other side
of the PTY. As /bin/login and friends call vhangup() during setup, there
is a short time-span when we might get a HUP.
Hence, we need to ignore HUPs and solely track clients by PID. To avoid
hogging the CPU while the TTY is hungup, we change the event-mode to
edge-triggered.

This fixes a bug where we tried starting /bin/login several times because
we always ran into this race-condition and directly closed the TTY again.

Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
2012-11-28 17:47:31 +01:00
David Herrmann
e8c439c805 pty: remove unused "master" argument
We do not use the master pty fd when spawning the child so skip it.

Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
2012-11-27 19:02:48 +01:00
David Herrmann
eaffe90061 shl: ring: provide offset parameter for shl_ring_peek()
If we want to fill a whole buffer, we actually might have to read more
data than just the data from the beginning. Therefore, provide an offset
so we can read from multiple pages.

Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
2012-10-25 14:47:32 +02:00
David Herrmann
06c6e56d4c kmscon: implement per-seat configuration
Sorry for the huge commit, but this reworks the whole configuration
handler. We now provide conf_ctx contexts which contain a pointer to the
backing storage and the config-options that are used.

It is also possible to copy config-options now. So we can use the
main-config as default value for seat-configurations.

Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
2012-10-19 16:15:34 +02:00
David Herrmann
593a4992b4 pty: set XDG_SEAT for childs
Recent systemd was updated to parse XDG_SEAT in PAM so we can assign
logins to the correct seat.
This patch allows pty users to specify what seat they run on so the PTY
can correctly set the seat variable. If no seat is specified, then
XDG_SEAT is not set so we still allow non-seated logins.
Note that if kmscon_pty is run with XDG_SEAT set, this will also be set
for the client PTY so unset it if you don't want the environment to be
copied to the client (like any environment variable).

Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
2012-10-07 17:24:52 +02:00
David Herrmann
32faedbfb4 Fix printf() specified bugs all over the code
When enabling the printf() logic for the logging subsystem, several
warnings were produced about missing or wrong specifiers. This fixes all
those occurrences.

Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
2012-09-30 18:01:35 +02:00
David Herrmann
b87b6555e8 pty: remove useless debug message
Remote pty debug message about resizing.

Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
2012-09-26 22:45:38 +02:00
David Herrmann
89cb239fce pty: set argv via helper function
This makes the pty layer independent of kmscon global state. This allows
us to use it in other applications bundled with kmscon. There is still
some work to do to make it fully independent so we can integrate it into
TSM. But that's not really needed, yet.

Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
2012-09-26 21:24:34 +02:00
David Herrmann
9c48153e30 pty: set "TERM" via helper function instead of kmscon_conf
Instead of accessing global state, we now set the TERM value via a helper
function. This is needed to make the pty layer independent of kmscon.

Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
2012-09-26 19:25:35 +02:00
David Herrmann
abde919bbd pty: set VERASE character to backspace during setup
Some crazy guy decided to set VERASE to DEL by default in the kernel. So
when starting an application which does not initialize the terminal on
startup, they may not notice that we actually send BACKSPACE as
erase-character (like /bin/login). Therefore, initialize VERASE to 010 so
everyone is happy.

Thanks to Etam for reporting this!

Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
2012-09-19 21:13:48 +02:00
David Herrmann
b5aa89f4ac pty: remove public eloop dependency
We now create an eloop object internally to avoid requiring public eloop
headers. Functionality is still the same but now hidden in the library.

Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
2012-09-18 19:22:09 +02:00
David Herrmann
04e3bcc652 shl: move kmscon_ring_* to shl
The ring implementation is only used in one place so move it into SHL to
avoid linking it into all other libraries and applications.

Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
2012-09-16 09:23:35 +02:00
David Herrmann
69bde6077e pty: improve application data read-path
The kernel tty buffer is actually too small to buffer data for 20ms, which
is the time a frame may take in kmscon so we can still get 50 fps.
However, profiling showed that we often read multiple times from the pty.
We can optimize this by increasing the buffer to match the tty internal
buffer.

The kernel internal buffering is currently the only performance slowdown
that we have. That is, the data an application writes while we do a single
rendering is more than the kernel can buffer. Therefore, the application
waits until we read from the pty again. We then wait with redrawing until
the next vblank.

Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
2012-08-31 20:19:55 +02:00
David Herrmann
a05815eb71 pty: read all available data instead of only one chunk
If there is plenty data available, we should read all of it before
returning. Otherwise, we might spend too much time letting the other
subsystems perform actions. This can have the effect, that we render after
each read() on the pty if a redraw takes more time than a single frame.
This is definitely not what we want.

To avoid staying here too long we use a hard-coded maximum. Otherwise, if
the vte layer takes longer than the pty-end writes data to us, we might
stay here forever. This is very unlikely as the VTE layer as no immediate
side-effects that make long computations, but we use it to be on the safe
side.

Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
2012-08-21 17:44:43 +02:00
David Herrmann
c9ccc70fcb main: move conf_global to kmscon_conf in new header main.h
The main configuration is now limited to kmscon and thus should not use
the conf_* prefix. Move all code to use the new name and introduce the new
main.h header mainly for kmscon.

Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
2012-08-11 22:02:46 +02:00
David Herrmann
dd68e97016 conf: add config-file parser
This again refactors the whole config subsystem but this should be the
last time. We now have generic parsers for booleans and strings and don't
leak any memory, anymore. Furthermore, this adds a config-file parser so
common options can now be placed into /etc/kmscon.conf or ~/.kmscon.conf.

The config files parse the same arguments as the command-line and the
command-line always has precedence even though it is parsed first.

Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
2012-07-17 22:47:15 +02:00
David Herrmann
f1326b2728 static: move statically linked subsystems to static_*
Small stuff that is not worth putting into a separate library is no moved
into the "static" library which is statically linked into all our
subsystems.

Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
2012-06-24 20:35:22 +02:00
David Herrmann
69dcfe8586 eloop: take fd argument for fd-sources at initialization
When creating a new fd-source you must supply the file descriptor
directly. You cannot delay this to the time when you add the fd to the
event loop.

This simplifies the logic and allows much smoother handling in the event
loop core.

Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
2012-05-17 17:03:46 +02:00
David Herrmann
3bcce95be3 pty: add kmscon_pty_signal()
Allow to send arbitrary signals to the foreground process group of the
pty. Linux supports the TIOCSIG ioctl so we actually do not need to
implement this on our own, yeah!

Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
2012-03-27 13:35:41 +02:00
David Herrmann
84b87c320b pty: avoid calling callbacks twice
We shouldn't call the close-cb twice. Therefore, correctly free the FD on
first error, however, keep the signal-callback to get nice log-messages.
Only when the user calls *_close() we eventually stop everything.

Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
2012-03-25 19:14:30 +02:00
David Herrmann
3935a77439 pty: fix using right fd
Use right fd when spawning child process.

Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
2012-03-25 18:50:30 +02:00
David Herrmann
5cdf94711b pty: random fixes
Fix some random coding-style issues and adjust to new eloop-rules.

Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
2012-03-25 18:37:45 +02:00
David Herrmann
e0546adcaa pty: correctly terminate when child_setup fails
We currently return "ret" when child setup fails, however, we should
rather call exit(). Also avoid cleaning up as this is impossible here
anyway.

Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
2012-03-25 18:16:05 +02:00
David Herrmann
0392fb8c49 pty: fix wrong fd check
FDs may be 0 so check for >= and not > for fds.

Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
2012-03-25 18:10:27 +02:00
David Herrmann
6bcc73666a pty: fix race when starting child
We should do fork() as the last operation when starting the child.
Currently, if our eloop-add() fails, we have a started child but return
failure to the caller. Therefore, the child will stay alive but we do not
use it.

We now perform all startup correctly before fork()'ing so we are always
safe when starting the child.

Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
2012-03-25 18:06:33 +02:00
David Herrmann
9e87b853ab use pthread_sigmask instead of sigprocmask
pthread is already in our vmem due to our dependencies so link to it
explicitly and use pthread_sigmask to avoid buggy sigprocmask in
multi-threaded applications.

Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
2012-03-25 17:53:16 +02:00
David Herrmann
b1cb8c918c pty: use reentrant ptsname_r
Avoid static storage in pty subsystem and use the ptsname_r extension.

Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
2012-03-25 16:18:03 +02:00
David Herrmann
8773331331 pty: introduce --term
Allow setting TERM to different values than the default with a
command-line switch.

Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
2012-03-24 18:15:50 +01:00
David Herrmann
ec2dfaa244 pty: add --login option
Allow to specify a separate login-program that is executed instead of the
default. All arguments specified after --login are considered argv[] of
the new process and not parsed by the library.

Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
2012-03-24 18:10:55 +01:00
David Herrmann
d98dba57d3 pty: fix log statements
Remove new-lines and add LOG_SUBSYSTEM.

Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
2012-03-24 17:44:42 +01:00
David Herrmann
4b9bc46226 Fix some signed/unsigned warnings
Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
2012-03-24 17:04:42 +01:00
David Herrmann
4790d9f7ab eloop: move prefix to "ev_" instead of "kmscon_"
The long "kmscon_" prefix is horrible so move everything to "ev_" now.

Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
2012-03-20 19:08:29 +01:00
Ran Benita
d8cf293c94 build: implicitly include config.h
config.h is meant to be around in all files, as it contains stuff like
_GNU_SOURCE, NDEBUG and HAVE_*.

Make these definitions available without needing to #include config.h
every single time.

Signed-off-by: Ran Benita <ran234@gmail.com>
Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
2012-03-20 19:00:16 +01:00
David Herrmann
7a31fa98d6 pty: avoid 4KB buffers on the stack
Allocate the IO-buffer dynamically on the heap for every pty object to
avoid 4KB objects on the stack. This may not be a problem now but we
might get stack overflows later if we continue to use such huge arrays
on the stack.

This doesn't affect the runtime performance as the buffer is still
allocated only once on pty-creation.

Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
2012-01-30 22:01:32 +01:00
Ran Benita
9d4cd66631 pty: increase input buffer size
Increase the buffer size to match the kernel's. This should guarantee
(practically) that we read() everything queued up for us.

This speeds us up considerably when running something like
$ find /
Such a process spends most of its time blocking on write() waiting for
us. By increasing the buffer size we avoid repeated
read pty -> draw screen -> read pty
cycles, which take most of our time.

To time it, before:
real  0m22.588s
user  0m00.000s
sys   0m00.020s

After:
real  0m00.680s
user  0m00.023s
sys   0m00.000s

Signed-off-by: Ran Benita <ran234@gmail.com>
Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
2012-01-30 20:51:27 +01:00
David Herrmann
f63eaffc95 pty: remove unneeded variable in setup_child
We can use "ret" instead of "saved_errno" here.

Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
2012-01-28 17:43:26 +01:00
David Herrmann
d8d0e24a22 pty: move fork_pty_child to setup_child
The name fork_pty_child was misleading. It doesn't fork at all but
instead sets up the child's environment.

Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
2012-01-28 17:39:20 +01:00
David Herrmann
31fc374065 pty: avoid FIONREAD ioctl
This ioctl is really not needed and performs needles kernel context
switches. We can simply read into our buffer without checking how many
data is available.

Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
2012-01-28 17:23:49 +01:00
David Herrmann
229b4bfde2 pty: buffer data between pty and child
If the child returns EWOULDBLOCK on write we need to save the input in a
buffer to avoid loosing data. We need to work in non-blocking mode to
avoid UI hangs so we simply use the new ring-buffer object to store
data.

This also changes the callback behavior. The pty is no longer closed
implicitely so the owner must call pty_close now even if the close
callback is called. This avoids circular callbacks.

Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
2012-01-28 17:17:20 +01:00
David Herrmann
ecb7ddbc29 pty: merge input and close callbacks
There is no reason to keep two callbacks as the caller always registers
both. Hence, we can use a shared callback. Reading length 0 means closed
like reading from an fd.

Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
2012-01-28 14:03:52 +01:00
David Herrmann
da0623c260 terminal, pty: pass eloop reference on obj creation
There is no reason to pass the eloop reference late at terminal/pty
open. If we pass it early on object creation we will always have a valid
reference and can remove several code paths.

Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
2012-01-28 13:56:13 +01:00
David Herrmann
9b4c6c5542 pty: move output_cb to input_cb
The output_cb handles output from the pty but it actually makes more
sense to call it input_cb as we are handling input to our console here.

Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
2012-01-28 13:45:06 +01:00
David Herrmann
cda62d3e60 pty: move pty_input to pty_write
pty_write actually makes more sense as we are writing to the other end
and not reading input.

Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
2012-01-28 13:44:25 +01:00