[haiku-commits] r34098 - haiku/trunk/src/add-ons/kernel/file_systems/packagefs

  • From: ingo_weinhold@xxxxxx
  • To: haiku-commits@xxxxxxxxxxxxx
  • Date: Tue, 17 Nov 2009 17:40:19 +0100 (CET)

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;
 }


Other related posts:

  • » [haiku-commits] r34098 - haiku/trunk/src/add-ons/kernel/file_systems/packagefs - ingo_weinhold