Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 524b3a0c authored by Elliott Hughes's avatar Elliott Hughes Committed by Gerrit Code Review
Browse files

Merge "Remove obsolete 'setconsole' command."

parents 7cd15614 c1e91b00
Loading
Loading
Loading
Loading
+0 −1
Original line number Diff line number Diff line
@@ -12,7 +12,6 @@ TOOLS := \
	rmmod \
	lsmod \
	ifconfig \
	setconsole \
	rm \
	mkdir \
	rmdir \

toolbox/setconsole.c

deleted100644 → 0
+0 −161
Original line number Diff line number Diff line
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <string.h>
#include <linux/kd.h>
#include <linux/vt.h>
#include <errno.h>
#include <pthread.h>
#include <unistd.h>
#include <sys/ioctl.h>

static int activate_thread_switch_vc;
static void *activate_thread(void *arg)
{
    int fd = (int) (uintptr_t) arg;
    while(activate_thread_switch_vc >= 0) {
        int res = TEMP_FAILURE_RETRY(ioctl(fd, VT_ACTIVATE, activate_thread_switch_vc));
        if (res < 0) {
            fprintf(stderr, "ioctl( vcfd, VT_ACTIVATE, vtnum) failed, %d %d %s for %d\n", res, errno, strerror(errno), activate_thread_switch_vc);
        }
        if(activate_thread_switch_vc >= 0)
            sleep(1);
    }
    return NULL;
}


int setconsole_main(int argc, char *argv[])
{
    int c;
    int fd;
    int res;

    int mode = -1;
    int new_vc = 0;
    int close_vc = 0;
    int switch_vc = -1;
    int printvc = 0;
    char *ttydev = "/dev/tty0";

    do {
        c = getopt(argc, argv, "d:gtncv:poh");
        if (c == EOF)
            break;
        switch (c) {
        case 'd':
            ttydev = optarg;
            break;
        case 'g':
            if(mode == KD_TEXT) {
                fprintf(stderr, "%s: cannot specify both -g and -t\n", argv[0]);
                exit(1);
            }
            mode = KD_GRAPHICS;
            break;
        case 't':
            if(mode == KD_GRAPHICS) {
                fprintf(stderr, "%s: cannot specify both -g and -t\n", argv[0]);
                exit(1);
            }
            mode = KD_TEXT;
            break;
        case 'n':
            new_vc = 1;
            break;
        case 'c':
            close_vc = 1;
            break;
        case 'v':
            switch_vc = atoi(optarg);
            break;
        case 'p':
            printvc |= 1;
            break;
        case 'o':
            printvc |= 2;
            break;
        case 'h':
            fprintf(stderr, "%s [-d <dev>] [-v <vc>] [-gtncpoh]\n"
                    "  -d <dev>   Use <dev> instead of /dev/tty0\n"
                    "  -v <vc>    Switch to virtual console <vc>\n"
                    "  -g         Switch to graphics mode\n"
                    "  -t         Switch to text mode\n"
                    "  -n         Create and switch to new virtual console\n"
                    "  -c         Close unused virtual consoles\n"
                    "  -p         Print new virtual console\n"
                    "  -o         Print old virtual console\n"
                    "  -h         Print help\n", argv[0]);
            return -1;
        case '?':
            fprintf(stderr, "%s: invalid option -%c\n",
                argv[0], optopt);
            exit(1);
        }
    } while (1);
    if(mode == -1 && new_vc == 0 && close_vc == 0 && switch_vc == -1 && printvc == 0) {
        fprintf(stderr,"%s [-d <dev>] [-v <vc>] [-gtncpoh]\n", argv[0]);
        return -1;
    }

    fd = open(ttydev, O_RDWR | O_SYNC);
    if (fd < 0) {
        fprintf(stderr, "cannot open %s\n", ttydev);
        return -1;
    }

    if ((printvc && !new_vc) || (printvc & 2)) {
        struct vt_stat vs;

        res = ioctl(fd, VT_GETSTATE, &vs);
        if (res < 0) {
            fprintf(stderr, "ioctl(vcfd, VT_GETSTATE, &vs) failed, %d\n", res);
        }
        printf("%d\n", vs.v_active);
    }

    if (new_vc) {
        int vtnum;
        res = ioctl(fd, VT_OPENQRY, &vtnum);
        if (res < 0 || vtnum == -1) {
            fprintf(stderr, "ioctl(vcfd, VT_OPENQRY, &vtnum) failed, res %d, vtnum %d\n", res, vtnum);
        }
        switch_vc = vtnum;
    }
    if (switch_vc != -1) {
        pthread_t thread;
        pthread_attr_t attr;
        activate_thread_switch_vc = switch_vc;
        pthread_attr_init(&attr);
        pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
        pthread_create(&thread, &attr, activate_thread, (void*) (uintptr_t) fd);

        res = TEMP_FAILURE_RETRY(ioctl(fd, VT_WAITACTIVE, switch_vc));
        activate_thread_switch_vc = -1;
        if (res < 0) {
            fprintf(stderr, "ioctl( vcfd, VT_WAITACTIVE, vtnum) failed, %d %d %s for %d\n", res, errno, strerror(errno), switch_vc);
        }
        if(printvc & 1)
            printf("%d\n", switch_vc);

        close(fd);
        fd = open(ttydev, O_RDWR | O_SYNC);
        if (fd < 0) {
            fprintf(stderr, "cannot open %s\n", ttydev);
            return -1;
        }
    }
    if (close_vc) {
        res = ioctl(fd, VT_DISALLOCATE, 0);
        if (res < 0) {
            fprintf(stderr, "ioctl(vcfd, VT_DISALLOCATE, 0) failed, %d\n", res);
        }
    }
    if (mode != -1) {
        if (ioctl(fd, KDSETMODE, mode) < 0) {
            fprintf(stderr, "KDSETMODE %d failed\n", mode);
            return -1;
        }
    }
    return 0;
}