Sophie

Sophie

distrib > Mandriva > 9.0 > i586 > by-pkgid > 0d5cd12c82d627a82c59047e1ba7b8a9 > files > 1210

howto-html-fr-9.0-0.2mdk.noarch.rpm

<HTML>
<HEAD>
<TITLE>Exemple de commande de requ&ecirc;te</TITLE>
</HEAD>
<BODY>
<H1>9. <A NAME="s9"></A>Exemple de commande de requ&ecirc;te</H1>
<P>
<A HREF="SCSI-Programming-HOWTO.html#toc9">Contenu de cette section</A></P>

<P>L'une des commandes SCSI de base est <CODE>INQUIRY</CODE>, utilis&eacute;e pour identifier les type et constructeur du p&eacute;riph&eacute;rique. Voici la d&eacute;finition issue de la sp&eacute;cification SCSI-2 (se reporter au standard SCSI-2 pour les d&eacute;tails).</P>
<P>
<BLOCKQUOTE><CODE>
<PRE>
                            Table 44: Commande INQUIRY
+=====-========-========-========-========-========-========-========-========+
|  Bit|   7    |   6    |   5    |   4    |   3    |   2    |   1    |   0    |
|Octet|        |        |        |        |        |        |        |        |
|=====+=======================================================================|
| 0   |                           Code operation (12h)                        |
|-----+-----------------------------------------------------------------------|
| 1   |Numero d'unite logique    |                  Reserve          |  EVPD  |
|-----+-----------------------------------------------------------------------|
| 2   |                           Code page                                   |
|-----+-----------------------------------------------------------------------|
| 3   |                           Reserve                                     |
|-----+-----------------------------------------------------------------------|
| 4   |                           Taille d'allocation                         |
|-----+-----------------------------------------------------------------------|
| 5   |                           Controle                                    |
+=============================================================================+
</PRE>
</CODE></BLOCKQUOTE>
</P>
<P>Les donn&eacute;es en sortie ont l'allure suivante&nbsp;:
<BLOCKQUOTE><CODE>
<PRE>
                   Table 45: Format standard de donnees INQUIRY
+=====-========-========-========-========-========-========-========-========+
|  Bit|   7    |   6    |   5    |   4    |   3    |   2    |   1    |   0    |
|Octet|        |        |        |        |        |        |        |        |
|=====+==========================+============================================|
| 0   | Qualificateur de periph. |           Type de peripherique             |
|-----+-----------------------------------------------------------------------|
| 1   |  RMB   |                  Modificateur de type de peripherique        |
|-----+-----------------------------------------------------------------------|
| 2   |   Version ISO   |       Version ECMA       |  Version approuvee ANSI  |
|-----+-----------------+-----------------------------------------------------|
| 3   |  AENC  | TrmIOP |     Reserve     |   Format de donnees en reponse    |
|-----+-----------------------------------------------------------------------|
| 4   |                    Longueur additionnelle (n-4)                       |
|-----+-----------------------------------------------------------------------|
| 5   |                           Reserve                                     |
|-----+-----------------------------------------------------------------------|
| 6   |                           Reserve                                     |
|-----+-----------------------------------------------------------------------|
| 7   | RelAdr | WBus32 | WBus16 |  Sync  | Linked |Reserve | CmdQue | SftRe  |
|-----+-----------------------------------------------------------------------|
| 8   | (MSB)                                                                 |
|- - -+---                      Identification de constructeur             ---|
| 15  |                                                                 (LSB) |
|-----+-----------------------------------------------------------------------|
| 16  | (MSB)                                                                 |
|- - -+---                      Identification de produit                  ---|
| 31  |                                                                 (LSB) |
|-----+-----------------------------------------------------------------------|
| 32  | (MSB)                                                                 |
|- - -+---                      Niveau de revision du produit              ---|
| 35  |                                                                 (LSB) |
|-----+-----------------------------------------------------------------------|
| 36  |                                                                       |
|- - -+---                      Specifique constructeur                    ---|
| 55  |                                                                       |
|-----+-----------------------------------------------------------------------|
| 56  |                                                                       |
|- - -+---                        Reserve                                  ---|
| 95  |                                                                       |
|=====+=======================================================================|
|     |                       Parametres specifiques constructeur             |
|=====+=======================================================================|
| 96  |                                                                       |
|- - -+---                      Specifique constructeur                    ---|
| n   |                                                                       |
+=============================================================================+
</PRE>
</CODE></BLOCKQUOTE>
</P>
<P>L'exemple qui suit utilise la fonction de bas niveau <CODE>handle_SCSI_cmd</CODE> pour effectuer la commande SCSI INQUIRY.</P>
<P>Tout d'abord, nous ajoutons le bloc de commande &agrave; l'en-t&ecirc;te g&eacute;n&eacute;rique, puis appelons <CODE>handle_SCSI_cmd</CODE>. Notez que l'argument taille de tampon en sortie de l'appel <CODE>handle_SCSI_cmd</CODE> exclut la taille de l'en-t&ecirc;te g&eacute;n&eacute;rique. Apr&egrave;s l'ex&eacute;cution de la commande, le tampon de sortie contient les informations, sauf si une erreur s'est produite.</P>
<P>
<BLOCKQUOTE><CODE>
<PRE>
#define INQUIRY_CMD     0x12
#define INQUIRY_CMDLEN  6
#define INQUIRY_REPLY_LEN 96
#define INQUIRY_VENDOR  8       /* decalage vers le nom du constructeur */

