Author: bonefish Date: 2009-11-17 17:40:18 +0100 (Tue, 17 Nov 2009) New Revision: 34098 Changeset: http://dev.haiku-os.org/changeset/34098/haiku Modified: haiku/trunk/src/add-ons/kernel/file_systems/packagefs/Directory.cpp haiku/trunk/src/add-ons/kernel/file_systems/packagefs/Directory.h haiku/trunk/src/add-ons/kernel/file_systems/packagefs/LeafNode.cpp haiku/trunk/src/add-ons/kernel/file_systems/packagefs/LeafNode.h haiku/trunk/src/add-ons/kernel/file_systems/packagefs/Node.h haiku/trunk/src/add-ons/kernel/file_systems/packagefs/PackageFile.cpp haiku/trunk/src/add-ons/kernel/file_systems/packagefs/PackageFile.h haiku/trunk/src/add-ons/kernel/file_systems/packagefs/PackageNode.cpp haiku/trunk/src/add-ons/kernel/file_systems/packagefs/PackageNode.h haiku/trunk/src/add-ons/kernel/file_systems/packagefs/Volume.cpp haiku/trunk/src/add-ons/kernel/file_systems/packagefs/kernel_interface.cpp Log: * Filter out write permissions. * We now report more correct stat data. The information are retrieved from the Package* objects. Modified: haiku/trunk/src/add-ons/kernel/file_systems/packagefs/Directory.cpp =================================================================== --- haiku/trunk/src/add-ons/kernel/file_systems/packagefs/Directory.cpp 2009-11-17 16:13:00 UTC (rev 34097) +++ haiku/trunk/src/add-ons/kernel/file_systems/packagefs/Directory.cpp 2009-11-17 16:40:18 UTC (rev 34098) @@ -65,6 +65,24 @@ } +timespec +Directory::ModifiedTime() const +{ + if (PackageDirectory* packageDirectory = fPackageDirectories.Head()) + return packageDirectory->ModifiedTime(); + + timespec time = { 0, 0 }; + return time; +} + + +off_t +Directory::FileSize() const +{ + return 0; +} + + status_t Directory::AddPackageNode(PackageNode* packageNode) { Modified: haiku/trunk/src/add-ons/kernel/file_systems/packagefs/Directory.h =================================================================== --- haiku/trunk/src/add-ons/kernel/file_systems/packagefs/Directory.h 2009-11-17 16:13:00 UTC (rev 34097) +++ haiku/trunk/src/add-ons/kernel/file_systems/packagefs/Directory.h 2009-11-17 16:40:18 UTC (rev 34098) @@ -34,6 +34,8 @@ virtual mode_t Mode() const; virtual uid_t UserID() const; virtual gid_t GroupID() const; + virtual timespec ModifiedTime() const; + virtual off_t FileSize() const; virtual status_t AddPackageNode(PackageNode* packageNode); Modified: haiku/trunk/src/add-ons/kernel/file_systems/packagefs/LeafNode.cpp =================================================================== --- haiku/trunk/src/add-ons/kernel/file_systems/packagefs/LeafNode.cpp 2009-11-17 16:13:00 UTC (rev 34097) +++ haiku/trunk/src/add-ons/kernel/file_systems/packagefs/LeafNode.cpp 2009-11-17 16:40:18 UTC (rev 34098) @@ -53,6 +53,26 @@ } +timespec +LeafNode::ModifiedTime() const +{ + if (PackageLeafNode* packageNode = fPackageNodes.Head()) + return packageNode->ModifiedTime(); + + timespec time = { 0, 0 }; + return time; +} + + +off_t +LeafNode::FileSize() const +{ + if (PackageLeafNode* packageNode = fPackageNodes.Head()) + return packageNode->FileSize(); + return 0; +} + + status_t LeafNode::AddPackageNode(PackageNode* packageNode) { Modified: haiku/trunk/src/add-ons/kernel/file_systems/packagefs/LeafNode.h =================================================================== --- haiku/trunk/src/add-ons/kernel/file_systems/packagefs/LeafNode.h 2009-11-17 16:13:00 UTC (rev 34097) +++ haiku/trunk/src/add-ons/kernel/file_systems/packagefs/LeafNode.h 2009-11-17 16:40:18 UTC (rev 34098) @@ -20,6 +20,8 @@ virtual mode_t Mode() const; virtual uid_t UserID() const; virtual gid_t GroupID() const; + virtual timespec ModifiedTime() const; + virtual off_t FileSize() const; virtual status_t AddPackageNode(PackageNode* packageNode); Modified: haiku/trunk/src/add-ons/kernel/file_systems/packagefs/Node.h =================================================================== --- haiku/trunk/src/add-ons/kernel/file_systems/packagefs/Node.h 2009-11-17 16:13:00 UTC (rev 34097) +++ haiku/trunk/src/add-ons/kernel/file_systems/packagefs/Node.h 2009-11-17 16:40:18 UTC (rev 34098) @@ -45,6 +45,8 @@ virtual mode_t Mode() const = 0; virtual uid_t UserID() const = 0; virtual gid_t GroupID() const = 0; + virtual timespec ModifiedTime() const = 0; + virtual off_t FileSize() const = 0; virtual status_t AddPackageNode(PackageNode* packageNode) = 0; Modified: haiku/trunk/src/add-ons/kernel/file_systems/packagefs/PackageFile.cpp =================================================================== --- haiku/trunk/src/add-ons/kernel/file_systems/packagefs/PackageFile.cpp 2009-11-17 16:13:00 UTC (rev 34097) +++ haiku/trunk/src/add-ons/kernel/file_systems/packagefs/PackageFile.cpp 2009-11-17 16:40:18 UTC (rev 34098) @@ -18,3 +18,10 @@ PackageFile::~PackageFile() { } + + +off_t +PackageFile::FileSize() const +{ + return fData.UncompressedSize(); +} Modified: haiku/trunk/src/add-ons/kernel/file_systems/packagefs/PackageFile.h =================================================================== --- haiku/trunk/src/add-ons/kernel/file_systems/packagefs/PackageFile.h 2009-11-17 16:13:00 UTC (rev 34097) +++ haiku/trunk/src/add-ons/kernel/file_systems/packagefs/PackageFile.h 2009-11-17 16:40:18 UTC (rev 34098) @@ -17,6 +17,8 @@ const PackageData& data); virtual ~PackageFile(); + virtual off_t FileSize() const; + private: PackageData fData; }; Modified: haiku/trunk/src/add-ons/kernel/file_systems/packagefs/PackageNode.cpp =================================================================== --- haiku/trunk/src/add-ons/kernel/file_systems/packagefs/PackageNode.cpp 2009-11-17 16:13:00 UTC (rev 34097) +++ haiku/trunk/src/add-ons/kernel/file_systems/packagefs/PackageNode.cpp 2009-11-17 16:40:18 UTC (rev 34098) @@ -39,3 +39,10 @@ return B_OK; } + + +off_t +PackageNode::FileSize() const +{ + return 0; +} Modified: haiku/trunk/src/add-ons/kernel/file_systems/packagefs/PackageNode.h =================================================================== --- haiku/trunk/src/add-ons/kernel/file_systems/packagefs/PackageNode.h 2009-11-17 16:13:00 UTC (rev 34097) +++ haiku/trunk/src/add-ons/kernel/file_systems/packagefs/PackageNode.h 2009-11-17 16:40:18 UTC (rev 34098) @@ -6,6 +6,8 @@ #define PACKAGE_NODE_H +#include <sys/stat.h> + #include <SupportDefs.h> #include <util/SinglyLinkedList.h> @@ -33,12 +35,20 @@ gid_t GroupID() const { return fGroupID; } void SetGroupID(gid_t id) { fGroupID = id; } + void SetModifiedTime(const timespec& time) + { fModifiedTime = time; } + const timespec& ModifiedTime() const + { return fModifiedTime; } + + virtual off_t FileSize() const; + protected: PackageDirectory* fParent; char* fName; mode_t fMode; uid_t fUserID; gid_t fGroupID; + timespec fModifiedTime; }; Modified: haiku/trunk/src/add-ons/kernel/file_systems/packagefs/Volume.cpp =================================================================== --- haiku/trunk/src/add-ons/kernel/file_systems/packagefs/Volume.cpp 2009-11-17 16:13:00 UTC (rev 34097) +++ haiku/trunk/src/add-ons/kernel/file_systems/packagefs/Volume.cpp 2009-11-17 16:40:18 UTC (rev 34098) @@ -134,15 +134,17 @@ status_t error; + // get the file mode -- filter out write permissions + mode_t mode = entry->Mode() & ~(mode_t)(S_IWUSR | S_IWGRP | S_IWOTH); + // create the package node PackageNode* node; - if (S_ISREG(entry->Mode())) { + if (S_ISREG(mode)) { // file - node = new(std::nothrow) PackageFile(entry->Mode(), entry->Data()); - } else if (S_ISLNK(entry->Mode())) { + node = new(std::nothrow) PackageFile(mode, entry->Data()); + } else if (S_ISLNK(mode)) { // symlink - PackageSymlink* symlink = new(std::nothrow) PackageSymlink( - entry->Mode()); + PackageSymlink* symlink = new(std::nothrow) PackageSymlink(mode); if (symlink == NULL) RETURN_ERROR(B_NO_MEMORY); @@ -153,9 +155,9 @@ } node = symlink; - } else if (S_ISDIR(entry->Mode())) { + } else if (S_ISDIR(mode)) { // directory - node = new(std::nothrow) PackageDirectory(entry->Mode()); + node = new(std::nothrow) PackageDirectory(mode); } else RETURN_ERROR(B_BAD_DATA); @@ -167,6 +169,8 @@ if (error != B_OK) RETURN_ERROR(error); + node->SetModifiedTime(entry->ModifiedTime()); + // add it to the parent directory if (parentDir != NULL) parentDir->AddChild(node); Modified: haiku/trunk/src/add-ons/kernel/file_systems/packagefs/kernel_interface.cpp =================================================================== --- haiku/trunk/src/add-ons/kernel/file_systems/packagefs/kernel_interface.cpp 2009-11-17 16:13:00 UTC (rev 34097) +++ haiku/trunk/src/add-ons/kernel/file_systems/packagefs/kernel_interface.cpp 2009-11-17 16:40:18 UTC (rev 34098) @@ -285,17 +285,17 @@ NodeReadLocker nodeLocker(node); -// TODO: Fill in correctly! st->st_mode = node->Mode(); st->st_nlink = 1; - st->st_uid = 0; - st->st_gid = 0; - st->st_size = 0; + st->st_uid = node->UserID(); + st->st_gid = node->GroupID(); + st->st_size = node->FileSize(); st->st_blksize = kOptimalIOSize; - st->st_atime = 0; - st->st_mtime = 0; - st->st_ctime = 0; - st->st_crtime = 0; + st->st_mtim = node->ModifiedTime(); + st->st_atim = st->st_mtim; + st->st_ctim = st->st_mtim; + // TODO: Perhaps manage a changed time (particularly for directories)? + st->st_crtim = st->st_mtim; return B_OK; }