vshost-util-vserver

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

showattr.c (3584B)


      1 // $Id$
      2 
      3 // Copyright (C) 2003 Enrico Scholz <enrico.scholz@informatik.tu-chemnitz.de>
      4 // based on showattr.cc by Jacques Gelinas
      5 //  
      6 // This program is free software; you can redistribute it and/or modify
      7 // it under the terms of the GNU General Public License as published by
      8 // the Free Software Foundation; either version 2, or (at your option)
      9 // any later version.
     10 //  
     11 // This program is distributed in the hope that it will be useful,
     12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
     13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     14 // GNU General Public License for more details.
     15 //  
     16 // You should have received a copy of the GNU General Public License
     17 // along with this program; if not, write to the Free Software
     18 // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
     19 
     20 #ifdef HAVE_CONFIG_H
     21 #  include <config.h>
     22 #endif
     23 
     24 #include "fstool.h"
     25 #include "util.h"
     26 
     27 #include <lib/fmt.h>
     28 #include <lib/vserver.h>
     29 #include <lib/vserver-internal.h>
     30 
     31 #include <stdio.h>
     32 #include <sys/types.h>
     33 #include <sys/stat.h>
     34 #include <fcntl.h>
     35 #include <ctype.h>
     36 
     37 struct option const
     38 CMDLINE_OPTIONS[] = {
     39   { "help",     no_argument,  0, CMD_HELP },
     40   { "version",  no_argument,  0, CMD_VERSION },
     41 #ifdef VC_ENABLE_API_LEGACY
     42   { "legacy",    no_argument, 0, CMD_LEGACY },
     43 #endif
     44   { 0,0,0,0 }
     45 };
     46 
     47 char const		CMDLINE_OPTIONS_SHORT[] = "Radx";
     48 
     49 void
     50 showHelp(int fd, char const *cmd, int res)
     51 {
     52   WRITE_MSG(fd, "Usage:  ");
     53   WRITE_STR(fd, cmd);
     54   WRITE_MSG(fd,
     55 	    " [-Radx] [--] <file>*\n\n"
     56 	    " Options:\n"
     57 	    "   -R  ...  recurse through directories\n"
     58 	    "   -a  ...  display files starting with '.' also\n"
     59 	    "   -d  ...  list directories like other files instead of listing\n"
     60 	    "            their content\n"
     61 	    "   -x  ...  do not cross filesystems\n\n"
     62 	    "Please report bugs to " PACKAGE_BUGREPORT "\n");
     63   exit(res);
     64 }
     65 
     66 void
     67 showVersion()
     68 {
     69   WRITE_MSG(1,
     70 	    "showattr " VERSION " -- shows vserver specific file attributes\n"
     71 	    "This program is part of " PACKAGE_STRING "\n\n"
     72 	    "Copyright (C) 2004 Enrico Scholz\n"
     73 	    VERSION_COPYRIGHT_DISCLAIMER);
     74   exit(0);
     75 }
     76 
     77 void
     78 fixupParams(struct Arguments UNUSED * args, int UNUSED argc)
     79 {
     80 }
     81 
     82 static bool
     83 getFlags(char const *name, uint32_t *flags, uint32_t *mask)
     84 {
     85   xid_t		xid;
     86   *mask = ~0;
     87   
     88   if (vc_get_iattr(name, &xid, flags, mask)==-1) {
     89     perror("vc_get_iattr()");
     90     return false;
     91   }
     92 
     93   return true;
     94 }
     95 
     96 bool
     97 handleFile(char const *name, char const *display_name)
     98 {
     99   bool			res = true;
    100   char			buf[40];
    101   char			*ptr = buf;
    102   uint32_t		flags;
    103   uint32_t		mask;
    104 
    105   memset(buf, ' ', sizeof buf);
    106 
    107   if (getFlags(name, &flags, &mask)) {
    108       //                                     1       1       0       0
    109       //                              fedcba9876543210fedcba9876543210
    110     static char const	MARKER[33] = ".......x....ciub............mhwa";
    111     int		i;
    112     uint32_t 		used_flags = (VC_IATTR_XID|VC_IATTR_ADMIN|
    113 				      VC_IATTR_WATCH|VC_IATTR_HIDE|
    114 				      VC_IATTR_BARRIER|VC_IATTR_IUNLINK|
    115 				      VC_IATTR_IMMUTABLE|VC_IATTR_WRITE|
    116 				      VC_IATTR_COW);
    117 
    118     for (i=0; i<32; ++i) {
    119       if (used_flags & 1) {
    120 	if (!   (mask  & 1) ) *ptr++ = '-';
    121 	else if (flags & 1)   *ptr++ = toupper(MARKER[31-i]);
    122 	else                  *ptr++ = MARKER[31-i];
    123       }
    124 
    125       used_flags >>= 1;
    126       flags      >>= 1;
    127       mask       >>= 1;
    128     }
    129   }      
    130   else {
    131     memcpy(buf, "ERR    ", 9);
    132     res = false;
    133   }
    134 
    135   Vwrite(1, buf, 10);
    136   Vwrite(1, display_name, strlen(display_name));
    137   Vwrite(1, "\n", 1);
    138 
    139   return res;
    140 }