* added additional 'mode' parameter to avoid an additional 'lstat'
authorEnrico Scholz <enrico.scholz@informatik.tu-chemnitz.de>
Thu, 22 Jan 2004 13:29:48 +0000 (13:29 +0000)
committerEnrico Scholz <enrico.scholz@informatik.tu-chemnitz.de>
Thu, 22 Jan 2004 13:29:48 +0000 (13:29 +0000)
* operate on regular files and directories only

git-svn-id: http://svn.linux-vserver.org/svn/util-vserver/trunk@679 94cd875c-1c1d-0410-91d2-eb244daf1a30

util-vserver/lib/fscompat_getiattr-fscompat.hc
util-vserver/lib/fscompat_setiattr-fscompat.hc

index 24417a7..24d026f 100644 (file)
@@ -29,16 +29,24 @@ vc_get_iattr_compat_fscompat(char const *filename,
                             dev_t dev, ino_t ino,
                             xid_t    * /*@null@*/ xid,
                             uint32_t * /*@null@*/ flags,
-                            uint32_t * mask)
+                            uint32_t * mask,
+                            mode_t const *mode)
 {
-  int                  fd = open(filename, O_RDONLY);
   struct stat          st;
   int                  stat_rc;
+  int                  fd;
   int                  old_mask = *mask;
-    
-  if (fd==-1) return -1;
+
   *mask = 0;
 
+  if (mode!=0) st.st_mode = *mode;
+  else if (lstat(filename, &st)==-1) return -1;
+
+  if (!S_ISREG(st.st_mode) && !S_ISDIR(st.st_mode)) return 0;
+
+  fd = open(filename, O_RDONLY);
+  if (fd==-1) return -1;
+
   stat_rc = fstat(fd, &st);
   if (stat_rc==-1) goto err;
 
index 7ffcb66..7772074 100644 (file)
 static inline ALWAYSINLINE int
 vc_set_iattr_compat_fscompat(char const *filename,
                             dev_t dev, ino_t ino, xid_t xid,
-                            uint32_t flags, uint32_t mask)
+                            uint32_t flags, uint32_t mask,
+                            mode_t const *mode)
 {
-  int                  fd = open(filename, O_RDONLY);
+  int                  fd;
   struct stat          st;
   int                  stat_rc;
-    
+
+  if (mode!=0) st.st_mode = *mode;
+  if (!S_ISREG(st.st_mode) && !S_ISDIR(st.st_mode)) return 0;
+  
+  fd = open(filename, O_RDONLY);
   if (fd==-1) return -1;
     
   stat_rc = fstat(fd, &st);