| 1763 | } |
| 1764 | |
| 1765 | U32 KProcess::getdents(FD fildes, U32 dirp, U32 count, bool is64) { |
| 1766 | KFileDescriptorPtr fd = this->getFileDescriptor(fildes); |
| 1767 | |
| 1768 | if (!fd) { |
| 1769 | return -K_EBADF; |
| 1770 | } |
| 1771 | if (fd->kobject->type!=KTYPE_FILE) { |
| 1772 | return -K_ENOTDIR; |
| 1773 | } |
| 1774 | std::shared_ptr<KFile> p = std::dynamic_pointer_cast<KFile>(fd->kobject); |
| 1775 | std::shared_ptr<FsNode> node = p->openFile->node; |
| 1776 | FsOpenNode* openNode = p->openFile; |
| 1777 | |
| 1778 | if (!node->isDirectory()) { |
| 1779 | return -K_ENOTDIR; |
| 1780 | } |
| 1781 | U32 entries = openNode->getDirectoryEntryCount(); |
| 1782 | U32 len = 0; |
| 1783 | |
| 1784 | for (U32 i=(U32)openNode->getFilePointer();i<entries;i++) { |
| 1785 | BString name; |
| 1786 | std::shared_ptr<FsNode> entry = openNode->getDirectoryEntry(i, name); |
| 1787 | U32 recordLen = writeRecord(memory, dirp, len, count, i + 2, is64, name.c_str(), entry->id, entry->getType(true)); |
| 1788 | if (recordLen>0) { |
| 1789 | dirp+=recordLen; |
| 1790 | len+=recordLen; |
| 1791 | openNode->seek(i+1); |
| 1792 | } else if (recordLen == 0) { |
| 1793 | return len; |
| 1794 | } else { |
| 1795 | return recordLen; |
| 1796 | } |
| 1797 | } |
| 1798 | return len; |
| 1799 | } |
| 1800 | |
| 1801 | U32 KProcess::msync(KThread* thread, U32 addr, U32 len, U32 flags) { |
| 1802 | BOXEDWINE_CRITICAL_SECTION_WITH_MUTEX(mappedFilesMutex); |
no test coverage detected