示例#1
0
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);
}
示例#2
0
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);
}
示例#3
0
bool cNoepgChannelID::SaveConfig(cConfig<cNoepgChannelID> &Config, cMutex *Mutex)
{
  cMutexLock filelock(&sFileMutex);
  cMutexLock lock(Mutex);
  return Config.Save();
}
示例#4
0
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;
}