⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 atacmds.c

📁 Linux下
💻 C
字号:
/* * atacmds.c * * Copyright (C) 1999-2000 Michael Cornwell <cornwell@acm.org> * Copyright (C) 2000 Andre Hedrick <andre@linux-ide.org> * * 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, or (at your option) * any later version. * * You should have received a copy of the GNU General Public License * (for example COPYING); if not, write to the Free * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */#include <stdio.h>#include <string.h>#include "atacmds.h"int ataReadHDIdentity ( int device, struct hd_driveid *buf){   if (ioctl ( device , HDIO_GET_IDENTITY, buf ) != 0)   {        perror ("ATA GET HD Failed");       return -1;    }   return 0;}int ataVersionInfo ( struct hd_driveid drive){   int i;   int atavalue = 0; 	#ifdef DEBUG#ifdef __NEW_HD_DRIVE_ID	printf ("Debug: Ata Version:	 %04x\n", drive.major_rev_num);#else	printf ("Debug: Ata Version:	 %04x\n", drive.word80);#endif#endif #ifdef __NEW_HD_DRIVE_ID	if ( (drive.major_rev_num == 0xffff) || (drive.major_rev_num == 0x000) )#else	if ( (drive.word80 == 0xffff) || (drive.word80 == 0x000) )#endif	{				return -1;	}	for ( i = 1; i < 16; i++ )	{#ifdef __NEW_HD_DRIVE_ID		if ( drive.major_rev_num &  ( 0x1 << i) )#else		#endif		{			atavalue = i;		}	}	return atavalue;}int ataSmartSupport ( struct hd_driveid drive){#ifdef __NEW_HD_DRIVE_ID	if ( drive.command_set_1 & 0x0001 ){#else	if ( drive.command_sets & 0x0001 ){#endif		return (1); /* drive supports S.M.A.R.T. and is disabled */	}				return (0);}int ataReadSmartValues (int device, struct ata_smart_values *data){	   int i;   unsigned char chksum;   unsigned char buf[ HDIO_DRIVE_CMD_HDR_SIZE +                       ATA_SMART_SEC_SIZE] =                       { WIN_SMART, 0, SMART_READ_VALUES, 1};	   if (ioctl ( device , HDIO_DRIVE_CMD,  (unsigned char *) &buf ) != 0)   {       perror ("Smart Values Read failed");       return -1;   }   chksum = 0;   for ( i =  HDIO_DRIVE_CMD_HDR_SIZE;           i < ATA_SMART_SEC_SIZE + HDIO_DRIVE_CMD_HDR_SIZE;          i++ )	chksum +=  buf[i];   if (  (unsigned char) chksum != 0)   {       perror ("Smart Read Failed, Chksum error");       return -1;   }	   memcpy( data,            &buf[HDIO_DRIVE_CMD_HDR_SIZE] ,           ATA_SMART_SEC_SIZE );   return 0;}int ataReadSelfTestLog (int device, struct ata_smart_selftestlog *data){	   unsigned char buf[ HDIO_DRIVE_CMD_HDR_SIZE +                       ATA_SMART_SEC_SIZE] =                       { WIN_SMART, 0x06, SMART_READ_LOG_SECTOR, 1};   if (ioctl ( device , HDIO_DRIVE_CMD, (unsigned char *) &buf ) != 0)   {       perror ("Smart Error Log Read failed");       return -1;   }	   memcpy( data, &buf[HDIO_DRIVE_CMD_HDR_SIZE] , ATA_SMART_SEC_SIZE);   return 0;}int ataReadErrorLog (int device, struct ata_smart_errorlog *data){	   unsigned char buf[ HDIO_DRIVE_CMD_HDR_SIZE +                       ATA_SMART_SEC_SIZE] =                       { WIN_SMART, 0x01, SMART_READ_LOG_SECTOR, 1};	   if (ioctl ( device , HDIO_DRIVE_CMD, (unsigned char *) &buf ) != 0)   {       perror ("Smart Error Log Read failed");       return -1;   }	   memcpy( data, &buf[HDIO_DRIVE_CMD_HDR_SIZE] , ATA_SMART_SEC_SIZE);   return 0;}int ataReadSmartThresholds ( int device, struct ata_smart_thresholds *data){	   unsigned char buf[ HDIO_DRIVE_CMD_HDR_SIZE +                       ATA_SMART_SEC_SIZE] =                       { WIN_SMART, 1, SMART_READ_THRESHOLDS, 1};	   if (ioctl ( device , HDIO_DRIVE_CMD, (unsigned char *) &buf ) != 0)   {       perror ("Smart Thresholds Read failed");       return -1;   }   memcpy( data, &buf[HDIO_DRIVE_CMD_HDR_SIZE] , ATA_SMART_SEC_SIZE);   return 0;}int ataSetSmartThresholds ( int device, struct ata_smart_thresholds *data){	   unsigned char buf[ HDIO_DRIVE_CMD_HDR_SIZE + 		           ATA_SMART_SEC_SIZE] =                            { WIN_SMART, 1, 0xD7, 1};	   memcpy( &buf[HDIO_DRIVE_CMD_HDR_SIZE],  data , ATA_SMART_SEC_SIZE);   if (ioctl ( device , HDIO_DRIVE_CMD, (unsigned char *)  &buf ) != 0)   {       perror ("Smart Thresholds Read failed");       return -1;   }   return 0;}int ataEnableSmart (int device ){	   unsigned char parms[4] = { WIN_SMART, 1, SMART_ENABLE, 0};	   if (ioctl ( device , HDIO_DRIVE_CMD,  &parms ) != 0)   {      perror ("Smart Enable failed");      return -1;   }	   return 0; }int ataDisableSmart (int device ){		   unsigned char parms[4] = { WIN_SMART, 1, SMART_DISABLE, 0};	   if (ioctl ( device , HDIO_DRIVE_CMD,  &parms ) != 0)   {      perror ("Smart Disable failed");      return -1;   }   return 0;}int ataEnableAutoOffline (int device ){	   /* timer hard coded to 4 hours */   unsigned char parms[4] = { WIN_SMART, 248, SMART_AUTO_OFFLINE, 0};	   if (ioctl ( device , HDIO_DRIVE_CMD,  &parms ) != 0)   {       perror ("Smart Enable Automatic Offline failed");       return -1;   }   return 0;}int ataDisableAutoOffline (int device ){	   unsigned char parms[4] = { WIN_SMART, 0, SMART_AUTO_OFFLINE, 0};	   if (ioctl ( device , HDIO_DRIVE_CMD,  &parms ) != 0)   {      perror ("Smart Disable Automatic Offline failed");      return -1;   }   return 0;}int ataSmartStatus (int device ){	   unsigned char parms[4] = { WIN_SMART, 0, SMART_STATUS, 0};   if (ioctl ( device , HDIO_DRIVE_CMD,  &parms) != 0)   {      return -1;   }   return 0;}int ataSmartTest (int device, int testtype){	   unsigned char parms[4] = { WIN_SMART, testtype,                     SMART_IMMEDIATE_OFFLINE, 0};	   if (ioctl ( device , HDIO_DRIVE_CMD, &parms) != 0)   {       perror ("Smart Offline failed");       return -1;   }   printf("Completed Off-line command\n");	   return 0;}int ataSmartOfflineTest (int device){	   return ataSmartTest( device, OFFLINE_FULL_SCAN  );}int ataSmartShortSelfTest (int device){	   return ataSmartTest( device, SHORT_SELF_TEST  );}int ataSmartExtendSelfTest (int device){	   return ataSmartTest( device, EXTEND_SELF_TEST  );}int ataSmartShortCapSelfTest (int device){	   return ataSmartTest( device, SHORT_CAPTIVE_SELF_TEST );}int ataSmartExtendCapSelfTest (int device){   return ataSmartTest( device, EXTEND_CAPTIVE_SELF_TEST );}int ataSmartSelfTestAbort (int device){   return ataSmartTest( device, 127 );}/* Test Time Functions */int isOfflineTestTime ( struct ata_smart_values data){   return (int) data.total_time_to_complete_off_line;}int isShortSelfTestTime ( struct ata_smart_values data){   return (int) data.short_test_completion_time;}int isExtendedSelfTestTime ( struct ata_smart_values data){   return (int) data.extend_test_completion_time;}int isSmartErrorLogCapable ( struct ata_smart_values data){   return data.errorlog_capability & 0x01;}int isSupportExecuteOfflineImmediate ( struct ata_smart_values data){   return data.offline_data_collection_capability & 0x01;}int isSupportAutomaticTimer ( struct ata_smart_values data){   return data.offline_data_collection_capability & 0x02;}int isSupportOfflineAbort ( struct ata_smart_values data){   return data.offline_data_collection_capability & 0x04;}int isSupportOfflineSurfaceScan ( struct ata_smart_values data){   return data.offline_data_collection_capability & 0x08;}int isSupportSelfTest (struct ata_smart_values data){   return data.offline_data_collection_capability & 0x10;}int ataCheckSmart ( struct ata_smart_values data, struct ata_smart_thresholds thresholds){   int i;     for ( i = 0 ; i < 30 ; i++ )   {      if ( (data.vendor_attributes[i].id !=0) &&              (thresholds.thres_entries[i].id != 0) &&           (data.vendor_attributes[i].status.flag.prefailure) &&           (data.vendor_attributes[i].current <             thresholds.thres_entries[i].threshold) &&           (thresholds.thres_entries[i].threshold != 0xFE) )      {         return i;      }   }   return 0;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -