diff options
-rw-r--r-- | hwdb.d/60-keyboard.hwdb | 33 | ||||
-rwxr-xr-x | hwdb.d/parse_hwdb.py | 1 | ||||
-rw-r--r-- | src/boot/bootctl.c | 8 | ||||
-rw-r--r-- | src/journal/journald-stream.c | 49 | ||||
-rwxr-xr-x | test/TEST-04-JOURNAL/test-journal.sh | 16 |
5 files changed, 89 insertions, 18 deletions
diff --git a/hwdb.d/60-keyboard.hwdb b/hwdb.d/60-keyboard.hwdb index 15f0a970b6..9227bee7ff 100644 --- a/hwdb.d/60-keyboard.hwdb +++ b/hwdb.d/60-keyboard.hwdb @@ -75,7 +75,13 @@ # XKB_FIXED_VARIANT="" # Examples of such devices: the Yubikey or other key-code generating # devices. -# + +# A device where the scan code to key code mapping is insufficient and +# requires a special key code to symbol configuration may specify that with: +# XKB_FIXED_MODEL="xkbmodel" +# Examples of such devices: Chromebooks where the top row is used for both +# media and F1-F10 keys. + # To update this file, create a new file # /etc/udev/hwdb.d/70-keyboard.hwdb # and add your rules there. To load the new rules execute (as root): @@ -569,21 +575,6 @@ evdev:atkbd:dmi:bvn*:bvr*:bd*:svnHewlett-Packard*:pnHDX9494NR:pvr* KEYBOARD_KEY_d8=!f23 # touchpad off KEYBOARD_KEY_d9=!f22 # touchpad on -# Chromebook 14 -# Top row keys (between ESC and power button) -evdev:atkbd:dmi:bvn*:bvr*:bd*:svnHewlett-Packard*:pnFalco:pvr* - KEYBOARD_KEY_3b=back - KEYBOARD_KEY_3c=forward - KEYBOARD_KEY_3d=refresh - KEYBOARD_KEY_3f=switchvideomode - KEYBOARD_KEY_40=brightnessdown - KEYBOARD_KEY_41=brightnessup - KEYBOARD_KEY_42=mute - KEYBOARD_KEY_43=volumedown - KEYBOARD_KEY_44=volumeup - KEYBOARD_KEY_db=search # Same position as caps lock key on most keyboards - # KEYBOARD_KEY_3e=fullscreen, no defined key sym - # HP EliteBook 725 G2 evdev:atkbd:dmi:bvn*:bvr*:bd*:svnHewlett-Packard*:pnHPLicrice:pvr* # HP ProBook 440 G2 @@ -1733,3 +1724,13 @@ evdev:atkbd:dmi:bvn*:bvr*:bd*:svnLENOVO:pn*:pvrThinkPadT560s # Lenovo ThinkPad X1 Carbon 3rd Gen evdev:atkbd:dmi:bvn*:bvr*:bd*:svnLENOVO:pn*:pvrThinkPadX1Carbon3rd KEYBOARD_LED_CAPSLOCK=0 + +######################### FIXED MODEL DEVICES ############################# +# This section lists devices which require special handling in their key +# code to keysym mapping by setting the xkb model. +# The model must be an xkb compatible model (defined with XKB_FIXED_MODEL). + +# Chromebooks +evdev:atkbd:dmi:bvn*:bvr*:bd*:svnHewlett-Packard*:pnFalco:pvr* +evdev:atkbd:dmi:bvn*:bvr*:bd*:svnAcer*:pnPeppy:pvr* + XKB_FIXED_MODEL="chromebook" diff --git a/hwdb.d/parse_hwdb.py b/hwdb.d/parse_hwdb.py index c558687edc..9a933b82b2 100755 --- a/hwdb.d/parse_hwdb.py +++ b/hwdb.d/parse_hwdb.py @@ -123,6 +123,7 @@ def property_grammar(): ('ID_INPUT_TOUCHPAD_INTEGRATION', Or(('internal', 'external'))), ('XKB_FIXED_LAYOUT', STRING), ('XKB_FIXED_VARIANT', STRING), + ('XKB_FIXED_MODEL', STRING), ('KEYBOARD_LED_NUMLOCK', Literal('0')), ('KEYBOARD_LED_CAPSLOCK', Literal('0')), ('ACCEL_MOUNT_MATRIX', mount_matrix), diff --git a/src/boot/bootctl.c b/src/boot/bootctl.c index 72c2115d89..d8e8d8ce40 100644 --- a/src/boot/bootctl.c +++ b/src/boot/bootctl.c @@ -27,6 +27,7 @@ #include "fs-util.h" #include "locale-util.h" #include "main-func.h" +#include "mkdir.h" #include "pager.h" #include "parse-util.h" #include "pretty-print.h" @@ -1364,6 +1365,13 @@ static int install_random_seed(const char *esp) { if (r < 0) return log_error_errno(r, "Failed to acquire random seed: %m"); + /* Normally create_subdirs() should already have created everything we need, but in case "bootctl + * random-seed" is called we want to just create the minimum we need for it, and not the full + * list. */ + r = mkdir_parents(path, 0755); + if (r < 0) + return log_error_errno(r, "Failed to create parent directory for %s: %m", path); + r = tempfn_random(path, "bootctl", &tmp); if (r < 0) return log_oom(); diff --git a/src/journal/journald-stream.c b/src/journal/journald-stream.c index afebadeccc..22a70ce5a6 100644 --- a/src/journal/journald-stream.c +++ b/src/journal/journald-stream.c @@ -487,11 +487,22 @@ static int stdout_stream_scan(StdoutStream *s, bool force_flush) { } static int stdout_stream_process(sd_event_source *es, int fd, uint32_t revents, void *userdata) { + uint8_t buf[CMSG_SPACE(sizeof(struct ucred))]; StdoutStream *s = userdata; + struct ucred *ucred = NULL; + struct cmsghdr *cmsg; + struct iovec iovec; size_t limit; ssize_t l; int r; + struct msghdr msghdr = { + .msg_iov = &iovec, + .msg_iovlen = 1, + .msg_control = buf, + .msg_controllen = sizeof(buf), + }; + assert(s); if ((revents|EPOLLIN|EPOLLHUP) != (EPOLLIN|EPOLLHUP)) { @@ -511,20 +522,50 @@ static int stdout_stream_process(sd_event_source *es, int fd, uint32_t revents, * always leave room for a terminating NUL we might need to add. */ limit = MIN(s->allocated - 1, s->server->line_max); - l = read(s->fd, s->buffer + s->length, limit - s->length); + iovec = IOVEC_MAKE(s->buffer + s->length, limit - s->length); + + l = recvmsg(s->fd, &msghdr, MSG_DONTWAIT|MSG_CMSG_CLOEXEC); if (l < 0) { - if (errno == EAGAIN) + if (IN_SET(errno, EINTR, EAGAIN)) return 0; log_warning_errno(errno, "Failed to read from stream: %m"); goto terminate; } + cmsg_close_all(&msghdr); if (l == 0) { stdout_stream_scan(s, true); goto terminate; } + CMSG_FOREACH(cmsg, &msghdr) + if (cmsg->cmsg_level == SOL_SOCKET && + cmsg->cmsg_type == SCM_CREDENTIALS && + cmsg->cmsg_len == CMSG_LEN(sizeof(struct ucred))) { + ucred = (struct ucred *)CMSG_DATA(cmsg); + break; + } + + /* Invalidate the context if the pid of the sender changed. + * This happens when a forked process inherits stdout / stderr + * from a parent. In this case getpeercred returns the ucred + * of the parent, which can be invalid if the parent has exited + * in the meantime. + */ + if (ucred && ucred->pid != s->ucred.pid) { + /* force out any previously half-written lines from a + * different process, before we switch to the new ucred + * structure for everything we just added */ + r = stdout_stream_scan(s, true); + if (r < 0) + goto terminate; + + s->ucred = *ucred; + client_context_release(s->server, s->context); + s->context = NULL; + } + s->length += l; r = stdout_stream_scan(s, false); if (r < 0) @@ -562,6 +603,10 @@ int stdout_stream_install(Server *s, int fd, StdoutStream **ret) { if (r < 0) return log_error_errno(r, "Failed to determine peer credentials: %m"); + r = setsockopt_int(fd, SOL_SOCKET, SO_PASSCRED, true); + if (r < 0) + return log_error_errno(r, "SO_PASSCRED failed: %m"); + if (mac_selinux_use()) { r = getpeersec(fd, &stream->label); if (r < 0 && r != -EOPNOTSUPP) diff --git a/test/TEST-04-JOURNAL/test-journal.sh b/test/TEST-04-JOURNAL/test-journal.sh index 4e539aa151..de27eb0064 100755 --- a/test/TEST-04-JOURNAL/test-journal.sh +++ b/test/TEST-04-JOURNAL/test-journal.sh @@ -74,6 +74,22 @@ cmp /expected /output { journalctl -ball -b -m 2>&1 || :; } | head -1 > /output cmp /expected /output +# https://github.com/systemd/systemd/issues/13708 +ID=$(systemd-id128 new) +systemd-cat -t "$ID" bash -c 'echo parent; (echo child) & wait' & +PID=$! +wait %% +journalctl --sync +# We can drop this grep when https://github.com/systemd/systemd/issues/13937 +# has a fix. +journalctl -b -o export -t "$ID" --output-fields=_PID | grep '^_PID=' >/output +[[ `grep -c . /output` -eq 2 ]] +grep -q "^_PID=$PID" /output +grep -vq "^_PID=$PID" /output + +# Add new tests before here, the journald restarts below +# may make tests flappy. + # Don't lose streams on restart systemctl start forever-print-hola sleep 3 |