decodeSense.cc
上传用户:weiliju62
上传日期:2007-01-06
资源大小:619k
文件大小:2k
源码类别:

SCSI/ASPI

开发平台:

MultiPlatform

  1. /*  cdrdao - write audio CD-Rs in disc-at-once mode
  2.  *
  3.  *  Copyright (C) 1998, 1999 Andreas Mueller <mueller@daneb.ping.de>
  4.  *
  5.  *  This program is free software; you can redistribute it and/or modify
  6.  *  it under the terms of the GNU General Public License as published by
  7.  *  the Free Software Foundation; either version 2 of the License, or
  8.  *  (at your option) any later version.
  9.  *
  10.  *  This program is distributed in the hope that it will be useful,
  11.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  12.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13.  *  GNU General Public License for more details.
  14.  *
  15.  *  You should have received a copy of the GNU General Public License
  16.  *  along with this program; if not, write to the Free Software
  17.  *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  18.  */
  19. /*
  20.  * $Log: decodeSense.cc,v $
  21.  * Revision 1.1  1999/03/14 15:34:03  mueller
  22.  * Initial revision
  23.  *
  24.  */
  25. /* Sense code printing for direct SCSI implementations */
  26. struct StringTable {
  27.   int code;
  28.   char *message;
  29. };
  30. static StringTable SENSE_KEYS[] = {
  31.   { 0x00, "NO SENSE" },
  32.   { 0x01, "RECOVERED ERROR" },
  33.   { 0x02, "NOT READY" },
  34.   { 0x03, "MEDIUM ERROR" },
  35.   { 0x04, "HARDWARE ERROR" },
  36.   { 0x05, "ILLEGAL REQUEST" },
  37.   { 0x06, "UNIT ATTENTION" },
  38.   { 0x08, "BLANK CHECK" },
  39.   { 0x09, "VENDOR SPECIFIC" },
  40.   { 0x0b, "ABORTED COMMAND" },
  41.   { 0x0d, "VOLUME OVERFLOW" },
  42.   { 0x0e, "MISCOMPARE" },
  43.   { 0x00, (char *)0 }
  44. };
  45. static const char *getFromStringTable(const StringTable *t, int code)
  46. {
  47.   while (t->message != NULL) {
  48.     if (t->code == code) {
  49.       return t->message;
  50.     }
  51.     t += 1;
  52.   }
  53.   return NULL;
  54. }
  55. // Prints decoded sense message, if 'ignoreUnitAttention' is != 0 and sense
  56. // code indicates unit attention nothing will be printed and 0 will be
  57. // returned.
  58. // return: 0: OK, no error
  59. //         1: sense key indicates error
  60. static int decodeSense(const unsigned char *buf, int len)
  61. {
  62.   int code = buf[2] & 0x0f;
  63.   const char *msg;
  64.   if (code == 0) {
  65.     return 0;
  66.   }
  67.   msg = getFromStringTable(SENSE_KEYS, code);
  68.   message(-2, "SCSI command failed:");
  69.   message(-2, "  sense key 0x%x: %s.", code, 
  70.   msg != NULL ? msg : "unknown code");
  71.     
  72.   if (len > 0x0c && buf[7] != 0) {
  73.     message(-2, "  additional sense code: 0x%x", buf[0x0c]);
  74.   }
  75.   if (len > 0x0d && buf[7] != 0) {
  76.     message(-2, "  additional sense code qualifier: 0x%x", buf[0x0d]);
  77.   }
  78.   return 1;
  79. }