\documentclass{report}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{textcomp}
\usepackage{geometry}
\geometry{top=15mm, bottom=15mm, left=1cm, right=1cm}
\usepackage[french]{babel}
\usepackage{pslatex}
\usepackage[colorlinks=true,urlcolor=black]{hyperref}
\usepackage{graphicx}
\usepackage{fancyhdr}
\pagestyle{fancy}
\renewcommand{\footrulewidth}{0.4pt}
\fancyfoot[L]{Uubu.fr}
\fancyfoot[R]{mer. févr. 3 10:18:23 CET 2016}
\lfoot{\Large \textit{Uubu.fr}}
\hypersetup{pdfinfo={
Title={vcs},
Author={Sylvain Girod},
Creator={Bash script from uubu.fr's format version 1},
Producer={Bash script and PDFLaTeX},
Subject={Mémoires des consoles virtuelles},
CreationDate={D:20160203101823},
ModDate={D:20160203101823},
Keywords={Linux}
}}
\begin{document}
 
\begin{center}
{\Huge vcs, vcsa }
\end{center}
\vspace{1cm}
 
\begin{flushleft}
 
{\large Mémoires des consoles virtuelles}
 
\vspace{10mm}
 
\hspace{1mm}  /dev/vcs0 est un périphérique caractère de numéro majeur 7 et mineur 0, avec les permissions 0644 et un propriétaire root:tty. Il correspond à la mémoire d'affichage de la console virtuelle en cours d'utilisation.
\vspace{5mm} \\
 
 
\hspace{1mm}  \textbf{/dev/vcs[1-63]} sont des périphériques caractères représentant la mémoire d'affichage des consoles virtuelles. Ils ont un numéro majeur 7 et mineurs de 1 à 63. Ils ont généralement un mode d'accès 0644 et un propriétaire root:tty. Les \textbf{/dev/vcsa[0-63]} sont équivalents mais utilisent des entiers non-signés court (dans l'ordre des octets de l'hôte) qui incluent les attributs, et sont préfixés avec 4 octets indiquant les dimensions de l'écran et la position du curseur: lines, columns, x, x, (x = y = 0 en haut à gauche).
\vspace{5mm} \\
 
 
\hspace{1mm}  Lorsqu'une police à 512 caractères est chargée, la position du 9e bit peut être extraite en appliquant l'opration ioctl(2) VT\_GETHIFONTMASK sur /dev/tty[1-63]; la valeur est renvoyée dans l'entier de type non-signé court pointé par le troisième paramètre de ioctl(2).
\vspace{5mm} \\
 
 
\hspace{1mm}  Ces périphériques remplacent les opérations ioctl(2) screedump des console(4), ainsi l'administrateur peut contrôler les accès en utilisant les permissions du système de fichiers.
\vspace{5mm} \\
 
 
\hspace{1mm} Les périphériques pour les 8 premières consoles virtuelles peuvent être créés ainsi:
 
{\ttfamily
for x in 0 1 2 3 4 5 6 7 8; do\\ \hspace{2mm}mknod -m 644 /dev/vcs\$x c 7 \$x;\\ \hspace{2mm}mknod -m 644 /dev/vcsa\$x c 7 \$\texttt{[}\$x+128\texttt{]};\\ done\\ chown root:tty /dev/vcs*\\
}
\vspace{8mm}
 
\vspace{1cm}{\huge Exemple }
 
\
 
\hspace{1mm} On peut faire un screendump de la console vt3 en basculant sur vt1 et en tapant: \\
\hspace{1mm} \textbf{cat /dev/vcs3 >foo} \\
\hspace{1mm} Noter que la sortie ne contient pas de caractères de retour-chariot, quelques manipulations peuvent être nécessaires comme: \\
\hspace{1mm} \textbf{old -w 81 /dev/vcs3 | lpr} \\
\hspace{1mm} ou \\
\hspace{1mm} \textbf{xetterm -dump 3 -file /proc/self/fd/1} \\
 
\hspace{1mm} Ce programme affiche le caractère et l'attribut d'écran sous le curseur de la seconde console virtuelle, puis y change la couleur de fond:
 
{\ttfamily
\#include <unistd.h>\\ \#include <stdlib.h>\\ \#include <stdio.h>\\ \#include <fcntl.h>\\ \#include <sys/ioctl.h>\\ \#include <linux/vt.h>\\ \hspace{2mm}\\ int\\ main(void)\\ \{\\ \hspace{2mm}int fd;\\ \hspace{2mm}char *device = "/dev/vcsa2";\\ \hspace{2mm}char *console = "/dev/tty2";\\ \hspace{2mm}struct \{unsigned char lines, cols, x, y;\} scrn;\\ \hspace{2mm}unsigned short s;\\ \hspace{2mm}unsigned short mask;\\ \hspace{2mm}unsigned char ch, attrib;\\ \hspace{2mm}\\ \hspace{2mm}fd = open(console, O\_RDWR);\\ \hspace{2mm}if (fd < 0) \{\\ \hspace{2mm}\hspace{2mm}perror(console);\\ \hspace{2mm}\hspace{2mm}exit(EXIT\_FAILURE);\\ \hspace{2mm}\}\\ \hspace{2mm}if (ioctl(fd, VT\_GETHIFONTMASK, \&mask) < 0) \{\\ \hspace{2mm}\hspace{2mm}perror("VT\_GETHIFONTMASK");\\ \hspace{2mm}\hspace{2mm}exit(EXIT\_FAILURE);\\ \hspace{2mm}\}\\ \hspace{2mm}(void) close(fd);\\ \hspace{2mm}fd = open(device, O\_RDWR);\\ \hspace{2mm}if (fd < 0) \{\\ \hspace{2mm}\hspace{2mm}perror(device);\\ \hspace{2mm}\hspace{2mm}exit(EXIT\_FAILURE);\\ \hspace{2mm}\}\\ \hspace{2mm}(void) read(fd, \&scrn, 4);\\ \hspace{2mm}(void) lseek(fd, 4 + 2*(scrn.y*scrn.cols + scrn.x), 0);\\ \hspace{2mm}(void) read(fd, \&s, 2);\\ \hspace{2mm}ch = s \& 0xff;\\ \hspace{2mm}if (attrib \& mask)\\ \hspace{2mm}\hspace{2mm}ch |= 0x100;\\ \hspace{2mm}attrib = ((s \& \textasciitilde mask) >> 8);\\ \hspace{2mm}printf("ch='\%c' attrib=0x\%02x\textbackslash{}n", ch, attrib);\\ \hspace{2mm}attrib \textasciicircum = 0x10;\\ \hspace{2mm}(void) lseek(fd, -1, 1);\\ \hspace{2mm}(void) write(fd, \&attrib, 1);\\ \hspace{2mm}exit(EXIT\_SUCCESS);\\ \}\\
}
\vspace{8mm}
\end{flushleft}
\end{document}
