Allowed arbitrary length uids when setting XDG_RUNTIME_DIR

This commit is contained in:
thomasfsteeples 2022-09-16 22:46:11 +01:00
parent 2ffb86213b
commit f0e38634ef
1 changed files with 24 additions and 8 deletions

View File

@ -257,16 +257,32 @@ void env_xdg_session(const enum display_server display_server)
} }
} }
static unsigned int ilog10(unsigned int n) {
unsigned int res = 0;
while (n >= 10) {
++res;
n /= 10;
}
return res;
}
void env_xdg(const char* tty_id, const char* desktop_name) void env_xdg(const char* tty_id, const char* desktop_name)
{ {
char user[15]; uid_t user_uid = getuid();
snprintf(user, 15, "/run/user/%d", getuid()); char* xdg_runtime_dir_prefix = "/run/user/";
setenv("XDG_RUNTIME_DIR", user, 0); // ilog10(n) + 1 == number of digits in n
setenv("XDG_SESSION_CLASS", "user", 0); unsigned int xdg_runtime_dir_length = strlen(xdg_runtime_dir_prefix) + ilog10(user_uid) + 1;
setenv("XDG_SESSION_ID", "1", 0); char* user = malloc(sizeof(*user) * (xdg_runtime_dir_length + 1));
setenv("XDG_SESSION_DESKTOP", desktop_name, 0); snprintf(user, xdg_runtime_dir_length + 1, "%s%d", xdg_runtime_dir_prefix, user_uid);
setenv("XDG_SEAT", "seat0", 0); setenv("XDG_RUNTIME_DIR", user, 0);
setenv("XDG_VTNR", tty_id, 0); free(user);
user = NULL;
setenv("XDG_SESSION_CLASS", "user", 0);
setenv("XDG_SESSION_ID", "1", 0);
setenv("XDG_SESSION_DESKTOP", desktop_name, 0);
setenv("XDG_SEAT", "seat0", 0);
setenv("XDG_VTNR", tty_id, 0);
} }
void add_utmp_entry( void add_utmp_entry(