Ondrej Vasik 4de88f
diff -urNp coreutils-7.1-orig/configure.ac coreutils-7.1/configure.ac
Ondrej Vasik 4de88f
--- coreutils-7.1-orig/configure.ac	2009-02-24 13:47:15.000000000 +0100
Ondrej Vasik 4de88f
+++ coreutils-7.1/configure.ac	2009-02-24 13:47:15.000000000 +0100
Ondrej Vasik 4de88f
@@ -84,6 +84,13 @@ AC_ARG_ENABLE(pam, dnl
Ondrej Vasik 0363d6
 LIB_PAM="-ldl -lpam -lpam_misc"
Ondrej Vasik 0363d6
 AC_SUBST(LIB_PAM)])
Ondrej Vasik 0363d6
 
Ondrej Vasik 0363d6
+dnl Give the chance to enable SELINUX
Ondrej Vasik 0363d6
+AC_ARG_ENABLE(selinux, dnl
Ondrej Vasik 0363d6
+[  --enable-selinux              Enable use of the SELINUX libraries],
Ondrej Vasik 0363d6
+[AC_DEFINE(WITH_SELINUX, 1, [Define if you want to use SELINUX])
Ondrej Vasik 0363d6
+LIB_SELINUX="-lselinux"
Ondrej Vasik 0363d6
+AC_SUBST(LIB_SELINUX)])
Ondrej Vasik 0363d6
+
Ondrej Vasik 0363d6
 AC_FUNC_FORK
Ondrej Vasik 0363d6
 
Ondrej Vasik 0363d6
 optional_bin_progs=
Ondrej Vasik 4de88f
diff -urNp coreutils-7.1-orig/man/chcon.x coreutils-7.1/man/chcon.x
Ondrej Vasik 4de88f
--- coreutils-7.1-orig/man/chcon.x	2008-09-18 09:06:57.000000000 +0200
Ondrej Vasik 4de88f
+++ coreutils-7.1/man/chcon.x	2009-02-24 13:47:15.000000000 +0100
Ondrej Vasik 893c38
@@ -1,4 +1,4 @@
Ondrej Vasik 893c38
 [NAME]
Ondrej Vasik 0363d6
-chcon \- change file security context
Ondrej Vasik 0363d6
+chcon \- change file SELinux security context
Ondrej Vasik 893c38
 [DESCRIPTION]
Ondrej Vasik 0363d6
 .\" Add any additional description here
Ondrej Vasik 4de88f
diff -urNp coreutils-7.1-orig/man/runcon.x coreutils-7.1/man/runcon.x
Ondrej Vasik 4de88f
--- coreutils-7.1-orig/man/runcon.x	2008-09-18 09:06:57.000000000 +0200
Ondrej Vasik 4de88f
+++ coreutils-7.1/man/runcon.x	2009-02-24 13:47:15.000000000 +0100
Ondrej Vasik 893c38
@@ -1,5 +1,5 @@
Ondrej Vasik 893c38
 [NAME]
Ondrej Vasik 893c38
-runcon \- run command with specified security context
Ondrej Vasik 893c38
+runcon \- run command with specified SELinux security context
Ondrej Vasik 893c38
 [DESCRIPTION]
Ondrej Vasik 893c38
 Run COMMAND with completely-specified CONTEXT, or with current or
Ondrej Vasik 893c38
 transitioned security context modified by one or more of LEVEL,
