X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=libbb%2Fget_console.c;h=9797ad6f09b3fcd55768a6d306ce62a0f6419665;hb=b6adbf1be29841501cc49917249e85f273e1df7c;hp=794888fa7b2520ce902d48a6cbe64a524977f6de;hpb=c38678d14b87f8e2d4f0d610d0aa61c656f17539;p=oweals%2Fbusybox.git diff --git a/libbb/get_console.c b/libbb/get_console.c index 794888fa7..9797ad6f0 100644 --- a/libbb/get_console.c +++ b/libbb/get_console.c @@ -5,51 +5,22 @@ * Copyright (C) many different people. If you wrote this, please * acknowledge your work. * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * Licensed under GPLv2 or later, see file LICENSE in this tarball for details. */ -#include -#include -#include -#include #include #include "libbb.h" +/* From */ +enum { KDGKBTYPE = 0x4B33 }; /* get keyboard type */ - -/* From */ -static const int KDGKBTYPE = 0x4B33; /* get keyboard type */ -static const int KB_84 = 0x01; -static const int KB_101 = 0x02; /* this is what we always answer */ - -static int is_a_console(int fd) -{ - char arg; - - arg = 0; - return (ioctl(fd, KDGKBTYPE, &arg) == 0 - && ((arg == KB_101) || (arg == KB_84))); -} - -static int open_a_console(char *fnam) +static int open_a_console(const char *fnam) { int fd; - /* try read-only */ + /* try read-write */ fd = open(fnam, O_RDWR); /* if failed, try read-only */ @@ -60,17 +31,6 @@ static int open_a_console(char *fnam) if (fd < 0 && errno == EACCES) fd = open(fnam, O_WRONLY); - /* if failed, fail */ - if (fd < 0) - return -1; - - /* if not a console, fail */ - if (!is_a_console(fd)) { - close(fd); - return -1; - } - - /* success */ return fd; } @@ -78,44 +38,35 @@ static int open_a_console(char *fnam) * Get an fd for use with kbd/console ioctls. * We try several things because opening /dev/console will fail * if someone else used X (which does a chown on /dev/console). - * - * if tty_name is non-NULL, try this one instead. */ int get_console_fd(void) { - int fd; - - if (-1 == (fd = open_a_console("/dev/console"))) - return -1; - else - return fd; - fd = open_a_console(CURRENT_TTY); - if (fd >= 0) - return fd; - - fd = open_a_console(CURRENT_VC); - if (fd >= 0) - return fd; + static const char *const console_names[] = { + DEV_CONSOLE, CURRENT_VC, CURRENT_TTY + }; - fd = open_a_console(CONSOLE_DEV); - if (fd >= 0) - return fd; + int fd; - for (fd = 0; fd < 3; fd++) - if (is_a_console(fd)) - return fd; + for (fd = 2; fd >= 0; fd--) { + int fd4name; + int choice_fd; + char arg; + + fd4name = open_a_console(console_names[fd]); + chk_std: + choice_fd = (fd4name >= 0 ? fd4name : fd); + + arg = 0; + if (ioctl(choice_fd, KDGKBTYPE, &arg) == 0) + return choice_fd; + if (fd4name >= 0) { + close(fd4name); + fd4name = -1; + goto chk_std; + } + } - error_msg("Couldn't get a file descriptor referring to the console"); - return -1; /* total failure */ + bb_error_msg("cannot get file descriptor referring to console"); + return fd; /* total failure */ } - - -/* END CODE */ -/* -Local Variables: -c-file-style: "linux" -c-basic-offset: 4 -tab-width: 4 -End: -*/