On Sun, Apr  3, 2011 at 15:03:32 +0100, Jurij Smakov wrote:

> >From d3f29283db9d58ad5b1702f66f9da15df6881526 Mon Sep 17 00:00:00 2001
> From: Jurij Smakov <[email protected]>
> Date: Sun, 27 Mar 2011 20:14:56 +0100
> Subject: [PATCH] Use TIOCGDEV ioctl to find real serial console device on 
> Linux.
> 
> Kernels >= 2.6.38 support TIOCGDEV ioctl, which allows to unambigously
> determine the real device corresponding to /dev/console. This change
> adds support to using if for real console device detection to
> rootskel.
> ---
>  debian/changelog                  |    2 ++
>  src/sbin/Makefile                 |   10 +++++++---
>  src/sbin/get-real-console-linux.c |   34 ++++++++++++++++++++++++++++++++++
>  src/sbin/reopen-console-linux     |    8 +++++++-
>  4 files changed, 50 insertions(+), 4 deletions(-)
>  create mode 100644 src/sbin/get-real-console-linux.c
> 
> diff --git a/debian/changelog b/debian/changelog
> index 487f4c0..e7e31f7 100644
> --- a/debian/changelog
> +++ b/debian/changelog
> @@ -7,6 +7,8 @@ rootskel (1.94) UNRELEASED; urgency=low
>    [ Jurij Smakov ]
>    * Set DEB_HOST_ARCH_OS in src/Makefile to make sure that everything builds
>      correctly without help from dpkg-buildpackage.
> +  * Switch to using TIOCGDEV ioctl for detection of the real console for
> +    kernels >= 2.6.38.
>  
>   -- Samuel Thibault <[email protected]>  Sat, 19 Mar 2011 20:21:40 +0100
>  
> diff --git a/src/sbin/Makefile b/src/sbin/Makefile
> index 64c91d3..dec554e 100644
> --- a/src/sbin/Makefile
> +++ b/src/sbin/Makefile
> @@ -13,22 +13,26 @@ files_exec = \
>  
>  ifeq ($(DEB_HOST_ARCH_OS),linux)
>    files_exec += \
> -     console-type
> +     console-type \
> +     get-real-console-linux
>  endif
>  
>  console-type: console-type.c
>       gcc -Os -Wall console-type.c -o console-type
>  
> +get-real-console-linux:
> +     gcc -Os -Wall get-real-console-linux.c -o get-real-console-linux
> +
>  steal-ctty: steal-ctty.c
>       gcc -Os -Wall steal-ctty.c -o steal-ctty
>  
>  ifeq ($(DEB_HOST_ARCH_OS),linux)
> -build: console-type steal-ctty
> +build: console-type get-real-console-linux steal-ctty
>  else
>  build: steal-ctty
>  endif
>  
>  clean:
> -     rm -f console-type steal-ctty
> +     rm -f console-type get-real-console-linux steal-ctty
>  
>  include ../../Makefile.inc
> diff --git a/src/sbin/get-real-console-linux.c 
> b/src/sbin/get-real-console-linux.c
> new file mode 100644
> index 0000000..89c3a24
> --- /dev/null
> +++ b/src/sbin/get-real-console-linux.c
> @@ -0,0 +1,34 @@
> +/*
> + * Licensed under GPLv2
> + *
> + * Print out major:minor number of the real console device,
> + * using the TIOCGDEV ioctl (only works on kernels >= 2.6.38).
> + * 
> + * Copyright (c) 2011 Jurij Smakov <[email protected]>
> + */
> +
> +#include <stdio.h>
> +#include <sys/ioctl.h>
> +#include <sys/types.h>
> +#include <sys/stat.h>
> +#include <fcntl.h>
> +
> +#define TIOCGDEV        _IOR('T', 0x32, unsigned int)
> +

the define shouldn't be needed if you build-depend on
'linux-libc-dev (>= 2.6.38) [linux-any]'.

> +int main()
> +{
> +    int fd = 0;
> +    unsigned int dev;
> +       
> +    fd = open("/dev/console", O_WRONLY, 0);
> +    if (fd < 0) {
> +        perror("open");
> +        return(1);
> +    }
> +    if (ioctl(fd, TIOCGDEV, &dev) < 0) {
> +        perror("ioctl");
> +        return(2);
> +    }
> +    printf("%d:%d\n", major(dev), minor(dev));
> +    return(0);
> +}
> diff --git a/src/sbin/reopen-console-linux b/src/sbin/reopen-console-linux
> index 4e65a13..9062a8a 100755
> --- a/src/sbin/reopen-console-linux
> +++ b/src/sbin/reopen-console-linux
> @@ -14,9 +14,15 @@ if ! [ -f /var/run/console-device ]; then
>               console="$(dmesg -s 65535 |
>                       sed -n -r -e 's/(.*\])? *console handover: boot \[.*\] 
> -> real \[(.*)\]$/\2/p')"
>               ;;
> -         *) # >=2.6.32
> +         2.6.3[234567]*)
>               console="$(dmesg -s 65535 |
>                       sed -n -r -e 's/(.*\])? *console \[(.*)\] enabled, 
> bootconsole disabled$/\2/p')"
> +             ;;
> +         *) # >= 2.6.38
> +             console_major_minor="$(get-real-console-linux)"
> +             console_raw="$(readlink "/sys/dev/char/${console_major_minor}")"
> +             console="${console_raw##*/}"
> +             ;;
>       esac
>  
>       # Except if it is the wrong type...

Looks sane to me other than that minor nit, fwiw.

Cheers,
Julien


-- 
To UNSUBSCRIBE, email to [email protected]
with a subject of "unsubscribe". Trouble? Contact [email protected]
Archive: http://lists.debian.org/[email protected]

Reply via email to