diff --git a/oam/oamcpp/liboamcpp.cpp b/oam/oamcpp/liboamcpp.cpp index 286b9d348..f85df737a 100644 --- a/oam/oamcpp/liboamcpp.cpp +++ b/oam/oamcpp/liboamcpp.cpp @@ -2523,6 +2523,9 @@ namespace oam string Section = "AlarmConfig"; int returnValue; + struct flock fl; + int fd; + // validate Alarm ID if( alarmid > MAX_ALARM_ID ) @@ -2543,41 +2546,55 @@ namespace oam exceptionControl("setAlarmConfig", API_READONLY_PARAMETER); string fileName = AlarmConfigFile; - - int fd = open(fileName.c_str(), O_RDWR|O_CREAT, 0644); - // Aquire an exclusive lock - if (flock(fd,LOCK_EX) == -1) { - throw runtime_error ("Lock file error: " + fileName); - } + memset(&fl, 0, sizeof(fl)); + fl.l_type = F_RDLCK; // read lock + fl.l_whence = SEEK_SET; + fl.l_start = 0; + fl.l_len = 0; //lock whole file - // write parameter to disk - - Config* alaConfig = Config::makeConfig(AlarmConfigFile.c_str()); - alaConfig->setConfig(Section, name, value); - - try - { - alaConfig->write(); - } - catch(...) - { - // Release lock - if (flock(fd,LOCK_UN)==-1) + // open config file + if ((fd = open(fileName.c_str(), O_RDWR)) >= 0) + { // lock file + if (fcntl(fd, F_SETLKW, &fl) != 0) { - throw runtime_error ("Release lock file error: " + fileName); + ostringstream oss; + oss << "Oam::setAlarmConfig: error locking file " << + fileName << + ": " << + strerror(errno) << + ", proceding anyway."; + cerr << oss.str() << endl; } + + // write parameter to disk - exceptionControl("setAlarmConfig", API_FAILURE); - } + Config* alaConfig = Config::makeConfig(AlarmConfigFile.c_str()); + alaConfig->setConfig(Section, name, value); + + try + { + alaConfig->write(); + } + catch(...) + {} - // Release lock - if (flock(fd,LOCK_UN)==-1) + fl.l_type = F_UNLCK; //unlock + fcntl(fd, F_SETLK, &fl); + + close(fd); + } + else { - throw runtime_error ("Release lock file error: " + fileName); + ostringstream oss; + oss << "Oam::setAlarmConfig: error opening file " << + fileName << + ": " << + strerror(errno); + throw runtime_error(oss.str()); } - close(fd); + return; } /******************************************************************** diff --git a/procmon/processmonitor.cpp b/procmon/processmonitor.cpp index c4292e773..9dcb7fad3 100644 --- a/procmon/processmonitor.cpp +++ b/procmon/processmonitor.cpp @@ -2902,6 +2902,9 @@ int ProcessMonitor::updateLog(std::string action, std::string level) MonitorLog log; Oam oam; + struct flock fl; + int fd; + string fileName; oam.getSystemConfig("SystemLogConfigFile", fileName); if (fileName == oam::UnassignedName ) { @@ -3137,33 +3140,49 @@ int ProcessMonitor::updateLog(std::string action, std::string level) // if (restart) { - unlink (fileName.c_str()); ofstream newFile (fileName.c_str()); - // create new file - int fd = open(fileName.c_str(),O_RDWR|O_CREAT, 0644); - - // Aquire an exclusive lock - if (flock(fd,LOCK_EX) == -1) { - log.writeLog(__LINE__, "ERROR: file lock failure on " + fileName, LOG_TYPE_ERROR ); - close(fd); - return -1; - } - - copy(lines.begin(), lines.end(), ostream_iterator(newFile, "\n")); - newFile.close(); - - // Release lock - if (flock(fd,LOCK_UN) == -1) - { - log.writeLog(__LINE__, "ERROR: file unlock failure on " + fileName, LOG_TYPE_ERROR ); - close(fd); - return -1; - } - close(fd); + memset(&fl, 0, sizeof(fl)); + fl.l_type = F_RDLCK; // read lock + fl.l_whence = SEEK_SET; + fl.l_start = 0; + fl.l_len = 0; //lock whole file - oam.syslogAction("restart"); + // create new file + if ((fd = open(fileName.c_str(), O_RDWR|O_CREAT, 0644)) >= 0) + { // lock file + + if (fcntl(fd, F_SETLKW, &fl) != 0) + { + ostringstream oss; + oss << "ProcessMonitor::updateLog: error locking file " << + fileName << + ": " << + strerror(errno) << + ", proceding anyway."; + cerr << oss.str() << endl; + } + + copy(lines.begin(), lines.end(), ostream_iterator(newFile, "\n")); + newFile.close(); + + fl.l_type = F_UNLCK; //unlock + fcntl(fd, F_SETLK, &fl); + + close(fd); + + oam.syslogAction("restart"); + } + else + { + ostringstream oss; + oss << "ProcessMonitor::updateLog: error opening file " << + fileName << + ": " << + strerror(errno); + throw runtime_error(oss.str()); + } } //update file priviledges