From 5e1a84ab74d5e97582427f016f291a8c11e66f99 Mon Sep 17 00:00:00 2001 From: jutteau Date: Fri, 11 May 2007 18:10:19 +0000 Subject: Completion du script de mise à jour de la pc-104 : * Ajout des sources de busybox dans ./conf/busybox/ * Ajout d'un fichier réclamé par les script dans ./conf/busybox.links --- i/pc104/initrd/conf/busybox/libbb/get_console.c | 72 +++++++++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100644 i/pc104/initrd/conf/busybox/libbb/get_console.c (limited to 'i/pc104/initrd/conf/busybox/libbb/get_console.c') diff --git a/i/pc104/initrd/conf/busybox/libbb/get_console.c b/i/pc104/initrd/conf/busybox/libbb/get_console.c new file mode 100644 index 0000000..42ee137 --- /dev/null +++ b/i/pc104/initrd/conf/busybox/libbb/get_console.c @@ -0,0 +1,72 @@ +/* vi: set sw=4 ts=4: */ +/* + * Utility routines. + * + * Copyright (C) many different people. If you wrote this, please + * acknowledge your work. + * + * Licensed under GPLv2 or later, see file LICENSE in this tarball for details. + */ + +#include +#include "libbb.h" + + +/* From */ +enum { KDGKBTYPE = 0x4B33 }; /* get keyboard type */ + + +static int open_a_console(const char *fnam) +{ + int fd; + + /* try read-write */ + fd = open(fnam, O_RDWR); + + /* if failed, try read-only */ + if (fd < 0 && errno == EACCES) + fd = open(fnam, O_RDONLY); + + /* if failed, try write-only */ + if (fd < 0 && errno == EACCES) + fd = open(fnam, O_WRONLY); + + return fd; +} + +/* + * 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). + */ + +int get_console_fd(void) +{ + static const char *const console_names[] = { + DEV_CONSOLE, CURRENT_VC, CURRENT_TTY + }; + + int fd; + + for (fd = 2; fd >= 0; fd--) { + int fd4name; + int choise_fd; + char arg; + + fd4name = open_a_console(console_names[fd]); + chk_std: + choise_fd = (fd4name >= 0 ? fd4name : fd); + + arg = 0; + if (ioctl(choise_fd, KDGKBTYPE, &arg) == 0) + return choise_fd; + if(fd4name >= 0) { + close(fd4name); + fd4name = -1; + goto chk_std; + } + } + + bb_error_msg("cannot get file descriptor referring to console"); + return fd; /* total failure */ +} -- cgit v1.2.3