|
From: <bb...@bo...> - 2013-10-30 09:49:24
|
Hi ,
I am writing to you because, you are a guru in those topics ;)
I tried read self-test log from my hdd but I do not receive any sense
information ;/
My code looks like this:
#include <sys/ioctl.h>
#include <linux/hdreg.h>
#include <sys/fcntl.h>
#include <sys/types.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <stdlib.h>
#include <ctype.h>
typedef struct ata_smart_selftestlog_struct {
unsigned char selftestnumber; // Sector number register
unsigned char selfteststatus;
unsigned short int timestamp;
unsigned char selftestfailurecheckpoint;
unsigned int lbafirstfailure;
unsigned char vendorspecific[15];
} ata_smart_selftestlog_struct;
struct ata_smart_selftestlog{
unsigned short int revnumber;
struct ata_smart_selftestlog_struct selftest_struct[21];
unsigned char vendorspecific[2];
unsigned char mostrecenttest;
unsigned char reserved[2];
unsigned char chksum;
};
int main(int argc, char **argv)
{
int fd;
struct {
struct hd_drive_cmd_hdr header; //hdreg.h
unsigned char data[512];
} buf;
buf.header.command = 0xB0; //WIN_SMART; ATA_CMD_SMART
buf.header.sector_number = 0x06; //0x06
buf.header.feature = 0xD5;//SMART_READ_LOG_SECTOR;
buf.header.sector_count = 1;
if ((fd = open("/dev/sda", O_RDONLY)) < 0) {
printf("ERROR opening device\n");
exit(1);
}
if (!ioctl(fd, HDIO_DRIVE_CMD, &buf)) {
/*====================================================================================================*/
struct ata_smart_selftestlog smart_selftestlog;
memcpy(&smart_selftestlog, buf.data, sizeof(smart_selftestlog));
printf("OK: ioctl(%d, HDIO_DRIVE_CMD)\n", fd);
printf("\nSMART Self-test log, version number
%u\n",smart_selftestlog.revnumber);
if (smart_selftestlog.revnumber!=0x01){
printf("Error -revision number does not match !\n");
return 0;
}
if (smart_selftestlog.mostrecenttest==0){
printf("No self-test have been logged\n");
return 0;
}
else {
printf("Number of Self-tests log:
%d\n",smart_selftestlog.mostrecenttest);
}
/*====================================================================================================*/
} else {
printf("ERROR: ioctl ");
exit(1);
}
return 0;
}
where I'm doing wrong?
Please help me.
BART
|