bool cNoepgChannelID::ReadConfig(cConfig<cNoepgChannelID> &Config, cMutex *Mutex) { cMutexLock filelock(&sFileMutex); cMutexLock lock(Mutex); cString filename = cString::sprintf("%s/settings.conf", cPlugin::ConfigDirectory("noepg")); return Config.Load(*filename, true, true); }
int already_running() { int fd; int ret; char buf[16]; fd = open(LOCKFILE, O_RDWR|O_CREAT, LOCKMODE); if (fd < 0) { printf("check single fail\n"); syslog(LOG_ERR, "can't open %s: %s", LOCKFILE, strerror(errno)); exit(1); } if (filelock(fd) < 0) { if (errno == EACCES || errno == EAGAIN) { close(fd); return(1); } printf("check single fail\n"); syslog(LOG_ERR, "can't lock %s: %s", LOCKFILE, strerror(errno)); exit(1); } ret = ftruncate(fd, 0); ret = sprintf(buf, "%ld", (long)getpid()); ret = write(fd, buf, strlen(buf)+1); return(0); }
bool cNoepgChannelID::SaveConfig(cConfig<cNoepgChannelID> &Config, cMutex *Mutex) { cMutexLock filelock(&sFileMutex); cMutexLock lock(Mutex); return Config.Save(); }
OsStatus OsFileBase::open(const int mode) { #ifdef DEBUG_FS pthread_t nTaskId = 0; OsTask* pTask = OsTask::getCurrentTask(); if (pTask) pTask->id(nTaskId); Os::Logger::instance().log(FAC_KERNEL, PRI_DEBUG, "OsFileBase::open ENTER threadid=%ld, filename=%s\n", (long)nTaskId, mFilename.data()); #endif //get a lock for the open call sOpenLock.acquire(); OsStatus stat = OS_INVALID; const char* fmode = ""; if (mode & CREATE) { fmode = "wb+"; } if (mode & READ_ONLY) fmode = "rb"; if (mode & WRITE_ONLY) fmode = "wb"; if (mode & READ_WRITE) fmode = "rb+"; if (mode & APPEND) fmode = "ab+"; if (mode & TRUNCATE) fmode = "wb"; mOsFileHandle = fopen(mFilename.data(),fmode); #ifndef _VXWORKS // 6/27/03 - Bob - Disabling locking under vxworks - crashes //success if (mOsFileHandle) { #ifdef DEBUG_FS Os::Logger::instance().log(FAC_KERNEL, PRI_DEBUG, "OsFileBase::open fopen returned mOsFileHandle=0x%08x, fd=%d, threadid=%d, filename=%s\n", mOsFileHandle, fileno(mOsFileHandle), nTaskId, mFilename.data()); #endif //first test to see if we have a local file lock on that file //get the thread id for local locking mLocalLockThreadId = OsProcess::getCurrentPID(); char* pLockName = new char[mFilename.length() + PID_STR_LEN]; sprintf(pLockName, "%s%ld", mFilename.data(), (long)mLocalLockThreadId); UtlString rValue; if (getFileLocks()->get(pLockName,rValue) == OS_SUCCESS) { //if we want read and someone else is already reading then it's ok if (rValue == "RL" && (mode & READ_ONLY)) stat = OS_SUCCESS; else if (rValue == "WL" && (mode & FSLOCK_WAIT)) { //we need to wait until the lock is freed UtlBoolean lockFree = FALSE; do { OsTask::delay(OsFileLockTimeout); if (getFileLocks()->get(pLockName,rValue) != OS_SUCCESS) { lockFree = TRUE; stat = OS_SUCCESS; } } while (lockFree == FALSE); } else { fclose(mOsFileHandle); mOsFileHandle = NULL; mLocalLockThreadId = INVALID_PID; stat = OS_FILE_ACCESS_DENIED; } } else { rValue = "RL"; if (mode & FSLOCK_WRITE) rValue = "WL"; getFileLocks()->set(pLockName,rValue); stat = OS_SUCCESS; } //if the lock is ok at this point, we need to get a cross process lock if (stat == OS_SUCCESS) { stat = filelock(mode); //returns success if no file sharing specified if (stat != OS_SUCCESS) { ::fclose(mOsFileHandle); mOsFileHandle = NULL; mLocalLockThreadId = INVALID_PID; stat = OS_FILE_ACCESS_DENIED; //remove local process locks getFileLocks()->remove(pLockName); } } delete[] pLockName; } else { switch(errno) { case EACCES: case EMFILE: stat = OS_FILE_ACCESS_DENIED; break; case ENOENT: stat = OS_FILE_NOT_FOUND; break; default: break; } } #else if (mOsFileHandle) { stat = OS_SUCCESS; } #endif sOpenLock.release(); #ifdef DEBUG_FS Os::Logger::instance().log(FAC_KERNEL, PRI_DEBUG, "OsFileBase::open EXIT threadid=%ld\n", nTaskId); #endif return stat; }