mirror of
https://github.com/hyprwm/wlroots-hyprland.git
synced 2024-11-22 21:05:58 +01:00
backend/session/freebsd: Fix the way to get TTY path
Previously, the path of TTY is generated using snprintf with %d format. It works with TTY 1 to 10, but fails with TTY with greater number because the number used in the name is in base 32 instead of base 10. Since there is no standard function to convert a number to a string with a custom base, this commit adds a function to do it. Fixes: https://github.com/swaywm/wlroots/issues/1854
This commit is contained in:
parent
01818ad2c8
commit
fc6c0ca12e
1 changed files with 49 additions and 1 deletions
|
@ -139,6 +139,51 @@ static int vt_handler(int signo, void *data) {
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool get_tty_path(int tty, char path[static 11], size_t len) {
|
||||||
|
assert(tty > 0);
|
||||||
|
|
||||||
|
const char prefix[] = "/dev/ttyv";
|
||||||
|
static_assert(sizeof(prefix) + 1 <= 11, "TTY path prefix is too long");
|
||||||
|
|
||||||
|
const size_t prefix_len = sizeof(prefix) - 1;
|
||||||
|
strcpy(path, prefix);
|
||||||
|
|
||||||
|
size_t offset = prefix_len;
|
||||||
|
const int num = tty - 1;
|
||||||
|
if (num == 0) {
|
||||||
|
path[offset++] = '0';
|
||||||
|
path[offset++] = '\0';
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
const int base = 32;
|
||||||
|
for (int remaning = num; remaning > 0; remaning /= base, offset++) {
|
||||||
|
// Return early if the buffer is too small.
|
||||||
|
if (offset + 1 >= len) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
const int value = remaning % base;
|
||||||
|
if (value >= 10) {
|
||||||
|
path[offset] = 'a' + value - 10;
|
||||||
|
} else {
|
||||||
|
path[offset] = '0' + value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const size_t num_len = offset - prefix_len;
|
||||||
|
for (size_t i = 0; i < num_len / 2; i++) {
|
||||||
|
const size_t p1 = prefix_len + i;
|
||||||
|
const size_t p2 = offset - 1 - i;
|
||||||
|
const char tmp = path[p1];
|
||||||
|
path[p1] = path[p2];
|
||||||
|
path[p2] = tmp;
|
||||||
|
}
|
||||||
|
|
||||||
|
path[offset++] = '\0';
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
static bool setup_tty(struct direct_session *session, struct wl_display *display) {
|
static bool setup_tty(struct direct_session *session, struct wl_display *display) {
|
||||||
int fd = -1, tty = -1, tty0_fd = -1, old_tty = 1;
|
int fd = -1, tty = -1, tty0_fd = -1, old_tty = 1;
|
||||||
if ((tty0_fd = open("/dev/ttyv0", O_RDWR | O_CLOEXEC)) < 0) {
|
if ((tty0_fd = open("/dev/ttyv0", O_RDWR | O_CLOEXEC)) < 0) {
|
||||||
|
@ -155,7 +200,10 @@ static bool setup_tty(struct direct_session *session, struct wl_display *display
|
||||||
}
|
}
|
||||||
close(tty0_fd);
|
close(tty0_fd);
|
||||||
char tty_path[64];
|
char tty_path[64];
|
||||||
snprintf(tty_path, sizeof(tty_path), "/dev/ttyv%d", tty - 1);
|
if (!get_tty_path(tty, tty_path, sizeof(tty_path))) {
|
||||||
|
wlr_log(WLR_ERROR, "Could not get tty %d path", tty);
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
wlr_log(WLR_INFO, "Using tty %s", tty_path);
|
wlr_log(WLR_INFO, "Using tty %s", tty_path);
|
||||||
fd = open(tty_path, O_RDWR | O_NOCTTY | O_CLOEXEC);
|
fd = open(tty_path, O_RDWR | O_NOCTTY | O_CLOEXEC);
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue