hddtemp: update to 0.4.3

This commit is contained in:
Rudi Heitbaum 2022-12-12 18:47:01 +00:00
parent 84dfadb6f7
commit 3fc1f9f1e4
4 changed files with 122 additions and 413 deletions

View File

@ -2,14 +2,15 @@
# Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv)
PKG_NAME="hddtemp"
PKG_VERSION="e16aed6d0145d7ad8b3308dd0b9199fc701c0417" # Jul 6, 2010
PKG_SHA256="5d5af74ba7449b6e56a8f872a0e10d654a512ed65d62beaef1575b0c1826d9f3"
PKG_VERSION="0.4.3"
PKG_SHA256="592322c64f0d5f035132249e3d051b752f5d24867514522a17285d5e72d21075"
PKG_LICENSE="GPL"
PKG_SITE="https://savannah.nongnu.org/projects/hddtemp"
PKG_URL="https://github.com/guzu/hddtemp/archive/${PKG_VERSION}.tar.gz"
PKG_URL="https://github.com/vitlav/hddtemp/archive/v${PKG_VERSION}.tar.gz"
PKG_DEPENDS_TARGET="toolchain"
PKG_LONGDESC="A utility that gives you the temperature of your hard drive by reading S.M.A.R.T.."
PKG_BUILD_FLAGS="-sysroot"
PKG_TOOLCHAIN="autotools"
PKG_CONFIGURE_OPTS_TARGET="--with-db-path=/storage/.kodi/addons/virtual.system-tools/data/hddtemp.db"

View File

@ -0,0 +1,80 @@
commit ba91ffb6d96528fa2d449586f0757d1028cdaa6d
Author: Rudi Heitbaum <rudi@heitbaum.com>
Date: Mon Dec 12 11:03:18 2022 +0000
add missing default Language PO header field
diff --git a/po/de.po b/po/de.po
index 31d02c7..b0d8b7e 100644
--- a/po/de.po
+++ b/po/de.po
@@ -13,7 +13,7 @@ msgstr ""
"PO-Revision-Date: 2011-08-30 16:40+0200\n"
"Last-Translator: Vinzenz Vietzke <vinz@v1nz.org>\n"
"Language-Team: <debian-l10n-german@lists.debian.org>\n"
-"Language: \n"
+"Language: de_DE\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
diff --git a/po/fr.po b/po/fr.po
index 2af6500..433ced0 100644
--- a/po/fr.po
+++ b/po/fr.po
@@ -12,7 +12,7 @@ msgstr ""
"PO-Revision-Date: 2011-08-30 16:38+0200\n"
"Last-Translator: Aurelien Jarno <aurelien@aurel32.net>\n"
"Language-Team: FRANCAIS <fr@li.org>\n"
-"Language: \n"
+"Language: fr_FR\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=ISO-8859-1\n"
"Content-Transfer-Encoding: 8bit\n"
diff --git a/po/hddtemp.pot b/po/hddtemp.pot
index 40936d9..a3d9af8 100644
--- a/po/hddtemp.pot
+++ b/po/hddtemp.pot
@@ -12,6 +12,7 @@ msgstr ""
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
+"Language: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=CHARSET\n"
"Content-Transfer-Encoding: 8bit\n"
diff --git a/po/pt.po b/po/pt.po
index 8583dd6..23c0e49 100644
--- a/po/pt.po
+++ b/po/pt.po
@@ -11,6 +11,7 @@ msgstr ""
"PO-Revision-Date: 2006-03-29 23:22+0000\n"
"Last-Translator: Miguel Figueiredo <elmig@debianp.org>\n"
"Language-Team: Portuguese <traduz@debianpt.org>\n"
+"Language: pt_PT\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
diff --git a/po/ru.po b/po/ru.po
index 3d06da3..7ebceb0 100644
--- a/po/ru.po
+++ b/po/ru.po
@@ -11,6 +11,7 @@ msgstr ""
"PO-Revision-Date: 2003-03-08 16:42+0300\n"
"Last-Translator: Michael Shigorin <mike@altlinux.ru>\n"
"Language-Team: Russian <ru@li.org>\n"
+"Language: ru_RU\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=koi8-r\n"
"Content-Transfer-Encoding: 8bit\n"
diff --git a/po/sv.po b/po/sv.po
index d235e52..2729e59 100644
--- a/po/sv.po
+++ b/po/sv.po
@@ -11,6 +11,7 @@ msgstr ""
"PO-Revision-Date: 2005-11-02 19:03+0100\n"
"Last-Translator: Daniel Nylander <po@danielnylander.se>\n"
"Language-Team: Swedish <sv@li.org>\n"
+"Language: sv_SV\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=iso-8859-1\n"
"Content-Transfer-Encoding: 8bit\n"

View File

@ -0,0 +1,38 @@
commit 12eb958f85084485a4c9768e595c64993996f4a6
Author: Rudi Heitbaum <rudi@heitbaum.com>
Date: Mon Dec 12 11:16:29 2022 +0000
Allow building with gettext ≥ 0.20
The use of AM_GNU_GETTEXT_VERSION in configure.ac instructs autopoint to
copy po/Makefile.in.in from the exact gettext version. It is fine if the
version of gettext installed on the system has the same minor version
number with the requested version, but it fails if you have a newer
version of gettext because of the mismatch between autoconf macros and
Makefile.in.in.
*** error: gettext infrastructure mismatch: using a Makefile.in.in
from gettext version 0.19 but the autoconf macros are from gettext
version 0.20
Instead of specifying the exact version with AM_GNU_GETTEXT_VERSION, we
can use AM_GNU_GETTEXT_REQUIRE_VERSION to ask autopoint to simply use
the gettext version installed on the system to prevent the mismatch.
This also bumps the version requirement on gettext to 0.19.6 because
AM_GNU_GETTEXT_REQUIRE_VERSION was added in this version.
diff --git a/configure.ac b/configure.ac
index 6729c9f..d9c4128 100644
--- a/configure.ac
+++ b/configure.ac
@@ -26,7 +26,8 @@ AC_C_CONST
AC_STRUCT_TM
dnl internationalization macros
-AM_GNU_GETTEXT_VERSION([0.18.1])
+AM_GNU_GETTEXT_VERSION([0.19.6])
+AM_GNU_GETTEXT_REQUIRE_VERSION([0.19.6])
AM_GNU_GETTEXT([external])
dnl reasonable guesses for where stuff is installed

View File

@ -1,410 +0,0 @@
https://bugzilla.redhat.com/show_bug.cgi?id=1801116
Description Constantine Gavrilov 2020-02-10 10:09:18 UTC
Created attachment 1662111 [details]
Patch that adds NVMe Drives Support
Description of problem: HDDTEMP cannot read temperature of MVME drives.
All versions are affected.
How reproducible: always (missing support)
Steps to Reproduce:
1. Try to read temperature of NVME drive
Actual results:
1. Error is reported (only SATA or SCSI drives supported).
Expected results:
1. A temperature report would be appreciated, many GUI sensor frontends depend on HDDTEMP.
Additional info:
I have crated a patch that adds NVME drives support to HDDTEMP.
diff -uNr hddtemp-0.3-beta15.old/src/hddtemp.c hddtemp-0.3-beta15/src/hddtemp.c
--- hddtemp-0.3-beta15.old/src/hddtemp.c 2020-02-03 14:23:19.781566750 +0200
+++ hddtemp-0.3-beta15/src/hddtemp.c 2020-02-03 14:31:03.526209746 +0200
@@ -61,6 +61,7 @@
#include "utf8.h"
#include "sata.h"
#include "scsi.h"
+#include "nvme.h"
#include "db.h"
#include "hddtemp.h"
#include "backtrace.h"
@@ -87,6 +88,7 @@
bus[BUS_SATA] = &sata_bus;
bus[BUS_ATA] = &ata_bus;
bus[BUS_SCSI] = &scsi_bus;
+ bus[BUS_NVME] = &nvme_bus;
}
/*******************************************************
@@ -130,6 +132,8 @@
return BUS_ATA;
else if(bus[BUS_SCSI]->probe(dsk->fd))
return BUS_SCSI;
+ else if (bus[BUS_NVME]->probe(dsk->fd))
+ return BUS_NVME;
else
return BUS_UNKNOWN;
}
diff -uNr hddtemp-0.3-beta15.old/src/hddtemp.h hddtemp-0.3-beta15/src/hddtemp.h
--- hddtemp-0.3-beta15.old/src/hddtemp.h 2020-02-03 14:23:19.781566750 +0200
+++ hddtemp-0.3-beta15/src/hddtemp.h 2020-02-03 08:50:34.755411875 +0200
@@ -35,7 +35,7 @@
#define F_to_C(val) (int)(((double)(val)-32.0)/1.8)
#define C_to_F(val) (int)(((double)(val)*(double)1.8) + (double)32.0)
-enum e_bustype { ERROR = 0, BUS_UNKNOWN, BUS_SATA, BUS_ATA, BUS_SCSI, BUS_TYPE_MAX };
+enum e_bustype { ERROR = 0, BUS_UNKNOWN, BUS_SATA, BUS_ATA, BUS_SCSI, BUS_NVME, BUS_TYPE_MAX };
enum e_gettemp {
GETTEMP_ERROR, /* Error */
GETTEMP_NOT_APPLICABLE, /* */
diff -uNr hddtemp-0.3-beta15.old/src/Makefile.am hddtemp-0.3-beta15/src/Makefile.am
--- hddtemp-0.3-beta15.old/src/Makefile.am 2005-03-15 02:23:13.000000000 +0200
+++ hddtemp-0.3-beta15/src/Makefile.am 2020-02-03 08:50:34.737411657 +0200
@@ -13,7 +13,7 @@
scsi.c scsi.h \
scsicmds.c scsicmds.h \
backtrace.c backtrace.h \
- utf8.c utf8.h
+ utf8.c utf8.h nvme.o
hddtemp_CFLAGS = -Wall -W -rdynamic
#hddtemp_CFLAGS = -Wall -fomit-frame-pointer -rdynamic
diff -uNr hddtemp-0.3-beta15.old/src/Makefile.in hddtemp-0.3-beta15/src/Makefile.in
--- hddtemp-0.3-beta15.old/src/Makefile.in 2005-10-17 21:20:28.000000000 +0200
+++ hddtemp-0.3-beta15/src/Makefile.in 2020-02-03 08:50:34.790412300 +0200
@@ -157,7 +157,7 @@
scsi.c scsi.h \
scsicmds.c scsicmds.h \
backtrace.c backtrace.h \
- utf8.c utf8.h
+ utf8.c utf8.h nvme.c
hddtemp_CFLAGS = -Wall -W -rdynamic
@@ -180,7 +180,7 @@
hddtemp-hddtemp.$(OBJEXT) hddtemp-sata.$(OBJEXT) \
hddtemp-satacmds.$(OBJEXT) hddtemp-scsi.$(OBJEXT) \
hddtemp-scsicmds.$(OBJEXT) hddtemp-backtrace.$(OBJEXT) \
- hddtemp-utf8.$(OBJEXT)
+ hddtemp-utf8.$(OBJEXT) hddtemp-nvme.$(OBJEXT)
hddtemp_OBJECTS = $(am_hddtemp_OBJECTS)
hddtemp_DEPENDENCIES =
hddtemp_LDFLAGS =
@@ -195,6 +195,7 @@
@AMDEP_TRUE@ ./$(DEPDIR)/hddtemp-db.Po \
@AMDEP_TRUE@ ./$(DEPDIR)/hddtemp-hddtemp.Po \
@AMDEP_TRUE@ ./$(DEPDIR)/hddtemp-sata.Po \
+@AMDEP_TRUE@ ./$(DEPDIR)/hddtemp-nvme.Po \
@AMDEP_TRUE@ ./$(DEPDIR)/hddtemp-satacmds.Po \
@AMDEP_TRUE@ ./$(DEPDIR)/hddtemp-scsi.Po \
@AMDEP_TRUE@ ./$(DEPDIR)/hddtemp-scsicmds.Po \
@@ -257,6 +258,7 @@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hddtemp-db.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hddtemp-hddtemp.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hddtemp-sata.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hddtemp-nvme.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hddtemp-satacmds.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hddtemp-scsi.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hddtemp-scsicmds.Po@am__quote@
@@ -416,6 +418,28 @@
@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hddtemp_CFLAGS) $(CFLAGS) -c -o hddtemp-sata.obj `if test -f 'sata.c'; then $(CYGPATH_W) 'sata.c'; else $(CYGPATH_W) '$(srcdir)/sata.c'; fi`
+hddtemp-nvme.o: nvme.c
+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hddtemp_CFLAGS) $(CFLAGS) -MT hddtemp-nvme.o -MD -MP -MF "$(DEPDIR)/hddtemp-nvme.Tpo" \
+@am__fastdepCC_TRUE@ -c -o hddtemp-nvme.o `test -f 'nvme.c' || echo '$(srcdir)/'`nvme.c; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/hddtemp-nvme.Tpo" "$(DEPDIR)/hddtemp-nvme.Po"; \
+@am__fastdepCC_TRUE@ else rm -f "$(DEPDIR)/hddtemp-nvme.Tpo"; exit 1; \
+@am__fastdepCC_TRUE@ fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='nvme.c' object='hddtemp-nvme.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ depfile='$(DEPDIR)/hddtemp-nvme.Po' tmpdepfile='$(DEPDIR)/hddtemp-nvme.TPo' @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hddtemp_CFLAGS) $(CFLAGS) -c -o hddtemp-nvme.o `test -f 'nvme.c' || echo '$(srcdir)/'`nvme.c
+
+hddtemp-nvme.obj: nvme.c
+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hddtemp_CFLAGS) $(CFLAGS) -MT hddtemp-nvme.obj -MD -MP -MF "$(DEPDIR)/hddtemp-nvme.Tpo" \
+@am__fastdepCC_TRUE@ -c -o hddtemp-nvme.obj `if test -f 'nvme.c'; then $(CYGPATH_W) 'nvme.c'; else $(CYGPATH_W) '$(srcdir)/nvme.c'; fi`; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/hddtemp-nvme.Tpo" "$(DEPDIR)/hddtemp-nvme.Po"; \
+@am__fastdepCC_TRUE@ else rm -f "$(DEPDIR)/hddtemp-nvme.Tpo"; exit 1; \
+@am__fastdepCC_TRUE@ fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='nvme.c' object='hddtemp-nvme.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ depfile='$(DEPDIR)/hddtemp-nvme.Po' tmpdepfile='$(DEPDIR)/hddtemp-nvme.TPo' @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hddtemp_CFLAGS) $(CFLAGS) -c -o hddtemp-nvme.obj `if test -f 'nvme.c'; then $(CYGPATH_W) 'nvme.c'; else $(CYGPATH_W) '$(srcdir)/nvme.c'; fi`
+
hddtemp-satacmds.o: satacmds.c
@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hddtemp_CFLAGS) $(CFLAGS) -MT hddtemp-satacmds.o -MD -MP -MF "$(DEPDIR)/hddtemp-satacmds.Tpo" \
@am__fastdepCC_TRUE@ -c -o hddtemp-satacmds.o `test -f 'satacmds.c' || echo '$(srcdir)/'`satacmds.c; \
diff -uNr hddtemp-0.3-beta15.old/src/nvme.c hddtemp-0.3-beta15/src/nvme.c
--- hddtemp-0.3-beta15.old/src/nvme.c 1970-01-01 02:00:00.000000000 +0200
+++ hddtemp-0.3-beta15/src/nvme.c 2020-02-03 15:36:20.217181895 +0200
@@ -0,0 +1,234 @@
+/*
+ * Copyright (C) 2020 Constantine Gavrilov <constantine.gavrilov@gmail.com>
+ *
+ * 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
+ */
+
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "hddtemp.h"
+#include <sys/ioctl.h>
+#include <linux/nvme_ioctl.h>
+#include <stdint.h>
+#include <stdbool.h>
+#include <string.h>
+
+struct nvme_smart_log {
+ unsigned char critical_warning;
+ unsigned char temperature[2];
+ unsigned char avail_spare;
+ unsigned char spare_thresh;
+ unsigned char percent_used;
+ unsigned char rsvd6[26];
+ unsigned char data_units_read[16];
+ unsigned char data_units_written[16];
+ unsigned char host_reads[16];
+ unsigned char host_writes[16];
+ unsigned char ctrl_busy_time[16];
+ unsigned char power_cycles[16];
+ unsigned char power_on_hours[16];
+ unsigned char unsafe_shutdowns[16];
+ unsigned char media_errors[16];
+ unsigned char num_err_log_entries[16];
+ unsigned int warning_temp_time;
+ unsigned int critical_comp_time;
+ unsigned short temp_sensor[8];
+ unsigned int thm_temp1_trans_count;
+ unsigned int thm_temp2_trans_count;
+ unsigned int thm_temp1_total_time;
+ unsigned int thm_temp2_total_time;
+ unsigned char rsvd232[280];
+};
+
+struct nvme_id_power_state {
+ unsigned short max_power; // centiwatts
+ unsigned char rsvd2;
+ unsigned char flags;
+ unsigned int entry_lat; // microseconds
+ unsigned int exit_lat; // microseconds
+ unsigned char read_tput;
+ unsigned char read_lat;
+ unsigned char write_tput;
+ unsigned char write_lat;
+ unsigned short idle_power;
+ unsigned char idle_scale;
+ unsigned char rsvd19;
+ unsigned short active_power;
+ unsigned char active_work_scale;
+ unsigned char rsvd23[9];
+};
+
+struct nvme_id_ctrl {
+ unsigned short vid;
+ unsigned short ssvid;
+ char sn[20];
+ char mn[40];
+ char fr[8];
+ unsigned char rab;
+ unsigned char ieee[3];
+ unsigned char cmic;
+ unsigned char mdts;
+ unsigned short cntlid;
+ unsigned int ver;
+ unsigned int rtd3r;
+ unsigned int rtd3e;
+ unsigned int oaes;
+ unsigned int ctratt;
+ unsigned char rsvd100[156];
+ unsigned short oacs;
+ unsigned char acl;
+ unsigned char aerl;
+ unsigned char frmw;
+ unsigned char lpa;
+ unsigned char elpe;
+ unsigned char npss;
+ unsigned char avscc;
+ unsigned char apsta;
+ unsigned short wctemp;
+ unsigned short cctemp;
+ unsigned short mtfa;
+ unsigned int hmpre;
+ unsigned int hmmin;
+ unsigned char tnvmcap[16];
+ unsigned char unvmcap[16];
+ unsigned int rpmbs;
+ unsigned short edstt;
+ unsigned char dsto;
+ unsigned char fwug;
+ unsigned short kas;
+ unsigned short hctma;
+ unsigned short mntmt;
+ unsigned short mxtmt;
+ unsigned int sanicap;
+ unsigned char rsvd332[180];
+ unsigned char sqes;
+ unsigned char cqes;
+ unsigned short maxcmd;
+ unsigned int nn;
+ unsigned short oncs;
+ unsigned short fuses;
+ unsigned char fna;
+ unsigned char vwc;
+ unsigned short awun;
+ unsigned short awupf;
+ unsigned char nvscc;
+ unsigned char rsvd531;
+ unsigned short acwu;
+ unsigned char rsvd534[2];
+ unsigned int sgls;
+ unsigned char rsvd540[228];
+ char subnqn[256];
+ unsigned char rsvd1024[768];
+ unsigned int ioccsz;
+ unsigned int iorcsz;
+ unsigned short icdoff;
+ unsigned char ctrattr;
+ unsigned char msdbd;
+ unsigned char rsvd1804[244];
+ struct nvme_id_power_state psd[32];
+ unsigned char vs[1024];
+};
+
+#include <stdio.h>
+
+static int nvme_probe(int fd)
+{
+ return (ioctl(fd, NVME_IOCTL_ID, NULL) > 0);
+}
+
+static bool nvme_read_smart_log(int fd, struct nvme_smart_log *smart_log)
+{
+ unsigned int size = sizeof(*smart_log);
+ struct nvme_passthru_cmd pt = { 0 };
+
+ memset(smart_log, 0, size);
+ pt.opcode = 0x02;
+ pt.nsid = 0xffffffff;
+ pt.addr = (uint64_t)smart_log;
+ pt.data_len = size;
+ pt.cdw10 = 0x02 | (((size / 4) - 1) << 16);
+ if (ioctl(fd, NVME_IOCTL_ADMIN_CMD, &pt) < 0)
+ return false;
+ return true;
+}
+
+static bool nvme_read_id_ctrl(int fd, struct nvme_id_ctrl *id)
+{
+ memset(id, 0, sizeof(*id));
+ struct nvme_passthru_cmd pt = { 0 };
+ pt.opcode = 0x06;
+ pt.nsid = 0;
+ pt.addr = (uint64_t)id;
+ pt.data_len = sizeof(*id);
+ pt.cdw10 = 0x01;
+ if (ioctl(fd, NVME_IOCTL_ADMIN_CMD, &pt) < 0)
+ return false;
+ return true;
+}
+
+
+const char *nvme_model(int fd)
+{
+ struct nvme_id_ctrl id;
+ unsigned int i;
+ char *p;
+ const unsigned int name_len = sizeof(id.mn);
+
+ if (nvme_read_id_ctrl(fd, &id) == false)
+ return "NVME Disk";
+ id.mn[name_len-1] = '\0';
+ for (i = name_len - 2; i > 0; i--) {
+ if (id.mn[i] == ' ')
+ id.mn[i] = '\0';
+ else
+ break;
+ }
+ p = id.mn;
+ for (i = 0; i < name_len; i++) {
+ if (id.mn[i] == ' ')
+ id.mn[i] = '\0';
+ else
+ break;
+ }
+ p = strdup(p);
+ if (!p || strlen(p) == 0)
+ return "NVME Disk";
+ for (i = 0; p[i]; i++) {
+ if (p[i] < 0x20 || p[i] > 0x7e)
+ p[i] = '?';
+ }
+ return p;
+}
+
+enum e_gettemp nvme_get_temperature(struct disk *disk)
+{
+ struct nvme_smart_log smart_log;
+ if (nvme_read_smart_log(disk->fd, &smart_log) == false)
+ return GETTEMP_UNKNOWN;
+ disk->value = smart_log.temperature[0] + (smart_log.temperature[1] << 8) - 273;
+ return GETTEMP_KNOWN;
+}
+
+struct bustype nvme_bus = {
+ "NVME",
+ nvme_probe,
+ nvme_model,
+ nvme_get_temperature
+};
+
+
diff -uNr hddtemp-0.3-beta15.old/src/nvme.h hddtemp-0.3-beta15/src/nvme.h
--- hddtemp-0.3-beta15.old/src/nvme.h 1970-01-01 02:00:00.000000000 +0200
+++ hddtemp-0.3-beta15/src/nvme.h 2020-02-03 08:08:03.708300652 +0200
@@ -0,0 +1,25 @@
+/*
+ * Copyright (C) 2020 Constnatine Gavrilov <constantine.gavrilov@gmail.com>
+ *
+ * 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
+ */
+
+#ifndef _HDDTEMP_NVME_H_
+#define _HDDTEMP_NVME_H_
+
+extern struct bustype nvme_bus;
+
+#endif
+