uint64_t getFileSize(const UnicodeString& path) { struct _stat s; if (statPath(path, &s)) { return s.st_size; } return 0; }
uint64_t getFileSize(const char* path) { struct _stat s; if (statPath(path, &s)) { return s.st_size; } return 0; }
bool fileExists(const UnicodeString& path) { struct _stat s; if (statPath(path, &s)) { return _S_ISREG(s.st_mode); } else { return false; } }
bool dirExists(const std::string& path) { struct _stat s; if (statPath(path, &s)) { return _S_ISDIR(s.st_mode); } else { return false; } }
PathType pathType(const UnicodeString& path) { struct _stat s; if (statPath(path, &s)) { return _S_ISREG(s.st_mode) ? PATHTYPE_FILE : (_S_ISDIR(s.st_mode) ? PATHTYPE_DIR : PATHTYPE_NONE); } else { return PATHTYPE_NONE; } }
void OpenFileFinder::FillInfo(OpenFileFinder::Info* aInfo, const nsACString& aPath) { aInfo->mFileName = aPath; aInfo->mPid = mPid; nsPrintfCString exePath("/proc/%d/exe", mPid); ReadSymLink(exePath, aInfo->mExe); aInfo->mComm.Truncate(); aInfo->mAppName.Truncate(); nsPrintfCString statPath("/proc/%d/stat", mPid); nsCString statString; statString.SetLength(200); char *stat = statString.BeginWriting(); if (!stat) { return; } ReadSysFile(statPath.get(), stat, statString.Length()); // The stat line includes the comm field, surrounded by parenthesis. // However, the contents of the comm field itself is arbitrary and // and can include ')', so we search for the rightmost ) as being // the end of the comm field. char *closeParen = strrchr(stat, ')'); if (!closeParen) { return; } char *openParen = strchr(stat, '('); if (!openParen) { return; } if (openParen >= closeParen) { return; } nsDependentCSubstring comm(&openParen[1], closeParen - openParen - 1); aInfo->mComm = comm; // There is a single character field after the comm and then // the parent pid (the field we're interested in). // ) X ppid // 01234 int ppid = atoi(&closeParen[4]); if (mPid == mMyPid) { // This is chrome process aInfo->mIsB2gOrDescendant = true; DBG("Chrome process has open file(s)"); return; } // For the rest (non-chrome process), we recursively check the ppid to know // it is a descendant of b2g or not. See bug 931456. while (ppid != mMyPid && ppid != 1) { DBG("Process(%d) is not forked from b2g(%d) or Init(1), keep looking", ppid, mMyPid); nsPrintfCString ppStatPath("/proc/%d/stat", ppid); ReadSysFile(ppStatPath.get(), stat, statString.Length()); closeParen = strrchr(stat, ')'); if (!closeParen) { return; } ppid = atoi(&closeParen[4]); } if (ppid == 1) { // This is a not a b2g process. DBG("Non-b2g process has open file(s)"); aInfo->mIsB2gOrDescendant = false; return; } if (ppid == mMyPid) { // This is a descendant of b2g. DBG("Child process of chrome process has open file(s)"); aInfo->mIsB2gOrDescendant = true; } // This looks like a content process. The comm field will be the // app name. aInfo->mAppName = aInfo->mComm; }