summaryrefslogtreecommitdiffstats
path: root/src/hddtemp_scsi/scsi.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/hddtemp_scsi/scsi.c')
-rw-r--r--src/hddtemp_scsi/scsi.c125
1 files changed, 125 insertions, 0 deletions
diff --git a/src/hddtemp_scsi/scsi.c b/src/hddtemp_scsi/scsi.c
new file mode 100644
index 0000000..ab00ad6
--- /dev/null
+++ b/src/hddtemp_scsi/scsi.c
@@ -0,0 +1,125 @@
+/*
+ * Copyright (C) 2002 Emmanuel VARAGNAT <hddtemp@guzu.net>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+/*
+ * Adapted from a patch sended by : Frederic LOCHON <lochon@roulaise.net>
+ */
+/*
+ * Adapted for use with nwipe by : Gerold Gruber <Gerold.Gruber@edv2g.de>
+ */
+
+// Include file generated by ./configure
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+// Gettext includes
+#if ENABLE_NLS
+#include <libintl.h>
+#define _(String) gettext (String)
+#else
+#define _(String) (String)
+#endif
+
+// Standard includes
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <string.h>
+#include <fcntl.h>
+#include <errno.h>
+#include <sys/ioctl.h>
+#include <scsi/scsi.h>
+
+// Application specific includes
+#include "scsicmds.h"
+#include "hddtemp.h"
+
+int scsi_get_temperature(struct disk *dsk) {
+ int i;
+ int tempPage = 0;
+ unsigned char buffer[1024];
+
+ /*
+ on triche un peu
+ we cheat a little and do not really read form drivedb as SCSI disks are not included there
+ original code omitted as there is no need for it in the context of nwipe
+ */
+
+ /*
+ Enable SMART
+ */
+ if (scsi_smartDEXCPTdisable(dsk->fd) != 0) {
+ snprintf(dsk->errormsg, MAX_ERRORMSG_SIZE, "%s", strerror(errno));
+ close(dsk->fd);
+ dsk->fd = -1;
+ return GETTEMP_ERROR;
+ }
+
+ /*
+ Temp. capable
+ */
+ if (scsi_logsense(dsk->fd , SUPPORT_LOG_PAGES, buffer, sizeof(buffer)) != 0) {
+ snprintf(dsk->errormsg, MAX_ERRORMSG_SIZE, _("log sense failed : %s"), strerror(errno));
+ close(dsk->fd);
+ dsk->fd = -1;
+ return GETTEMP_ERROR;
+ }
+
+ for ( i = 4; i < buffer[3] + LOGPAGEHDRSIZE ; i++) {
+ if (buffer[i] == TEMPERATURE_PAGE) {
+ tempPage = 1;
+ break;
+ }
+ }
+
+ if(tempPage) {
+ /*
+ get temperature (from scsiGetTemp (scsicmd.c))
+ */
+ if (scsi_logsense(dsk->fd , TEMPERATURE_PAGE, buffer, sizeof(buffer)) != 0) {
+ snprintf(dsk->errormsg, MAX_ERRORMSG_SIZE, _("log sense failed : %s"), strerror(errno));
+ close(dsk->fd);
+ dsk->fd = -1;
+ return GETTEMP_ERROR;
+ }
+
+ if( (int)buffer[7] == 2 ) /* PARAMETER LENGTH */
+ {
+ dsk->value = buffer[9];
+ }
+ else
+ {
+ snprintf(dsk->errormsg, MAX_ERRORMSG_SIZE, _("parameter length unexpected: %d"), (int)buffer[7] );
+ return GETTEMP_UNKNOWN;
+ }
+ dsk->refvalue = buffer[15];
+ if( (int)buffer[13] == 2 ) /* PARAMETER LENGTH */
+ {
+ dsk->refvalue = buffer[15];
+ }
+ else
+ {
+ snprintf(dsk->errormsg, MAX_ERRORMSG_SIZE, _("parameter ref length unexpected: %d"), (int)buffer[13] );
+ return GETTEMP_UNKNOWN;
+ }
+ return GETTEMP_SUCCESS;
+ } else {
+ return GETTEMP_NOSENSOR;
+ }
+}