Ondrej Vasik 4de88f
diff -urNp coreutils-7.1-orig/src/copy.c coreutils-7.1/src/copy.c
Ondrej Vasik 4de88f
--- coreutils-7.1-orig/src/copy.c	2009-02-18 15:32:52.000000000 +0100
Ondrej Vasik 4de88f
+++ coreutils-7.1/src/copy.c	2009-02-24 13:47:15.000000000 +0100
Ondrej Vasik 4de88f
@@ -1830,6 +1830,8 @@ copy_internal (char const *src_name, cha
Ondrej Vasik 250517
         {
Ondrej Vasik 250517
           /* Here, we are crossing a file system boundary and cp's -x option
Ondrej Vasik 250517
              is in effect: so don't copy the contents of this directory. */
Ondrej Vasik 0363d6
+        if (x->preserve_security_context)
Ondrej Vasik 250517
+           restore_default_fscreatecon_or_die ();
Ondrej Vasik 250517
         }
Ondrej Vasik 0363d6
       else
Ondrej Vasik 250517
         {
Ondrej Vasik 4de88f
diff -urNp coreutils-7.1-orig/src/copy.h coreutils-7.1/src/copy.h
Ondrej Vasik 4de88f
--- coreutils-7.1-orig/src/copy.h	2009-02-18 15:32:52.000000000 +0100
Ondrej Vasik 4de88f
+++ coreutils-7.1/src/copy.h	2009-02-24 13:47:15.000000000 +0100
Ondrej Vasik 4de88f
@@ -140,6 +140,9 @@ struct cp_options
Ondrej Vasik 0363d6
   bool preserve_mode;
Ondrej Vasik 0363d6
   bool preserve_timestamps;
Ondrej Vasik 0363d6
 
Ondrej Vasik 0363d6
+  /* If true, attempt to set specified security context */
Ondrej Vasik 0363d6
+  bool set_security_context;
Ondrej Vasik 0363d6
+
Ondrej Vasik 0363d6
   /* Enabled for mv, and for cp by the --preserve=links option.
Ondrej Vasik 0363d6
      If true, attempt to preserve in the destination files any
Ondrej Vasik 0363d6
      logical hard links between the source files.  If used with cp's
Ondrej Vasik 4de88f
diff -urNp coreutils-7.1-orig/src/cp.c coreutils-7.1/src/cp.c
Ondrej Vasik 4de88f
--- coreutils-7.1-orig/src/cp.c	2009-02-18 15:32:52.000000000 +0100
Ondrej Vasik 4de88f
+++ coreutils-7.1/src/cp.c	2009-02-24 13:47:15.000000000 +0100
Ondrej Vasik 4de88f
@@ -133,6 +133,7 @@ static struct option const long_opts[] =
Ondrej Vasik 0363d6
   {"target-directory", required_argument, NULL, 't'},
Ondrej Vasik 0363d6
   {"update", no_argument, NULL, 'u'},
Ondrej Vasik 0363d6
   {"verbose", no_argument, NULL, 'v'},
Ondrej Vasik 0363d6
+  {"context", required_argument, NULL, 'Z'},
Ondrej Vasik 0363d6
   {GETOPT_HELP_OPTION_DECL},
Ondrej Vasik 0363d6
   {GETOPT_VERSION_OPTION_DECL},
Ondrej Vasik 0363d6
   {NULL, 0, NULL, 0}
Ondrej Vasik 4de88f
@@ -191,6 +192,9 @@ Mandatory arguments to long options are 
Kamil Dudka b26491
                                  all\n\
Ondrej Vasik 0363d6
 "), stdout);
Ondrej Vasik 0363d6
       fputs (_("\
Ondrej Vasik 0363d6
+  -c                           same as --preserve=context\n\
Ondrej Vasik 0363d6
+"), stdout);
Ondrej Vasik 0363d6
+      fputs (_("\
Ondrej Vasik 0363d6
       --no-preserve=ATTR_LIST  don't preserve the specified attributes\n\
Ondrej Vasik 0363d6
       --parents                use full source file name under DIRECTORY\n\
Ondrej Vasik 0363d6
 "), stdout);
Ondrej Vasik 4de88f
@@ -216,6 +220,7 @@ Mandatory arguments to long options are 
Ondrej Vasik 0363d6
                                  destination file is missing\n\
Ondrej Vasik 0363d6
   -v, --verbose                explain what is being done\n\
Ondrej Vasik 0363d6
   -x, --one-file-system        stay on this file system\n\
Ondrej Vasik 0363d6
+  -Z, --context=CONTEXT        set security context of copy to CONTEXT\n\
Ondrej Vasik 0363d6
 "), stdout);
Ondrej Vasik 0363d6
       fputs (HELP_OPTION_DESCRIPTION, stdout);
Ondrej Vasik 0363d6
       fputs (VERSION_OPTION_DESCRIPTION, stdout);
Ondrej Vasik 4de88f
@@ -765,6 +770,7 @@ cp_option_init (struct cp_options *x)
Ondrej Vasik 0363d6
   x->preserve_timestamps = false;
Ondrej Vasik 0363d6
   x->preserve_security_context = false;
Ondrej Vasik 0363d6
   x->require_preserve_context = false;
Ondrej Vasik 0363d6
+  x->set_security_context = false;
Kamil Dudka b26491
   x->preserve_xattr = false;
Ondrej Vasik 4de88f
   x->reduce_diagnostics = false;
Kamil Dudka b26491
   x->require_preserve_xattr = false;
Ondrej Vasik 4de88f
@@ -911,7 +917,7 @@ main (int argc, char **argv)
Ondrej Vasik 0363d6
      we'll actually use backup_suffix_string.  */
Ondrej Vasik 0363d6
   backup_suffix_string = getenv ("SIMPLE_BACKUP_SUFFIX");
Tim Waugh d66c4d
 
Kamil Dudka b26491
-  while ((c = getopt_long (argc, argv, "abdfHilLnprst:uvxPRS:T",
Kamil Dudka b26491
+  while ((c = getopt_long (argc, argv, "abcdfHilLnprst:uvxPRS:TZ:",
Ondrej Vasik 250517
                            long_opts, NULL))
Ondrej Vasik 250517
          != -1)
Ondrej Vasik 0363d6
     {
Ondrej Vasik 4de88f
@@ -945,6 +951,16 @@ main (int argc, char **argv)
Ondrej Vasik 250517
           copy_contents = true;
Ondrej Vasik 250517
           break;
Ondrej Vasik 250517
 
Ondrej Vasik 250517
+        case 'c':
Ondrej Vasik 250517
+          if ( x.set_security_context ) { 
Ondrej Vasik 250517
+              (void) fprintf(stderr, "%s: cannot force target context and preserve it\n", argv[0]);
Ondrej Vasik 250517
+             exit( 1 );
Ondrej Vasik 250517
+           }
Ondrej Vasik 250517
+           else if (selinux_enabled) {
Ondrej Vasik 250517
+              x.preserve_security_context = true;
Ondrej Vasik 250517
+              x.require_preserve_context = true;
Ondrej Vasik 250517
+           }
Ondrej Vasik 250517
+          break;
Ondrej Vasik 250517
         case 'd':
Ondrej Vasik 250517
           x.preserve_links = true;
Ondrej Vasik 250517
           x.dereference = DEREF_NEVER;
Ondrej Vasik 4de88f
@@ -1054,6 +1070,27 @@ main (int argc, char **argv)
Ondrej Vasik 250517
           x.one_file_system = true;
Ondrej Vasik 250517
           break;
Tim Waugh d66c4d
 
Daniel J Walsh 129baa
+
Ondrej Vasik 250517
+        case 'Z':
Ondrej Vasik 250517
+          /* politely decline if we're not on a selinux-enabled kernel. */
Ondrej Vasik 250517
+          if( !selinux_enabled ) {
Ondrej Vasik 250517
+             fprintf( stderr, "Warning:  ignoring --context (-Z). "
Ondrej Vasik 250517
+                              "It requires a SELinux enabled kernel.\n" );
Ondrej Vasik 250517
+             break;
Ondrej Vasik 250517
+         }
Ondrej Vasik 250517
+         if ( x.preserve_security_context ) {
Ondrej Vasik 250517
+            (void) fprintf(stderr, "%s: cannot force target context to '%s' and preserve it\n", argv[0], optarg);
Ondrej Vasik 250517
+            exit( 1 );
Ondrej Vasik 250517
+         }
Ondrej Vasik 250517
+         x.set_security_context = true;
Ondrej Vasik 250517
+         /* if there's a security_context given set new path 
Ondrej Vasik 250517
+            components to that context, too */
Ondrej Vasik 250517
+         if ( setfscreatecon(optarg) < 0 ) {
Ondrej Vasik 250517
+            (void) fprintf(stderr, _("cannot set default security context %s\n"), optarg);
Ondrej Vasik 250517
+            exit( 1 );
Ondrej Vasik 250517
+         }
Ondrej Vasik 250517
+         break;
Daniel J Walsh 129baa
+
Ondrej Vasik 250517
         case 'S':
Ondrej Vasik 250517
           make_backups = true;
Ondrej Vasik 250517
           backup_suffix_string = optarg;
Ondrej Vasik 4de88f
diff -urNp coreutils-7.1-orig/src/chcon.c coreutils-7.1/src/chcon.c
Ondrej Vasik 4de88f
--- coreutils-7.1-orig/src/chcon.c	2008-10-12 16:12:56.000000000 +0200
Ondrej Vasik 4de88f
+++ coreutils-7.1/src/chcon.c	2009-02-24 13:47:15.000000000 +0100
Ondrej Vasik 4de88f
@@ -346,7 +346,7 @@ Usage: %s [OPTION]... CONTEXT FILE...\n\
Ondrej Vasik 4de88f
 "),
Ondrej Vasik 250517
         program_name, program_name, program_name);
Ondrej Vasik 4de88f
       fputs (_("\
Ondrej Vasik 4de88f
-Change the security context of each FILE to CONTEXT.\n\
Ondrej Vasik 4de88f
+Change the SELinux security context of each FILE to CONTEXT.\n\
Ondrej Vasik 4de88f
 With --reference, change the security context of each FILE to that of RFILE.\n\
Ondrej Vasik 4de88f
 \n\
Ondrej Vasik 4de88f
   -h, --no-dereference   affect symbolic links instead of any referenced file\n\
Ondrej Vasik 4de88f
diff -urNp coreutils-7.1-orig/src/id.c coreutils-7.1/src/id.c
Ondrej Vasik 4de88f
--- coreutils-7.1-orig/src/id.c	2009-02-16 15:57:44.000000000 +0100
Ondrej Vasik 4de88f
+++ coreutils-7.1/src/id.c	2009-02-24 13:47:15.000000000 +0100
Ondrej Vasik 4de88f
@@ -107,7 +107,7 @@ int
Ondrej Vasik 0363d6
 main (int argc, char **argv)
Ondrej Vasik 0363d6
 {
Ondrej Vasik 0363d6
   int optc;
Ondrej Vasik 0363d6
-  int selinux_enabled = (is_selinux_enabled () > 0);
Ondrej Vasik 0363d6
+  bool selinux_enabled = (is_selinux_enabled () > 0);
Ondrej Vasik 0363d6
 
Ondrej Vasik 0363d6
   /* If true, output the list of all group IDs. -G */
Ondrej Vasik 0363d6
   bool just_group_list = false;
Ondrej Vasik 4de88f
diff -urNp coreutils-7.1-orig/src/install.c coreutils-7.1/src/install.c
Ondrej Vasik 4de88f
--- coreutils-7.1-orig/src/install.c	2009-02-18 15:32:52.000000000 +0100
Ondrej Vasik 4de88f
+++ coreutils-7.1/src/install.c	2009-02-24 13:47:15.000000000 +0100
Ondrej Vasik 4de88f
@@ -292,6 +292,7 @@ cp_option_init (struct cp_options *x)
Ondrej Vasik 4de88f
   x->reduce_diagnostics=false;
Ondrej Vasik 0363d6
   x->require_preserve = false;
Ondrej Vasik 0363d6
   x->require_preserve_context = false;
Ondrej Vasik 0363d6
+  x->set_security_context = false;
Ondrej Vasik c4b1fe
   x->require_preserve_xattr = false;
Ondrej Vasik 0363d6
   x->recursive = false;
Ondrej Vasik 0363d6
   x->sparse_mode = SPARSE_AUTO;
Ondrej Vasik 4de88f
@@ -469,7 +470,7 @@ main (int argc, char **argv)
Ondrej Vasik 6feaf7
      we'll actually use backup_suffix_string.  */
Ondrej Vasik 6feaf7
   backup_suffix_string = getenv ("SIMPLE_BACKUP_SUFFIX");
Ondrej Vasik 6feaf7
 
Ondrej Vasik c4b1fe
-  while ((optc = getopt_long (argc, argv, "bcCsDdg:m:o:pt:TvS:Z:", long_options,
Ondrej Vasik c4b1fe
+  while ((optc = getopt_long (argc, argv, "bcCsDdg:m:o:pPt:TvS:Z:", long_options,
Ondrej Vasik 250517
                               NULL)) != -1)
Ondrej Vasik 6feaf7
     {
Ondrej Vasik 6feaf7
       switch (optc)
Ondrej Vasik 4de88f
@@ -539,6 +540,7 @@ main (int argc, char **argv)
Ondrej Vasik 250517
           error (0, 0, _("WARNING: --preserve_context is deprecated; "
Ondrej Vasik 250517
                          "use --preserve-context instead"));
Ondrej Vasik 250517
           /* fall through */
Ondrej Vasik 250517
+        case 'P':
Ondrej Vasik 250517
         case PRESERVE_CONTEXT_OPTION:
Ondrej Vasik 250517
           if ( ! selinux_enabled)
Ondrej Vasik 250517
             {
Ondrej Vasik 4de88f
@@ -546,6 +548,10 @@ main (int argc, char **argv)
Ondrej Vasik 250517
                              "this kernel is not SELinux-enabled"));
Ondrej Vasik 250517
               break;
Ondrej Vasik 250517
             }
Ondrej Vasik 250517
+          if ( x.set_security_context ) {
Ondrej Vasik 250517
+             (void) fprintf(stderr, "%s: cannot force target context and preserve it\n", argv[0]);
Ondrej Vasik 250517
+             exit( 1 );
Ondrej Vasik 250517
+          }
Ondrej Vasik 250517
           x.preserve_security_context = true;
Ondrej Vasik 250517
           use_default_selinux_context = false;
Ondrej Vasik 250517
           break;
Ondrej Vasik 4de88f
@@ -557,6 +563,7 @@ main (int argc, char **argv)
Ondrej Vasik 250517
               break;
Ondrej Vasik 250517
             }
Ondrej Vasik 250517
           scontext = optarg;
Ondrej Vasik 250517
+          x.set_security_context = true;
Ondrej Vasik 250517
           use_default_selinux_context = false;
Ondrej Vasik 250517
           break;
Ondrej Vasik 250517
         case_GETOPT_HELP_CHAR;
Ondrej Vasik 4de88f
@@ -990,8 +997,8 @@ Mandatory arguments to long options are 
Ondrej Vasik 0363d6
   -v, --verbose       print the name of each directory as it is created\n\
Ondrej Vasik 0363d6
 "), stdout);
Ondrej Vasik 0363d6
       fputs (_("\
Ondrej Vasik 0363d6
-      --preserve-context  preserve SELinux security context\n\
Ondrej Vasik 0363d6
-  -Z, --context=CONTEXT  set SELinux security context of files and directories\n\
Ondrej Vasik 0363d6
+  -P, --preserve-context (SELinux) preserve security context\n\
Ondrej Vasik 0363d6
+  -Z, --context=CONTEXT  (SELinux) set security context of files and directories\n\
Ondrej Vasik 0363d6
 "), stdout);
Tim Waugh d66c4d
 
Ondrej Vasik 0363d6
       fputs (HELP_OPTION_DESCRIPTION, stdout);
Ondrej Vasik 4de88f
diff -urNp coreutils-7.1-orig/src/ls.c coreutils-7.1/src/ls.c
Ondrej Vasik 4de88f
--- coreutils-7.1-orig/src/ls.c	2009-02-20 19:34:02.000000000 +0100
Ondrej Vasik 4de88f
+++ coreutils-7.1/src/ls.c	2009-02-24 13:47:15.000000000 +0100
Ondrej Vasik 4de88f
@@ -136,7 +136,8 @@ enum filetype
Tim Waugh d66c4d
     symbolic_link,
Tim Waugh d66c4d
     sock,
Tim Waugh d66c4d
     whiteout,
Tim Waugh d66c4d
-    arg_directory
Tim Waugh d66c4d
+    arg_directory,
Tim Waugh d66c4d
+    command_line
Tim Waugh d66c4d
   };
Tim Waugh d66c4d
 
Tim Waugh d66c4d
 /* Display letters and indicators for each filetype.
Ondrej Vasik 4de88f
@@ -253,6 +254,7 @@ static void queue_directory (char const 
Tim Waugh d66c4d
 static void sort_files (void);
Tim Waugh d66c4d
 static void parse_ls_color (void);
Tim Waugh d66c4d
 void usage (int status);
Tim Waugh d66c4d
+static void print_scontext_format (const struct fileinfo *f);
Tim Waugh d66c4d
 
Ondrej Vasik e18e41
 /* Initial size of hash table.
Ondrej Vasik e18e41
    Most hierarchies are likely to be shallower than this.  */
Ondrej Vasik 4de88f
@@ -322,7 +324,7 @@ static struct pending *pending_dirs;
Ondrej Vasik 0e0613
 
Ondrej Vasik 0e0613
 static struct timespec current_time;
Ondrej Vasik 0363d6
 
Ondrej Vasik 0363d6
-static bool print_scontext;
Ondrej Vasik 0363d6
+static int print_scontext = 0;
Ondrej Vasik 0363d6
 static char UNKNOWN_SECURITY_CONTEXT[] = "?";
Ondrej Vasik 0363d6
 
Ondrej Vasik 0363d6
 /* Whether any of the files has an ACL.  This affects the width of the
Ondrej Vasik 4de88f
@@ -362,7 +364,9 @@ enum format
Tim Waugh d66c4d
     one_per_line,		/* -1 */
Tim Waugh d66c4d
     many_per_line,		/* -C */
Tim Waugh d66c4d
     horizontal,			/* -x */
Tim Waugh d66c4d
-    with_commas			/* -m */
Ondrej Vasik 0363d6
+    with_commas,			/* -m */
Ondrej Vasik 0363d6
+    security_format, /* -Z */
Tim Waugh d66c4d
+    invalid_format
Tim Waugh d66c4d
   };
Tim Waugh d66c4d
 
Tim Waugh d66c4d
 static enum format format;
Ondrej Vasik 4de88f
@@ -754,6 +758,9 @@ enum
Tim Waugh d66c4d
   SHOW_CONTROL_CHARS_OPTION,
Tim Waugh d66c4d
   SI_OPTION,
Tim Waugh d66c4d
   SORT_OPTION,
Tim Waugh d66c4d
+  CONTEXT_OPTION,
Tim Waugh d66c4d
+  LCONTEXT_OPTION,
Tim Waugh d66c4d
+  SCONTEXT_OPTION,
Tim Waugh d66c4d
   TIME_OPTION,
Tim Waugh d66c4d
   TIME_STYLE_OPTION
Tim Waugh d66c4d
 };
Ondrej Vasik 4de88f
@@ -799,7 +806,9 @@ static struct option const long_options[
Tim Waugh d66c4d
   {"time-style", required_argument, NULL, TIME_STYLE_OPTION},
Tim Waugh d66c4d
   {"color", optional_argument, NULL, COLOR_OPTION},
Tim Waugh d66c4d
   {"block-size", required_argument, NULL, BLOCK_SIZE_OPTION},
Ondrej Vasik 0363d6
-  {"context", no_argument, 0, 'Z'},
Tim Waugh d66c4d
+  {"context", no_argument, 0, CONTEXT_OPTION},
Tim Waugh d66c4d
+  {"lcontext", no_argument, 0, LCONTEXT_OPTION},
Tim Waugh d66c4d
+  {"scontext", no_argument, 0, SCONTEXT_OPTION},
Tim Waugh d66c4d
   {"author", no_argument, NULL, AUTHOR_OPTION},
Tim Waugh d66c4d
   {GETOPT_HELP_OPTION_DECL},
Tim Waugh d66c4d
   {GETOPT_VERSION_OPTION_DECL},
Ondrej Vasik 4de88f
@@ -809,12 +818,12 @@ static struct option const long_options[
Tim Waugh d66c4d
 static char const *const format_args[] =
Tim Waugh d66c4d
 {
Tim Waugh d66c4d
   "verbose", "long", "commas", "horizontal", "across",
Tim Waugh d66c4d
-  "vertical", "single-column", NULL
Ondrej Vasik 0363d6
+  "vertical", "single-column", "context", NULL
Tim Waugh d66c4d
 };
Tim Waugh d66c4d
 static enum format const format_types[] =
Tim Waugh d66c4d
 {
Tim Waugh d66c4d
   long_format, long_format, with_commas, horizontal, horizontal,
Ondrej Vasik 0363d6
-  many_per_line, one_per_line
Ondrej Vasik 0363d6
+  many_per_line, one_per_line, security_format
Tim Waugh d66c4d
 };
Tim Waugh d66c4d
 ARGMATCH_VERIFY (format_args, format_types);
Tim Waugh d66c4d
 
Ondrej Vasik a35968
@@ -1194,7 +1203,8 @@ main (int argc, char **argv)
Ondrej Vasik a35968
       /* Avoid following symbolic links when possible.  */
Ondrej Vasik a35968
       if (is_colored (C_ORPHAN)
Ondrej Vasik 250517
           || (is_colored (C_EXEC) && color_symlink_as_referent)
Ondrej Vasik 250517
-          || (is_colored (C_MISSING) && format == long_format))
Ondrej Vasik 250517
+          || (is_colored (C_MISSING) && (format == long_format
Ondrej Vasik 250517
+              || format == security_format)))
Ondrej Vasik 250517
         check_symlink_color = true;
Ondrej Vasik a35968
 
Ondrej Vasik a35968
       /* If the standard output is a controlling terminal, watch out
Ondrej Vasik a35968
@@ -1241,7 +1251,7 @@ main (int argc, char **argv)
Ondrej Vasik a35968
   if (dereference == DEREF_UNDEFINED)
Ondrej Vasik a35968
     dereference = ((immediate_dirs
Ondrej Vasik 250517
                     || indicator_style == classify
Ondrej Vasik 250517
-                    || format == long_format)
Ondrej Vasik 250517
+                    || format == long_format || format == security_format)
Ondrej Vasik 250517
                    ? DEREF_NEVER
Ondrej Vasik 250517
                    : DEREF_COMMAND_LINE_SYMLINK_TO_DIR);
Ondrej Vasik a35968
 
Ondrej Vasik a35968
@@ -1261,7 +1271,7 @@ main (int argc, char **argv)
Tim Waugh d66c4d
 
Tim Waugh d66c4d
   format_needs_stat = sort_type == sort_time || sort_type == sort_size
Tim Waugh d66c4d
     || format == long_format
Ondrej Vasik 0363d6
-    || print_scontext
Tim Waugh d66c4d
+    || format == security_format || print_scontext
Tim Waugh d66c4d
     || print_block_size;
Tim Waugh d66c4d
   format_needs_type = (! format_needs_stat
Ondrej Vasik 250517
                        && (recursive
Ondrej Vasik a35968
@@ -1292,7 +1302,7 @@ main (int argc, char **argv)
Tim Waugh d66c4d
     }
Tim Waugh d66c4d
   else
Tim Waugh d66c4d
     do
Tim Waugh d66c4d
-      gobble_file (argv[i++], unknown, NOT_AN_INODE_NUMBER, true, "");
Tim Waugh d66c4d
+      gobble_file (argv[i++], command_line, NOT_AN_INODE_NUMBER, true, "");
Tim Waugh d66c4d
     while (i < argc);
Tim Waugh d66c4d
 
Tim Waugh bb664a
   if (cwd_n_used)
Ondrej Vasik a35968
@@ -1455,7 +1465,7 @@ decode_switches (int argc, char **argv)
Tim Waugh d66c4d
   ignore_mode = IGNORE_DEFAULT;
Tim Waugh d66c4d
   ignore_patterns = NULL;
Tim Waugh d66c4d
   hide_patterns = NULL;
Ondrej Vasik 0363d6
-  print_scontext = false;
Ondrej Vasik 0363d6
+  print_scontext = 0;
Tim Waugh d66c4d
 
Tim Waugh d66c4d
   /* FIXME: put this in a function.  */
Tim Waugh d66c4d
   {
Ondrej Vasik a35968
@@ -1837,13 +1847,27 @@ decode_switches (int argc, char **argv)
Ondrej Vasik 250517
           break;
Tim Waugh d66c4d
 
Ondrej Vasik 250517
         case 'Z':
Ondrej Vasik 250517
-          print_scontext = true;
Ondrej Vasik 250517
+          print_scontext = 1;
Ondrej Vasik 0363d6
+    format = security_format;
Ondrej Vasik 250517
           break;
Ondrej Vasik 0363d6
 
Ondrej Vasik 250517
         case_GETOPT_HELP_CHAR;
Tim Waugh d66c4d
 
Ondrej Vasik 250517
         case_GETOPT_VERSION_CHAR (PROGRAM_NAME, AUTHORS);
Tim Waugh d66c4d
 
Ondrej Vasik 0363d6
+  case CONTEXT_OPTION: /* default security context format */
Ondrej Vasik 250517
+                print_scontext = 1;
Ondrej Vasik 250517
+                format = security_format;
Ondrej Vasik 250517
+                break;
Ondrej Vasik 250517
+        case LCONTEXT_OPTION: /* long format plus security context */
Ondrej Vasik 250517
+                print_scontext = 1;
Ondrej Vasik 250517
+                format = long_format;
Ondrej Vasik 250517
+                break;
Ondrej Vasik 250517
+        case SCONTEXT_OPTION: /* short form of new security format */
Ondrej Vasik 250517
+                print_scontext = 0;
Ondrej Vasik 250517
+                format = security_format;
Ondrej Vasik 250517
+                break;
Tim Waugh 5505e2
+
Ondrej Vasik 250517
         default:
Ondrej Vasik 250517
           usage (LS_FAILURE);
Ondrej Vasik 250517
         }
Ondrej Vasik a35968
@@ -2557,8 +2581,10 @@ clear_files (void)
Tim Waugh bb664a
       struct fileinfo *f = sorted_file[i];
Tim Waugh bb664a
       free (f->name);
Tim Waugh bb664a
       free (f->linkname);
Ondrej Vasik 0363d6
-      if (f->scontext != UNKNOWN_SECURITY_CONTEXT)
Ondrej Vasik 250517
-        freecon (f->scontext);
Ondrej Vasik 0363d6
+      if (f->scontext != UNKNOWN_SECURITY_CONTEXT) {
Ondrej Vasik 250517
+               freecon (f->scontext);
Ondrej Vasik 0363d6
+        f->scontext = NULL;
Ondrej Vasik 0363d6
+      }
Tim Waugh d66c4d
     }
Ondrej Vasik 0363d6
 
Ondrej Vasik 0363d6
   cwd_n_used = 0;
Ondrej Vasik a35968
@@ -2600,6 +2626,7 @@ gobble_file (char const *name, enum file
Tim Waugh d66c4d
   memset (f, '\0', sizeof *f);
Tim Waugh d66c4d
   f->stat.st_ino = inode;
Tim Waugh d66c4d
   f->filetype = type;
Tim Waugh d66c4d
+  f->scontext = NULL;
Tim Waugh d66c4d
 
Tim Waugh d66c4d
   if (command_line_arg
Tim Waugh d66c4d
       || format_needs_stat
Ondrej Vasik a35968
@@ -2699,7 +2726,7 @@ gobble_file (char const *name, enum file
Ondrej Vasik 0363d6
 
Tim Waugh 327524
       f->stat_ok = true;
Tim Waugh d66c4d
 
Ondrej Vasik 0363d6
-      if (format == long_format || print_scontext)
Ondrej Vasik 98cf8d
+      if (format == long_format || format == security_format || print_scontext)
Ondrej Vasik 250517
         {
Ondrej Vasik 250517
           bool have_selinux = false;
Ondrej Vasik 250517
           bool have_acl = false;
Ondrej Vasik a35968
@@ -2732,7 +2760,7 @@ gobble_file (char const *name, enum file
Ondrej Vasik 250517
                 err = 0;
Ondrej Vasik 250517
             }
Ondrej Vasik 250517
 
Ondrej Vasik 250517
-          if (err == 0 && format == long_format)
Ondrej Vasik 250517
+          if (err == 0 && (format == long_format || format == security_format))
Ondrej Vasik 250517
             {
Ondrej Vasik 250517
               int n = file_has_acl (absolute_name, &f->stat);
Ondrej Vasik 250517
               err = (n < 0);
Ondrej Vasik a35968
@@ -2751,7 +2779,8 @@ gobble_file (char const *name, enum file
Ondrej Vasik 250517
         }
Ondrej Vasik a35968
 
Ondrej Vasik a35968
       if (S_ISLNK (f->stat.st_mode)
Ondrej Vasik 250517
-          && (format == long_format || check_symlink_color))
Ondrej Vasik 250517
+          && (format == long_format || format == security_format
Ondrej Vasik 250517
+              || check_symlink_color))
Ondrej Vasik 250517
         {
Ondrej Vasik 250517
           char *linkname;
Ondrej Vasik 250517
           struct stat linkstats;
Ondrej Vasik a35968
@@ -2771,6 +2800,7 @@ gobble_file (char const *name, enum file
Ondrej Vasik 250517
                  command line are automatically traced if not being
Ondrej Vasik 250517
                  listed as files.  */
Ondrej Vasik 250517
               if (!command_line_arg || format == long_format
Ondrej Vasik 250517
+                  || format == security_format
Ondrej Vasik 250517
                   || !S_ISDIR (linkstats.st_mode))
Ondrej Vasik 250517
                 {
Ondrej Vasik 250517
                   /* Get the linked-to file's mode for the filetype indicator
Ondrej Vasik a35968
@@ -2810,7 +2840,7 @@ gobble_file (char const *name, enum file
Ondrej Vasik 250517
             block_size_width = len;
Ondrej Vasik 250517
         }
Ondrej Vasik a35968
 
Ondrej Vasik a35968
-      if (format == long_format)
Ondrej Vasik a35968
+      if (format == long_format || format == security_format)
Ondrej Vasik 250517
         {
Ondrej Vasik 250517
           if (print_owner)
Ondrej Vasik 250517
             {
Ondrej Vasik a35968
@@ -3312,6 +3341,13 @@ print_current_files (void)
Ondrej Vasik 250517
           print_long_format (sorted_file[i]);
Ondrej Vasik 250517
           DIRED_PUTCHAR ('\n');
Ondrej Vasik 250517
         }
Ondrej Vasik 0363d6
+     break;
Tim Waugh d66c4d
+    case security_format:
Tim Waugh bb664a
+      for (i = 0; i < cwd_n_used; i++)
Tim Waugh d66c4d
+      {
Tim Waugh bb664a
+        print_scontext_format (sorted_file[i]);
Tim Waugh d66c4d
+        DIRED_PUTCHAR ('\n');
Tim Waugh d66c4d
+      }
Ondrej Vasik 0363d6
       break;
Tim Waugh d66c4d
     }
Tim Waugh d66c4d
 }
Ondrej Vasik a35968
@@ -3434,6 +3470,69 @@ format_group_width (gid_t g)
Ondrej Vasik 4de88f
 }
Ondrej Vasik 4de88f
 
Ondrej Vasik 4de88f
 
Ondrej Vasik 4de88f
+/* Print info about f in scontext format */
Ondrej Vasik 4de88f
+static void
Ondrej Vasik 4de88f
+print_scontext_format (const struct fileinfo *f)
Ondrej Vasik 4de88f
+{
Ondrej Vasik 4de88f
+  char modebuf[12];
Ondrej Vasik 4de88f
+
Ondrej Vasik 4de88f
+  /* 7 fields that may require LONGEST_HUMAN_READABLE bytes,
Ondrej Vasik 4de88f
+     1 10-byte mode string,
Ondrej Vasik 4de88f
+     9 spaces, one following each of these fields, and
Ondrej Vasik 4de88f
+     1 trailing NUL byte.  */
Ondrej Vasik 4de88f
+
Ondrej Vasik 4de88f
+  char init_bigbuf[7 * LONGEST_HUMAN_READABLE + 10  + 9 + 1];
Ondrej Vasik 4de88f
+  char *buf = init_bigbuf;
Ondrej Vasik 4de88f
+  char *p;
Ondrej Vasik 4de88f
+
Ondrej Vasik 4de88f
+  p = buf;
Ondrej Vasik 4de88f
+
Ondrej Vasik 4de88f
+  if ( print_scontext ) { /* zero means terse listing */
Ondrej Vasik 4de88f
+    filemodestring (&f->stat, modebuf);
Ondrej Vasik 4de88f
+    if (! any_has_acl)
Ondrej Vasik 4de88f
+      modebuf[10] = '\0';
Ondrej Vasik 4de88f
+    else if (f->acl_type == ACL_T_SELINUX_ONLY)
Ondrej Vasik 4de88f
+      modebuf[10] = '.';
Ondrej Vasik 4de88f
+    else if (f->acl_type == ACL_T_YES)
Ondrej Vasik 4de88f
+      modebuf[10] = '+';
Ondrej Vasik 4de88f
+    modebuf[11] = '\0';
Ondrej Vasik 4de88f
+
Ondrej Vasik 4de88f
+    /* print mode */
Ondrej Vasik 4de88f
+
Ondrej Vasik 4de88f
+    (void) sprintf (p, "%s ", modebuf);
Ondrej Vasik 4de88f
+    p += strlen (p);
Ondrej Vasik 4de88f
+
Ondrej Vasik 4de88f
+    /* print standard user and group */
Ondrej Vasik 4de88f
+
Ondrej Vasik 4de88f
+    DIRED_FPUTS (buf, stdout, p - buf);
Ondrej Vasik 4de88f
+    format_user (f->stat.st_uid, owner_width, f->stat_ok);
Ondrej Vasik 4de88f
+    format_group (f->stat.st_gid, group_width, f->stat_ok);
Ondrej Vasik 4de88f
+    p = buf;
Ondrej Vasik 4de88f
+  }
Ondrej Vasik 4de88f
+
Ondrej Vasik 4de88f
+  (void) sprintf (p, "%-32s ", f->scontext ?: "");
Ondrej Vasik 4de88f
+  p += strlen (p);
Ondrej Vasik 4de88f
+
Ondrej Vasik 4de88f
+  DIRED_INDENT ();
Ondrej Vasik 4de88f
+  DIRED_FPUTS (buf, stdout, p - buf);
Ondrej Vasik 4de88f
+  size_t w = print_name_with_quoting (f->name, FILE_OR_LINK_MODE(f), f->linkok,
Ondrej Vasik 250517
+                           f->stat_ok, f->filetype, &dired_obstack, f->stat.st_nlink, p - buf);
Ondrej Vasik 4de88f
+
Ondrej Vasik 4de88f
+  if (f->filetype == symbolic_link) {
Ondrej Vasik 4de88f
+      if (f->linkname) {
Ondrej Vasik 250517
+          DIRED_FPUTS_LITERAL (" -> ", stdout);
Ondrej Vasik 250517
+          print_name_with_quoting (f->linkname, f->linkmode, f->linkok - 1,
Ondrej Vasik 250517
+                                   f->stat_ok, f->filetype, NULL, f->stat.st_nlink, (p-buf) + w + 4 );
Ondrej Vasik 250517
+          if (indicator_style != none)
Ondrej Vasik 250517
+            print_type_indicator (f->stat_ok, f->linkmode, f->filetype);
Ondrej Vasik 4de88f
+      }
Ondrej Vasik 4de88f
+  }
Ondrej Vasik 4de88f
+  else {
Ondrej Vasik 4de88f
+    if (indicator_style != none)
Ondrej Vasik 4de88f
+      print_type_indicator (f->stat_ok, f->stat.st_mode, f->filetype);
Ondrej Vasik 4de88f
+  }
Ondrej Vasik 4de88f
+}
Ondrej Vasik 4de88f
+
Ondrej Vasik 4de88f
 /* Print information about F in long format.  */
Ondrej Vasik 4de88f
 
Ondrej Vasik 4de88f
 static void
Ondrej Vasik a35968
@@ -3528,9 +3627,15 @@ print_long_format (const struct fileinfo
Tim Waugh d66c4d
      The latter is wrong when nlink_width is zero.  */
Tim Waugh d66c4d
   p += strlen (p);
Tim Waugh d66c4d
 
Tim Waugh d66c4d
+  if (print_scontext)
Tim Waugh 5505e2
+    {
Tim Waugh d66c4d
+      sprintf (p, "%-32s ", f->scontext ? f->scontext : "");
Tim Waugh d66c4d
+      p += strlen (p);
Tim Waugh 5505e2
+    }
Tim Waugh 5505e2
+
Tim Waugh d66c4d
   DIRED_INDENT ();
Tim Waugh d66c4d
 
Ondrej Vasik 0363d6
-  if (print_owner | print_group | print_author | print_scontext)
Ondrej Vasik 0363d6
+  if (print_owner | print_group | print_author)
Ondrej Vasik 0363d6
     {
Ondrej Vasik 0363d6
       DIRED_FPUTS (buf, stdout, p - buf);
Ondrej Vasik 0363d6
 
Ondrej Vasik a35968
@@ -3543,9 +3648,6 @@ print_long_format (const struct fileinfo
Ondrej Vasik 0363d6
       if (print_author)
Ondrej Vasik 250517
         format_user (f->stat.st_author, author_width, f->stat_ok);
Ondrej Vasik 0363d6
 
Ondrej Vasik 0363d6
-      if (print_scontext)
Ondrej Vasik 250517
-        format_user_or_group (f->scontext, 0, scontext_width);
Ondrej Vasik 0363d6
-
Ondrej Vasik 0363d6
       p = buf;
Ondrej Vasik 0363d6
     }
Ondrej Vasik 0363d6
 
Ondrej Vasik a35968
@@ -3888,9 +3990,6 @@ print_file_name_and_frills (const struct
Ondrej Vasik 250517
             human_readable (ST_NBLOCKS (f->stat), buf, human_output_opts,
Ondrej Vasik 250517
                             ST_NBLOCKSIZE, output_block_size));
Ondrej Vasik 0363d6
 
Ondrej Vasik 0363d6
-  if (print_scontext)
Ondrej Vasik 0363d6
-    printf ("%*s ", format == with_commas ? 0 : scontext_width, f->scontext);
Ondrej Vasik 0363d6
-
Ondrej Vasik c4b1fe
   size_t width = print_name_with_quoting (f->name, FILE_OR_LINK_MODE (f),
Ondrej Vasik 250517
                                           f->linkok, f->stat_ok, f->filetype,
Ondrej Vasik 250517
                                           NULL, f->stat.st_nlink, start_col);
Ondrej Vasik a35968
@@ -4105,9 +4204,6 @@ length_of_file_name_and_frills (const st
Ondrej Vasik 250517
                                           output_block_size))
Ondrej Vasik 250517
                 : block_size_width);
Ondrej Vasik 0363d6
 
Ondrej Vasik 0363d6
-  if (print_scontext)
Ondrej Vasik 0363d6
-    len += 1 + (format == with_commas ? strlen (f->scontext) : scontext_width);
Ondrej Vasik 0363d6
-
Ondrej Vasik 0363d6
   quote_name (NULL, f->name, filename_quoting_options, &name_width);
Ondrej Vasik 0363d6
   len += name_width;
Ondrej Vasik 0363d6
 
Ondrej Vasik a35968
@@ -4538,9 +4634,16 @@ Mandatory arguments to long options are 
Ondrej Vasik 0363d6
   -w, --width=COLS           assume screen width instead of current value\n\
Ondrej Vasik 0363d6
   -x                         list entries by lines instead of by columns\n\
Tim Waugh d66c4d
   -X                         sort alphabetically by entry extension\n\
Ondrej Vasik 0363d6
-  -Z, --context              print any SELinux security context of each file\n\
Tim Waugh d66c4d
   -1                         list one file per line\n\
Tim Waugh d66c4d
 "), stdout);
Ondrej Vasik 893c38
+      fputs(_("\nSELinux options:\n\n\
Ondrej Vasik 0363d6
+  --lcontext                 Display security context.   Enable -l. Lines\n\
Ondrej Vasik 0363d6
+                             will probably be too wide for most displays.\n\
Ondrej Vasik 0363d6
+  -Z, --context              Display security context so it fits on most\n\
Ondrej Vasik 0363d6
+                             displays.  Displays only mode, user, group,\n\
Ondrej Vasik 0363d6
+                             security context and file name.\n\
Ondrej Vasik 0363d6
+  --scontext                 Display only security context and file name.\n\
Ondrej Vasik 0363d6
+"), stdout);
Tim Waugh d66c4d
       fputs (HELP_OPTION_DESCRIPTION, stdout);
Tim Waugh d66c4d
       fputs (VERSION_OPTION_DESCRIPTION, stdout);
Ondrej Vasik 250517
       emit_size_note ();
Ondrej Vasik 4de88f
diff -urNp coreutils-7.1-orig/src/mkdir.c coreutils-7.1/src/mkdir.c
Ondrej Vasik 4de88f
--- coreutils-7.1-orig/src/mkdir.c	2008-10-19 21:47:57.000000000 +0200
Ondrej Vasik 4de88f
+++ coreutils-7.1/src/mkdir.c	2009-02-24 13:47:15.000000000 +0100
Ondrej Vasik 4de88f
@@ -38,6 +38,7 @@
Ondrej Vasik 0363d6
 static struct option const longopts[] =
Ondrej Vasik 0363d6
 {
Ondrej Vasik 0363d6
   {GETOPT_SELINUX_CONTEXT_OPTION_DECL},
Tim Waugh 5505e2
+  {"context", required_argument, NULL, 'Z'},
Ondrej Vasik 0363d6
   {"mode", required_argument, NULL, 'm'},
Ondrej Vasik 0363d6
   {"parents", no_argument, NULL, 'p'},
Ondrej Vasik 0363d6
   {"verbose", no_argument, NULL, 'v'},
Ondrej Vasik 4de88f
diff -urNp coreutils-7.1-orig/src/mknod.c coreutils-7.1/src/mknod.c
Ondrej Vasik 4de88f
--- coreutils-7.1-orig/src/mknod.c	2008-09-22 16:01:21.000000000 +0200
Ondrej Vasik 4de88f
+++ coreutils-7.1/src/mknod.c	2009-02-24 13:47:15.000000000 +0100
Kamil Dudka b26491
@@ -35,7 +35,7 @@
Tim Waugh 5505e2
 
Ondrej Vasik 0363d6
 static struct option const longopts[] =
Ondrej Vasik 0363d6
 {
Ondrej Vasik 0363d6
-  {GETOPT_SELINUX_CONTEXT_OPTION_DECL},
Ondrej Vasik 0363d6
+  {GETOPT_SELINUX_CONTEXT_OPTION_DECL}, 
Ondrej Vasik 0363d6
   {"mode", required_argument, NULL, 'm'},
Ondrej Vasik 0363d6
   {GETOPT_HELP_OPTION_DECL},
Ondrej Vasik 0363d6
   {GETOPT_VERSION_OPTION_DECL},
Ondrej Vasik 4de88f
diff -urNp coreutils-7.1-orig/src/mv.c coreutils-7.1/src/mv.c
Ondrej Vasik 4de88f
--- coreutils-7.1-orig/src/mv.c	2009-02-18 15:32:52.000000000 +0100
Ondrej Vasik 4de88f
+++ coreutils-7.1/src/mv.c	2009-02-24 13:47:15.000000000 +0100
Ondrej Vasik 4de88f
@@ -122,6 +122,7 @@ cp_option_init (struct cp_options *x)
Ondrej Vasik 0363d6
   x->preserve_mode = true;
Ondrej Vasik 0363d6
   x->preserve_timestamps = true;
Ondrej Vasik 0363d6
   x->preserve_security_context = selinux_enabled;
Ondrej Vasik 0363d6
+  x->set_security_context = false;
Ondrej Vasik c4b1fe
   x->reduce_diagnostics = false;
Ondrej Vasik 0363d6
   x->require_preserve = false;  /* FIXME: maybe make this an option */
Ondrej Vasik 0363d6
   x->require_preserve_context = false;
Ondrej Vasik 4de88f
diff -urNp coreutils-7.1-orig/src/runcon.c coreutils-7.1/src/runcon.c
Ondrej Vasik 4de88f
--- coreutils-7.1-orig/src/runcon.c	2008-09-18 09:06:57.000000000 +0200
Ondrej Vasik 4de88f
+++ coreutils-7.1/src/runcon.c	2009-02-24 13:47:15.000000000 +0100
Kamil Dudka b26491
@@ -86,7 +86,7 @@ Usage: %s CONTEXT COMMAND [args]\n\
Ondrej Vasik 893c38
   or:  %s [ -c ] [-u USER] [-r ROLE] [-t TYPE] [-l RANGE] COMMAND [args]\n\
Ondrej Vasik 893c38
 "), program_name, program_name);
Ondrej Vasik 893c38
       fputs (_("\
Ondrej Vasik 893c38
-Run a program in a different security context.\n\
Ondrej Vasik 893c38
+Run a program in a different SELinux security context.\n\
Ondrej Vasik 893c38
 With neither CONTEXT nor COMMAND, print the current security context.\n\
Ondrej Vasik 893c38
 \n\
Ondrej Vasik 893c38
   CONTEXT            Complete security context\n\
Ondrej Vasik 4de88f
diff -urNp coreutils-7.1-orig/src/stat.c coreutils-7.1/src/stat.c
Ondrej Vasik 4de88f
--- coreutils-7.1-orig/src/stat.c	2009-01-27 22:11:25.000000000 +0100
Ondrej Vasik 4de88f
+++ coreutils-7.1/src/stat.c	2009-02-24 13:47:15.000000000 +0100
Ondrej Vasik 4de88f
@@ -825,7 +825,7 @@ print_it (char const *format, char const
Tim Waugh 5505e2
 
Ondrej Vasik 0363d6
 /* Stat the file system and print what we find.  */
Ondrej Vasik 0363d6
 static bool
Ondrej Vasik 0363d6
-do_statfs (char const *filename, bool terse, char const *format)
Ondrej Vasik 0363d6
+do_statfs (char const *filename, bool terse, bool secure, char const *format)
Ondrej Vasik 0363d6
 {
Ondrej Vasik 0363d6
   STRUCT_STATVFS statfsbuf;
Tim Waugh 5505e2
 
Ondrej Vasik 4de88f
@@ -837,15 +837,31 @@ do_statfs (char const *filename, bool te
Ondrej Vasik 0363d6
     }
Tim Waugh 5505e2
 
Ondrej Vasik 0363d6
   if (format == NULL)
Ondrej Vasik 0363d6
+  {
Ondrej Vasik 0363d6
+    if (terse)
Tim Waugh 5505e2
     {
Ondrej Vasik 0363d6
-      format = (terse
Ondrej Vasik 250517
-                ? "%n %i %l %t %s %S %b %f %a %c %d\n"
Ondrej Vasik 250517
-                : "  File: \"%n\"\n"
Ondrej Vasik 250517
-                "    ID: %-8i Namelen: %-7l Type: %T\n"
Ondrej Vasik 250517
-                "Block size: %-10s Fundamental block size: %S\n"
Ondrej Vasik 250517
-                "Blocks: Total: %-10b Free: %-10f Available: %a\n"
Ondrej Vasik 250517
-                "Inodes: Total: %-10c Free: %d\n");
Ondrej Vasik 0363d6
+      if (secure)
Ondrej Vasik 0363d6
+        format = "%n %i %l %t %s %S %b %f %a %c %d %C\n";
Ondrej Vasik 250517
+             else
Ondrej Vasik 250517
+              format = "%n %i %l %t %s %S %b %f %a %c %d\n";
Ondrej Vasik 0363d6
     }
Ondrej Vasik 0363d6
+    else
Ondrej Vasik 250517
+          {
Ondrej Vasik 250517
+            if (secure)
Ondrej Vasik 250517
+              format = "  File: \"%n\"\n"
Ondrej Vasik 250517
+                "    ID: %-8i Namelen: %-7l Type: %T\n"
Ondrej Vasik 250517
+                "Block size: %-10s Fundamental block size: %S\n"
Ondrej Vasik 250517
+                "Blocks: Total: %-10b Free: %-10f Available: %a\n"
Ondrej Vasik 250517
+                "Inodes: Total: %-10c Free: %d\n"
Ondrej Vasik 250517
+                "   S_Context: %C\n";
Ondrej Vasik 250517
+            else
Ondrej Vasik 250517
+              format = "  File: \"%n\"\n"
Ondrej Vasik 250517
+                "    ID: %-8i Namelen: %-7l Type: %T\n"
Ondrej Vasik 250517
+                "Block size: %-10s Fundamental block size: %S\n"
Ondrej Vasik 250517
+                "Blocks: Total: %-10b Free: %-10f Available: %a\n"
Ondrej Vasik 250517
+                "Inodes: Total: %-10c Free: %d\n";
Ondrej Vasik 0363d6
+     }
Ondrej Vasik 0363d6
+  }
Tim Waugh b9e1cc
 
Ondrej Vasik 0363d6
   print_it (format, filename, print_statfs, &statfsbuf);
Ondrej Vasik 0363d6
   return true;
Ondrej Vasik 4de88f
@@ -853,7 +869,7 @@ do_statfs (char const *filename, bool te
Tim Waugh 5505e2
 
Ondrej Vasik 0363d6
 /* stat the file and print what we find */
Ondrej Vasik 0363d6
 static bool
Ondrej Vasik 0363d6
-do_stat (char const *filename, bool terse, char const *format)
Ondrej Vasik 1ecd64
+do_stat (char const *filename, bool terse, bool secure, char const *format)
Ondrej Vasik 0363d6
 {
Ondrej Vasik 0363d6
   struct stat statbuf;
Tim Waugh 5505e2
 
Ondrej Vasik 4de88f
@@ -866,9 +882,12 @@ do_stat (char const *filename, bool ters
Ondrej Vasik 0363d6
   if (format == NULL)
Ondrej Vasik 0363d6
     {
Ondrej Vasik 0363d6
       if (terse)
Ondrej Vasik 250517
-        {
Ondrej Vasik 250517
-          format = "%n %s %b %f %u %g %D %i %h %t %T %X %Y %Z %o\n";
Ondrej Vasik 250517
-        }
Ondrej Vasik 0363d6
+      {
Ondrej Vasik 0363d6
+        if (secure)
Ondrej Vasik 250517
+               format = "%n %s %b %f %u %g %D %i %h %t %T %X %Y %Z %o %C\n";
Ondrej Vasik 250517
+             else
Ondrej Vasik 250517
+               format = "%n %s %b %f %u %g %D %i %h %t %T %X %Y %Z %o\n";
Ondrej Vasik 0363d6
+      }
Ondrej Vasik 0363d6
       else
Ondrej Vasik 250517
         {
Ondrej Vasik 250517
           /* Temporary hack to match original output until conditional
Ondrej Vasik 4de88f
@@ -885,12 +904,22 @@ do_stat (char const *filename, bool ters
Ondrej Vasik 250517
             }
Ondrej Vasik 250517
           else
Ondrej Vasik 250517
             {
Ondrej Vasik 250517
-              format =
Ondrej Vasik 250517
-                "  File: %N\n"
Ondrej Vasik 250517
-                "  Size: %-10s\tBlocks: %-10b IO Block: %-6o %F\n"
Ondrej Vasik 250517
-                "Device: %Dh/%dd\tInode: %-10i  Links: %h\n"
Ondrej Vasik 250517
-                "Access: (%04a/%10.10A)  Uid: (%5u/%8U)   Gid: (%5g/%8G)\n"
Ondrej Vasik 250517
-                "Access: %x\n" "Modify: %y\n" "Change: %z\n";
Ondrej Vasik 0363d6
+        if (secure)
Ondrej Vasik 0363d6
+           format =
Ondrej Vasik 250517
+                    "  File: %N\n"
Ondrej Vasik 250517
+                    "  Size: %-10s\tBlocks: %-10b IO Block: %-6o %F\n"
Ondrej Vasik 250517
+                    "Device: %Dh/%dd\tInode: %-10i  Links: %-5h"
Ondrej Vasik 250517
+                    " Device type: %t,%T\n"
Ondrej Vasik 250517
+                     "Access: (%04a/%10.10A)  Uid: (%5u/%8U)   Gid: (%5g/%8G)\n"
Ondrej Vasik 250517
+                    "   S_Context: %C\n"
Ondrej Vasik 250517
+                    "Access: %x\n" "Modify: %y\n" "Change: %z\n";
Ondrej Vasik 0363d6
+        else 
Ondrej Vasik 250517
+                format =
Ondrej Vasik 250517
+                    "  File: %N\n"
Ondrej Vasik 250517
+                    "  Size: %-10s\tBlocks: %-10b IO Block: %-6o %F\n"
Ondrej Vasik 250517
+                    "Device: %Dh/%dd\tInode: %-10i  Links: %h\n"
Ondrej Vasik 250517
+                    "Access: (%04a/%10.10A)  Uid: (%5u/%8U)   Gid: (%5g/%8G)\n"
Ondrej Vasik 250517
+                    "Access: %x\n" "Modify: %y\n" "Change: %z\n";
Ondrej Vasik 250517
             }
Ondrej Vasik 250517
         }
Ondrej Vasik 0363d6
     }
Ondrej Vasik 4de88f
@@ -911,6 +940,7 @@ usage (int status)
Ondrej Vasik 0363d6
 Display file or file system status.\n\
Ondrej Vasik 0363d6
 \n\
Ondrej Vasik 0363d6
   -L, --dereference     follow links\n\
Ondrej Vasik 0363d6
+  -Z, --context         print the SELinux security context \n\
Ondrej Vasik 0363d6
   -f, --file-system     display file system status instead of file status\n\
Ondrej Vasik 0363d6
 "), stdout);
Ondrej Vasik 0363d6
       fputs (_("\
Ondrej Vasik 4de88f
@@ -995,6 +1025,7 @@ main (int argc, char *argv[])
Ondrej Vasik 0363d6
   int i;
Ondrej Vasik 0363d6
   bool fs = false;
Ondrej Vasik 0363d6
   bool terse = false;
Ondrej Vasik 0363d6
+  bool secure = false;
Ondrej Vasik 0363d6
   char *format = NULL;
Ondrej Vasik 0363d6
   bool ok = true;
Tim Waugh 5505e2
 
Ondrej Vasik 4de88f
@@ -1034,13 +1065,13 @@ main (int argc, char *argv[])
Ondrej Vasik 250517
           terse = true;
Ondrej Vasik 250517
           break;
Ondrej Vasik 250517
 
Ondrej Vasik 250517
-        case 'Z':  /* FIXME: remove in 2010 */
Ondrej Vasik 250517
-          /* Ignore, for compatibility with distributions
Ondrej Vasik 250517
-             that implemented this before upstream.
Ondrej Vasik 250517
-             But warn of impending removal.  */
Ondrej Vasik 250517
-          error (0, 0,
Ondrej Vasik 250517
-                 _("the --context (-Z) option is obsolete and will be removed\n"
Ondrej Vasik 250517
-                   "in a future release"));
Ondrej Vasik 250517
+        case 'Z':
Ondrej Vasik 0363d6
+    if((is_selinux_enabled()>0))
Ondrej Vasik 250517
+            secure = 1;
Ondrej Vasik 250517
+          else {
Ondrej Vasik 250517
+            error (0, 0, _("Kernel is not SELinux enabled"));
Ondrej Vasik 250517
+            usage (EXIT_FAILURE);
Ondrej Vasik 250517
+          }
Ondrej Vasik 250517
           break;
Ondrej Vasik 250517
 
Ondrej Vasik 250517
         case_GETOPT_HELP_CHAR;
Ondrej Vasik 4de88f
@@ -1060,8 +1091,8 @@ main (int argc, char *argv[])
Daniel J Walsh 129baa
 
Tim Waugh 5505e2
   for (i = optind; i < argc; i++)
Tim Waugh 5505e2
     ok &= (fs
Ondrej Vasik 250517
-           ? do_statfs (argv[i], terse, format)
Ondrej Vasik 250517
-           : do_stat (argv[i], terse, format));
Ondrej Vasik 250517
+           ? do_statfs (argv[i], terse, secure, format)
Ondrej Vasik 250517
+           : do_stat (argv[i], terse, secure, format));
Tim Waugh 5505e2
 
Tim Waugh 5505e2
   exit (ok ? EXIT_SUCCESS : EXIT_FAILURE);
Tim Waugh 5505e2
 }
Ondrej Vasik 4de88f
diff -urNp coreutils-7.1-orig/tests/misc/selinux coreutils-7.1/tests/misc/selinux
Ondrej Vasik 4de88f
--- coreutils-7.1-orig/tests/misc/selinux	2008-10-25 14:20:26.000000000 +0200
Ondrej Vasik 4de88f
+++ coreutils-7.1/tests/misc/selinux	2009-02-24 13:47:15.000000000 +0100
Ondrej Vasik c4b1fe
@@ -30,7 +30,7 @@ chcon $ctx f d p ||
Ondrej Vasik 0363d6
 
Ondrej Vasik 0363d6
 # inspect that context with both ls -Z and stat.
Ondrej Vasik 0363d6
 for i in d f p; do
Ondrej Vasik 0363d6
-  c=`ls -dogZ $i|cut -d' ' -f3`; test x$c = x$ctx || fail=1
Ondrej Vasik 5d66c4
+  c=`ls -dogZ $i|cut -d' ' -f5`; test x$c = x$ctx || fail=1
Ondrej Vasik 0363d6
   c=`stat --printf %C $i`; test x$c = x$ctx || fail=1
Ondrej Vasik 0363d6
 done
Kamil Dudka b26491