/* recherche du constructeur et du modele */
static unsigned char *Inquiry ( void )
{
  unsigned char Inqbuffer[ SCSI_OFF + INQUIRY_REPLY_LEN ];
  unsigned char cmdblk [ INQUIRY_CMDLEN ] =
      { INQUIRY_CMD,  /* commande                 */
                  0,  /* lun/reserve              */
                  0,  /* code de page             */
                  0,  /* reserve                  */
  INQUIRY_REPLY_LEN,  /* longueur allocation      */
                  0 };/* reserve / drapeau / lien */

  memcpy( cmd + SCSI_OFF, cmdblk, sizeof(cmdblk) );

  /*
   * +------------------+
   * | struct sg_header | &lt;- commande
   * +------------------+
   * | copie de cmdblk  | &lt;- commande + SCSI_OFF
   * +------------------+
   */

  if (handle_SCSI_cmd(sizeof(cmdblk), 0, cmd,
                      sizeof(Inqbuffer) - SCSI_OFF, Inqbuffer )) {
      fprintf( stderr, &quot;La requete a echoue\n&quot; );
      exit(2);
  }
  return (Inqbuffer + SCSI_OFF);
}
</PRE>
</CODE></BLOCKQUOTE>
</P>
<P>L'exemple ci-dessus suit cette structure. La fonction Inquiry recopie son bloc de commande apr&egrave;s l'en-t&ecirc;te g&eacute;n&eacute;rique (donn&eacute; par <CODE>SCSI_OFF</CODE>). Les donn&eacute;es en entr&eacute;e sont absentes de cette commande. <CODE>handle_SCSI_cmd</CODE> d&eacute;finit la structure d'en-t&ecirc;te. Nous pouvons maintenant impl&eacute;menter la fonction <CODE>main</CODE> qui compl&egrave;te ce programme d'exemple fonctionnel.</P>
<P>
<BLOCKQUOTE><CODE>
<PRE>
void main( void )
{
  fd = open(DEVICE, O_RDWR);
  if (fd &lt; 0) {
    fprintf( stderr, &quot;Il faut les permissions lecture/ecriture pour &quot;DEVICE&quot;.\n&quot; );
    exit(1);
  }

  /* affiche certains champs du resultat de Inquiry() */
  printf( &quot;%s\n&quot;, Inquiry() + INQUIRY_VENDOR );
}
</PRE>
</CODE></BLOCKQUOTE>
</P>
<P>Tout d'abord, nous ouvrons le p&eacute;riph&eacute;rique, contr&ocirc;lons l'absence d'erreur, puis appelons la fonction de haut niveau. Ensuite, nous affichons des r&eacute;sultats sous une forme lisible, dont le constructeur, le produit et la version.</P>
<P>Note&nbsp;: il y a plus d'informations dans le r&eacute;sultat de "Inquiry" que ce que fournit ce petit programme. Il vous est loisible d'&eacute;tendre celui-ci au type de p&eacute;riph&eacute;rique, version ANSI, etc. Le type de p&eacute;riph&eacute;rique a une importance particuli&egrave;re, puisqu'il d&eacute;termine les jeux de commandes obligatoires et facultatives pour celui-ci. Si vous ne souhaitez pas le programmer vous-m&ecirc;me, Eric Youngdale a r&eacute;alis&eacute; le programme scsiinfo, qui fournit &agrave; peu pr&egrave;s toute information disponible pour un p&eacute;riph&eacute;rique SCSI. Cherchez sur tsx-11.mit.edu dans <CODE>pub/Linux/ALPHA/scsi</CODE> (NdT&nbsp;: on trouvera ce programme sur les sites miroirs fran&ccedil;ais, comme ftp.ibp.fr, &agrave; un emplacement similaire).</P>
<P></P>
<HR>
<P>
Chapitre <A HREF="SCSI-Programming-HOWTO-10.html">suivant</A>,
Chapitre <A HREF="SCSI-Programming-HOWTO-8.html">Pr&eacute;c&eacute;dent</A>
<P>
Table des mati&egrave;res de <A HREF="SCSI-Programming-HOWTO.html#toc9">ce chapitre</A>,
 <A HREF="SCSI-Programming-HOWTO.html#toc">Table des mati&egrave;res</A> g&eacute;n&eacute;rale</P>
<P>
<A HREF="SCSI-Programming-HOWTO.html">D&eacute;but</A> du document,
 <A HREF="#0"> D&eacute;but de ce chapitre</A></P>
</BODY>
</HTML>