mirror of https://github.com/fairyglade/ly.git
Add display information to utmp log
This change aims to open up a discussion about proper utmp handling,
originally started by cylgom/ly#133. Since I don't know how to handle
Wayland and shell in this particular case.
The original approach didn't work for me, tools such as `w` or
`utmpdump` gave me false information about the TTY and even policykit
didn't see the session as local. I used this command to check the
policy:
pkcheck --action-id org.freedesktop.login1.suspend --process $$ && echo yes
This code is heavily inspired by:
810f9b171f/src/session-child.c (L207)
https://gitlab.gnome.org/GNOME/gdm/blob/master/daemon/gdm-session-record.c
This commit is contained in:
parent
b775f93c22
commit
af90c29a77
46
src/login.c
46
src/login.c
|
|
@ -297,23 +297,20 @@ void env_xdg(const char* tty_id, const enum display_server display_server)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void add_utmp_entry(
|
void add_utmp_entry(struct utmp* entry, pid_t display_pid, char* username, char* tty_id, char* xdisplay) {
|
||||||
struct utmp *entry,
|
char tty_name[6];
|
||||||
char *username,
|
|
||||||
pid_t display_pid
|
|
||||||
) {
|
|
||||||
entry->ut_type = USER_PROCESS;
|
entry->ut_type = USER_PROCESS;
|
||||||
entry->ut_pid = display_pid;
|
entry->ut_pid = display_pid;
|
||||||
strcpy(entry->ut_line, ttyname(STDIN_FILENO) + strlen("/dev/"));
|
snprintf(tty_name, sizeof(tty_name), "tty%d", config.tty);
|
||||||
|
strncpy(entry->ut_line, tty_name, sizeof(entry->ut_line));
|
||||||
/* only correct for ptys named /dev/tty[pqr][0-9a-z] */
|
strncpy(entry->ut_user, username, sizeof(entry->ut_user));
|
||||||
strcpy(entry->ut_id, ttyname(STDIN_FILENO) + strlen("/dev/tty"));
|
if (xdisplay) {
|
||||||
|
strncpy(entry->ut_id, xdisplay, sizeof(entry->ut_id));
|
||||||
|
strncpy(entry->ut_host, xdisplay, sizeof(entry->ut_host));
|
||||||
|
}
|
||||||
|
|
||||||
time((long int *) &entry->ut_time);
|
time((long int *) &entry->ut_time);
|
||||||
|
|
||||||
strncpy(entry->ut_user, username, UT_NAMESIZE);
|
|
||||||
memset(entry->ut_host, 0, UT_HOSTSIZE);
|
|
||||||
entry->ut_addr = 0;
|
|
||||||
setutent();
|
setutent();
|
||||||
|
|
||||||
pututline(entry);
|
pututline(entry);
|
||||||
|
|
@ -366,6 +363,7 @@ void xauth(const char* display_name, const char* shell, const char* dir)
|
||||||
void xorg(
|
void xorg(
|
||||||
struct passwd* pwd,
|
struct passwd* pwd,
|
||||||
const char* vt,
|
const char* vt,
|
||||||
|
const char* display_name,
|
||||||
const char* desktop_cmd)
|
const char* desktop_cmd)
|
||||||
{
|
{
|
||||||
// generate xauthority file
|
// generate xauthority file
|
||||||
|
|
@ -376,9 +374,6 @@ void xorg(
|
||||||
xauth_dir = pwd->pw_dir;
|
xauth_dir = pwd->pw_dir;
|
||||||
}
|
}
|
||||||
|
|
||||||
char display_name[4];
|
|
||||||
|
|
||||||
snprintf(display_name, 3, ":%d", get_free_display());
|
|
||||||
xauth(display_name, pwd->pw_shell, xauth_dir);
|
xauth(display_name, pwd->pw_shell, xauth_dir);
|
||||||
|
|
||||||
// start xorg
|
// start xorg
|
||||||
|
|
@ -572,6 +567,16 @@ void auth(
|
||||||
tb_present();
|
tb_present();
|
||||||
tb_shutdown();
|
tb_shutdown();
|
||||||
|
|
||||||
|
// get a display
|
||||||
|
char tty_id[3];
|
||||||
|
char vt[5];
|
||||||
|
char display_name[4];
|
||||||
|
|
||||||
|
snprintf(tty_id, 3, "%d", config.tty);
|
||||||
|
snprintf(vt, 5, "vt%d", config.tty);
|
||||||
|
// Xorg only?
|
||||||
|
snprintf(display_name, 3, ":%d", get_free_display());
|
||||||
|
|
||||||
// start desktop environment
|
// start desktop environment
|
||||||
pid_t pid = fork();
|
pid_t pid = fork();
|
||||||
|
|
||||||
|
|
@ -602,13 +607,6 @@ void auth(
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
|
|
||||||
// get a display
|
|
||||||
char tty_id [3];
|
|
||||||
char vt[5];
|
|
||||||
|
|
||||||
snprintf(tty_id, 3, "%d", config.tty);
|
|
||||||
snprintf(vt, 5, "vt%d", config.tty);
|
|
||||||
|
|
||||||
// set env
|
// set env
|
||||||
env_init(pwd);
|
env_init(pwd);
|
||||||
|
|
||||||
|
|
@ -653,7 +651,7 @@ void auth(
|
||||||
case DS_XINITRC:
|
case DS_XINITRC:
|
||||||
case DS_XORG:
|
case DS_XORG:
|
||||||
{
|
{
|
||||||
xorg(pwd, vt, desktop->cmd[desktop->cur]);
|
xorg(pwd, vt, display_name, desktop->cmd[desktop->cur]);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -663,7 +661,7 @@ void auth(
|
||||||
|
|
||||||
// add utmp audit
|
// add utmp audit
|
||||||
struct utmp entry;
|
struct utmp entry;
|
||||||
add_utmp_entry(&entry, pwd->pw_name, pid);
|
add_utmp_entry(&entry, pid, pwd->pw_name, tty_id, display_name);
|
||||||
|
|
||||||
// wait for the session to stop
|
// wait for the session to stop
|
||||||
int status;
|
int status;
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue