Commit fe804c9f authored by Pavel Vainerman's avatar Pavel Vainerman

Исправления по результатам проверки coverity // часть вторая

parent 90a6fa8c
...@@ -395,23 +395,30 @@ ModbusRTU::mbErrCode MBSlave::fileTransfer( ModbusRTU::FileTransferMessage& quer ...@@ -395,23 +395,30 @@ ModbusRTU::mbErrCode MBSlave::fileTransfer( ModbusRTU::FileTransferMessage& quer
int fd = open(fname.c_str(), O_RDONLY | O_NONBLOCK ); int fd = open(fname.c_str(), O_RDONLY | O_NONBLOCK );
if( fd <= 0 ) if( fd < 0 )
{ {
dwarn << "(fileTransfer): open '" << fname << "' with error: " << strerror(errno) << endl; dwarn << "(fileTransfer): open '" << fname << "' with error: " << strerror(errno) << endl;
return ModbusRTU::erOperationFailed; return ModbusRTU::erOperationFailed;
} }
int seek = query.numpacket * ModbusRTU::FileTransferRetMessage::MaxDataLen; int seek = query.numpacket * ModbusRTU::FileTransferRetMessage::MaxDataLen;
(void)lseek(fd, seek, SEEK_SET); int ret = lseek(fd, seek, SEEK_SET);
if( ret < 0 )
{
close(fd);
dwarn << "(fileTransfer): lseek '" << fname << "' with error: " << strerror(errno) << endl;
return ModbusRTU::erOperationFailed;
}
ModbusRTU::ModbusByte buf[ModbusRTU::FileTransferRetMessage::MaxDataLen]; ModbusRTU::ModbusByte buf[ModbusRTU::FileTransferRetMessage::MaxDataLen];
int ret = ::read(fd, &buf, sizeof(buf)); ret = ::read(fd, &buf, sizeof(buf));
if( ret < 0 ) if( ret < 0 )
{ {
dwarn << "(fileTransfer): read from '" << fname << "' with error: " << strerror(errno) << endl;
close(fd); close(fd);
dwarn << "(fileTransfer): read from '" << fname << "' with error: " << strerror(errno) << endl;
return ModbusRTU::erOperationFailed; return ModbusRTU::erOperationFailed;
} }
...@@ -425,8 +432,8 @@ ModbusRTU::mbErrCode MBSlave::fileTransfer( ModbusRTU::FileTransferMessage& quer ...@@ -425,8 +432,8 @@ ModbusRTU::mbErrCode MBSlave::fileTransfer( ModbusRTU::FileTransferMessage& quer
if( fstat(fd, &fs) < 0 ) if( fstat(fd, &fs) < 0 )
{ {
dwarn << "(fileTransfer): fstat for '" << fname << "' with error: " << strerror(errno) << endl;
close(fd); close(fd);
dwarn << "(fileTransfer): fstat for '" << fname << "' with error: " << strerror(errno) << endl;
return ModbusRTU::erOperationFailed; return ModbusRTU::erOperationFailed;
} }
......
...@@ -390,23 +390,29 @@ ModbusRTU::mbErrCode MBTCPServer::fileTransfer( ModbusRTU::FileTransferMessage& ...@@ -390,23 +390,29 @@ ModbusRTU::mbErrCode MBTCPServer::fileTransfer( ModbusRTU::FileTransferMessage&
int fd = open(fname.c_str(), O_RDONLY | O_NONBLOCK ); int fd = open(fname.c_str(), O_RDONLY | O_NONBLOCK );
if( fd <= 0 ) if( fd < 0 )
{ {
dwarn << "(fileTransfer): open '" << fname << "' with error: " << strerror(errno) << endl; dwarn << "(fileTransfer): open '" << fname << "' with error: " << strerror(errno) << endl;
return ModbusRTU::erOperationFailed; return ModbusRTU::erOperationFailed;
} }
int seek = query.numpacket * ModbusRTU::FileTransferRetMessage::MaxDataLen; int seek = query.numpacket * ModbusRTU::FileTransferRetMessage::MaxDataLen;
(void)lseek(fd, seek, SEEK_SET); int ret = lseek(fd, seek, SEEK_SET);
if( ret < 0 )
{
close(fd);
dwarn << "(fileTransfer): open '" << fname << "' with error: " << strerror(errno) << endl;
return ModbusRTU::erOperationFailed;
}
ModbusRTU::ModbusByte buf[ModbusRTU::FileTransferRetMessage::MaxDataLen]; ModbusRTU::ModbusByte buf[ModbusRTU::FileTransferRetMessage::MaxDataLen];
int ret = ::read(fd, &buf, sizeof(buf)); ret = ::read(fd, &buf, sizeof(buf));
if( ret < 0 ) if( ret < 0 )
{ {
dwarn << "(fileTransfer): read from '" << fname << "' with error: " << strerror(errno) << endl;
close(fd); close(fd);
dwarn << "(fileTransfer): read from '" << fname << "' with error: " << strerror(errno) << endl;
return ModbusRTU::erOperationFailed; return ModbusRTU::erOperationFailed;
} }
...@@ -420,8 +426,8 @@ ModbusRTU::mbErrCode MBTCPServer::fileTransfer( ModbusRTU::FileTransferMessage& ...@@ -420,8 +426,8 @@ ModbusRTU::mbErrCode MBTCPServer::fileTransfer( ModbusRTU::FileTransferMessage&
if( fstat(fd, &fs) < 0 ) if( fstat(fd, &fs) < 0 )
{ {
dwarn << "(fileTransfer): fstat for '" << fname << "' with error: " << strerror(errno) << endl;
close(fd); close(fd);
dwarn << "(fileTransfer): fstat for '" << fname << "' with error: " << strerror(errno) << endl;
return ModbusRTU::erOperationFailed; return ModbusRTU::erOperationFailed;
} }
......
...@@ -846,6 +846,9 @@ end_private(false) ...@@ -846,6 +846,9 @@ end_private(false)
</xsl:if> </xsl:if>
</xsl:for-each> </xsl:for-each>
si.id = UniSetTypes::DefaultObjectId;
si.node = conf->getLocalNode();
sleep_msec = conf->getArgPInt("--" + argprefix + "sleep-msec","<xsl:call-template name="settings"><xsl:with-param name="varname" select="'sleep-msec'"/></xsl:call-template>", <xsl:call-template name="settings"><xsl:with-param name="varname" select="'sleep-msec'"/></xsl:call-template>); sleep_msec = conf->getArgPInt("--" + argprefix + "sleep-msec","<xsl:call-template name="settings"><xsl:with-param name="varname" select="'sleep-msec'"/></xsl:call-template>", <xsl:call-template name="settings"><xsl:with-param name="varname" select="'sleep-msec'"/></xsl:call-template>);
string s_resetTime("<xsl:call-template name="settings"><xsl:with-param name="varname" select="'resetMsgTime'"/></xsl:call-template>"); string s_resetTime("<xsl:call-template name="settings"><xsl:with-param name="varname" select="'resetMsgTime'"/></xsl:call-template>");
...@@ -1252,6 +1255,8 @@ askPause(uniset_conf()->getPIntProp(cnode,"askPause",2000)) ...@@ -1252,6 +1255,8 @@ askPause(uniset_conf()->getPIntProp(cnode,"askPause",2000))
maxHeartBeat = conf->getArgPInt("--" + argprefix + "heartbeat-max",it.getProp("heartbeat_max"), 10); maxHeartBeat = conf->getArgPInt("--" + argprefix + "heartbeat-max",it.getProp("heartbeat_max"), 10);
} }
si.id = UniSetTypes::DefaultObjectId;
si.node = conf->getLocalNode();
sleep_msec = conf->getArgPInt("--" + argprefix + "sleep-msec","<xsl:call-template name="settings-alone"><xsl:with-param name="varname" select="'sleep-msec'"/></xsl:call-template>", <xsl:call-template name="settings-alone"><xsl:with-param name="varname" select="'sleep-msec'"/></xsl:call-template>); sleep_msec = conf->getArgPInt("--" + argprefix + "sleep-msec","<xsl:call-template name="settings-alone"><xsl:with-param name="varname" select="'sleep-msec'"/></xsl:call-template>", <xsl:call-template name="settings-alone"><xsl:with-param name="varname" select="'sleep-msec'"/></xsl:call-template>);
......
...@@ -37,7 +37,7 @@ IOControl::IOControl(UniSetTypes::ObjectId id, UniSetTypes::ObjectId icID, ...@@ -37,7 +37,7 @@ IOControl::IOControl(UniSetTypes::ObjectId id, UniSetTypes::ObjectId icID,
blink_state(true), blink_state(true),
blink2_state(true), blink2_state(true),
blink3_state(true), blink3_state(true),
testLamp_S(UniSetTypes::DefaultObjectId), testLamp_s(UniSetTypes::DefaultObjectId),
isTestLamp(false), isTestLamp(false),
sidHeartBeat(UniSetTypes::DefaultObjectId), sidHeartBeat(UniSetTypes::DefaultObjectId),
force(false), force(false),
...@@ -173,9 +173,9 @@ IOControl::IOControl(UniSetTypes::ObjectId id, UniSetTypes::ObjectId icID, ...@@ -173,9 +173,9 @@ IOControl::IOControl(UniSetTypes::ObjectId id, UniSetTypes::ObjectId icID,
if( !testlamp.empty() ) if( !testlamp.empty() )
{ {
testLamp_S = conf->getSensorID(testlamp); testLamp_s = conf->getSensorID(testlamp);
if( testLamp_S == DefaultObjectId ) if( testLamp_s == DefaultObjectId )
{ {
ostringstream err; ostringstream err;
err << myname << ": Unkown ID for " << testlamp; err << myname << ": Unkown ID for " << testlamp;
...@@ -557,7 +557,7 @@ void IOControl::ioread( IOInfo* it ) ...@@ -557,7 +557,7 @@ void IOControl::ioread( IOInfo* it )
// немного оптимизации // немного оптимизации
// сразу выставляем.сбрасываем флаг тестирования // сразу выставляем.сбрасываем флаг тестирования
if( it->si.id == testLamp_S ) if( it->si.id == testLamp_s )
isTestLamp = set; isTestLamp = set;
} }
else if( it->stype == UniversalIO::AO ) else if( it->stype == UniversalIO::AO )
...@@ -1094,13 +1094,13 @@ void IOControl::check_testmode() ...@@ -1094,13 +1094,13 @@ void IOControl::check_testmode()
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
void IOControl::check_testlamp() void IOControl::check_testlamp()
{ {
if( testLamp_S == DefaultObjectId ) if( testLamp_s == DefaultObjectId )
return; return;
try try
{ {
if( force_out ) if( force_out )
isTestLamp = shm->localGetValue( itTestLamp, testLamp_S ); isTestLamp = shm->localGetValue( itTestLamp, testLamp_s );
if( !trTestLamp.change(isTestLamp) ) if( !trTestLamp.change(isTestLamp) )
return; // если состояние не менялось, то продолжаем работу... return; // если состояние не менялось, то продолжаем работу...
...@@ -1348,8 +1348,8 @@ void IOControl::askSensors( UniversalIO::UIOCommand cmd ) ...@@ -1348,8 +1348,8 @@ void IOControl::askSensors( UniversalIO::UIOCommand cmd )
try try
{ {
if( testLamp_S != DefaultObjectId ) if( testLamp_s != DefaultObjectId )
shm->askSensor(testLamp_S, cmd); shm->askSensor(testLamp_s, cmd);
} }
catch( const Exception& ex) catch( const Exception& ex)
{ {
...@@ -1398,7 +1398,7 @@ void IOControl::sensorInfo( const UniSetTypes::SensorMessage* sm ) ...@@ -1398,7 +1398,7 @@ void IOControl::sensorInfo( const UniSetTypes::SensorMessage* sm )
if( force_out ) if( force_out )
return; return;
if( sm->id == testLamp_S ) if( sm->id == testLamp_s )
{ {
ioinfo << myname << "(sensorInfo): test_lamp=" << sm->value << endl; ioinfo << myname << "(sensorInfo): test_lamp=" << sm->value << endl;
isTestLamp = (bool)sm->value; isTestLamp = (bool)sm->value;
......
...@@ -322,11 +322,11 @@ class IOControl: ...@@ -322,11 +322,11 @@ class IOControl:
bool checkCards( const std::string& func = "" ); bool checkCards( const std::string& func = "" );
xmlNode* cnode; /*!< xml-узел в настроечном файле */ xmlNode* cnode = { 0 }; /*!< xml-узел в настроечном файле */
int polltime; /*!< переодичность обновления данных (опроса карт в/в), [мсек] */ int polltime = { 150 }; /*!< переодичность обновления данных (опроса карт в/в), [мсек] */
CardList cards; /*!< список карт - массив созданных ComediInterface */ CardList cards; /*!< список карт - массив созданных ComediInterface */
bool noCards; bool noCards = { false };
typedef std::vector<IOInfo> IOMap; typedef std::vector<IOInfo> IOMap;
IOMap iomap; /*!< список входов/выходов */ IOMap iomap; /*!< список входов/выходов */
...@@ -334,16 +334,16 @@ class IOControl: ...@@ -334,16 +334,16 @@ class IOControl:
typedef std::deque<IOPriority> PIOMap; typedef std::deque<IOPriority> PIOMap;
PIOMap pmap; /*!< список приоритетных входов/выходов */ PIOMap pmap; /*!< список приоритетных входов/выходов */
unsigned int maxItem; /*!< количество элементов (используется на момент инициализации) */ unsigned int maxItem = { 0 }; /*!< количество элементов (используется на момент инициализации) */
unsigned int maxHalf; unsigned int maxHalf = { 0 };
int filtersize; int filtersize = { 0 };
float filterT; float filterT = { 0.0 };
std::string s_field; std::string s_field;
std::string s_fvalue; std::string s_fvalue;
std::shared_ptr<SMInterface> shm; std::shared_ptr<SMInterface> shm;
UniSetTypes::ObjectId myid; UniSetTypes::ObjectId myid = { UniSetTypes::DefaultObjectId };
std::string prefix; std::string prefix;
typedef std::list<IOInfo*> BlinkList; typedef std::list<IOInfo*> BlinkList;
...@@ -355,46 +355,46 @@ class IOControl: ...@@ -355,46 +355,46 @@ class IOControl:
// обычное мигание // обычное мигание
BlinkList lstBlink; BlinkList lstBlink;
PassiveTimer ptBlink; PassiveTimer ptBlink;
bool blink_state; bool blink_state = { false };
// мигание с двойной частотой // мигание с двойной частотой
BlinkList lstBlink2; BlinkList lstBlink2;
PassiveTimer ptBlink2; PassiveTimer ptBlink2;
bool blink2_state; bool blink2_state = { false };
// мигание с тройной частотой // мигание с тройной частотой
BlinkList lstBlink3; BlinkList lstBlink3;
PassiveTimer ptBlink3; PassiveTimer ptBlink3;
bool blink3_state; bool blink3_state = { false };
UniSetTypes::ObjectId testLamp_S; UniSetTypes::ObjectId testLamp_s = { UniSetTypes::DefaultObjectId };
Trigger trTestLamp; Trigger trTestLamp;
bool isTestLamp; bool isTestLamp = { false };
IOController::IOStateList::iterator itTestLamp; IOController::IOStateList::iterator itTestLamp;
PassiveTimer ptHeartBeat; PassiveTimer ptHeartBeat;
UniSetTypes::ObjectId sidHeartBeat; UniSetTypes::ObjectId sidHeartBeat;
int maxHeartBeat; int maxHeartBeat = { 10 };
IOController::IOStateList::iterator itHeartBeat; IOController::IOStateList::iterator itHeartBeat;
bool force; /*!< флаг, означающий, что надо сохранять в SM, даже если значение не менялось */ bool force = { false }; /*!< флаг, означающий, что надо сохранять в SM, даже если значение не менялось */
bool force_out; /*!< флаг, включающий принудительное чтения выходов */ bool force_out = { false }; /*!< флаг, включающий принудительное чтения выходов */
timeout_t smReadyTimeout; /*!< время ожидания готовности SM к работе, мсек */ timeout_t smReadyTimeout = { 15000 }; /*!< время ожидания готовности SM к работе, мсек */
int defCardNum; /*!< номер карты по умолчанию */ int defCardNum = { -1 }; /*!< номер карты по умолчанию */
int maxCardNum; /*! максимально разрешённый номер для карты */ int maxCardNum = { 10 }; /*! максимально разрешённый номер для карты */
UniSetTypes::uniset_mutex iopollMutex; UniSetTypes::uniset_mutex iopollMutex;
std::atomic_bool activated; std::atomic_bool activated = { false };
bool readconf_ok; bool readconf_ok = { false };
int activateTimeout; int activateTimeout;
UniSetTypes::ObjectId sidTestSMReady; UniSetTypes::ObjectId sidTestSMReady = { UniSetTypes::DefaultObjectId };
bool term; bool term = { false };
UniSetTypes::ObjectId testMode_as; UniSetTypes::ObjectId testMode_as = { UniSetTypes::DefaultObjectId };
IOController::IOStateList::iterator itTestMode; IOController::IOStateList::iterator itTestMode;
long testmode; long testmode = { false };
long prev_testmode; long prev_testmode = { false };
std::shared_ptr<LogAgregator> loga; std::shared_ptr<LogAgregator> loga;
std::shared_ptr<DebugStream> iolog; std::shared_ptr<DebugStream> iolog;
......
...@@ -157,10 +157,10 @@ class LProcessor ...@@ -157,10 +157,10 @@ class LProcessor
std::shared_ptr<SchemaXML> sch; std::shared_ptr<SchemaXML> sch;
UInterface ui; UInterface ui;
int sleepTime; int sleepTime = { 200 };
int smReadyTimeout; /*!< время ожидания готовности SM */ int smReadyTimeout = { 30000 } ; /*!< время ожидания готовности SM, мсек */
std::string logname; std::string logname = { "" };
std::atomic_bool canceled = {false}; std::atomic_bool canceled = {false};
......
...@@ -55,8 +55,8 @@ class PassiveLProcessor: ...@@ -55,8 +55,8 @@ class PassiveLProcessor:
private: private:
PassiveTimer ptHeartBeat; PassiveTimer ptHeartBeat;
UniSetTypes::ObjectId sidHeartBeat; UniSetTypes::ObjectId sidHeartBeat = { UniSetTypes::DefaultObjectId };
int maxHeartBeat; int maxHeartBeat = { 10 };
IOController::IOStateList::iterator itHeartBeat; IOController::IOStateList::iterator itHeartBeat;
UniSetTypes::uniset_mutex mutex_start; UniSetTypes::uniset_mutex mutex_start;
}; };
......
...@@ -17,7 +17,7 @@ MBExchange::MBExchange(UniSetTypes::ObjectId objId, UniSetTypes::ObjectId shmId, ...@@ -17,7 +17,7 @@ MBExchange::MBExchange(UniSetTypes::ObjectId objId, UniSetTypes::ObjectId shmId,
const std::shared_ptr<SharedMemory>& _ic, const std::string& prefix ): const std::shared_ptr<SharedMemory>& _ic, const std::string& prefix ):
UniSetObject_LT(objId), UniSetObject_LT(objId),
allInitOK(false), allInitOK(false),
initPause(0), initPause(3000),
force(false), force(false),
force_out(false), force_out(false),
mbregFromID(false), mbregFromID(false),
......
...@@ -311,41 +311,41 @@ class MBExchange: ...@@ -311,41 +311,41 @@ class MBExchange:
void rtuQueryOptimization( RTUDeviceMap& m ); void rtuQueryOptimization( RTUDeviceMap& m );
xmlNode* cnode; xmlNode* cnode = { 0 };
std::string s_field; std::string s_field;
std::string s_fvalue; std::string s_fvalue;
std::shared_ptr<SMInterface> shm; std::shared_ptr<SMInterface> shm;
bool initPause; timeout_t initPause = { 3000 };
UniSetTypes::uniset_rwmutex mutex_start; UniSetTypes::uniset_rwmutex mutex_start;
bool force; /*!< флаг означающий, что надо сохранять в SM, даже если значение не менялось */ bool force = { false }; /*!< флаг означающий, что надо сохранять в SM, даже если значение не менялось */
bool force_out; /*!< флаг означающий, принудительного чтения выходов */ bool force_out = { false }; /*!< флаг означающий, принудительного чтения выходов */
bool mbregFromID; bool mbregFromID = { false };
int polltime; /*!< переодичность обновления данных, [мсек] */ int polltime = { 100 }; /*!< переодичность обновления данных, [мсек] */
timeout_t sleepPause_usec; timeout_t sleepPause_usec;
unsigned int maxQueryCount; /*!< максимальное количество регистров для одного запроса */ unsigned int maxQueryCount = { ModbusRTU::MAXDATALEN }; /*!< максимальное количество регистров для одного запроса */
PassiveTimer ptHeartBeat; PassiveTimer ptHeartBeat;
UniSetTypes::ObjectId sidHeartBeat; UniSetTypes::ObjectId sidHeartBeat = { UniSetTypes::DefaultObjectId };
int maxHeartBeat; int maxHeartBeat = { 10 };
IOController::IOStateList::iterator itHeartBeat; IOController::IOStateList::iterator itHeartBeat;
UniSetTypes::ObjectId test_id; UniSetTypes::ObjectId test_id = { UniSetTypes::DefaultObjectId };
UniSetTypes::ObjectId sidExchangeMode; /*!< иденидентификатор для датчика режима работы */ UniSetTypes::ObjectId sidExchangeMode = { UniSetTypes::DefaultObjectId }; /*!< иденидентификатор для датчика режима работы */
IOController::IOStateList::iterator itExchangeMode; IOController::IOStateList::iterator itExchangeMode;
long exchangeMode = {emNone}; /*!< режим работы см. ExchangeMode */ long exchangeMode = {emNone}; /*!< режим работы см. ExchangeMode */
std::atomic_bool activated; std::atomic_bool activated = { false };
int activateTimeout; int activateTimeout = { 20000 }; // msec
bool noQueryOptimization; bool noQueryOptimization = { false };
bool no_extimer; bool no_extimer = { false };
std::string prefix; std::string prefix;
timeout_t stat_time; /*!< время сбора статистики обмена */ timeout_t stat_time = { 0 }; /*!< время сбора статистики обмена, 0 - отключена */
unsigned int poll_count; unsigned int poll_count = { 0 };
PassiveTimer ptStatistic; /*!< таймер для сбора статистики обмена */ PassiveTimer ptStatistic; /*!< таймер для сбора статистики обмена */
std::string prop_prefix; /*!< префикс для считывания параметров обмена */ std::string prop_prefix; /*!< префикс для считывания параметров обмена */
...@@ -353,10 +353,10 @@ class MBExchange: ...@@ -353,10 +353,10 @@ class MBExchange:
std::shared_ptr<ModbusClient> mb; std::shared_ptr<ModbusClient> mb;
// определение timeout для соединения // определение timeout для соединения
timeout_t recv_timeout; timeout_t recv_timeout = { 500 }; // msec
timeout_t default_timeout; timeout_t default_timeout = { 5000 }; // msec
int aftersend_pause; int aftersend_pause = { 0 };
PassiveTimer ptReopen; /*!< таймер для переоткрытия соединения */ PassiveTimer ptReopen; /*!< таймер для переоткрытия соединения */
Trigger trReopen; Trigger trReopen;
...@@ -370,7 +370,7 @@ class MBExchange: ...@@ -370,7 +370,7 @@ class MBExchange:
std::string defaultMBtype; std::string defaultMBtype;
std::string defaultMBaddr; std::string defaultMBaddr;
bool defaultMBinitOK; // флаг определяющий нужно ли ждать "первого обмена" или при запуске сохранять в SM значение default. bool defaultMBinitOK = { false }; // флаг определяющий нужно ли ждать "первого обмена" или при запуске сохранять в SM значение default.
std::shared_ptr<LogAgregator> loga; std::shared_ptr<LogAgregator> loga;
std::shared_ptr<DebugStream> mblog; std::shared_ptr<DebugStream> mblog;
......
...@@ -475,23 +475,29 @@ ModbusRTU::mbErrCode MBTCPTestServer::fileTransfer( ModbusRTU::FileTransferMessa ...@@ -475,23 +475,29 @@ ModbusRTU::mbErrCode MBTCPTestServer::fileTransfer( ModbusRTU::FileTransferMessa
int fd = open(fname.c_str(), O_RDONLY | O_NONBLOCK ); int fd = open(fname.c_str(), O_RDONLY | O_NONBLOCK );
if( fd <= 0 ) if( fd < 0 )
{ {
dwarn << "(fileTransfer): open '" << fname << "' with error: " << strerror(errno) << endl; dwarn << "(fileTransfer): open '" << fname << "' with error: " << strerror(errno) << endl;
return ModbusRTU::erOperationFailed; return ModbusRTU::erOperationFailed;
} }
int seek = query.numpacket * ModbusRTU::FileTransferRetMessage::MaxDataLen; int seek = query.numpacket * ModbusRTU::FileTransferRetMessage::MaxDataLen;
(void)lseek(fd, seek, SEEK_SET); int ret = lseek(fd, seek, SEEK_SET);
if( ret < 0 )
{
close(fd);
dwarn << "(fileTransfer): lseek '" << fname << "' with error: " << strerror(errno) << endl;
return ModbusRTU::erOperationFailed;
}
ModbusRTU::ModbusByte buf[ModbusRTU::FileTransferRetMessage::MaxDataLen]; ModbusRTU::ModbusByte buf[ModbusRTU::FileTransferRetMessage::MaxDataLen];
int ret = ::read(fd, &buf, sizeof(buf)); ret = ::read(fd, &buf, sizeof(buf));
if( ret < 0 ) if( ret < 0 )
{ {
dwarn << "(fileTransfer): read from '" << fname << "' with error: " << strerror(errno) << endl;
close(fd); close(fd);
dwarn << "(fileTransfer): read from '" << fname << "' with error: " << strerror(errno) << endl;
return ModbusRTU::erOperationFailed; return ModbusRTU::erOperationFailed;
} }
...@@ -505,8 +511,8 @@ ModbusRTU::mbErrCode MBTCPTestServer::fileTransfer( ModbusRTU::FileTransferMessa ...@@ -505,8 +511,8 @@ ModbusRTU::mbErrCode MBTCPTestServer::fileTransfer( ModbusRTU::FileTransferMessa
if( fstat(fd, &fs) < 0 ) if( fstat(fd, &fs) < 0 )
{ {
dwarn << "(fileTransfer): fstat for '" << fname << "' with error: " << strerror(errno) << endl;
close(fd); close(fd);
dwarn << "(fileTransfer): fstat for '" << fname << "' with error: " << strerror(errno) << endl;
return ModbusRTU::erOperationFailed; return ModbusRTU::erOperationFailed;
} }
......
...@@ -14,7 +14,7 @@ using namespace ModbusRTU; ...@@ -14,7 +14,7 @@ using namespace ModbusRTU;
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
MBSlave::MBSlave(UniSetTypes::ObjectId objId, UniSetTypes::ObjectId shmId, const std::shared_ptr<SharedMemory>& ic, const string& prefix ): MBSlave::MBSlave(UniSetTypes::ObjectId objId, UniSetTypes::ObjectId shmId, const std::shared_ptr<SharedMemory>& ic, const string& prefix ):
UniSetObject_LT(objId), UniSetObject_LT(objId),
initPause(0), initPause(3000),
test_id(DefaultObjectId), test_id(DefaultObjectId),
askcount_id(DefaultObjectId), askcount_id(DefaultObjectId),
respond_id(DefaultObjectId), respond_id(DefaultObjectId),
......
...@@ -445,11 +445,11 @@ class MBSlave: ...@@ -445,11 +445,11 @@ class MBSlave:
std::shared_ptr<ModbusServerSlot> mbslot; std::shared_ptr<ModbusServerSlot> mbslot;
std::unordered_set<ModbusRTU::ModbusAddr> vaddr; /*!< адреса данного узла */ std::unordered_set<ModbusRTU::ModbusAddr> vaddr; /*!< адреса данного узла */
std::string default_mbaddr; std::string default_mbaddr = { "" };
xmlNode* cnode; xmlNode* cnode = { 0 };
std::string s_field; std::string s_field = { "" };
std::string s_fvalue; std::string s_fvalue = { "" };
int default_mbfunc = {0}; // функция по умолчанию, для вычисления RegID int default_mbfunc = {0}; // функция по умолчанию, для вычисления RegID
std::shared_ptr<SMInterface> shm; std::shared_ptr<SMInterface> shm;
...@@ -490,7 +490,7 @@ class MBSlave: ...@@ -490,7 +490,7 @@ class MBSlave:
ModbusRTU::mbErrCode real_write_prop( IOProperty* p, ModbusRTU::ModbusData* dat, int& i, int count ); ModbusRTU::mbErrCode real_write_prop( IOProperty* p, ModbusRTU::ModbusData* dat, int& i, int count );
MBSlave(); MBSlave();
bool initPause; timeout_t initPause = { 3000 };
UniSetTypes::uniset_rwmutex mutex_start; UniSetTypes::uniset_rwmutex mutex_start;
std::shared_ptr< ThreadCreator<MBSlave> > thr; std::shared_ptr< ThreadCreator<MBSlave> > thr;
...@@ -498,29 +498,29 @@ class MBSlave: ...@@ -498,29 +498,29 @@ class MBSlave:
std::condition_variable startNotifyEvent; std::condition_variable startNotifyEvent;
PassiveTimer ptHeartBeat; PassiveTimer ptHeartBeat;
UniSetTypes::ObjectId sidHeartBeat; UniSetTypes::ObjectId sidHeartBeat = { UniSetTypes::DefaultObjectId };
int maxHeartBeat; int maxHeartBeat = { 10 };
IOController::IOStateList::iterator itHeartBeat; IOController::IOStateList::iterator itHeartBeat;
UniSetTypes::ObjectId test_id; UniSetTypes::ObjectId test_id = { UniSetTypes::DefaultObjectId };
IOController::IOStateList::iterator itAskCount; IOController::IOStateList::iterator itAskCount;
UniSetTypes::ObjectId askcount_id; UniSetTypes::ObjectId askcount_id = { UniSetTypes::DefaultObjectId };
IOController::IOStateList::iterator itRespond; IOController::IOStateList::iterator itRespond;
UniSetTypes::ObjectId respond_id; UniSetTypes::ObjectId respond_id = { UniSetTypes::DefaultObjectId };
bool respond_invert; bool respond_invert = { false };
PassiveTimer ptTimeout; PassiveTimer ptTimeout;
long askCount; long askCount = { 0 };
typedef std::unordered_map<ModbusRTU::mbErrCode, unsigned int> ExchangeErrorMap; typedef std::unordered_map<ModbusRTU::mbErrCode, unsigned int> ExchangeErrorMap;
ExchangeErrorMap errmap; /*!< статистика обмена */ ExchangeErrorMap errmap; /*!< статистика обмена */
std::atomic_bool activated; std::atomic_bool activated = { false };
std::atomic_bool cancelled; std::atomic_bool cancelled = { false };
int activateTimeout; int activateTimeout = { 20000 }; // msec
bool pingOK; bool pingOK = { false };
timeout_t wait_msec; timeout_t wait_msec = { 3000 };
bool force; /*!< флаг означающий, что надо сохранять в SM, даже если значение не менялось */ bool force = { false }; /*!< флаг означающий, что надо сохранять в SM, даже если значение не менялось */
bool mbregFromID = {0}; bool mbregFromID = {0};
bool checkMBFunc = {0}; bool checkMBFunc = {0};
...@@ -530,8 +530,8 @@ class MBSlave: ...@@ -530,8 +530,8 @@ class MBSlave:
typedef std::unordered_map<int, std::string> FileList; typedef std::unordered_map<int, std::string> FileList;
FileList flist; FileList flist;
std::string prefix; std::string prefix = { "" };
std::string prop_prefix; std::string prop_prefix = { "" };
ModbusRTU::ModbusData buf[ModbusRTU::MAXLENPACKET / 2 + 1]; /*!< буфер для формирования ответов */ ModbusRTU::ModbusData buf[ModbusRTU::MAXLENPACKET / 2 + 1]; /*!< буфер для формирования ответов */
......
...@@ -2,6 +2,7 @@ ...@@ -2,6 +2,7 @@
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
#include <time.h> #include <time.h>
#include <limits> #include <limits>
#include <memory>
#include "MBSlave.h" #include "MBSlave.h"
#include "UniSetTypes.h" #include "UniSetTypes.h"
#include "modbus/ModbusTCPMaster.h" #include "modbus/ModbusTCPMaster.h"
...@@ -14,26 +15,26 @@ static ModbusRTU::ModbusAddr slaveaddr2 = 0x02; ...@@ -14,26 +15,26 @@ static ModbusRTU::ModbusAddr slaveaddr2 = 0x02;
static int port = 20048; // conf->getArgInt("--mbs-inet-port"); static int port = 20048; // conf->getArgInt("--mbs-inet-port");
static string addr("127.0.0.1"); // conf->getArgParam("--mbs-inet-addr"); static string addr("127.0.0.1"); // conf->getArgParam("--mbs-inet-addr");
static ObjectId slaveID = 6004; // conf->getObjectID( conf->getArgParam("--mbs-name")); static ObjectId slaveID = 6004; // conf->getObjectID( conf->getArgParam("--mbs-name"));
static ModbusTCPMaster* mb = nullptr; static std::shared_ptr<ModbusTCPMaster> mb;
static UInterface* ui = nullptr; static std::shared_ptr<UInterface> ui;
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
static void InitTest() static void InitTest()
{ {
auto conf = uniset_conf(); auto conf = uniset_conf();
CHECK( conf != nullptr ); CHECK( conf != nullptr );
if( ui == nullptr ) if( !ui )
{ {
ui = new UInterface(); ui = std::make_shared<UInterface>();
// UI понадобиться для проверки записанных в SM значений. // UI понадобиться для проверки записанных в SM значений.
CHECK( ui->getObjectIndex() != nullptr ); CHECK( ui->getObjectIndex() != nullptr );
CHECK( ui->getConf() == conf ); CHECK( ui->getConf() == conf );
CHECK( ui->waitReady(slaveID, 5000) ); CHECK( ui->waitReady(slaveID, 5000) );
} }
if( mb == nullptr ) if( !mb )
{ {
mb = new ModbusTCPMaster(); mb = std::make_shared<ModbusTCPMaster>();
ost::InetAddress ia(addr.c_str()); ost::InetAddress ia(addr.c_str());
mb->setTimeout(2000); mb->setTimeout(2000);
REQUIRE_NOTHROW( mb->connect(ia, port) ); REQUIRE_NOTHROW( mb->connect(ia, port) );
......
...@@ -59,7 +59,7 @@ int main(int argc, char* argv[] ) ...@@ -59,7 +59,7 @@ int main(int argc, char* argv[] )
int tout = 6000; int tout = 6000;
PassiveTimer pt(tout); PassiveTimer pt(tout);
while( !pt.checkTime() && !act->exist() ) while( !pt.checkTime() && !act->exist() && !mbs->exist() )
msleep(100); msleep(100);
if( !act->exist() ) if( !act->exist() )
...@@ -68,6 +68,12 @@ int main(int argc, char* argv[] ) ...@@ -68,6 +68,12 @@ int main(int argc, char* argv[] )
return 1; return 1;
} }
if( !mbs->exist() )
{
cerr << "(tests_with_sm): ModbusSlave not exist! (timeout=" << tout << ")" << endl;
return 1;
}
return session.run(); return session.run();
} }
catch( const SystemError& err ) catch( const SystemError& err )
......
...@@ -11,6 +11,6 @@ cd - ...@@ -11,6 +11,6 @@ cd -
./uniset2-start.sh -f ./tests-with-sm $* -- --confile mbslave-test-configure.xml --e-startup-pause 10 \ ./uniset2-start.sh -f ./tests-with-sm $* -- --confile mbslave-test-configure.xml --e-startup-pause 10 \
--mbs-name MBSlave1 --mbs-type TCP --mbs-inet-addr 127.0.0.1 --mbs-inet-port 20048 \ --mbs-name MBSlave1 --mbs-type TCP --mbs-inet-addr 127.0.0.1 --mbs-inet-port 20048 \
--mbs-askcount-id SVU_AskCount_AS --mbs-respond-id RespondRTU_S --mbs-respond-invert 1 \ --mbs-askcount-id SVU_AskCount_AS --mbs-respond-id RespondRTU_S --mbs-respond-invert 1 \
--mbs-filter-field mbs --mbs-filter-value 1 --mbs-filter-field mbs --mbs-filter-value 1 --mbs-initPause 100
#--mbs-log-add-levels any #--mbs-log-add-levels any
\ No newline at end of file
...@@ -11,4 +11,5 @@ cd - ...@@ -11,4 +11,5 @@ cd -
./uniset2-start.sh -f ./tests-with-sm $* -- --apart --confile mbslave-test-configure.xml --e-startup-pause 10 \ ./uniset2-start.sh -f ./tests-with-sm $* -- --apart --confile mbslave-test-configure.xml --e-startup-pause 10 \
--mbs-name MBSlave1 --mbs-type TCP --mbs-inet-addr 127.0.0.1 --mbs-inet-port 20048 \ --mbs-name MBSlave1 --mbs-type TCP --mbs-inet-addr 127.0.0.1 --mbs-inet-port 20048 \
--mbs-askcount-id SVU_AskCount_AS --mbs-respond-id RespondRTU_S --mbs-respond-invert 1 \ --mbs-askcount-id SVU_AskCount_AS --mbs-respond-id RespondRTU_S --mbs-respond-invert 1 \
--mbs-filter-field mbs --mbs-filter-value 1 --mbs-filter-field mbs --mbs-filter-value 1 --mbs-initPause 100
...@@ -1543,18 +1543,27 @@ ModbusRTU::mbErrCode ModbusServer::replyFileTransfer( const std::string& fname, ...@@ -1543,18 +1543,27 @@ ModbusRTU::mbErrCode ModbusServer::replyFileTransfer( const std::string& fname,
} }
int seek = query.numpacket * ModbusRTU::FileTransferRetMessage::MaxDataLen; int seek = query.numpacket * ModbusRTU::FileTransferRetMessage::MaxDataLen;
(void)lseek(fd, seek, SEEK_SET); int ret = lseek(fd, seek, SEEK_SET);
if( ret == -1 )
{
close(fd);
if( dlog && dlog->is_warn() )
(*dlog)[Debug::WARN] << "(replyFileTransfer): open '" << fname << "' with error: " << strerror(errno) << endl;
return ModbusRTU::erOperationFailed;
}
ModbusRTU::ModbusByte buf[ModbusRTU::FileTransferRetMessage::MaxDataLen]; ModbusRTU::ModbusByte buf[ModbusRTU::FileTransferRetMessage::MaxDataLen];
int ret = ::read(fd, &buf, sizeof(buf)); ret = ::read(fd, &buf, sizeof(buf));
if( ret < 0 ) if( ret < 0 )
{ {
close(fd);
if( dlog && dlog->is_warn() ) if( dlog && dlog->is_warn() )
(*dlog)[Debug::WARN] << "(replyFileTransfer): read from '" << fname << "' with error: " << strerror(errno) << endl; (*dlog)[Debug::WARN] << "(replyFileTransfer): read from '" << fname << "' with error: " << strerror(errno) << endl;
close(fd);
return ModbusRTU::erOperationFailed; return ModbusRTU::erOperationFailed;
} }
...@@ -1562,10 +1571,10 @@ ModbusRTU::mbErrCode ModbusServer::replyFileTransfer( const std::string& fname, ...@@ -1562,10 +1571,10 @@ ModbusRTU::mbErrCode ModbusServer::replyFileTransfer( const std::string& fname,
if( fstat(fd, &fs) < 0 ) if( fstat(fd, &fs) < 0 )
{ {
close(fd);
if( dlog && dlog->is_warn() ) if( dlog && dlog->is_warn() )
(*dlog)[Debug::WARN] << "(replyFileTransfer): fstat for '" << fname << "' with error: " << strerror(errno) << endl; (*dlog)[Debug::WARN] << "(replyFileTransfer): fstat for '" << fname << "' with error: " << strerror(errno) << endl;
close(fd);
return ModbusRTU::erOperationFailed; return ModbusRTU::erOperationFailed;
} }
......
...@@ -43,51 +43,52 @@ bool RunLock::isLocked( const string& name ) ...@@ -43,51 +43,52 @@ bool RunLock::isLocked( const string& name )
{ {
FILE* out = fopen( string(name + ".lock" ).c_str(), "r" ); FILE* out = fopen( string(name + ".lock" ).c_str(), "r" );
if( out ) if( out == NULL )
return false;
char ptr[10];
int n = fscanf( out, "%9s", ptr );
if( n < 1 )
{ {
char ptr[10]; fclose(out);
int n = fscanf( out, "%9s", ptr ); return false;
if( n < 1 ) }
return false;
DIR* d = opendir( "/proc" ); DIR* d = opendir( "/proc" );
dirent* dir; dirent* dir;
while((dir = readdir(d))) while((dir = readdir(d)))
{
if( !strcmp( ptr, dir->d_name ) )
{ {
if( !strcmp( ptr, dir->d_name ) ) // по хорошему здесь надо бы проверять
{ // статус на зомби
// по хорошему здесь надо бы проверять /*
// статус на зомби string path(dir->d_name);
/* path = "/proc/" + path + "/status";
string path(dir->d_name); FILE *out_st = fopen( path.c_str(), "r" );
path = "/proc/" + path + "/status"; if(out_st)
FILE *out_st = fopen( path.c_str(), "r" ); {
if(out_st) char ptr_st[1000];
{ fread(ptr_st, sizeof(ptr_st), 1, out_st);
char ptr_st[1000]; string str(ptr_st);
fread(ptr_st, sizeof(ptr_st), 1, out_st); if(str.find(exename) == str.npos)
string str(ptr_st); {
if(str.find(exename) == str.npos) fclose(out_st);
{ break;
fclose(out_st); }
break; }
}
}
*/ */
uinfo << "(RunLock): programm " << name << " already run" << endl; uinfo << "(RunLock): programm " << name << " already run" << endl;
fclose(out); fclose(out);
closedir(d); closedir(d);
return true; return true;
}
} }
fclose(out);
closedir(d);
} }
return false; fclose(out);
closedir(d);
} }
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
bool RunLock::lock( const string& name ) bool RunLock::lock( const string& name )
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment