From 9ccaaa9642a7697d46bf6a8198e094b82982ab58 Mon Sep 17 00:00:00 2001 From: Ingo Weinhold Date: Tue, 17 Nov 2009 16:40:18 +0000 Subject: [PATCH] * Filter out write permissions. * We now report more correct stat data. The information are retrieved from the Package* objects. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@34098 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- .../file_systems/packagefs/Directory.cpp | 18 +++++++++++++++++ .../kernel/file_systems/packagefs/Directory.h | 2 ++ .../file_systems/packagefs/LeafNode.cpp | 20 +++++++++++++++++++ .../kernel/file_systems/packagefs/LeafNode.h | 2 ++ .../kernel/file_systems/packagefs/Node.h | 2 ++ .../file_systems/packagefs/PackageFile.cpp | 7 +++++++ .../file_systems/packagefs/PackageFile.h | 2 ++ .../file_systems/packagefs/PackageNode.cpp | 7 +++++++ .../file_systems/packagefs/PackageNode.h | 10 ++++++++++ .../kernel/file_systems/packagefs/Volume.cpp | 18 ++++++++++------- .../packagefs/kernel_interface.cpp | 16 +++++++-------- 11 files changed, 89 insertions(+), 15 deletions(-) diff --git a/src/add-ons/kernel/file_systems/packagefs/Directory.cpp b/src/add-ons/kernel/file_systems/packagefs/Directory.cpp index 2d98ef6981..9df1ab2430 100644 --- a/src/add-ons/kernel/file_systems/packagefs/Directory.cpp +++ b/src/add-ons/kernel/file_systems/packagefs/Directory.cpp @@ -65,6 +65,24 @@ Directory::GroupID() const } +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) { diff --git a/src/add-ons/kernel/file_systems/packagefs/Directory.h b/src/add-ons/kernel/file_systems/packagefs/Directory.h index 062c56650d..ac45adf487 100644 --- a/src/add-ons/kernel/file_systems/packagefs/Directory.h +++ b/src/add-ons/kernel/file_systems/packagefs/Directory.h @@ -34,6 +34,8 @@ public: 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); diff --git a/src/add-ons/kernel/file_systems/packagefs/LeafNode.cpp b/src/add-ons/kernel/file_systems/packagefs/LeafNode.cpp index df8d8cb525..f491099b2d 100644 --- a/src/add-ons/kernel/file_systems/packagefs/LeafNode.cpp +++ b/src/add-ons/kernel/file_systems/packagefs/LeafNode.cpp @@ -53,6 +53,26 @@ LeafNode::GroupID() const } +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) { diff --git a/src/add-ons/kernel/file_systems/packagefs/LeafNode.h b/src/add-ons/kernel/file_systems/packagefs/LeafNode.h index b36b8f6f33..c9c13b5b70 100644 --- a/src/add-ons/kernel/file_systems/packagefs/LeafNode.h +++ b/src/add-ons/kernel/file_systems/packagefs/LeafNode.h @@ -20,6 +20,8 @@ public: 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); diff --git a/src/add-ons/kernel/file_systems/packagefs/Node.h b/src/add-ons/kernel/file_systems/packagefs/Node.h index 9df909c788..e312422bca 100644 --- a/src/add-ons/kernel/file_systems/packagefs/Node.h +++ b/src/add-ons/kernel/file_systems/packagefs/Node.h @@ -45,6 +45,8 @@ public: 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; diff --git a/src/add-ons/kernel/file_systems/packagefs/PackageFile.cpp b/src/add-ons/kernel/file_systems/packagefs/PackageFile.cpp index 46534c8dfc..6d762c8cc1 100644 --- a/src/add-ons/kernel/file_systems/packagefs/PackageFile.cpp +++ b/src/add-ons/kernel/file_systems/packagefs/PackageFile.cpp @@ -18,3 +18,10 @@ PackageFile::PackageFile(mode_t mode, const PackageData& data) PackageFile::~PackageFile() { } + + +off_t +PackageFile::FileSize() const +{ + return fData.UncompressedSize(); +} diff --git a/src/add-ons/kernel/file_systems/packagefs/PackageFile.h b/src/add-ons/kernel/file_systems/packagefs/PackageFile.h index 3232104d77..10eae045bb 100644 --- a/src/add-ons/kernel/file_systems/packagefs/PackageFile.h +++ b/src/add-ons/kernel/file_systems/packagefs/PackageFile.h @@ -17,6 +17,8 @@ public: const PackageData& data); virtual ~PackageFile(); + virtual off_t FileSize() const; + private: PackageData fData; }; diff --git a/src/add-ons/kernel/file_systems/packagefs/PackageNode.cpp b/src/add-ons/kernel/file_systems/packagefs/PackageNode.cpp index 8134b3fbc6..cc23685c97 100644 --- a/src/add-ons/kernel/file_systems/packagefs/PackageNode.cpp +++ b/src/add-ons/kernel/file_systems/packagefs/PackageNode.cpp @@ -39,3 +39,10 @@ PackageNode::Init(PackageDirectory* parent, const char* name) return B_OK; } + + +off_t +PackageNode::FileSize() const +{ + return 0; +} diff --git a/src/add-ons/kernel/file_systems/packagefs/PackageNode.h b/src/add-ons/kernel/file_systems/packagefs/PackageNode.h index 291b431964..273795a6e6 100644 --- a/src/add-ons/kernel/file_systems/packagefs/PackageNode.h +++ b/src/add-ons/kernel/file_systems/packagefs/PackageNode.h @@ -6,6 +6,8 @@ #define PACKAGE_NODE_H +#include + #include #include @@ -33,12 +35,20 @@ public: 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; }; diff --git a/src/add-ons/kernel/file_systems/packagefs/Volume.cpp b/src/add-ons/kernel/file_systems/packagefs/Volume.cpp index 5ed64f1e7d..60a4cfc917 100644 --- a/src/add-ons/kernel/file_systems/packagefs/Volume.cpp +++ b/src/add-ons/kernel/file_systems/packagefs/Volume.cpp @@ -134,15 +134,17 @@ struct Volume::PackageLoaderContentHandler : PackageContentHandler { 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 @@ struct Volume::PackageLoaderContentHandler : PackageContentHandler { } 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 @@ struct Volume::PackageLoaderContentHandler : PackageContentHandler { if (error != B_OK) RETURN_ERROR(error); + node->SetModifiedTime(entry->ModifiedTime()); + // add it to the parent directory if (parentDir != NULL) parentDir->AddChild(node); diff --git a/src/add-ons/kernel/file_systems/packagefs/kernel_interface.cpp b/src/add-ons/kernel/file_systems/packagefs/kernel_interface.cpp index bef87fb4b4..1b0dfce5c7 100644 --- a/src/add-ons/kernel/file_systems/packagefs/kernel_interface.cpp +++ b/src/add-ons/kernel/file_systems/packagefs/kernel_interface.cpp @@ -285,17 +285,17 @@ packagefs_read_stat(fs_volume* fsVolume, fs_vnode* fsNode, struct stat* st) 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; }