Hi Alexey,

The console-setup package in Debian needs a way to check for the
text/graphics mode of the active VT (from a shell script).  This can be
done with “setfont -v -o /dev/null”, for example, but that isn’t very
elegant.  Julien Cristau has proposed a small utility (which I’m calling
“vt_mode” for now) to report this information in a canonical fashion.

I’ve adapted it to kbd; see attachment.  Do you think this code is
suitable for inclusion?  If so, I am going to integrate it into the
build system and write a short man page for it, so I can send you a
proper patch.  I’d like to hear your opinion!

All the best,
-- 
Michael Schutte                   | michi@{uiae.at,debian.org}
Innsbruck, Austria                | happily accepting encrypted mail
OpenPGP: 0x16fb 517b a866 c3f6 8f11 1485 f3e4 122f 1D8C 261A
/*
 * vt_mode: report VT mode (text or graphics)
 *
 * Contributed by Julien Cristau <jcris...@debian.org> in
 *   http://bugs.debian.org/618573;
 * adapted to kbd by Michael Schutte <mi...@debian.org>.
 */

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <linux/kd.h>
#include <getopt.h>
#include "getfd.h"
#include "nls.h"
#include "version.h"

static void attr_noreturn
usage(int code) {
        fprintf(stderr, _("Usage: vt_mode [-C DEVICE]\n"));
        exit(code);
}

int
main(int argc, char *argv[]) {
        int fd, rc, mode, c;
        char *console = NULL;

        set_progname(argv[0]);
#ifndef __klibc__
        setlocale(LC_ALL, "");
        bindtextdomain(PACKAGE_NAME, LOCALEDIR);
        textdomain(PACKAGE_NAME);
#endif

        while ((c = getopt(argc, argv, "C:hV")) != EOF) {
                switch (c) {
                case 'C':
                        if (optarg == NULL || optarg[0] == '\0')
                                usage(1);
                        console = optarg;
                        break;
                case 'h':
                        usage(0);
                        break;
                case 'V':
                        print_version_and_exit();
                        break;
                default:
                        usage(1);
                }
        }

        fd = getfd(console);

        rc = ioctl(fd, KDGETMODE, &mode);
        if (rc < 0) {
                fprintf(stderr, _("%s: Error reading VT mode.\n"), progname);
                return 1;
        }

        switch (mode) {
        case KD_TEXT:
                printf("text\n");
                break;
        case KD_GRAPHICS:
                printf("graphics\n");
                break;
        default:
                printf("other (%d)\n", mode);
                break;
        }

        return 0;
}

Attachment: signature.asc
Description: Digital signature

Reply via email to