--- embedaddon/smartmontools/dev_interface.cpp 2012/02/21 16:32:16 1.1.1.1 +++ embedaddon/smartmontools/dev_interface.cpp 2012/10/09 09:36:45 1.1.1.2 @@ -3,7 +3,7 @@ * * Home page of code is: http://smartmontools.sourceforge.net * - * Copyright (C) 2008-11 Christian Franke + * Copyright (C) 2008-12 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 @@ -25,7 +25,13 @@ #include #include -const char * dev_interface_cpp_cvsid = "$Id: dev_interface.cpp,v 1.1.1.1 2012/02/21 16:32:16 misho Exp $" +#if defined(HAVE_GETTIMEOFDAY) +#include +#elif defined(HAVE_FTIME) +#include +#endif + +const char * dev_interface_cpp_cvsid = "$Id: dev_interface.cpp,v 1.1.1.2 2012/10/09 09:36:45 misho Exp $" DEV_INTERFACE_H_CVSID; ///////////////////////////////////////////////////////////////////////////// @@ -48,6 +54,17 @@ smart_device::~smart_device() throw() { } +bool smart_device::is_syscall_unsup() const +{ + if (get_errno() == ENOSYS) + return true; +#ifdef ENOTSUP + if (get_errno() == ENOTSUP) + return true; +#endif + return false; +} + bool smart_device::set_err(int no, const char * msg, ...) { if (!msg) @@ -61,8 +78,7 @@ bool smart_device::set_err(int no, const char * msg, . bool smart_device::set_err(int no) { - smi()->set_err_var(&m_err, no); - return false; + return smi()->set_err_var(&m_err, no); } smart_device * smart_device::autodetect_open() @@ -230,7 +246,7 @@ std::string smart_interface::get_valid_dev_types_str() { // default std::string s = - "ata, scsi, sat[,N][+TYPE], usbcypress[,X], usbjmicron[,x][,N], usbsunplus"; + "ata, scsi, sat[,auto][,N][+TYPE], usbcypress[,X], usbjmicron[,x][,N], usbsunplus"; // append custom std::string s2 = get_valid_custom_dev_types_str(); if (!s2.empty()) { @@ -244,28 +260,64 @@ std::string smart_interface::get_app_examples(const ch return ""; } -void smart_interface::set_err(int no, const char * msg, ...) +int64_t smart_interface::get_timer_usec() { - if (!msg) { - set_err(no); return; +#if defined(HAVE_GETTIMEOFDAY) + #if defined(HAVE_CLOCK_GETTIME) && defined(CLOCK_MONOTONIC) + { + static bool have_clock_monotonic = true; + if (have_clock_monotonic) { + struct timespec ts; + if (!clock_gettime(CLOCK_MONOTONIC, &ts)) + return ts.tv_sec * 1000000LL + ts.tv_nsec/1000; + have_clock_monotonic = false; + } } + #endif + { + struct timeval tv; + gettimeofday(&tv, 0); + return tv.tv_sec * 1000000LL + tv.tv_usec; + } +#elif defined(HAVE_FTIME) + { + struct timeb tb; + ftime(&tb); + return tb.time * 1000000LL + tb.millitm * 1000; + } +#else + return -1; +#endif +} + +bool smart_interface::disable_system_auto_standby(bool /*disable*/) +{ + return set_err(ENOSYS); +} + +bool smart_interface::set_err(int no, const char * msg, ...) +{ + if (!msg) + return set_err(no); m_err.no = no; va_list ap; va_start(ap, msg); m_err.msg = vstrprintf(msg, ap); va_end(ap); + return false; } -void smart_interface::set_err(int no) +bool smart_interface::set_err(int no) { - set_err_var(&m_err, no); + return set_err_var(&m_err, no); } -void smart_interface::set_err_var(smart_device::error_info * err, int no) +bool smart_interface::set_err_var(smart_device::error_info * err, int no) { err->no = no; err->msg = get_msg_for_errno(no); if (err->msg.empty() && no != 0) err->msg = strprintf("Unknown error %d", no); + return false; } const char * smart_interface::get_msg_for_errno(int no)