vshost-util-vserver

Build script and sources for util-vserver.
git clone https://ccx.te2000.cz/git/vshost-util-vserver
Log | Files | Refs

syscall_setiattr-fscompat.hc (2396B)


      1 // $Id$    --*- c -*--
      2 
      3 // Copyright (C) 2004 Enrico Scholz <enrico.scholz@informatik.tu-chemnitz.de>
      4 //
      5 // This program is free software; you can redistribute it and/or modify
      6 // it under the terms of the GNU General Public License as published by
      7 // the Free Software Foundation; version 2 of the License.
      8 //
      9 // This program is distributed in the hope that it will be useful,
     10 // but WITHOUT ANY WARRANTY; without even the implied warranty of
     11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     12 // GNU General Public License for more details.
     13 //
     14 // You should have received a copy of the GNU General Public License
     15 // along with this program; if not, write to the Free Software
     16 // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
     17 
     18 
     19 #ifdef HAVE_CONFIG_H
     20 #  include <config.h>
     21 #endif
     22 
     23 #include "ioctl-setext2flags.hc"
     24 #include "ioctl-setfilecontext.hc"
     25 #include "ioctl-setxflg.hc"
     26 #include "ioctl-getxflg.hc"
     27 
     28 #include <fcntl.h>
     29 #include <sys/stat.h>
     30 
     31 static inline ALWAYSINLINE int
     32 vc_set_iattr_fscompat(char const *filename,
     33 		      xid_t xid,
     34 		      uint32_t flags, uint32_t mask)
     35 {
     36   int			fd;
     37   struct stat		st;
     38   int			stat_rc;
     39 
     40   fd = open(filename, O_RDONLY|O_NONBLOCK);
     41   if (fd==-1) return -1;
     42 
     43   stat_rc = fstat(fd, &st);
     44   if (stat_rc==-1) goto err;
     45 
     46   if ( (mask&VC_IATTR_IUNLINK) ) {
     47     unsigned int const	tmp = VC_IMMUTABLE_FILE_FL|VC_IMMUTABLE_LINK_FL;
     48     if (vc_X_set_ext2flags(fd,
     49 			   (flags&VC_IATTR_IUNLINK) ? tmp : 0,
     50 			   (flags&VC_IATTR_IUNLINK) ? 0   : tmp)==-1)
     51       goto err;
     52   }
     53 
     54   if ( (mask&VC_IATTR_BARRIER) ) {
     55     if ((flags&VC_IATTR_BARRIER)) {
     56       if (vc_X_set_ext2flags(fd, VC_IMMUTABLE_LINK_FL, 0)==-1 ||
     57 	  fchmod(fd, 0))
     58 	goto err;
     59     }
     60     else {
     61       if (vc_X_set_ext2flags(fd, 0, VC_IMMUTABLE_LINK_FL)==-1 ||
     62 	  fchmod(fd, 0500))
     63 	goto err;
     64     }
     65   }
     66 
     67   if ( (mask&VC_IATTR_XID) &&
     68        vc_X_set_filecontext(fd, xid)==-1)
     69     goto err;
     70 
     71   if ( (mask&(VC_IATTR_HIDE|VC_IATTR_WATCH)) ) {
     72     long		tmp;
     73     if (vc_X_get_xflg(fd, &tmp)==-1) goto err;
     74 
     75     tmp &= ~( ((mask&VC_IATTR_HIDE)   ? 1 : 0) |
     76 	      ((mask&VC_IATTR_WATCH) ? 2 : 0) );
     77     tmp |= ( ((flags&VC_IATTR_HIDE)  ? 1 : 0) |
     78 	     ((flags&VC_IATTR_WATCH) ? 2 : 0) );
     79 
     80     if (vc_X_set_xflg(fd, tmp)==-1) goto err;
     81   }
     82 
     83   close(fd);
     84   return 0;
     85   err:
     86   {
     87     int	old_errno = errno;
     88     close(fd);
     89     errno = old_errno;
     90     return -1;
     91   }
     92 }