Commit fe804c9f authored by Pavel Vainerman's avatar Pavel Vainerman

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

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