Compare commits
4 Commits
d1559793df
...
09d0b46ab6
Author | SHA1 | Date |
---|---|---|
Lorenz Bauer | 09d0b46ab6 | |
Sebastian Wick | d7d31692bf | |
Anita Zhang | d36b573ef7 | |
Lennart Poettering | a4a55e9ace |
|
@ -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"
|
||||
|
|
|
@ -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),
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue