X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=util.c;h=f9eae6bba1e8818b7d56c8174664f33626975c7c;hp=f3161bd7f3e888b4a4b34e8ded2b1a4fde652f13;hb=601f6a1e820462b1df6ff632d112bef241d556b1;hpb=4fc935cad4026516035e16484fd359c778ec0acb diff --git a/util.c b/util.c index f3161bd7f..f9eae6bba 100644 --- a/util.c +++ b/util.c @@ -34,6 +34,9 @@ #include #include #include +#include +#include +#include #include "macro.h" #include "util.h" @@ -1294,6 +1297,31 @@ bool fstype_is_network(const char *fstype) { return false; } +int chvt(int vt) { + int fd, r = 0; + + if ((fd = open("/dev/tty0", O_RDWR|O_NOCTTY|O_CLOEXEC)) < 0) + return -errno; + + if (vt < 0) { + int tiocl[2] = { + TIOCL_GETKMSGREDIRECT, + 0 + }; + + if (ioctl(fd, TIOCLINUX, tiocl) < 0) + return -errno; + + vt = tiocl[0] <= 0 ? 1 : tiocl[0]; + } + + if (ioctl(fd, VT_ACTIVATE, vt) < 0) + r = -errno; + + close_nointr(r); + return r; +} + static const char *const ioprio_class_table[] = { [IOPRIO_CLASS_NONE] = "none", [IOPRIO_CLASS_RT] = "realtime",