X-Git-Url: https://git.proxmox.com/?a=blobdiff_plain;f=dev_legacy.cpp;h=ca4575bcd5d287ccc01e94519633ac00c5f5fd24;hb=fb337c9cb7f2443edb74813df8f6d69501c0eef0;hp=76ed9479f1b379f75726d9313a069291ae98ac02;hpb=2127e1931eec4a688d41baf253744fc48ed8c989;p=mirror_smartmontools-debian.git diff --git a/dev_legacy.cpp b/dev_legacy.cpp index 76ed947..ca4575b 100644 --- a/dev_legacy.cpp +++ b/dev_legacy.cpp @@ -3,7 +3,7 @@ * * Home page of code is: http://smartmontools.sourceforge.net * - * Copyright (C) 2008 Christian Franke + * Copyright (C) 2008-11 Christian Franke * * 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 @@ -17,17 +17,16 @@ #include "config.h" #include "int64.h" -#include "extern.h" #include "utility.h" #include "atacmds.h" #include "scsicmds.h" #include "dev_interface.h" #include "dev_ata_cmd_set.h" -const char * dev_legacy_cpp_cvsid = "$Id: dev_legacy.cpp 2879 2009-08-29 17:19:00Z chrfranke $" - DEV_INTERFACE_H_CVSID; +#include -extern smartmonctrl * con; // con->reportscsiioctl +const char * dev_legacy_cpp_cvsid = "$Id: dev_legacy.cpp 3263 2011-02-20 18:32:56Z chrfranke $" + DEV_INTERFACE_H_CVSID; ///////////////////////////////////////////////////////////////////////////// @@ -38,19 +37,9 @@ int guess_device_type(const char * dev_name); int make_device_names (char ***devlist, const char* name); int deviceopen(const char *pathname, char *type); int deviceclose(int fd); -#ifdef HAVE_GET_OS_VERSION_STR -const char * get_os_version_str(void); -#endif // from atacmds.h: int ata_command_interface(int device, smart_command_set command, int select, char *data); -int escalade_command_interface(int fd, int escalade_port, int escalade_type, smart_command_set command, int select, char *data); -int marvell_command_interface(int device, smart_command_set command, int select, char *data); -int highpoint_command_interface(int device, smart_command_set command, int select, char *data); -int areca_command_interface(int fd, int disknum, smart_command_set command, int select, char *data); -#ifdef HAVE_ATA_IDENTIFY_IS_CACHED -int ata_identify_is_cached(int fd); -#endif // from scsicmds.h: int do_scsi_cmnd_io(int dev_fd, struct scsi_cmnd_io * iop, int report); @@ -105,7 +94,7 @@ bool legacy_smart_device::is_open() const bool legacy_smart_device::open() { - m_fd = ::deviceopen(get_dev_name(), (char*)m_mode); + m_fd = ::deviceopen(get_dev_name(), const_cast(m_mode)); if (m_fd < 0) { set_err((errno==ENOENT || errno==ENOTDIR) ? ENODEV : errno); return false; @@ -133,10 +122,6 @@ class legacy_ata_device public: legacy_ata_device(smart_interface * intf, const char * dev_name, const char * req_type); -#ifdef HAVE_ATA_IDENTIFY_IS_CACHED - virtual bool ata_identify_is_cached() const; -#endif - protected: virtual int ata_command_interface(smart_command_set command, int select, char * data); }; @@ -152,148 +137,6 @@ int legacy_ata_device::ata_command_interface(smart_command_set command, int sele return ::ata_command_interface(get_fd(), command, select, data); } -#ifdef HAVE_ATA_IDENTIFY_IS_CACHED -bool legacy_ata_device::ata_identify_is_cached() const -{ - return !!::ata_identify_is_cached(get_fd()); -} -#endif - - -///////////////////////////////////////////////////////////////////////////// -/// Implement AMCC/3ware RAID support with old functions - -class legacy_escalade_device -: public /*implements*/ ata_device_with_command_set, - public /*extends*/ legacy_smart_device -{ -public: - legacy_escalade_device(smart_interface * intf, const char * dev_name, - int escalade_type, int disknum); - -protected: - virtual int ata_command_interface(smart_command_set command, int select, char * data); - -private: - int m_escalade_type; ///< Type string for escalade_command_interface(). - int m_disknum; ///< Disk number. -}; - -legacy_escalade_device::legacy_escalade_device(smart_interface * intf, const char * dev_name, - int escalade_type, int disknum) -: smart_device(intf, dev_name, "3ware", "3ware"), - legacy_smart_device( - escalade_type==CONTROLLER_3WARE_9000_CHAR ? "ATA_3WARE_9000" : - escalade_type==CONTROLLER_3WARE_678K_CHAR ? "ATA_3WARE_678K" : - /* CONTROLLER_3WARE_678K */ "ATA" ), - m_escalade_type(escalade_type), m_disknum(disknum) -{ - set_info().info_name = strprintf("%s [3ware_disk_%02d]", dev_name, disknum); -} - -int legacy_escalade_device::ata_command_interface(smart_command_set command, int select, char * data) -{ - return ::escalade_command_interface(get_fd(), m_disknum, m_escalade_type, command, select, data); -} - - -///////////////////////////////////////////////////////////////////////////// -/// Implement Areca RAID support with old functions - -class legacy_areca_device -: public /*implements*/ ata_device_with_command_set, - public /*extends*/ legacy_smart_device -{ -public: - legacy_areca_device(smart_interface * intf, const char * dev_name, int disknum); - -protected: - virtual int ata_command_interface(smart_command_set command, int select, char * data); - -private: - int m_disknum; ///< Disk number. -}; - -legacy_areca_device::legacy_areca_device(smart_interface * intf, const char * dev_name, int disknum) -: smart_device(intf, dev_name, "areca", "areca"), - legacy_smart_device("ATA_ARECA"), - m_disknum(disknum) -{ - set_info().info_name = strprintf("%s [areca_%02d]", dev_name, disknum); -} - -int legacy_areca_device::ata_command_interface(smart_command_set command, int select, char * data) -{ - return ::areca_command_interface(get_fd(), m_disknum, command, select, data); -} - - -///////////////////////////////////////////////////////////////////////////// -/// Implement Marvell support with old functions - -class legacy_marvell_device -: public /*implements*/ ata_device_with_command_set, - public /*extends*/ legacy_smart_device -{ -public: - legacy_marvell_device(smart_interface * intf, const char * dev_name, const char * req_type); - -protected: - virtual int ata_command_interface(smart_command_set command, int select, char * data); -}; - - -legacy_marvell_device::legacy_marvell_device(smart_interface * intf, - const char * dev_name, const char * req_type) -: smart_device(intf, dev_name, "marvell", req_type), - legacy_smart_device("ATA") -{ -} - -int legacy_marvell_device::ata_command_interface(smart_command_set command, int select, char * data) -{ - return ::marvell_command_interface(get_fd(), command, select, data); -} - - -///////////////////////////////////////////////////////////////////////////// -/// Implement Highpoint RAID support with old functions - -class legacy_highpoint_device -: public /*implements*/ ata_device_with_command_set, - public /*extends*/ legacy_smart_device -{ -public: - legacy_highpoint_device(smart_interface * intf, const char * dev_name, - unsigned char controller, unsigned char channel, unsigned char port); - -protected: - virtual int ata_command_interface(smart_command_set command, int select, char * data); - -private: - unsigned char m_hpt_data[3]; ///< controller/channel/port -}; - - -legacy_highpoint_device::legacy_highpoint_device(smart_interface * intf, const char * dev_name, - unsigned char controller, unsigned char channel, unsigned char port) -: smart_device(intf, dev_name, "hpt", "hpt"), - legacy_smart_device("ATA") -{ - m_hpt_data[0] = controller; m_hpt_data[1] = channel; m_hpt_data[2] = port; - set_info().info_name = strprintf("%s [hpt_disk_%u/%u/%u]", dev_name, m_hpt_data[0], m_hpt_data[1], m_hpt_data[2]); -} - -int legacy_highpoint_device::ata_command_interface(smart_command_set command, int select, char * data) -{ - unsigned char old_hpt_data[3]; - memcpy(old_hpt_data, con->hpt_data, 3); - memcpy(con->hpt_data, m_hpt_data, 3); - int status = ::highpoint_command_interface(get_fd(), command, select, data); - memcpy(con->hpt_data, old_hpt_data, 3); - return status; -} - ///////////////////////////////////////////////////////////////////////////// /// Implement standard SCSI support with old functions @@ -319,51 +162,7 @@ legacy_scsi_device::legacy_scsi_device(smart_interface * intf, bool legacy_scsi_device::scsi_pass_through(scsi_cmnd_io * iop) { - unsigned char oldtype = con->controller_type, oldport = con->controller_port; - con->controller_type = CONTROLLER_SCSI; con->controller_port = 0; - int status = ::do_scsi_cmnd_io(get_fd(), iop, con->reportscsiioctl); - con->controller_type = oldtype; con->controller_port = oldport; - if (status < 0) { - set_err(-status); - return false; - } - return true; -} - - -///////////////////////////////////////////////////////////////////////////// -/// Implement CCISS RAID support with old functions - -class legacy_cciss_device -: public /*implements*/ scsi_device, - public /*extends*/ legacy_smart_device -{ -public: - legacy_cciss_device(smart_interface * intf, const char * name, unsigned char disknum); - - virtual bool scsi_pass_through(scsi_cmnd_io * iop); - -private: - unsigned char m_disknum; ///< Disk number. -}; - - -legacy_cciss_device::legacy_cciss_device(smart_interface * intf, - const char * dev_name, unsigned char disknum) -: smart_device(intf, dev_name, "cciss", "cciss"), - legacy_smart_device("SCSI"), - m_disknum(disknum) -{ - set_info().info_name = strprintf("%s [cciss_disk_%02d]", dev_name, disknum); -} - -bool legacy_cciss_device::scsi_pass_through(scsi_cmnd_io * iop) -{ - // See os_linux.cpp - unsigned char oldtype = con->controller_type, oldport = con->controller_port; - con->controller_type = CONTROLLER_CCISS; con->controller_port = m_disknum+1; - int status = ::do_scsi_cmnd_io(get_fd(), iop, con->reportscsiioctl); - con->controller_type = oldtype; con->controller_port = oldport; + int status = ::do_scsi_cmnd_io(get_fd(), iop, scsi_debugmode); if (status < 0) { set_err(-status); return false; @@ -405,44 +204,17 @@ smart_device * legacy_scsi_device::autodetect_open() int avail_len = req_buff[4] + 5; int len = (avail_len < req_len ? avail_len : req_len); if (len < 36) - return this; + return this; // Use INQUIRY to detect type - smart_device * newdev = 0; - try { - // 3ware ? - if (!memcmp(req_buff + 8, "3ware", 5) || !memcmp(req_buff + 8, "AMCC", 4)) { - close(); -#if defined(_WIN32) || defined(__CYGWIN__) - set_err(EINVAL, "AMCC/3ware controller, please try changing device to %s,N", get_dev_name()); -#else - set_err(EINVAL, "AMCC/3ware controller, please try adding '-d 3ware,N',\n" - "you may need to replace %s with /dev/twaN or /dev/tweN", get_dev_name()); -#endif - return this; - } - - // Marvell ? - if (len >= 42 && !memcmp(req_buff + 36, "MVSATA", 6)) { // TODO: Linux-specific? - //pout("Device %s: using '-d marvell' for ATA disk with Marvell driver\n", get_dev_name()); - close(); - newdev = new legacy_marvell_device(smi(), get_dev_name(), get_req_type()); - newdev->open(); // TODO: Can possibly pass open fd - delete this; - return newdev; - } - // SAT or USB ? - newdev = smi()->autodetect_sat_device(this, req_buff, len); + // SAT or USB ? + { + smart_device * newdev = smi()->autodetect_sat_device(this, req_buff, len); if (newdev) // NOTE: 'this' is now owned by '*newdev' return newdev; } - catch (...) { - // Cleanup if exception occurs after newdev was allocated - delete newdev; - throw; - } // Nothing special found return this; @@ -456,11 +228,7 @@ class legacy_smart_interface : public /*implements*/ smart_interface { public: -#ifdef HAVE_GET_OS_VERSION_STR - virtual const char * get_os_version_str(); -#endif - - virtual const char * get_app_examples(const char * appname); + virtual std::string get_app_examples(const char * appname); virtual bool scan_smart_devices(smart_device_list & devlist, const char * type, const char * pattern = 0); @@ -471,27 +239,16 @@ protected: virtual scsi_device * get_scsi_device(const char * name, const char * type); virtual smart_device * autodetect_smart_device(const char * name); - - virtual smart_device * get_custom_smart_device(const char * name, const char * type); - - virtual const char * get_valid_custom_dev_types_str(); }; ////////////////////////////////////////////////////////////////////// -#ifdef HAVE_GET_OS_VERSION_STR -const char * legacy_smart_interface::get_os_version_str() -{ - return ::get_os_version_str(); -} -#endif - -const char * legacy_smart_interface::get_app_examples(const char * appname) +std::string legacy_smart_interface::get_app_examples(const char * appname) { if (!strcmp(appname, "smartctl")) ::print_smartctl_examples(); // this prints to stdout ... - return 0; // ... so don't print again. + return ""; // ... so don't print again. } ata_device * legacy_smart_interface::get_ata_device(const char * name, const char * type) @@ -518,7 +275,7 @@ smart_device * legacy_smart_interface::autodetect_smart_device(const char * name static void free_devnames(char * * devnames, int numdevs) { - static const char version[] = "$Id: dev_legacy.cpp 2879 2009-08-29 17:19:00Z chrfranke $"; + static const char version[] = "$Id: dev_legacy.cpp 3263 2011-02-20 18:32:56Z chrfranke $"; for (int i = 0; i < numdevs; i++) FreeNonZero(devnames[i], -1,__LINE__, version); FreeNonZero(devnames, (sizeof (char*) * numdevs),__LINE__, version); @@ -554,108 +311,24 @@ bool legacy_smart_interface::scan_smart_devices(smart_device_list & devlist, // Add to devlist int i; - if (type==NULL) + if (!type) type=""; for (i = 0; i < numata; i++) { ata_device * atadev = get_ata_device(atanames[i], type); if (atadev) - devlist.add(atadev); + devlist.push_back(atadev); } free_devnames(atanames, numata); for (i = 0; i < numscsi; i++) { scsi_device * scsidev = get_scsi_device(scsinames[i], type); if (scsidev) - devlist.add(scsidev); + devlist.push_back(scsidev); } free_devnames(scsinames, numscsi); return true; } - -smart_device * legacy_smart_interface::get_custom_smart_device(const char * name, const char * type) -{ - // Marvell ? - if (!strcmp(type, "marvell")) - return new legacy_marvell_device(this, name, type); - - // 3Ware ? - int disknum = -1, n1 = -1, n2 = -1; - if (sscanf(type, "3ware,%n%d%n", &n1, &disknum, &n2) == 1 || n1 == 6) { - if (n2 != (int)strlen(type)) { - set_err(EINVAL, "Option -d 3ware,N requires N to be a non-negative integer"); - return 0; - } - if (!(0 <= disknum && disknum <= 127)) { - set_err(EINVAL, "Option -d 3ware,N (N=%d) must have 0 <= N <= 127", disknum); - return 0; - } - int contr = ::guess_device_type(name); - if (contr != CONTROLLER_3WARE_9000_CHAR && contr != CONTROLLER_3WARE_678K_CHAR) - contr = CONTROLLER_3WARE_678K; - return new legacy_escalade_device(this, name, contr, disknum); - } - - // Areca? - disknum = n1 = n2 = -1; - if (sscanf(type, "areca,%n%d%n", &n1, &disknum, &n2) == 1 || n1 == 6) { - if (n2 != (int)strlen(type)) { - set_err(EINVAL, "Option -d areca,N requires N to be a non-negative integer"); - return 0; - } - if (!(1 <= disknum && disknum <= 24)) { - set_err(EINVAL, "Option -d areca,N (N=%d) must have 1 <= N <= 24", disknum); - return 0; - } - return new legacy_areca_device(this, name, disknum); - } - - // Highpoint ? - int controller = -1, channel = -1; disknum = 1; - n1 = n2 = -1; int n3 = -1; - if (sscanf(type, "hpt,%n%d/%d%n/%d%n", &n1, &controller, &channel, &n2, &disknum, &n3) >= 2 || n1 == 4) { - int len = strlen(type); - if (!(n2 == len || n3 == len)) { - set_err(EINVAL, "Option '-d hpt,L/M/N' supports 2-3 items"); - return 0; - } - if (!(1 <= controller && controller <= 8)) { - set_err(EINVAL, "Option '-d hpt,L/M/N' invalid controller id L supplied"); - return 0; - } - if (!(1 <= channel && channel <= 8)) { - set_err(EINVAL, "Option '-d hpt,L/M/N' invalid channel number M supplied"); - return 0; - } - if (!(1 <= disknum && disknum <= 15)) { - set_err(EINVAL, "Option '-d hpt,L/M/N' invalid pmport number N supplied"); - return 0; - } - return new legacy_highpoint_device(this, name, controller, channel, disknum); - } - - // CCISS ? - disknum = n1 = n2 = -1; - if (sscanf(type, "cciss,%n%d%n", &n1, &disknum, &n2) == 1 || n1 == 6) { - if (n2 != (int)strlen(type)) { - set_err(EINVAL, "Option -d cciss,N requires N to be a non-negative integer"); - return 0; - } - if (!(0 <= disknum && disknum <= 15)) { - set_err(EINVAL, "Option -d cciss,N (N=%d) must have 0 <= N <= 15", disknum); - return 0; - } - return new legacy_cciss_device(this, name, disknum); - } - - return 0; -} - -const char * legacy_smart_interface::get_valid_custom_dev_types_str() -{ - return "marvell, areca,N, 3ware,N, hpt,L/M/N, cciss,N"; -} - } // namespace