#include #include #include #include #include #include #include #include #include #include "getfd.h" #include "nls.h" #include "version.h" #define RETURN_BASE 100 #define GETMODE 10 #define GKBMODE 20 #define GKBMETA 30 static void attr_noreturn usage(int code) { fprintf(stderr, _("Usage: kbdinfo [-C DEVICE] GETMODE | GKBMODE | GKBMETA\n")); exit(code); } int main(int argc, char *argv[]) { int fd, mode, c, rc; int quiet = 0; char *console = NULL; set_progname(argv[0]); setlocale(LC_ALL, ""); bindtextdomain(PACKAGE_NAME, LOCALEDIR); textdomain(PACKAGE_NAME); while ((c = getopt(argc, argv, "C:qhV")) != EOF) { switch (c) { case 'C': if (optarg == NULL || optarg[0] == '\0') usage(1); console = optarg; break; case 'q': quiet = 1; break; case 'V': print_version_and_exit(); break; case 'h': usage(0); break; default: usage(1); } } if (argc == optind) usage(1); fd = getfd(console); rc = EXIT_FAILURE; #define answer(typ,text,code) { \ if (!quiet) \ printf("%s\n", text); \ rc = (RETURN_BASE + typ + code); \ }; if (!strcasecmp("GETMODE", argv[optind])) { if (ioctl(fd, KDGETMODE, &mode) == -1) error(EXIT_FAILURE, errno, "ioctl"); switch (mode) { case KD_TEXT: answer(GETMODE, "text", 1); break; case KD_GRAPHICS: answer(GETMODE, "graphics", 2); break; } return rc; } if (!strcasecmp("GKBMODE", argv[optind])) { if (ioctl(fd, KDGKBMODE, &mode) == -1) error(EXIT_FAILURE, errno, "ioctl"); switch (mode) { case K_RAW: answer(GKBMODE, "raw", 1); break; case K_XLATE: answer(GKBMODE, "xlate", 2); break; case K_MEDIUMRAW: answer(GKBMODE, "mediumraw", 3); break; case K_UNICODE: answer(GKBMODE, "unicode", 4); break; } return rc; } if (!strcasecmp("GKBMETA", argv[optind])) { if (ioctl(fd, KDGKBMETA, &mode) == -1) error(EXIT_FAILURE, errno, "ioctl"); switch (mode) { case K_METABIT: answer(GKBMETA, "metabit", 1); break; case K_ESCPREFIX: answer(GKBMETA, "escprefix", 2); break; } return rc; } return rc; }