This file is indexed.

/usr/share/doc/HOWTO/de-html/DE-SCSI-Programmierung-HOWTO-10.html is in doc-linux-de 2003.10-5.

This file is owned by root:root, with mode 0o644.

The actual contents of the file can be viewed below.

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<HTML>
<HEAD>
 <META NAME="GENERATOR" CONTENT="LinuxDoc-Tools 0.9.65">
 <TITLE>Das Linux SCSI Programmier HOWTO: Beispiel mit Sensepuffer</TITLE>
 <LINK HREF="DE-SCSI-Programmierung-HOWTO-11.html" REL=next>
 <LINK HREF="DE-SCSI-Programmierung-HOWTO-9.html" REL=previous>
 <LINK HREF="DE-SCSI-Programmierung-HOWTO.html#toc10" REL=contents>
</HEAD>
<BODY>
<A HREF="DE-SCSI-Programmierung-HOWTO-11.html"><IMG SRC="next.png" ALT="Weiter"></A>
<A HREF="DE-SCSI-Programmierung-HOWTO-9.html"><IMG SRC="prev.png" ALT="Zurück"></A>
<A HREF="DE-SCSI-Programmierung-HOWTO.html#toc10"><IMG SRC="toc.png" ALT="Inhalt"></A>
<HR>
<H2><A NAME="s10">10.</A> <A HREF="DE-SCSI-Programmierung-HOWTO.html#toc10">Beispiel mit Sensepuffer</A></H2>

<P>Wir f&uuml;hren ein TEST UNIT READY Kommando durch, um zu &uuml;berpr&uuml;fen, 
ob ein
Medium im Ger&auml;t geladen ist. Die Kopf-Deklarationen und die Funktion
<CODE>handle_SCSI_cmd</CODE> aus dem Inquiry-Bespiel werden hier auch ben&ouml;tigt.</P>

<P>
<BLOCKQUOTE><CODE>
<PRE>
                        Tabelle 73: TEST UNIT READY Command
+=====-========-========-========-========-========-========-========-========+
|  Bit|   7    |   6    |   5    |   4    |   3    |   2    |   1    |   0    |
|Byte |        |        |        |        |        |        |        |        |
|=====+=======================================================================|
| 0   |                           Operation Code (00h)                        |
|-----+-----------------------------------------------------------------------|
| 1   | Logical Unit Number      |                  Reserved                  |
|-----+-----------------------------------------------------------------------|
| 2   |                           Reserved                                    |
|-----+-----------------------------------------------------------------------|
| 3   |                           Reserved                                    |
|-----+-----------------------------------------------------------------------|
| 4   |                           Reserved                                    |
|-----+-----------------------------------------------------------------------|
| 5   |                           Control                                     |
+=============================================================================+
</PRE>
</CODE></BLOCKQUOTE>
</P>


<P>Mit dieser Funktion implementieren wir die Abfrage.</P>
<P>
<BLOCKQUOTE><CODE>
<PRE>
#define TESTUNITREADY_CMD 0
#define TESTUNITREADY_CMDLEN 6

#define ADD_SENSECODE 12
#define ADD_SC_QUALIFIER 13
#define NO_MEDIA_SC 0x3a
#define NO_MEDIA_SCQ 0x00

int TestForMedium ( void )
{
  /* request READY status */
  static unsigned char cmdblk [TESTUNITREADY_CMDLEN] = {
      TESTUNITREADY_CMD, /* command */
                      0, /* lun/reserved */
                      0, /* reserved */
                      0, /* reserved */
                      0, /* reserved */
                      0};/* control */

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

  /*
   * +------------------+
   * | struct sg_header | &lt;- cmd
   * +------------------+
   * | copy of cmdblk   | &lt;- cmd + SCSI_OFF
   * +------------------+
   */

  if (handle_SCSI_cmd(sizeof(cmdblk), 0, cmd, 
                            0, NULL)) {
      fprintf (stderr, "Test unit ready scheiterte\n");
      exit(2);
  }

  return
   *(((struct sg_header*)cmd)->sense_buffer +ADD_SENSECODE) != 
                                                        NO_MEDIA_SC ||
   *(((struct sg_header*)cmd)->sense_buffer +ADD_SC_QUALIFIER) != 
                                                        NO_MEDIA_SCQ;
}
</PRE>
</CODE></BLOCKQUOTE>
</P>
<P>Mit einer neuen <CODE>main</CODE> Funktion k&ouml;nnen wir die Abfrage laufen lassen.</P>
<P>
<BLOCKQUOTE><CODE>
<PRE>
int main( void )
{
  fd = open(DEVICE, O_RDWR);
  if (fd &lt; 0) {
    fprintf( stderr, "Lese-Schreiberlaubnis erforderlich f&uuml;r "DEVICE".\n" 
);
    exit(1);
  }

  /* Abfrage, ob sich ein Medium im Ger&auml;t befindet */

  if (!TestForMedium()) {
    printf("Ger&auml;t enth&auml;lt kein Medium\n");
  } else {
    printf("Ger&auml;t enth&auml;lt ein Medium\n");
  }
  return 0;
}
</PRE>
</CODE></BLOCKQUOTE>
</P>

<P>Die Datei <CODE>generic_demo.c</CODE> im Anhang enth&auml;lt beide Beispiele.</P>

<HR>
<A HREF="DE-SCSI-Programmierung-HOWTO-11.html"><IMG SRC="next.png" ALT="Weiter"></A>
<A HREF="DE-SCSI-Programmierung-HOWTO-9.html"><IMG SRC="prev.png" ALT="Zurück"></A>
<A HREF="DE-SCSI-Programmierung-HOWTO.html#toc10"><IMG SRC="toc.png" ALT="Inhalt"></A>
</BODY>
</HTML>