120 lines
2.4 KiB
TeX
120 lines
2.4 KiB
TeX
\chapter{Hardware}
|
|
\label{chap:hardware}
|
|
|
|
|
|
|
|
\section{Diagnostics}
|
|
|
|
dmesg, lshw, lsusb, lspci\dots
|
|
|
|
% -----------------------------------------------------------
|
|
\section{Ports série}
|
|
\index{rs232}
|
|
|
|
Comment détecter si un \textit{device} correspond bien
|
|
à un port série ?
|
|
|
|
\begin{lstlisting}[language=C]
|
|
#include <stdio.h>
|
|
#include <fcntl.h>
|
|
#include <termios.h>
|
|
|
|
#define TTY "/dev/ttyS18"
|
|
|
|
int main(void) {
|
|
int fd = open(TTY, O_RDWR | O_NOCTTY);
|
|
if (fd < 0) {
|
|
perror("open " TTY);
|
|
return 1;
|
|
}
|
|
|
|
struct termios tio;
|
|
if (tcgetattr(fd, &tio)) {
|
|
perror("tcgetattr " TTY);
|
|
return 1;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
\end{lstlisting}
|
|
|
|
|
|
|
|
% -----------------------------------------------------------
|
|
|
|
|
|
\section{Disques durs}
|
|
|
|
Iozone ? Bonnie ? Smart\index{smart} ?
|
|
|
|
\section{Interface réseaux}
|
|
|
|
On a parfois besoin de savoir dans quel état est une interface
|
|
réseau (\textsc{up}, \textsc{running} dans la sortie de ifconfig).
|
|
Parfois, je n'aime pas trop \textit{parser} celle-ci à grand
|
|
coup de \textit{regexp}\index{regexp}, en particulier dans un
|
|
contexte de type Busybox\index{busybox}. Et pour ce cas-là, je
|
|
préfère utiliser un binaire brassé à la maison, et dont voici
|
|
un fragment de source :
|
|
|
|
|
|
\begin{lstlisting}[language=C]
|
|
int get_if_flags(char *ifname, short *p_flags)
|
|
{
|
|
int fd;
|
|
int retcode;
|
|
struct ifreq req;
|
|
|
|
#if DEBUG_LEVEL
|
|
fprintf(stderr, ">>> %s \"%s\" to %p\n", \
|
|
__func__, ifname, p_flags);
|
|
#endif
|
|
|
|
/* Sanity check */
|
|
if ( strlen(ifname) > (IFNAMSIZ-1) )
|
|
{
|
|
fprintf(stderr, "name %s to long\n", ifname);
|
|
abort();
|
|
}
|
|
|
|
fd = socket(PF_INET, SOCK_DGRAM, 0);
|
|
if (fd < 0)
|
|
{
|
|
perror("socket bla...");
|
|
return -2;
|
|
}
|
|
|
|
/* populate the struct for the request */
|
|
memset(&req, 0, sizeof(req));
|
|
strcpy(req.ifr_name, ifname);
|
|
|
|
/* do the call */
|
|
retcode = ioctl(fd, SIOCGIFFLAGS, &req);
|
|
if (retcode < 0)
|
|
{
|
|
perror("ioctl SIOCGIFFLAGS");
|
|
close(fd);
|
|
return -1;
|
|
}
|
|
#if DEBUG_LEVEL
|
|
/* display the result */
|
|
fprintf(stderr, "flags = 0x%04x\n", req.ifr_flags);
|
|
#endif
|
|
|
|
close(fd);
|
|
|
|
*p_flags = req.ifr_flags;
|
|
return 0;
|
|
}
|
|
\end{lstlisting}
|
|
|
|
Hélas, je n'ai pas pu trop tester ce truc sur beaucoup de systèmes,
|
|
et je vous propose de ne pas trop lui faire confiance pour une
|
|
application critique...
|
|
|
|
|
|
|
|
|
|
|
|
|