linux/fs/proc/consoles.c
<<
>>
Prefs
   1/*
   2 * Copyright (c) 2010 Werner Fink, Jiri Slaby
   3 *
   4 * Licensed under GPLv2
   5 */
   6
   7#include <linux/console.h>
   8#include <linux/kernel.h>
   9#include <linux/proc_fs.h>
  10#include <linux/seq_file.h>
  11#include <linux/tty_driver.h>
  12
  13/*
  14 * This is handler for /proc/consoles
  15 */
  16static int show_console_dev(struct seq_file *m, void *v)
  17{
  18        static const struct {
  19                short flag;
  20                char name;
  21        } con_flags[] = {
  22                { CON_ENABLED,          'E' },
  23                { CON_CONSDEV,          'C' },
  24                { CON_BOOT,             'B' },
  25                { CON_PRINTBUFFER,      'p' },
  26                { CON_BRL,              'b' },
  27                { CON_ANYTIME,          'a' },
  28        };
  29        char flags[ARRAY_SIZE(con_flags) + 1];
  30        struct console *con = v;
  31        unsigned int a;
  32        dev_t dev = 0;
  33
  34        if (con->device) {
  35                const struct tty_driver *driver;
  36                int index;
  37                driver = con->device(con, &index);
  38                if (driver) {
  39                        dev = MKDEV(driver->major, driver->minor_start);
  40                        dev += index;
  41                }
  42        }
  43
  44        for (a = 0; a < ARRAY_SIZE(con_flags); a++)
  45                flags[a] = (con->flags & con_flags[a].flag) ?
  46                        con_flags[a].name : ' ';
  47        flags[a] = 0;
  48
  49        seq_setwidth(m, 21 - 1);
  50        seq_printf(m, "%s%d", con->name, con->index);
  51        seq_pad(m, ' ');
  52        seq_printf(m, "%c%c%c (%s)", con->read ? 'R' : '-',
  53                        con->write ? 'W' : '-', con->unblank ? 'U' : '-',
  54                        flags);
  55        if (dev)
  56                seq_printf(m, " %4d:%d", MAJOR(dev), MINOR(dev));
  57
  58        seq_putc(m, '\n');
  59        return 0;
  60}
  61
  62static void *c_start(struct seq_file *m, loff_t *pos)
  63{
  64        struct console *con;
  65        loff_t off = 0;
  66
  67        console_lock();
  68        for_each_console(con)
  69                if (off++ == *pos)
  70                        break;
  71
  72        return con;
  73}
  74
  75static void *c_next(struct seq_file *m, void *v, loff_t *pos)
  76{
  77        struct console *con = v;
  78        ++*pos;
  79        return con->next;
  80}
  81
  82static void c_stop(struct seq_file *m, void *v)
  83{
  84        console_unlock();
  85}
  86
  87static const struct seq_operations consoles_op = {
  88        .start  = c_start,
  89        .next   = c_next,
  90        .stop   = c_stop,
  91        .show   = show_console_dev
  92};
  93
  94static int __init proc_consoles_init(void)
  95{
  96        proc_create_seq("consoles", 0, NULL, &consoles_op);
  97        return 0;
  98}
  99fs_initcall(proc_consoles_init);
 100