Kamil Dudka b26491
diff -urp coreutils-7.0.orig/configure.ac coreutils-7.0/configure.ac
Kamil Dudka b26491
--- coreutils-7.0.orig/configure.ac	2009-01-28 17:18:16.790672000 +0100
Kamil Dudka b26491
+++ coreutils-7.0/configure.ac	2009-01-28 17:18:52.757913913 +0100
Ondrej Vasik 0363d6
@@ -51,6 +51,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=
Kamil Dudka b26491
diff -urp coreutils-7.0.orig/man/chcon.x coreutils-7.0/man/chcon.x
Kamil Dudka b26491
--- coreutils-7.0.orig/man/chcon.x	2008-03-07 17:05:53.000000000 +0100
Kamil Dudka b26491
+++ coreutils-7.0/man/chcon.x	2009-01-28 17:18:52.759913926 +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
Kamil Dudka b26491
diff -urp coreutils-7.0.orig/man/runcon.x coreutils-7.0/man/runcon.x
Kamil Dudka b26491
--- coreutils-7.0.orig/man/runcon.x	2008-03-07 17:05:53.000000000 +0100
Kamil Dudka b26491
+++ coreutils-7.0/man/runcon.x	2009-01-28 17:18:52.760913933 +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,
Kamil Dudka b26491
diff -urp coreutils-7.0.orig/src/chcon.c coreutils-7.0/src/chcon.c
Kamil Dudka b26491
--- coreutils-7.0.orig/src/chcon.c	2008-08-24 22:30:10.000000000 +0200
Kamil Dudka b26491
+++ coreutils-7.0/src/chcon.c	2009-01-28 17:18:52.761913940 +0100
Kamil Dudka b26491
@@ -366,7 +366,7 @@ Usage: %s [OPTION]... CONTEXT FILE...\n\
Ondrej Vasik 893c38
 "),
Ondrej Vasik 893c38
 	program_name, program_name, program_name);
Ondrej Vasik 893c38
       fputs (_("\
Ondrej Vasik 893c38
-Change the security context of each FILE to CONTEXT.\n\
Ondrej Vasik 893c38
+Change the SELinux security context of each FILE to CONTEXT.\n\
Ondrej Vasik 893c38
 With --reference, change the security context of each FILE to that of RFILE.\n\
Ondrej Vasik 893c38
 \n\
Ondrej Vasik 46776e
   -c, --changes          like verbose but report only when a change is made\n\
Kamil Dudka b26491
diff -urp coreutils-7.0.orig/src/copy.c coreutils-7.0/src/copy.c
Kamil Dudka b26491
--- coreutils-7.0.orig/src/copy.c	2009-01-28 17:18:16.748671000 +0100
Kamil Dudka b26491
+++ coreutils-7.0/src/copy.c	2009-01-28 17:18:52.762913947 +0100
Kamil Dudka b26491
@@ -449,9 +449,10 @@ copy_reg (char const *src_name, char con
Ondrej Vasik 0363d6
 	  security_context_t con = NULL;
Ondrej Vasik 0363d6
 	  if (getfscreatecon (&con) < 0)
Ondrej Vasik 0363d6
 	    {
Ondrej Vasik 0363d6
-	      error (0, errno, _("failed to get file system create context"));
Ondrej Vasik 0363d6
+        //do not show error when we not require security context (-a option)
Ondrej Vasik 0363d6
 	      if (x->require_preserve_context)
Ondrej Vasik 0363d6
 		{
Ondrej Vasik 0363d6
+      error (0, errno, _("failed to get file system create context"));
Ondrej Vasik 0363d6
 		  return_val = false;
Ondrej Vasik 0363d6
 		  goto close_src_and_dst_desc;
Ondrej Vasik 0363d6
 		}
Kamil Dudka b26491
@@ -461,11 +462,12 @@ copy_reg (char const *src_name, char con
Ondrej Vasik 0363d6
 	    {
Ondrej Vasik 0363d6
 	      if (fsetfilecon (dest_desc, con) < 0)
Ondrej Vasik 0363d6
 		{
Ondrej Vasik 0363d6
-		  error (0, errno,
Ondrej Vasik 0363d6
-			 _("failed to set the security context of %s to %s"),
Ondrej Vasik 0363d6
-			 quote_n (0, dst_name), quote_n (1, con));
Ondrej Vasik 0363d6
+      //do not show error when we not require security context (-a option)
Ondrej Vasik 0363d6
 		  if (x->require_preserve_context)
Ondrej Vasik 0363d6
 		    {
Ondrej Vasik 0363d6
+          error (0, errno,
Ondrej Vasik 0363d6
+		    	 _("failed to set the security context of %s to %s"),
Ondrej Vasik 0363d6
+    			 quote_n (0, dst_name), quote_n (1, con));
Ondrej Vasik 0363d6
 		      return_val = false;
Ondrej Vasik 0363d6
 		      freecon (con);
Ondrej Vasik 0363d6
 		      goto close_src_and_dst_desc;
Kamil Dudka b26491
@@ -1714,11 +1716,12 @@ copy_internal (char const *src_name, cha
Ondrej Vasik 0363d6
 	{
Ondrej Vasik 0363d6
 	  if (setfscreatecon (con) < 0)
Ondrej Vasik 0363d6
 	    {
Ondrej Vasik 0363d6
-	      error (0, errno,
Ondrej Vasik 0363d6
-		     _("failed to set default file creation context to %s"),
Ondrej Vasik 0363d6
-		     quote (con));
Ondrej Vasik 0363d6
+        //do not show error when we not require security context (-a option)
Ondrej Vasik 0363d6
 	      if (x->require_preserve_context)
Ondrej Vasik 0363d6
 		{
Ondrej Vasik 0363d6
+      error (0, errno,
Ondrej Vasik 0363d6
+		     _("failed to set default file creation context to %s"),
Ondrej Vasik 0363d6
+		     quote (con));
Ondrej Vasik 0363d6
 		  freecon (con);
Ondrej Vasik 0363d6
 		  return false;
Ondrej Vasik 0363d6
 		}
Kamil Dudka b26491
@@ -1728,12 +1731,14 @@ copy_internal (char const *src_name, cha
Ondrej Vasik 0363d6
       else
Ondrej Vasik 0363d6
 	{
Ondrej Vasik 0363d6
 	  if (errno != ENOTSUP && errno != ENODATA)
Ondrej Vasik 0363d6
-	    {
Ondrej Vasik 0363d6
-	      error (0, errno,
Ondrej Vasik 0363d6
-		     _("failed to get security context of %s"),
Ondrej Vasik 0363d6
-		     quote (src_name));
Ondrej Vasik 0363d6
-	      if (x->require_preserve_context)
Ondrej Vasik 0363d6
-		return false;
Ondrej Vasik 0363d6
+	    { 
Ondrej Vasik 0363d6
+        //do not show error when we not require security context (-a option)
Ondrej Vasik 0363d6
+	      if (x->require_preserve_context) {
Ondrej Vasik 0363d6
+           error (0, errno,
Ondrej Vasik 0363d6
+    		   _("failed to get security context of %s"),
Ondrej Vasik 0363d6
+		       quote (src_name));
Ondrej Vasik 0363d6
+           return false;
Ondrej Vasik 0363d6
+        }
Ondrej Vasik 0363d6
 	    }
Ondrej Vasik 0363d6
 	}
Ondrej Vasik 0363d6
     }
Kamil Dudka b26491
@@ -1819,6 +1824,8 @@ copy_internal (char const *src_name, cha
Ondrej Vasik 0363d6
 	{
Ondrej Vasik 0363d6
 	  /* Here, we are crossing a file system boundary and cp's -x option
Ondrej Vasik 0363d6
 	     is in effect: so don't copy the contents of this directory. */
Ondrej Vasik 0363d6
+        if (x->preserve_security_context)
Ondrej Vasik 0363d6
+      	    restore_default_fscreatecon_or_die ();
Ondrej Vasik 0363d6
 	}
Ondrej Vasik 0363d6
       else
Ondrej Vasik 0363d6
 	{
Kamil Dudka b26491
diff -urp coreutils-7.0.orig/src/copy.h coreutils-7.0/src/copy.h
Kamil Dudka b26491
--- coreutils-7.0.orig/src/copy.h	2009-01-28 17:18:16.748671000 +0100
Kamil Dudka b26491
+++ coreutils-7.0/src/copy.h	2009-01-28 17:18:52.763913953 +0100
Ondrej Vasik 0363d6
@@ -141,6 +141,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
Kamil Dudka b26491
diff -urp coreutils-7.0.orig/src/cp.c coreutils-7.0/src/cp.c
Kamil Dudka b26491
--- coreutils-7.0.orig/src/cp.c	2009-01-28 17:18:16.750671000 +0100
Kamil Dudka b26491
+++ coreutils-7.0/src/cp.c	2009-01-28 17:20:29.109561384 +0100
Kamil Dudka b26491
@@ -148,6 +148,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}
Kamil Dudka b26491
@@ -175,7 +176,7 @@ Copy SOURCE to DEST, or multiple SOURCE(
Ondrej Vasik d47655
 Mandatory arguments to long options are mandatory for short options too.\n\
Ondrej Vasik d47655
 "), stdout);
Ondrej Vasik d47655
       fputs (_("\
Ondrej Vasik d47655
-  -a, --archive                same as -dpR\n\
Ondrej Vasik d47655
+  -a, --archive                same as -cdpR\n\
Ondrej Vasik d47655
       --backup[=CONTROL]       make a backup of each existing destination file\n\
Ondrej Vasik d47655
   -b                           like --backup but does not accept an argument\n\
Ondrej Vasik d47655
       --copy-contents          copy contents of special files when recursive\n\
Kamil Dudka b26491
@@ -206,6 +207,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);
Kamil Dudka b26491
@@ -231,6 +235,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);
Kamil Dudka b26491
@@ -780,6 +785,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;
Kamil Dudka b26491
   x->require_preserve_xattr = false;
Tim Waugh d66c4d
 
Kamil Dudka b26491
@@ -925,7 +931,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 0363d6
 			   long_opts, NULL))
Ondrej Vasik 0363d6
 	 != -1)
Ondrej Vasik 0363d6
     {
Kamil Dudka b26491
@@ -936,13 +942,15 @@ main (int argc, char **argv)
Ondrej Vasik 0363d6
 				     sparse_type_string, sparse_type);
Ondrej Vasik 0363d6
 	  break;
Tim Waugh d66c4d
 
Ondrej Vasik e18e41
-	case 'a':		/* Like -dpR. */
Ondrej Vasik e18e41
+	case 'a':		/* Like -dpRc. */
Ondrej Vasik 0363d6
 	  x.dereference = DEREF_NEVER;
Ondrej Vasik 0363d6
 	  x.preserve_links = true;
Ondrej Vasik 0363d6
 	  x.preserve_ownership = true;
Ondrej Vasik 0363d6
 	  x.preserve_mode = true;
Ondrej Vasik 0363d6
 	  x.preserve_timestamps = true;
Ondrej Vasik 0363d6
-	  x.require_preserve = true;
Ondrej Vasik 0363d6
+    x.require_preserve = true;
Ondrej Vasik 0363d6
+    if (selinux_enabled)
Ondrej Vasik 0363d6
+	     x.preserve_security_context = true;
Ondrej Vasik 0363d6
 	  x.recursive = true;
Ondrej Vasik 0363d6
 	  break;
Tim Waugh d66c4d
 
Kamil Dudka b26491
@@ -956,6 +964,16 @@ main (int argc, char **argv)
Ondrej Vasik 0363d6
 	  copy_contents = true;
Ondrej Vasik 0363d6
 	  break;
Ondrej Vasik 0363d6
 
Ondrej Vasik 0363d6
+  case 'c':
Ondrej Vasik 0363d6
+	  if ( x.set_security_context ) { 
Ondrej Vasik 0363d6
+	      (void) fprintf(stderr, "%s: cannot force target context and preserve it\n", argv[0]);
Ondrej Vasik 0363d6
+	    exit( 1 );
Ondrej Vasik 0363d6
+	  }
Ondrej Vasik 0363d6
+	  else if (selinux_enabled) {
Ondrej Vasik 0363d6
+	    x.preserve_security_context = true;
Ondrej Vasik 0363d6
+      x.require_preserve_context = true;
Ondrej Vasik 0363d6
+    }
Ondrej Vasik 0363d6
+	  break;
Ondrej Vasik 0363d6
 	case 'd':
Ondrej Vasik 0363d6
 	  x.preserve_links = true;
Ondrej Vasik 0363d6
 	  x.dereference = DEREF_NEVER;
Kamil Dudka b26491
@@ -1072,6 +1090,27 @@ main (int argc, char **argv)
Ondrej Vasik 0363d6
 	  x.one_file_system = true;
Ondrej Vasik 0363d6
 	  break;
Tim Waugh d66c4d
 
Daniel J Walsh 129baa
+
Ondrej Vasik 0363d6
+  case 'Z':
Ondrej Vasik 0363d6
+	  /* politely decline if we're not on a selinux-enabled kernel. */
Ondrej Vasik 0363d6
+	  if( !selinux_enabled ) {
Ondrej Vasik 0363d6
+	    fprintf( stderr, "Warning:  ignoring --context (-Z). "
Ondrej Vasik 0363d6
+		             "It requires a SELinux enabled kernel.\n" );
Ondrej Vasik 0363d6
+	    break;
Ondrej Vasik 0363d6
+	  }
Ondrej Vasik 0363d6
+	  if ( x.preserve_security_context ) {
Ondrej Vasik 0363d6
+	    (void) fprintf(stderr, "%s: cannot force target context to '%s' and preserve it\n", argv[0], optarg);
Ondrej Vasik 0363d6
+	    exit( 1 );
Ondrej Vasik 0363d6
+	  }
Ondrej Vasik 0363d6
+	  x.set_security_context = true;
Ondrej Vasik 0363d6
+	  /* if there's a security_context given set new path 
Ondrej Vasik 0363d6
+	     components to that context, too */
Ondrej Vasik 0363d6
+	  if ( setfscreatecon(optarg) < 0 ) {
Ondrej Vasik 0363d6
+	    (void) fprintf(stderr, _("cannot set default security context %s\n"), optarg);
Ondrej Vasik 0363d6
+	    exit( 1 );
Ondrej Vasik 0363d6
+	  }
Ondrej Vasik 0363d6
+	  break;
Daniel J Walsh 129baa
+
Ondrej Vasik 0363d6
 	case 'S':
Ondrej Vasik 0363d6
 	  make_backups = true;
Ondrej Vasik 0363d6
 	  backup_suffix_string = optarg;
Kamil Dudka b26491
diff -urp coreutils-7.0.orig/src/id.c coreutils-7.0/src/id.c
Kamil Dudka b26491
--- coreutils-7.0.orig/src/id.c	2008-08-24 22:58:15.000000000 +0200
Kamil Dudka b26491
+++ coreutils-7.0/src/id.c	2009-01-28 17:18:52.766913973 +0100
Kamil Dudka b26491
@@ -106,7 +106,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;
Kamil Dudka b26491
diff -urp coreutils-7.0.orig/src/install.c coreutils-7.0/src/install.c
Kamil Dudka b26491
--- coreutils-7.0.orig/src/install.c	2009-01-28 17:18:16.751671000 +0100
Kamil Dudka b26491
+++ coreutils-7.0/src/install.c	2009-01-28 17:18:52.767913980 +0100
Kamil Dudka b26491
@@ -152,11 +152,11 @@ static struct option const long_options[
Ondrej Vasik 0363d6
   {"no-target-directory", no_argument, NULL, 'T'},
Ondrej Vasik 0363d6
   {"owner", required_argument, NULL, 'o'},
Ondrej Vasik 0363d6
   {"preserve-timestamps", no_argument, NULL, 'p'},
Ondrej Vasik 0363d6
-  {"preserve-context", no_argument, NULL, PRESERVE_CONTEXT_OPTION},
Ondrej Vasik 0363d6
+  {"preserve-context", no_argument, NULL, 'P'},
Ondrej Vasik 0363d6
   /* Continue silent support for --preserve_context until Jan 2008. FIXME-obs
Ondrej Vasik 0363d6
      After that, FIXME-obs: warn in, say, late 2008, and disable altogether
Ondrej Vasik 0363d6
      a year or two later.  */
Ondrej Vasik 0363d6
-  {"preserve_context", no_argument, NULL, PRESERVE_CONTEXT_OPTION},
Ondrej Vasik 0363d6
+  {"preserve_context", no_argument, NULL, 'P'},
Ondrej Vasik 0363d6
   {"strip", no_argument, NULL, 's'},
Ondrej Vasik e18e41
   {"strip-program", required_argument, NULL, STRIP_PROGRAM_OPTION},
Ondrej Vasik 0363d6
   {"suffix", required_argument, NULL, 'S'},
Kamil Dudka b26491
@@ -185,6 +185,7 @@ cp_option_init (struct cp_options *x)
Ondrej Vasik 0363d6
   x->preserve_timestamps = 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 0363d6
   x->recursive = false;
Ondrej Vasik 0363d6
   x->sparse_mode = SPARSE_AUTO;
Ondrej Vasik 0363d6
   x->symbolic_link = false;
Kamil Dudka b26491
@@ -361,7 +362,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 6feaf7
-  while ((optc = getopt_long (argc, argv, "bcsDdg:m:o:pt:TvS:Z:", long_options,
Ondrej Vasik 6feaf7
+  while ((optc = getopt_long (argc, argv, "bcsDdg:m:o:pPt:TvS:Z:", long_options,
Ondrej Vasik 6feaf7
 			      NULL)) != -1)
Ondrej Vasik 6feaf7
     {
Ondrej Vasik 6feaf7
       switch (optc)
Kamil Dudka b26491
@@ -428,6 +429,7 @@ main (int argc, char **argv)
Ondrej Vasik 0363d6
 	  no_target_directory = true;
Ondrej Vasik 0363d6
 	  break;
Ondrej Vasik 0363d6
 
Ondrej Vasik 0363d6
+  case 'P':
Ondrej Vasik 0363d6
 	case PRESERVE_CONTEXT_OPTION:
Ondrej Vasik 0363d6
 	  if ( ! selinux_enabled)
Ondrej Vasik 0363d6
 	    {
Kamil Dudka b26491
@@ -435,6 +437,10 @@ main (int argc, char **argv)
Ondrej Vasik e18e41
 			     "this kernel is not SELinux-enabled"));
Ondrej Vasik 0363d6
 	      break;
Ondrej Vasik 0363d6
 	    }
Ondrej Vasik 0363d6
+    if ( x.set_security_context ) {
Ondrej Vasik 0363d6
+		  (void) fprintf(stderr, "%s: cannot force target context and preserve it\n", argv[0]);
Ondrej Vasik 0363d6
+ 	    exit( 1 );
Ondrej Vasik 0363d6
+ 	  }
Ondrej Vasik 0363d6
 	  x.preserve_security_context = true;
Ondrej Vasik 0363d6
 	  use_default_selinux_context = false;
Ondrej Vasik 0363d6
 	  break;
Kamil Dudka b26491
@@ -446,6 +452,7 @@ main (int argc, char **argv)
Ondrej Vasik 55707b
 	      break;
Ondrej Vasik 55707b
 	    }
Ondrej Vasik 55707b
 	  scontext = optarg;
Ondrej Vasik 55707b
+	  x.set_security_context = true;
Ondrej Vasik 55707b
 	  use_default_selinux_context = false;
Ondrej Vasik 55707b
 	  break;
Ondrej Vasik 55707b
 	case_GETOPT_HELP_CHAR;
Kamil Dudka b26491
@@ -850,8 +857,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);
Kamil Dudka b26491
diff -urp coreutils-7.0.orig/src/ls.c coreutils-7.0/src/ls.c
Kamil Dudka b26491
--- coreutils-7.0.orig/src/ls.c	2009-01-28 17:18:16.705671000 +0100
Kamil Dudka b26491
+++ coreutils-7.0/src/ls.c	2009-01-28 17:18:52.770914000 +0100
Kamil Dudka b26491
@@ -139,7 +139,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.
Kamil Dudka b26491
@@ -182,8 +183,9 @@ struct fileinfo
Ondrej Vasik 5d66c4
        exists, otherwise false.  */
Ondrej Vasik 5d66c4
     bool linkok;
Ondrej Vasik 5d66c4
 
Ondrej Vasik 5d66c4
-    /* For long listings, true if the file has an access control list,
Ondrej Vasik 5d66c4
-       or an SELinux security context.  */
Ondrej Vasik 5d66c4
+    /* For long listings, true if the file has an access control list.
Ondrej Vasik 5d66c4
+       Unlike with upstream not true for SELinux scontext(#430779) as
Ondrej Vasik 5d66c4
+       this removes possibility to detect ACL via ls */
Ondrej Vasik 5d66c4
     bool have_acl;
Ondrej Vasik 5d66c4
   };
Ondrej Vasik 5d66c4
 
Kamil Dudka b26491
@@ -246,6 +248,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.  */
Kamil Dudka b26491
@@ -315,7 +318,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
Kamil Dudka b26491
@@ -355,7 +358,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;
Kamil Dudka b26491
@@ -744,6 +749,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
 };
Kamil Dudka b26491
@@ -789,7 +797,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},
Kamil Dudka b26491
@@ -799,12 +809,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
 
Kamil Dudka b26491
@@ -1251,7 +1261,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
Tim Waugh d66c4d
 		       && (recursive
Kamil Dudka b26491
@@ -1282,7 +1292,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)
Kamil Dudka b26491
@@ -1445,7 +1455,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
   {
Kamil Dudka b26491
@@ -1827,13 +1837,27 @@ decode_switches (int argc, char **argv)
Tim Waugh d66c4d
 	  break;
Tim Waugh d66c4d
 
Ondrej Vasik 0363d6
 	case 'Z':
Ondrej Vasik 0363d6
-	  print_scontext = true;
Tim Waugh d66c4d
+	  print_scontext = 1;
Ondrej Vasik 0363d6
+    format = security_format;
Ondrej Vasik 0363d6
 	  break;
Ondrej Vasik 0363d6
 
Ondrej Vasik 0363d6
 	case_GETOPT_HELP_CHAR;
Tim Waugh d66c4d
 
Tim Waugh d66c4d
 	case_GETOPT_VERSION_CHAR (PROGRAM_NAME, AUTHORS);
Tim Waugh d66c4d
 
Ondrej Vasik 0363d6
+  case CONTEXT_OPTION: /* default security context format */
Tim Waugh d66c4d
+		print_scontext = 1;
Tim Waugh d66c4d
+		format = security_format;
Tim Waugh d66c4d
+		break;
Tim Waugh d66c4d
+	case LCONTEXT_OPTION: /* long format plus security context */
Tim Waugh d66c4d
+		print_scontext = 1;
Tim Waugh d66c4d
+		format = long_format;
Tim Waugh d66c4d
+		break;
Tim Waugh d66c4d
+	case SCONTEXT_OPTION: /* short form of new security format */
Tim Waugh d66c4d
+		print_scontext = 0;
Tim Waugh d66c4d
+		format = security_format;
Tim Waugh d66c4d
+		break;
Tim Waugh 5505e2
+
Tim Waugh d66c4d
 	default:
Tim Waugh d66c4d
 	  usage (LS_FAILURE);
Tim Waugh d66c4d
 	}
Kamil Dudka b26491
@@ -2547,8 +2571,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 0363d6
-	freecon (f->scontext);
Ondrej Vasik 0363d6
+      if (f->scontext != UNKNOWN_SECURITY_CONTEXT) {
Ondrej Vasik 0363d6
+       	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;
Kamil Dudka b26491
@@ -2590,6 +2616,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
Kamil Dudka b26491
@@ -2689,7 +2716,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)
Tim Waugh d66c4d
 	{
Ondrej Vasik 0363d6
 	  bool have_acl = false;
Ondrej Vasik 0363d6
 	  int attr_len = (do_deref
Kamil Dudka b26491
@@ -2708,9 +2735,7 @@ gobble_file (char const *name, enum file
Ondrej Vasik 0e0613
 	      f->scontext = xstrdup ("unlabeled");
Ondrej Vasik 0e0613
 	    }
Ondrej Vasik 5d66c4
 
Ondrej Vasik 5d66c4
-	  if (err == 0)
Ondrej Vasik 5d66c4
-	    have_acl = ! STREQ ("unlabeled", f->scontext);
Ondrej Vasik 5d66c4
-	  else
Ondrej Vasik 5d66c4
+	  if (err != 0)
Ondrej Vasik 5d66c4
 	    {
Ondrej Vasik 5d66c4
 	      f->scontext = UNKNOWN_SECURITY_CONTEXT;
Ondrej Vasik 5d66c4
 
Kamil Dudka b26491
@@ -2722,7 +2747,7 @@ gobble_file (char const *name, enum file
Ondrej Vasik 5d66c4
 		err = 0;
Ondrej Vasik 5d66c4
 	    }
Ondrej Vasik 5d66c4
 
Ondrej Vasik 5d66c4
-	  if (err == 0 && ! have_acl && format == long_format)
Ondrej Vasik 5d66c4
+	  if (err == 0 && format == long_format)
Ondrej Vasik 5d66c4
 	    {
Ondrej Vasik 5d66c4
 	      int n = file_has_acl (absolute_name, &f->stat);
Ondrej Vasik 5d66c4
 	      err = (n < 0);
Kamil Dudka b26491
@@ -3297,6 +3322,13 @@ print_current_files (void)
Ondrej Vasik 0363d6
 	  print_long_format (sorted_file[i]);
Tim Waugh d66c4d
 	  DIRED_PUTCHAR ('\n');
Tim Waugh d66c4d
 	}
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
 }
Kamil Dudka b26491
@@ -3482,7 +3514,7 @@ print_long_format (const struct fileinfo
Ondrej Vasik 0363d6
 	 The latter is wrong when inode_number_width is zero.  */
Ondrej Vasik 0363d6
       p += strlen (p);
Ondrej Vasik 0363d6
     }
Ondrej Vasik 0363d6
-
Ondrej Vasik 0363d6
+  
Ondrej Vasik 0363d6
   if (print_block_size)
Ondrej Vasik 0363d6
     {
Ondrej Vasik 0363d6
       char hbuf[LONGEST_HUMAN_READABLE + 1];
Kamil Dudka b26491
@@ -3511,9 +3543,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
 
Kamil Dudka b26491
@@ -3526,9 +3564,6 @@ print_long_format (const struct fileinfo
Ondrej Vasik 0363d6
       if (print_author)
Ondrej Vasik 0363d6
 	format_user (f->stat.st_author, author_width, f->stat_ok);
Ondrej Vasik 0363d6
 
Ondrej Vasik 0363d6
-      if (print_scontext)
Ondrej Vasik 0363d6
-	format_user_or_group (f->scontext, 0, scontext_width);
Ondrej Vasik 0363d6
-
Ondrej Vasik 0363d6
       p = buf;
Ondrej Vasik 0363d6
     }
Ondrej Vasik 0363d6
 
Kamil Dudka b26491
@@ -3867,9 +3902,6 @@ print_file_name_and_frills (const struct
Ondrej Vasik 0363d6
 	    human_readable (ST_NBLOCKS (f->stat), buf, human_output_opts,
Ondrej Vasik 0363d6
 			    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 0363d6
   print_name_with_quoting (f->name, FILE_OR_LINK_MODE (f), f->linkok,
Ondrej Vasik 0363d6
 			   f->stat_ok, f->filetype, NULL);
Ondrej Vasik 0363d6
 
Kamil Dudka b26491
@@ -4077,9 +4109,6 @@ length_of_file_name_and_frills (const st
Ondrej Vasik 0363d6
 					  output_block_size))
Ondrej Vasik 0363d6
 		: 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
 
Kamil Dudka b26491
@@ -4510,9 +4539,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);
Tim Waugh d66c4d
       fputs (_("\n\
Kamil Dudka b26491
@@ -4541,3 +4577,67 @@ Exit status:\n\
Tim Waugh d66c4d
     }
Tim Waugh d66c4d
   exit (status);
Tim Waugh d66c4d
 }
Tim Waugh 5505e2
+
Tim Waugh d66c4d
+static void
Tim Waugh d66c4d
+print_scontext_format (const struct fileinfo *f)
Tim Waugh d66c4d
+{
Tim Waugh d66c4d
+  char modebuf[12];
Tim Waugh 5505e2
+
Tim Waugh d66c4d
+  /* 7 fields that may require LONGEST_HUMAN_READABLE bytes,
Tim Waugh d66c4d
+     1 10-byte mode string,
Tim Waugh d66c4d
+     9 spaces, one following each of these fields, and
Tim Waugh d66c4d
+     1 trailing NUL byte.  */
Daniel J Walsh 129baa
+
Tim Waugh d66c4d
+  char init_bigbuf[7 * LONGEST_HUMAN_READABLE + 10  + 9 + 1];
Tim Waugh d66c4d
+  char *buf = init_bigbuf;
Tim Waugh d66c4d
+  size_t bufsize = sizeof (init_bigbuf);
Tim Waugh d66c4d
+  size_t s;
Tim Waugh d66c4d
+  char *p;
Tim Waugh d66c4d
+  const char *fmt;
Tim Waugh d66c4d
+  char *user_name;
Tim Waugh d66c4d
+  char *group_name;
Tim Waugh d66c4d
+  int rv;
Tim Waugh d66c4d
+  char *scontext;
Daniel J Walsh 129baa
+
Tim Waugh d66c4d
+  p = buf;
Daniel J Walsh 129baa
+
Tim Waugh d66c4d
+  if ( print_scontext ) { /* zero means terse listing */
Tim Waugh d66c4d
+    filemodestring (&f->stat, modebuf);
Ondrej Vasik 0363d6
+    modebuf[10] = (f->have_acl ? '+' : ' ');
Tim Waugh d66c4d
+    modebuf[11] = '\0';
Daniel J Walsh 129baa
+
Tim Waugh d66c4d
+    /* print mode */
Daniel J Walsh 129baa
+
Tim Waugh d66c4d
+    (void) sprintf (p, "%s ", modebuf);
Tim Waugh d66c4d
+    p += strlen (p);
cvsdist 5adf0d
+
Tim Waugh d66c4d
+    /* print standard user and group */
Tim Waugh 5505e2
+
Tim Waugh d66c4d
+    DIRED_FPUTS (buf, stdout, p - buf);
Tim Waugh d66c4d
+    format_user (f->stat.st_uid, owner_width, f->stat_ok);
Tim Waugh d66c4d
+    format_group (f->stat.st_gid, group_width, f->stat_ok);
Tim Waugh d66c4d
+    p = buf;
Tim Waugh 5505e2
+  }
Tim Waugh 5505e2
+
Tim Waugh d66c4d
+  (void) sprintf (p, "%-32s ", f->scontext ?: "");
Tim Waugh d66c4d
+  p += strlen (p);
Tim Waugh d66c4d
+ 
Tim Waugh d66c4d
+  DIRED_INDENT ();
Tim Waugh d66c4d
+  DIRED_FPUTS (buf, stdout, p - buf);
Tim Waugh d66c4d
+  print_name_with_quoting (f->name, f->stat.st_mode, f->linkok,
Tim Waugh d66c4d
+			   f->stat_ok, f->filetype, &dired_obstack);
Tim Waugh d66c4d
+ 
Tim Waugh d66c4d
+  if (f->filetype == symbolic_link) {
Tim Waugh d66c4d
+      if (f->linkname) {
Tim Waugh d66c4d
+	  DIRED_FPUTS_LITERAL (" -> ", stdout);
Tim Waugh d66c4d
+	  print_name_with_quoting (f->linkname, f->linkmode, f->linkok - 1,
Tim Waugh d66c4d
+				   f->stat_ok, f->filetype, NULL);
Tim Waugh d66c4d
+	  if (indicator_style != none)
Tim Waugh d66c4d
+	    print_type_indicator (f->stat_ok, f->linkmode, f->filetype);
Tim Waugh d66c4d
+      }
Tim Waugh 5505e2
+  }
Tim Waugh d66c4d
+  else {
Tim Waugh d66c4d
+    if (indicator_style != none)
Tim Waugh d66c4d
+      print_type_indicator (f->stat_ok, f->stat.st_mode, f->filetype);
Tim Waugh 5505e2
+  }
cvsdist 4d15f3
+}
Kamil Dudka b26491
diff -urp coreutils-7.0.orig/src/mkdir.c coreutils-7.0/src/mkdir.c
Kamil Dudka b26491
--- coreutils-7.0.orig/src/mkdir.c	2008-08-24 22:58:15.000000000 +0200
Kamil Dudka b26491
+++ coreutils-7.0/src/mkdir.c	2009-01-28 17:18:52.771914007 +0100
Kamil Dudka b26491
@@ -39,6 +39,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'},
Kamil Dudka b26491
diff -urp coreutils-7.0.orig/src/mknod.c coreutils-7.0/src/mknod.c
Kamil Dudka b26491
--- coreutils-7.0.orig/src/mknod.c	2008-09-27 19:28:54.000000000 +0200
Kamil Dudka b26491
+++ coreutils-7.0/src/mknod.c	2009-01-28 17:18:52.772914014 +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},
Kamil Dudka b26491
diff -urp coreutils-7.0.orig/src/mv.c coreutils-7.0/src/mv.c
Kamil Dudka b26491
--- coreutils-7.0.orig/src/mv.c	2009-01-28 17:18:16.752671000 +0100
Kamil Dudka b26491
+++ coreutils-7.0/src/mv.c	2009-01-28 17:18:52.773914020 +0100
Kamil Dudka b26491
@@ -138,6 +138,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 0363d6
   x->require_preserve = false;  /* FIXME: maybe make this an option */
Ondrej Vasik 0363d6
   x->require_preserve_context = false;
Kamil Dudka b26491
   x->preserve_xattr = true;
Kamil Dudka b26491
diff -urp coreutils-7.0.orig/src/runcon.c coreutils-7.0/src/runcon.c
Kamil Dudka b26491
--- coreutils-7.0.orig/src/runcon.c	2008-08-24 22:30:10.000000000 +0200
Kamil Dudka b26491
+++ coreutils-7.0/src/runcon.c	2009-01-28 17:18:52.774914027 +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\
Kamil Dudka b26491
diff -urp coreutils-7.0.orig/src/stat.c coreutils-7.0/src/stat.c
Kamil Dudka b26491
--- coreutils-7.0.orig/src/stat.c	2008-09-27 19:28:54.000000000 +0200
Kamil Dudka b26491
+++ coreutils-7.0/src/stat.c	2009-01-28 17:18:52.775914034 +0100
Kamil Dudka b26491
@@ -823,7 +823,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
 
Kamil Dudka b26491
@@ -835,15 +835,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 0363d6
-		? "%n %i %l %t %s %S %b %f %a %c %d\n"
Ondrej Vasik 0363d6
-		: "  File: \"%n\"\n"
Ondrej Vasik 0363d6
-		"    ID: %-8i Namelen: %-7l Type: %T\n"
Ondrej Vasik 0363d6
-		"Block size: %-10s Fundamental block size: %S\n"
Ondrej Vasik 0363d6
-		"Blocks: Total: %-10b Free: %-10f Available: %a\n"
Ondrej Vasik 0363d6
-		"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 0363d6
+   	  else
Ondrej Vasik 0363d6
+	      format = "%n %i %l %t %s %S %b %f %a %c %d\n";
Ondrej Vasik 0363d6
     }
Ondrej Vasik 0363d6
+    else
Ondrej Vasik 0363d6
+  	{
Ondrej Vasik 0363d6
+	    if (secure)
Ondrej Vasik 0363d6
+	      format = "  File: \"%n\"\n"
Ondrej Vasik 0363d6
+	        "    ID: %-8i Namelen: %-7l Type: %T\n"
Ondrej Vasik 0363d6
+  	      "Block size: %-10s Fundamental block size: %S\n"
Ondrej Vasik 0363d6
+	        "Blocks: Total: %-10b Free: %-10f Available: %a\n"
Ondrej Vasik 0363d6
+	        "Inodes: Total: %-10c Free: %d\n"
Ondrej Vasik 0363d6
+	        "   S_Context: %C\n";
Ondrej Vasik 0363d6
+  	  else
Ondrej Vasik 0363d6
+	      format = "  File: \"%n\"\n"
Ondrej Vasik 0363d6
+	        "    ID: %-8i Namelen: %-7l Type: %T\n"
Ondrej Vasik 0363d6
+	        "Block size: %-10s Fundamental block size: %S\n"
Ondrej Vasik 0363d6
+	        "Blocks: Total: %-10b Free: %-10f Available: %a\n"
Ondrej Vasik 0363d6
+  	      "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;
Kamil Dudka b26491
@@ -851,7 +867,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
 
Kamil Dudka b26491
@@ -864,9 +880,12 @@ do_stat (char const *filename, bool ters
Ondrej Vasik 0363d6
   if (format == NULL)
Ondrej Vasik 0363d6
     {
Ondrej Vasik 0363d6
       if (terse)
Ondrej Vasik 0363d6
-	{
Ondrej Vasik 0363d6
-	  format = "%n %s %b %f %u %g %D %i %h %t %T %X %Y %Z %o\n";
Ondrej Vasik 0363d6
-	}
Ondrej Vasik 0363d6
+      {
Ondrej Vasik 0363d6
+        if (secure)
Ondrej Vasik 0363d6
+  	     format = "%n %s %b %f %u %g %D %i %h %t %T %X %Y %Z %o %C\n";
Ondrej Vasik 0363d6
+  	   else
Ondrej Vasik 0363d6
+	       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 0363d6
 	{
Ondrej Vasik 0363d6
 	  /* Temporary hack to match original output until conditional
Kamil Dudka b26491
@@ -883,12 +902,22 @@ do_stat (char const *filename, bool ters
Ondrej Vasik 0363d6
 	    }
Ondrej Vasik 0363d6
 	  else
Ondrej Vasik 0363d6
 	    {
Ondrej Vasik 0363d6
-	      format =
Ondrej Vasik 0363d6
-		"  File: %N\n"
Ondrej Vasik 0363d6
-		"  Size: %-10s\tBlocks: %-10b IO Block: %-6o %F\n"
Ondrej Vasik 0363d6
-		"Device: %Dh/%dd\tInode: %-10i  Links: %h\n"
Ondrej Vasik 0363d6
-		"Access: (%04a/%10.10A)  Uid: (%5u/%8U)   Gid: (%5g/%8G)\n"
Ondrej Vasik 0363d6
-		"Access: %x\n" "Modify: %y\n" "Change: %z\n";
Ondrej Vasik 0363d6
+        if (secure)
Ondrej Vasik 0363d6
+           format =
Ondrej Vasik 0363d6
+  		  "  File: %N\n"
Ondrej Vasik 0363d6
+	  	  "  Size: %-10s\tBlocks: %-10b IO Block: %-6o %F\n"
Ondrej Vasik 0363d6
+  		  "Device: %Dh/%dd\tInode: %-10i  Links: %-5h"
Ondrej Vasik 0363d6
+	  	  " Device type: %t,%T\n"
Ondrej Vasik 0363d6
+ 		    "Access: (%04a/%10.10A)  Uid: (%5u/%8U)   Gid: (%5g/%8G)\n"
Ondrej Vasik 0363d6
+  		  "   S_Context: %C\n"
Ondrej Vasik 0363d6
+	  	  "Access: %x\n" "Modify: %y\n" "Change: %z\n";
Ondrej Vasik 0363d6
+        else 
Ondrej Vasik 0363d6
+	        format =
Ondrej Vasik 0363d6
+    		"  File: %N\n"
Ondrej Vasik 0363d6
+	    	"  Size: %-10s\tBlocks: %-10b IO Block: %-6o %F\n"
Ondrej Vasik 0363d6
+  	  	"Device: %Dh/%dd\tInode: %-10i  Links: %h\n"
Ondrej Vasik 0363d6
+  	  	"Access: (%04a/%10.10A)  Uid: (%5u/%8U)   Gid: (%5g/%8G)\n"
Ondrej Vasik 0363d6
+    		"Access: %x\n" "Modify: %y\n" "Change: %z\n";
Ondrej Vasik 0363d6
 	    }
Ondrej Vasik 0363d6
 	}
Ondrej Vasik 0363d6
     }
Kamil Dudka b26491
@@ -909,6 +938,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 (_("\
Kamil Dudka b26491
@@ -993,6 +1023,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
 
Kamil Dudka b26491
@@ -1032,13 +1063,13 @@ main (int argc, char *argv[])
Ondrej Vasik 0363d6
 	  terse = true;
Ondrej Vasik 0363d6
 	  break;
Tim Waugh 5505e2
 
Ondrej Vasik e18e41
-	case 'Z':  /* FIXME: remove in 2010 */
Ondrej Vasik e18e41
-	  /* Ignore, for compatibility with distributions
Ondrej Vasik e18e41
-	     that implemented this before upstream.
Ondrej Vasik e18e41
-	     But warn of impending removal.  */
Ondrej Vasik e18e41
-	  error (0, 0,
Ondrej Vasik e18e41
-		 _("the --context (-Z) option is obsolete and will be removed\n"
Ondrej Vasik e18e41
-		   "in a future release"));
Ondrej Vasik e18e41
+	case 'Z':
Ondrej Vasik 0363d6
+    if((is_selinux_enabled()>0))
Ondrej Vasik 0363d6
+	    secure = 1;
Ondrej Vasik 0363d6
+	  else {
Ondrej Vasik 0363d6
+	    error (0, 0, _("Kernel is not SELinux enabled"));
Ondrej Vasik 0363d6
+	    usage (EXIT_FAILURE);
Ondrej Vasik 0363d6
+	  }
Ondrej Vasik 0363d6
 	  break;
Tim Waugh 5505e2
 
Ondrej Vasik 0363d6
 	case_GETOPT_HELP_CHAR;
Kamil Dudka b26491
@@ -1058,8 +1089,8 @@ main (int argc, char *argv[])
Daniel J Walsh 129baa
 
Tim Waugh 5505e2
   for (i = optind; i < argc; i++)
Tim Waugh 5505e2
     ok &= (fs
Tim Waugh 5505e2
-	   ? do_statfs (argv[i], terse, format)
Ondrej Vasik 0363d6
-	   : do_stat (argv[i], terse, format));
Tim Waugh 5505e2
+	   ? do_statfs (argv[i], terse, secure, format)
Ondrej Vasik 0363d6
+	   : do_stat (argv[i], terse, secure, format));
Tim Waugh 5505e2
 
Tim Waugh 5505e2
   exit (ok ? EXIT_SUCCESS : EXIT_FAILURE);
Tim Waugh 5505e2
 }
Kamil Dudka b26491
diff -urp coreutils-7.0.orig/tests/misc/selinux coreutils-7.0/tests/misc/selinux
Kamil Dudka b26491
--- coreutils-7.0.orig/tests/misc/selinux	2008-09-27 19:28:54.000000000 +0200
Kamil Dudka b26491
+++ coreutils-7.0/tests/misc/selinux	2009-01-28 17:18:52.776914041 +0100
Kamil Dudka b26491
@@ -30,12 +30,10 @@ 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
 
Ondrej Vasik 5d66c4
-# ensure that ls -l output includes the "+".
Ondrej Vasik 5d66c4
-c=`ls -l f|cut -c11`; test "$c" = + || fail=1
Kamil Dudka b26491
 
Ondrej Vasik 5d66c4
 # Copy each to a new directory and ensure that context is preserved.
Ondrej Vasik 5d66c4
 cp -r --preserve=all d f p s1 || fail=1