Tim Waugh 5505e2
--- /dev/null	2006-03-24 08:16:09.803715750 +0000
Tim Waugh 5505e2
+++ coreutils-5.94/src/chcon.c	2006-03-24 13:23:45.000000000 +0000
Daniel J Walsh 129baa
@@ -0,0 +1,421 @@
Daniel J Walsh 129baa
+/* chcontext -- change security context of a pathname */
Daniel J Walsh 129baa
+
Daniel J Walsh 129baa
+#include <config.h>
Daniel J Walsh 129baa
+#include <stdio.h>
Daniel J Walsh 129baa
+#include <sys/types.h>
Daniel J Walsh 129baa
+#include <grp.h>
Daniel J Walsh 129baa
+#include <getopt.h>
cvsdist 4d15f3
+#include <selinux/selinux.h>
Daniel J Walsh 129baa
+#include <selinux/context.h>
cvsdist 5adf0d
+
Daniel J Walsh 129baa
+#include "system.h"
Daniel J Walsh 129baa
+#include "error.h"
Daniel J Walsh 129baa
+#include "savedir.h"
Daniel J Walsh 129baa
+#include "group-member.h"
cvsdist 5adf0d
+
Daniel J Walsh 129baa
+enum Change_status
Daniel J Walsh 129baa
+{
Daniel J Walsh 129baa
+  CH_SUCCEEDED,
Daniel J Walsh 129baa
+  CH_FAILED,
Daniel J Walsh 129baa
+  CH_NO_CHANGE_REQUESTED
Daniel J Walsh 129baa
+};
Daniel J Walsh 129baa
+
Daniel J Walsh 129baa
+enum Verbosity
Daniel J Walsh 129baa
+{
Daniel J Walsh 129baa
+  /* Print a message for each file that is processed.  */
Daniel J Walsh 129baa
+  V_high,
Daniel J Walsh 129baa
+
Daniel J Walsh 129baa
+  /* Print a message for each file whose attributes we change.  */
Daniel J Walsh 129baa
+  V_changes_only,
Daniel J Walsh 129baa
+
Daniel J Walsh 129baa
+  /* Do not be verbose.  This is the default. */
Daniel J Walsh 129baa
+  V_off
Daniel J Walsh 129baa
+};
Daniel J Walsh 129baa
+
Daniel J Walsh 129baa
+static int change_dir_context (const char *dir, const struct stat *statp);
Daniel J Walsh 129baa
+
Daniel J Walsh 129baa
+/* The name the program was run with. */
Daniel J Walsh 129baa
+char *program_name;
Daniel J Walsh 129baa
+
Daniel J Walsh 129baa
+/* If nonzero, and the systems has support for it, change the context
Daniel J Walsh 129baa
+   of symbolic links rather than any files they point to.  */
Daniel J Walsh 129baa
+static int change_symlinks;
Daniel J Walsh 129baa
+
Daniel J Walsh 129baa
+/* If nonzero, change the context of directories recursively. */
Daniel J Walsh 129baa
+static int recurse;
Daniel J Walsh 129baa
+
Daniel J Walsh 129baa
+/* If nonzero, force silence (no error messages). */
Daniel J Walsh 129baa
+static int force_silent;
Daniel J Walsh 129baa
+
Daniel J Walsh 129baa
+/* Level of verbosity.  */
Daniel J Walsh 129baa
+static enum Verbosity verbosity = V_off;
Daniel J Walsh 129baa
+
Daniel J Walsh 129baa
+/* The name of the context file is being given. */
Daniel J Walsh 129baa
+static const char *specified_context;
Daniel J Walsh 129baa
+
Tim Waugh 5505e2
+/* Specific components of the context */
Tim Waugh 5505e2
+static const char *specified_user;
Tim Waugh 5505e2
+static const char *specified_role;
Tim Waugh 5505e2
+static const char *specified_range;
Tim Waugh 5505e2
+static const char *specified_type;
Tim Waugh 5505e2
+
Tim Waugh 5505e2
+/* The argument to the --reference option.  Use the context of this file.
Tim Waugh 5505e2
+   This file must exist.  */
Tim Waugh 5505e2
+static char *reference_file;
Tim Waugh 5505e2
+
Tim Waugh 5505e2
+/* If nonzero, display usage information and exit.  */
Tim Waugh 5505e2
+static int show_help;
Tim Waugh 5505e2
+
Tim Waugh 5505e2
+/* If nonzero, print the version on standard output and exit.  */
Tim Waugh 5505e2
+static int show_version;
Tim Waugh 5505e2
+
Tim Waugh 5505e2
+static struct option const long_options[] =
Tim Waugh 5505e2
+{
Tim Waugh 5505e2
+  {"recursive", no_argument, 0, 'R'},
Tim Waugh 5505e2
+  {"changes", no_argument, 0, 'c'},
Tim Waugh 5505e2
+  {"no-dereference", no_argument, 0, 'h'},
Tim Waugh 5505e2
+  {"silent", no_argument, 0, 'f'},
Tim Waugh 5505e2
+  {"quiet", no_argument, 0, 'f'},
Tim Waugh 5505e2
+  {"reference", required_argument, 0, CHAR_MAX + 1},
Tim Waugh 5505e2
+  {"context", required_argument, 0, CHAR_MAX + 2},
Tim Waugh 5505e2
+  {"user", required_argument, 0, 'u'},
Tim Waugh 5505e2
+  {"role", required_argument, 0, 'r'},      
Tim Waugh 5505e2
+  {"type", required_argument, 0, 't'},
Tim Waugh 5505e2
+  {"range", required_argument, 0, 'l'},   
Tim Waugh 5505e2
+  {"verbose", no_argument, 0, 'v'},
Tim Waugh 5505e2
+  {"help", no_argument, &show_help, 1},
Tim Waugh 5505e2
+  {"version", no_argument, &show_version, 1},
Tim Waugh 5505e2
+  {0, 0, 0, 0}
Tim Waugh 5505e2
+};
Tim Waugh 5505e2
+
Tim Waugh 5505e2
+/* Tell the user how/if the context of FILE has been changed.
Tim Waugh 5505e2
+   CHANGED describes what (if anything) has happened. */
Tim Waugh 5505e2
+
Tim Waugh 5505e2
+static void
Tim Waugh 5505e2
+describe_change (const char *file, security_context_t newcontext, enum Change_status changed)
Tim Waugh 5505e2
+{
Tim Waugh 5505e2
+  const char *fmt;
Tim Waugh 5505e2
+  switch (changed)
Tim Waugh 5505e2
+    {
Tim Waugh 5505e2
+    case CH_SUCCEEDED:
Tim Waugh 5505e2
+      fmt = _("context of %s changed to %s\n");
Tim Waugh 5505e2
+      break;
Tim Waugh 5505e2
+    case CH_FAILED:
Tim Waugh 5505e2
+      fmt = _("failed to change context of %s to %s\n");
Tim Waugh 5505e2
+      break;
Tim Waugh 5505e2
+    case CH_NO_CHANGE_REQUESTED:
Tim Waugh 5505e2
+      fmt = _("context of %s retained as %s\n");
Tim Waugh 5505e2
+      break;
Tim Waugh 5505e2
+    default:
Tim Waugh 5505e2
+      abort ();
Tim Waugh 5505e2
+    }
Tim Waugh 5505e2
+  printf (fmt, file, newcontext);
Tim Waugh 5505e2
+}
Tim Waugh 5505e2
+
Tim Waugh 5505e2
+static int
Tim Waugh 5505e2
+compute_context_from_mask (security_context_t context, context_t *ret)
Tim Waugh 5505e2
+{
Tim Waugh 5505e2
+  context_t newcontext = context_new (context);
Tim Waugh 5505e2
+  if (!newcontext)
Tim Waugh 5505e2
+    return 1;
Tim Waugh 5505e2
+#define SETCOMPONENT(comp) \
Tim Waugh 5505e2
+  do { \
Tim Waugh 5505e2
+    if (specified_ ## comp) \
Tim Waugh 5505e2
+      if (context_ ## comp ## _set (newcontext, specified_ ## comp)) \
Tim Waugh 5505e2
+        goto lose; \
Tim Waugh 5505e2
+  } while (0)
Tim Waugh 5505e2
+      
Tim Waugh 5505e2
+  SETCOMPONENT(user);
Tim Waugh 5505e2
+  SETCOMPONENT(range);
Tim Waugh 5505e2
+  SETCOMPONENT(role);
Tim Waugh 5505e2
+  SETCOMPONENT(type);
Tim Waugh 5505e2
+#undef SETCOMPONENT
Tim Waugh 5505e2
+  
Tim Waugh 5505e2
+  *ret = newcontext;
Tim Waugh 5505e2
+  return 0;
Tim Waugh 5505e2
+ lose:
Tim Waugh 5505e2
+  context_free (newcontext);
Tim Waugh 5505e2
+  return 1;
Tim Waugh 5505e2
+}
Tim Waugh 5505e2
+
Tim Waugh 5505e2
+/* Change the context of FILE, using specified components.
Tim Waugh 5505e2
+   If it is a directory and -R is given, recurse.
Tim Waugh 5505e2
+   Return 0 if successful, 1 if errors occurred. */
Tim Waugh 5505e2
+
Tim Waugh 5505e2
+static int
Tim Waugh 5505e2
+change_file_context (const char *file)
Tim Waugh 5505e2
+{
Tim Waugh 5505e2
+  struct stat file_stats;
Tim Waugh 5505e2
+  security_context_t file_context=NULL;
Tim Waugh 5505e2
+  context_t context;
Tim Waugh 5505e2
+  security_context_t context_string;
Tim Waugh 5505e2
+  int errors = 0;
Tim Waugh 5505e2
+  int status = 0;
Tim Waugh 5505e2
+
Tim Waugh 5505e2
+  if (change_symlinks)
Tim Waugh 5505e2
+    status = lgetfilecon(file, &file_context);
Tim Waugh 5505e2
+  else 
Tim Waugh 5505e2
+    status = getfilecon(file, &file_context);
Tim Waugh 5505e2
+
Tim Waugh 5505e2
+  if ((status < 0) && (errno != ENODATA))
Tim Waugh 5505e2
+    {
Tim Waugh 5505e2
+      if (force_silent == 0)
Tim Waugh 5505e2
+	error (0, errno, "%s", file);
Tim Waugh 5505e2
+      return 1;
Tim Waugh 5505e2
+    }
Tim Waugh 5505e2
+
Tim Waugh 5505e2
+  /* If the file doesn't have a context, and we're not setting all of
Tim Waugh 5505e2
+     the context components, there isn't really an obvious default.
Tim Waugh 5505e2
+     Thus, we just give up. */
Tim Waugh 5505e2
+  if (file_context == NULL && specified_context == NULL)
Tim Waugh 5505e2
+    {
Tim Waugh 5505e2
+      error (0, 0, _("can't apply partial context to unlabeled file %s"), file);
Tim Waugh 5505e2
+      return 1;
Tim Waugh 5505e2
+    }
Tim Waugh 5505e2
+      
Tim Waugh 5505e2
+  if (specified_context == NULL)
Tim Waugh 5505e2
+    {
Tim Waugh 5505e2
+      if (compute_context_from_mask (file_context, &context))
Tim Waugh 5505e2
+	{
Tim Waugh 5505e2
+	  error (0, 0, _("couldn't compute security context from %s"), file_context);
Tim Waugh 5505e2
+	      return 1;
Tim Waugh 5505e2
+	}
Tim Waugh 5505e2
+    }
Tim Waugh 5505e2
+  else
Tim Waugh 5505e2
+    {
Tim Waugh 5505e2
+      context = context_new (specified_context);
Tim Waugh 5505e2
+      if (!context)
Tim Waugh 5505e2
+	error (1, 0,_("invalid context: %s"),specified_context);	    
Tim Waugh 5505e2
+    }
Tim Waugh 5505e2
+
Tim Waugh 5505e2
+  context_string = context_str (context);
Tim Waugh 5505e2
+      
Tim Waugh 5505e2
+  if (file_context == NULL || strcmp(context_string,file_context)!=0)
Tim Waugh 5505e2
+    {
Tim Waugh 5505e2
+      int fail;
Tim Waugh 5505e2
+
Tim Waugh 5505e2
+      if (change_symlinks)
Tim Waugh 5505e2
+      	fail = lsetfilecon (file, context_string);
Tim Waugh 5505e2
+      else
Tim Waugh 5505e2
+      	fail = setfilecon (file, context_string);
Tim Waugh 5505e2
+
Tim Waugh 5505e2
+      if (verbosity == V_high || (verbosity == V_changes_only && !fail))
Tim Waugh 5505e2
+	describe_change (file, context_string, (fail ? CH_FAILED : CH_SUCCEEDED));
Tim Waugh 5505e2
+
Tim Waugh 5505e2
+      if (fail)
Tim Waugh 5505e2
+	{
Tim Waugh 5505e2
+	  errors = 1;
Tim Waugh 5505e2
+	  if (force_silent == 0)
Tim Waugh 5505e2
+	    {
Tim Waugh 5505e2
+	      error (0, errno, _("failed to change context of %s to %s"), file, context_string);
Tim Waugh 5505e2
+	    }
Tim Waugh 5505e2
+	}
Tim Waugh 5505e2
+    }
Tim Waugh 5505e2
+  else if (verbosity == V_high)
Tim Waugh 5505e2
+    {
Tim Waugh 5505e2
+      describe_change (file, context_string, CH_NO_CHANGE_REQUESTED);
Tim Waugh 5505e2
+    }
Daniel J Walsh 129baa
+
Tim Waugh 5505e2
+  context_free(context);
Tim Waugh 5505e2
+  freecon(file_context);
Daniel J Walsh 129baa
+
Tim Waugh 5505e2
+  if (recurse) {
Tim Waugh 5505e2
+    if (lstat(file, &file_stats)==0)
Tim Waugh 5505e2
+      if (S_ISDIR (file_stats.st_mode))
Tim Waugh 5505e2
+	errors |= change_dir_context (file, &file_stats);
Tim Waugh 5505e2
+  }
Tim Waugh 5505e2
+  return errors;
Tim Waugh 5505e2
+}
Daniel J Walsh 129baa
+
Tim Waugh 5505e2
+/* Recursively change context of the files in directory DIR
Tim Waugh 5505e2
+   using specified context components.
Tim Waugh 5505e2
+   STATP points to the results of lstat on DIR.
Tim Waugh 5505e2
+   Return 0 if successful, 1 if errors occurred. */
Daniel J Walsh 129baa
+
Tim Waugh 5505e2
+static int
Tim Waugh 5505e2
+change_dir_context (const char *dir, const struct stat *statp)
Daniel J Walsh 129baa
+{
Tim Waugh 5505e2
+  char *name_space, *namep;
Tim Waugh 5505e2
+  char *path;			/* Full path of each entry to process. */
Tim Waugh 5505e2
+  unsigned dirlength;		/* Length of `dir' and '\0'. */
Tim Waugh 5505e2
+  unsigned filelength;		/* Length of each pathname to process. */
Tim Waugh 5505e2
+  unsigned pathlength;		/* Bytes allocated for `path'. */
Tim Waugh 5505e2
+  int errors = 0;
Daniel J Walsh 129baa
+
Tim Waugh 5505e2
+  errno = 0;
Tim Waugh 5505e2
+  name_space = savedir (dir);
Tim Waugh 5505e2
+  if (name_space == NULL)
Tim Waugh 5505e2
+    {
Tim Waugh 5505e2
+      if (errno)
Tim Waugh 5505e2
+        {
Tim Waugh 5505e2
+	  if (force_silent == 0)
Tim Waugh 5505e2
+	    error (0, errno, "%s", dir);
Tim Waugh 5505e2
+	  return 1;
Tim Waugh 5505e2
+	}
Tim Waugh 5505e2
+      else
Tim Waugh 5505e2
+	error (1, 0, _("virtual memory exhausted"));
Tim Waugh 5505e2
+    }
Tim Waugh 5505e2
+
Tim Waugh 5505e2
+  dirlength = strlen (dir) + 1;	/* + 1 is for the trailing '/'. */
Tim Waugh 5505e2
+  pathlength = dirlength + 1;
Tim Waugh 5505e2
+  /* Give `path' a dummy value; it will be reallocated before first use. */
Tim Waugh 5505e2
+  path = xmalloc (pathlength);
Tim Waugh 5505e2
+  strcpy (path, dir);
Tim Waugh 5505e2
+  path[dirlength - 1] = '/';
Tim Waugh 5505e2
+
Tim Waugh 5505e2
+  for (namep = name_space; *namep; namep += filelength - dirlength)
Tim Waugh 5505e2
+    {
Tim Waugh 5505e2
+      filelength = dirlength + strlen (namep) + 1;
Tim Waugh 5505e2
+      if (filelength > pathlength)
Tim Waugh 5505e2
+	{
Tim Waugh 5505e2
+	  pathlength = filelength * 2;
Tim Waugh 5505e2
+	  path = xrealloc (path, pathlength);
Tim Waugh 5505e2
+	}
Tim Waugh 5505e2
+      strcpy (path + dirlength, namep);
Tim Waugh 5505e2
+      errors |= change_file_context (path);
Tim Waugh 5505e2
+    }
Tim Waugh 5505e2
+  free (path);
Tim Waugh 5505e2
+  free (name_space);
Tim Waugh 5505e2
+  return errors;
Tim Waugh 5505e2
+}
Daniel J Walsh 129baa
+
Daniel J Walsh 129baa
+static void
Tim Waugh 5505e2
+usage (int status)
Daniel J Walsh 129baa
+{
Tim Waugh 5505e2
+  if (status != 0)
Tim Waugh 5505e2
+    fprintf (stderr, _("Try `%s --help' for more information.\n"),
Tim Waugh 5505e2
+	     program_name);
Tim Waugh 5505e2
+  else
Daniel J Walsh 129baa
+    {
Tim Waugh 5505e2
+      printf (_("\
Tim Waugh 5505e2
+Usage: %s [OPTION]... CONTEXT FILE...\n\
Tim Waugh 5505e2
+  or:  %s [OPTION]... [-u USER] [-r ROLE] [-l RANGE] [-t TYPE] FILE...\n\
Tim Waugh 5505e2
+  or:  %s [OPTION]... --reference=RFILE FILE...\n\
Tim Waugh 5505e2
+"),
Tim Waugh 5505e2
+	program_name, program_name, program_name);
Tim Waugh 5505e2
+      printf (_("\
Tim Waugh 5505e2
+Change the security context of each FILE to CONTEXT.\n\
Tim Waugh 5505e2
+\n\
Tim Waugh 5505e2
+  -c, --changes          like verbose but report only when a change is made\n\
Tim Waugh 5505e2
+  -h, --no-dereference   affect symbolic links instead of any referenced file\n\
Tim Waugh 5505e2
+                         (available only on systems with lchown system call)\n\
Tim Waugh 5505e2
+  -f, --silent, --quiet  suppress most error messages\n\
Tim Waugh 5505e2
+      --reference=RFILE  use RFILE's group instead of using a CONTEXT value\n\
Tim Waugh 5505e2
+  -u, --user=USER        set user USER in the target security context\n\
Tim Waugh 5505e2
+  -r, --role=ROLE        set role ROLE in the target security context\n\
Tim Waugh 5505e2
+  -t, --type=TYPE        set type TYPE in the target security context\n\
Tim Waugh 5505e2
+  -l, --range=RANGE      set range RANGE in the target security context\n\
Tim Waugh 5505e2
+  -R, --recursive        change files and directories recursively\n\
Tim Waugh 5505e2
+  -v, --verbose          output a diagnostic for every file processed\n\
Tim Waugh 5505e2
+      --help             display this help and exit\n\
Tim Waugh 5505e2
+      --version          output version information and exit\n\
Tim Waugh 5505e2
+"));
Tim Waugh 5505e2
+      close_stdout ();
cvsdist 5adf0d
+    }
Tim Waugh 5505e2
+  exit (status);
Daniel J Walsh 129baa
+}
cvsdist 5adf0d
+
Tim Waugh 5505e2
+int
Tim Waugh 5505e2
+main (int argc, char **argv)
Daniel J Walsh 129baa
+{
Tim Waugh 5505e2
+  security_context_t ref_context = NULL;
Tim Waugh 5505e2
+  int errors = 0;
Tim Waugh 5505e2
+  int optc;
Tim Waugh 5505e2
+  int component_specified = 0;
Daniel J Walsh 129baa
+  
Tim Waugh 5505e2
+  program_name = argv[0];
Tim Waugh 5505e2
+  setlocale (LC_ALL, "");
Tim Waugh 5505e2
+  bindtextdomain (PACKAGE, LOCALEDIR);
Tim Waugh 5505e2
+  textdomain (PACKAGE);
Tim Waugh 5505e2
+
Tim Waugh 5505e2
+  recurse = force_silent = 0;
Tim Waugh 5505e2
+  
Tim Waugh 5505e2
+  while ((optc = getopt_long (argc, argv, "Rcfhvu:r:t:l:", long_options, NULL)) != -1)
Tim Waugh 5505e2
+  {
Tim Waugh 5505e2
+	  switch (optc)
Tim Waugh 5505e2
+	  {
Tim Waugh 5505e2
+	  case 0:
Tim Waugh 5505e2
+	    break;
Tim Waugh 5505e2
+	  case 'u':
Tim Waugh 5505e2
+	    specified_user = optarg;
Tim Waugh 5505e2
+	    component_specified = 1;
Tim Waugh 5505e2
+	    break;
Tim Waugh 5505e2
+	  case 'r':
Tim Waugh 5505e2
+	    specified_role = optarg;
Tim Waugh 5505e2
+	    component_specified = 1;
Tim Waugh 5505e2
+	    break;
Tim Waugh 5505e2
+	  case 't':
Tim Waugh 5505e2
+	    specified_type = optarg;
Tim Waugh 5505e2
+	    component_specified = 1;
Tim Waugh 5505e2
+	    break;
Tim Waugh 5505e2
+	  case 'l':
Tim Waugh 5505e2
+	    specified_range = optarg;
Tim Waugh 5505e2
+	    component_specified = 1;
Tim Waugh 5505e2
+	    break;
Tim Waugh 5505e2
+	  case CHAR_MAX + 1:
Tim Waugh 5505e2
+		  reference_file = optarg;
Tim Waugh 5505e2
+		  break;
Tim Waugh 5505e2
+	  case 'R':
Tim Waugh 5505e2
+		  recurse = 1;
Tim Waugh 5505e2
+		  break;
Tim Waugh 5505e2
+ 	  case 'c':
Tim Waugh 5505e2
+		  verbosity = V_changes_only;
Tim Waugh 5505e2
+		  break;
Tim Waugh 5505e2
+	  case 'f':
Tim Waugh 5505e2
+		  force_silent = 1;
Tim Waugh 5505e2
+		  break;
Tim Waugh 5505e2
+	  case 'h':
Tim Waugh 5505e2
+		  change_symlinks = 1;
Tim Waugh 5505e2
+		  break;
Tim Waugh 5505e2
+	  case 'v':
Tim Waugh 5505e2
+		  verbosity = V_high;
Tim Waugh 5505e2
+		  break;
Tim Waugh 5505e2
+	  default:
Tim Waugh 5505e2
+		  usage (1);
Tim Waugh 5505e2
+	  }
Tim Waugh 5505e2
+  }
Tim Waugh 5505e2
+
Tim Waugh 5505e2
+  if (show_version)
Tim Waugh 5505e2
+  {
Tim Waugh 5505e2
+     printf ("chcon (%s) %s\n", GNU_PACKAGE, VERSION);
Tim Waugh 5505e2
+     close_stdout ();
Tim Waugh 5505e2
+     exit (0);
Tim Waugh 5505e2
+  }
Tim Waugh 5505e2
+
Tim Waugh 5505e2
+  if (show_help)
Tim Waugh 5505e2
+    usage (0);
Tim Waugh 5505e2
+
Tim Waugh 5505e2
+  
Tim Waugh 5505e2
+  if (reference_file && component_specified)
Tim Waugh 5505e2
+    {
Tim Waugh 5505e2
+      error (0, 0, _("conflicting security context specifiers given"));
Tim Waugh 5505e2
+      usage (1);
Tim Waugh 5505e2
+    }
Tim Waugh 5505e2
+
Tim Waugh 5505e2
+  if (!(((reference_file || component_specified)
Tim Waugh 5505e2
+	 && (argc - optind > 0))
Tim Waugh 5505e2
+	|| (argc - optind > 1)))
Tim Waugh 5505e2
+    {
Tim Waugh 5505e2
+      error (0, 0, _("too few arguments"));
Tim Waugh 5505e2
+      usage (1);
Tim Waugh 5505e2
+    }
Tim Waugh 5505e2
+  
Tim Waugh 5505e2
+  if (reference_file)
Tim Waugh 5505e2
+    {
Tim Waugh 5505e2
+      if (getfilecon (reference_file, &ref_context)<0)
Tim Waugh 5505e2
+	error (1, errno, "%s", reference_file);
Tim Waugh 5505e2
+      
Tim Waugh 5505e2
+      specified_context = ref_context;
Tim Waugh 5505e2
+    }
Tim Waugh 5505e2
+  else if (!component_specified) {
Tim Waugh 5505e2
+    specified_context = argv[optind++];
Tim Waugh 5505e2
+  }
Tim Waugh 5505e2
+  for (; optind < argc; ++optind)
Tim Waugh 5505e2
+     errors |= change_file_context (argv[optind]);
Tim Waugh 5505e2
+
Tim Waugh 5505e2
+  if (verbosity != V_off)
Tim Waugh 5505e2
+    close_stdout ();
Tim Waugh 5505e2
+  if (ref_context != NULL)
Tim Waugh 5505e2
+    freecon(ref_context);
Tim Waugh 5505e2
+  exit (errors);
cvsdist 4d15f3
+}
Tim Waugh 5505e2
--- coreutils-5.94/src/mv.c.selinux	2006-03-24 13:23:38.000000000 +0000
Tim Waugh 5505e2
+++ coreutils-5.94/src/mv.c	2006-03-24 13:23:44.000000000 +0000
Tim Waugh 5505e2
@@ -34,6 +34,11 @@
Tim Waugh 5505e2
 #include "quote.h"
Tim Waugh 5505e2
 #include "remove.h"
Tim Waugh 5505e2
 
Tim Waugh 5505e2
+#ifdef WITH_SELINUX
Tim Waugh 5505e2
+#include <selinux/selinux.h>          /* for is_selinux_enabled() */
Tim Waugh 5505e2
+int selinux_enabled=0;
Tim Waugh 5505e2
+#endif
cvsdist 5adf0d
+
Tim Waugh 5505e2
 /* The official name of this program (e.g., no `g' prefix).  */
Tim Waugh 5505e2
 #define PROGRAM_NAME "mv"
Tim Waugh 5505e2
 
Tim Waugh 5505e2
@@ -127,6 +132,9 @@
Tim Waugh 5505e2
   x->preserve_links = true;
Tim Waugh 5505e2
   x->preserve_mode = true;
Tim Waugh 5505e2
   x->preserve_timestamps = true;
Tim Waugh 5505e2
+#ifdef WITH_SELINUX
Tim Waugh 5505e2
+  x->preserve_security_context = 1;
Tim Waugh 5505e2
+#endif
Tim Waugh 5505e2
   x->require_preserve = false;  /* FIXME: maybe make this an option */
Tim Waugh 5505e2
   x->recursive = true;
Tim Waugh 5505e2
   x->sparse_mode = SPARSE_AUTO;  /* FIXME: maybe make this an option */
Tim Waugh 5505e2
@@ -365,6 +373,10 @@
Tim Waugh 5505e2
 
Tim Waugh 5505e2
   cp_option_init (&x);
Tim Waugh 5505e2
 
Tim Waugh 5505e2
+#ifdef WITH_SELINUX
Tim Waugh 5505e2
+  selinux_enabled= (is_selinux_enabled()>0);
Tim Waugh 5505e2
+#endif
cvsdist 5adf0d
+
Tim Waugh 5505e2
   /* FIXME: consider not calling getenv for SIMPLE_BACKUP_SUFFIX unless
Tim Waugh 5505e2
      we'll actually use backup_suffix_string.  */
Tim Waugh 5505e2
   backup_suffix_string = getenv ("SIMPLE_BACKUP_SUFFIX");
Tim Waugh 5505e2
--- coreutils-5.94/src/mkdir.c.selinux	2005-06-15 00:55:47.000000000 +0100
Tim Waugh 5505e2
+++ coreutils-5.94/src/mkdir.c	2006-03-24 13:23:44.000000000 +0000
Tim Waugh 5505e2
@@ -34,11 +34,18 @@
Tim Waugh 5505e2
 
Tim Waugh 5505e2
 #define AUTHORS "David MacKenzie"
Tim Waugh 5505e2
 
Tim Waugh 5505e2
+#ifdef WITH_SELINUX
Tim Waugh 5505e2
+#include <selinux/selinux.h>          /* for is_selinux_enabled() */
Tim Waugh 5505e2
+#endif
cvsdist 5adf0d
+
Tim Waugh 5505e2
 /* The name this program was run with. */
Tim Waugh 5505e2
 char *program_name;
Tim Waugh 5505e2
 
Tim Waugh 5505e2
 static struct option const longopts[] =
Tim Waugh 5505e2
 {
Tim Waugh 5505e2
+#ifdef WITH_SELINUX
Tim Waugh 5505e2
+  {"context", required_argument, NULL, 'Z'},
Tim Waugh 5505e2
+#endif
Tim Waugh 5505e2
   {"mode", required_argument, NULL, 'm'},
Tim Waugh 5505e2
   {"parents", no_argument, NULL, 'p'},
Tim Waugh 5505e2
   {"verbose", no_argument, NULL, 'v'},
Tim Waugh 5505e2
@@ -60,6 +67,11 @@
Tim Waugh 5505e2
 Create the DIRECTORY(ies), if they do not already exist.\n\
Tim Waugh 5505e2
 \n\
Tim Waugh 5505e2
 "), stdout);
Tim Waugh 5505e2
+#ifdef WITH_SELINUX
Tim Waugh 5505e2
+      printf (_("\
Tim Waugh 5505e2
+  -Z, --context=CONTEXT (SELinux) set security context to CONTEXT\n\
Tim Waugh 5505e2
+"));
Tim Waugh 5505e2
+#endif
Tim Waugh 5505e2
       fputs (_("\
Tim Waugh 5505e2
 Mandatory arguments to long options are mandatory for short options too.\n\
Tim Waugh 5505e2
 "), stdout);
Tim Waugh 5505e2
@@ -95,7 +107,11 @@
Tim Waugh 5505e2
 
Tim Waugh 5505e2
   atexit (close_stdout);
Tim Waugh 5505e2
 
Tim Waugh 5505e2
+#ifdef WITH_SELINUX
Tim Waugh 5505e2
+  while ((optc = getopt_long (argc, argv, "pm:vZ:", longopts, NULL)) != -1)
Tim Waugh 5505e2
+#else
Tim Waugh 5505e2
   while ((optc = getopt_long (argc, argv, "pm:v", longopts, NULL)) != -1)
Tim Waugh 5505e2
+#endif
Tim Waugh 5505e2
     {
Tim Waugh 5505e2
       switch (optc)
Tim Waugh 5505e2
 	{
Tim Waugh 5505e2
@@ -108,6 +124,20 @@
Tim Waugh 5505e2
 	case 'v': /* --verbose  */
Tim Waugh 5505e2
 	  verbose_fmt_string = _("created directory %s");
Tim Waugh 5505e2
 	  break;
Tim Waugh 5505e2
+#ifdef WITH_SELINUX
Tim Waugh 5505e2
+ 	case 'Z':
Tim Waugh 5505e2
+ 	  /* politely decline if we're not on a selinux-enabled kernel. */
Tim Waugh 5505e2
+	  if( !(is_selinux_enabled()>0)) {
Tim Waugh 5505e2
+ 	    fprintf( stderr, "Sorry, --context (-Z) can be used only on "
Tim Waugh 5505e2
+ 		             "a selinux-enabled kernel.\n" );
Tim Waugh 5505e2
+ 	    exit( 1 );
Tim Waugh 5505e2
+ 	  }
Tim Waugh 5505e2
+	  if (setfscreatecon(optarg)) {
Tim Waugh 5505e2
+ 	    fprintf( stderr, "Sorry, cannot set default context to %s.\n", optarg);
Tim Waugh 5505e2
+ 	    exit( 1 );
Tim Waugh 5505e2
+ 	  }
Tim Waugh 5505e2
+ 	  break;
Tim Waugh 5505e2
+#endif
Tim Waugh 5505e2
 	case_GETOPT_HELP_CHAR;
Tim Waugh 5505e2
 	case_GETOPT_VERSION_CHAR (PROGRAM_NAME, AUTHORS);
Tim Waugh 5505e2
 	default:
Tim Waugh 5505e2
--- coreutils-5.94/src/cp.c.selinux	2006-03-24 13:23:38.000000000 +0000
Tim Waugh 5505e2
+++ coreutils-5.94/src/cp.c	2006-03-24 13:23:45.000000000 +0000
Tim Waugh 5505e2
@@ -51,6 +51,11 @@
Tim Waugh 5505e2
 
Tim Waugh 5505e2
 #define AUTHORS "Torbjorn Granlund", "David MacKenzie", "Jim Meyering"
Tim Waugh 5505e2
 
Tim Waugh 5505e2
+#ifdef WITH_SELINUX
Tim Waugh 5505e2
+#include <selinux/selinux.h>          /* for is_selinux_enabled() */
Tim Waugh 5505e2
+int selinux_enabled=0;
Tim Waugh 5505e2
+#endif
cvsdist 5adf0d
+
Tim Waugh 5505e2
 /* Used by do_copy, make_dir_parents_private, and re_protect
Tim Waugh 5505e2
    to keep a list of leading directories whose protections
Tim Waugh 5505e2
    need to be fixed after copying. */
Tim Waugh 5505e2
@@ -141,6 +146,9 @@
Tim Waugh 5505e2
   {"target-directory", required_argument, NULL, 't'},
Tim Waugh 5505e2
   {"update", no_argument, NULL, 'u'},
Tim Waugh 5505e2
   {"verbose", no_argument, NULL, 'v'},
Tim Waugh 5505e2
+#ifdef WITH_SELINUX
Tim Waugh 5505e2
+  {"context", required_argument, NULL, 'Z'},
Tim Waugh 5505e2
+#endif
Tim Waugh 5505e2
   {GETOPT_HELP_OPTION_DECL},
Tim Waugh 5505e2
   {GETOPT_VERSION_OPTION_DECL},
Tim Waugh 5505e2
   {NULL, 0, NULL, 0}
Tim Waugh 5505e2
@@ -194,6 +202,9 @@
Tim Waugh 5505e2
                                  additional attributes: links, all\n\
Tim Waugh 5505e2
 "), stdout);
Tim Waugh 5505e2
       fputs (_("\
Tim Waugh 5505e2
+  -c                           same as --preserve=context\n\
Tim Waugh 5505e2
+"), stdout);
Tim Waugh 5505e2
+      fputs (_("\
Tim Waugh 5505e2
       --no-preserve=ATTR_LIST  don't preserve the specified attributes\n\
Tim Waugh 5505e2
       --parents                use full source file name under DIRECTORY\n\
Tim Waugh 5505e2
 "), stdout);
Tim Waugh 5505e2
@@ -219,6 +230,7 @@
Tim Waugh 5505e2
                                  destination file is missing\n\
Tim Waugh 5505e2
   -v, --verbose                explain what is being done\n\
Tim Waugh 5505e2
   -x, --one-file-system        stay on this file system\n\
Tim Waugh 5505e2
+  -Z, --context=CONTEXT        set security context of copy to CONTEXT\n\
Tim Waugh 5505e2
 "), stdout);
Tim Waugh 5505e2
       fputs (HELP_OPTION_DESCRIPTION, stdout);
Tim Waugh 5505e2
       fputs (VERSION_OPTION_DESCRIPTION, stdout);
Tim Waugh 5505e2
@@ -741,6 +753,10 @@
Tim Waugh 5505e2
   x->preserve_mode = false;
Tim Waugh 5505e2
   x->preserve_timestamps = false;
Tim Waugh 5505e2
 
Tim Waugh 5505e2
+#ifdef WITH_SELINUX
Tim Waugh 5505e2
+  x->preserve_security_context = false;
Tim Waugh 5505e2
+#endif
Tim Waugh 5505e2
+
Tim Waugh 5505e2
   x->require_preserve = false;
Tim Waugh 5505e2
   x->recursive = false;
Tim Waugh 5505e2
   x->sparse_mode = SPARSE_AUTO;
Tim Waugh 5505e2
@@ -768,18 +784,19 @@
Tim Waugh 5505e2
       PRESERVE_TIMESTAMPS,
Tim Waugh 5505e2
       PRESERVE_OWNERSHIP,
Tim Waugh 5505e2
       PRESERVE_LINK,
Tim Waugh 5505e2
+      PRESERVE_CONTEXT,
Tim Waugh 5505e2
       PRESERVE_ALL
Tim Waugh 5505e2
     };
Tim Waugh 5505e2
   static enum File_attribute const preserve_vals[] =
Tim Waugh 5505e2
     {
Tim Waugh 5505e2
       PRESERVE_MODE, PRESERVE_TIMESTAMPS,
Tim Waugh 5505e2
-      PRESERVE_OWNERSHIP, PRESERVE_LINK, PRESERVE_ALL
Tim Waugh 5505e2
+      PRESERVE_OWNERSHIP, PRESERVE_LINK, PRESERVE_CONTEXT, PRESERVE_ALL
Tim Waugh 5505e2
     };
Tim Waugh 5505e2
   /* Valid arguments to the `--preserve' option. */
Tim Waugh 5505e2
   static char const* const preserve_args[] =
Tim Waugh 5505e2
     {
Tim Waugh 5505e2
       "mode", "timestamps",
Tim Waugh 5505e2
-      "ownership", "links", "all", NULL
Tim Waugh 5505e2
+      "ownership", "links", "context", "all", NULL
Tim Waugh 5505e2
     };
Tim Waugh 5505e2
   ARGMATCH_VERIFY (preserve_args, preserve_vals);
Tim Waugh 5505e2
 
Tim Waugh 5505e2
@@ -815,11 +832,16 @@
Tim Waugh 5505e2
 	  x->preserve_links = on_off;
Tim Waugh 5505e2
 	  break;
Tim Waugh 5505e2
 
Tim Waugh 5505e2
+	case PRESERVE_CONTEXT:
Tim Waugh 5505e2
+	  x->preserve_security_context = on_off;
Tim Waugh 5505e2
+	  break;
Tim Waugh 5505e2
+
Tim Waugh 5505e2
 	case PRESERVE_ALL:
Tim Waugh 5505e2
 	  x->preserve_mode = on_off;
Tim Waugh 5505e2
 	  x->preserve_timestamps = on_off;
Tim Waugh 5505e2
 	  x->preserve_ownership = on_off;
Tim Waugh 5505e2
 	  x->preserve_links = on_off;
Tim Waugh 5505e2
+	  x->preserve_security_context = on_off;
Tim Waugh 5505e2
 	  break;
Tim Waugh 5505e2
 
Tim Waugh 5505e2
 	default:
Tim Waugh 5505e2
@@ -844,6 +866,10 @@
Tim Waugh 5505e2
   bool copy_contents = false;
Tim Waugh 5505e2
   char *target_directory = NULL;
Tim Waugh 5505e2
   bool no_target_directory = false;
Tim Waugh 5505e2
+#ifdef WITH_SELINUX
Tim Waugh 5505e2
+  security_context_t scontext = NULL;
Tim Waugh 5505e2
+  selinux_enabled= (is_selinux_enabled()>0);
Tim Waugh 5505e2
+#endif
Tim Waugh 5505e2
 
Tim Waugh 5505e2
   initialize_main (&argc, &argv);
Tim Waugh 5505e2
   program_name = argv[0];
Tim Waugh 5505e2
@@ -859,7 +885,11 @@
Tim Waugh 5505e2
      we'll actually use backup_suffix_string.  */
Tim Waugh 5505e2
   backup_suffix_string = getenv ("SIMPLE_BACKUP_SUFFIX");
Tim Waugh 5505e2
 
Tim Waugh 5505e2
+#ifdef WITH_SELINUX
Tim Waugh 5505e2
+  while ((c = getopt_long (argc, argv, "abcdfHilLprst:uvxPRS:TZ:",
Tim Waugh 5505e2
+#else
Tim Waugh 5505e2
   while ((c = getopt_long (argc, argv, "abdfHilLprst:uvxPRS:T",
Tim Waugh 5505e2
+#endif
Tim Waugh 5505e2
 			   long_opts, NULL))
Tim Waugh 5505e2
 	 != -1)
Tim Waugh 5505e2
     {
Tim Waugh 5505e2
@@ -950,6 +980,36 @@
Tim Waugh 5505e2
 	case 'R':
Tim Waugh 5505e2
 	  x.recursive = true;
Tim Waugh 5505e2
 	  break;
Tim Waugh 5505e2
+#ifdef WITH_SELINUX
Tim Waugh 5505e2
+	case 'c':
Tim Waugh 5505e2
+	  if ( scontext != NULL ) { 
Tim Waugh 5505e2
+	      (void) fprintf(stderr, "%s: cannot force target context <-- %s and preserve it\n", argv[0], scontext);
Tim Waugh 5505e2
+	    exit( 1 );
Tim Waugh 5505e2
+	  }
Tim Waugh 5505e2
+	  else if (selinux_enabled) 
Tim Waugh 5505e2
+	    x.preserve_security_context = 1;
Tim Waugh 5505e2
+	  break;
Tim Waugh 5505e2
+
Tim Waugh 5505e2
+	case 'Z':
Tim Waugh 5505e2
+	  /* politely decline if we're not on a selinux-enabled kernel. */
Tim Waugh 5505e2
+	  if( !selinux_enabled ) {
Tim Waugh 5505e2
+	    fprintf( stderr, "Warning:  ignoring --context (-Z). "
Tim Waugh 5505e2
+		             "It requires a SELinux enabled kernel.\n" );
Tim Waugh 5505e2
+	    break;
Tim Waugh 5505e2
+	  }
Tim Waugh 5505e2
+	  if ( x.preserve_security_context ) {
Tim Waugh 5505e2
+	    (void) fprintf(stderr, "%s: cannot force target context to '%s' and preserve it\n", argv[0], optarg);
Tim Waugh 5505e2
+	    exit( 1 );
Tim Waugh 5505e2
+	  }
Tim Waugh 5505e2
+	  scontext = optarg;
Tim Waugh 5505e2
+	  /* if there's a security_context given set new path 
Tim Waugh 5505e2
+	     components to that context, too */
Tim Waugh 5505e2
+	  if ( setfscreatecon(scontext) < 0 ) {
Tim Waugh 5505e2
+	    (void) fprintf(stderr, _("cannot set default security context %s"), scontext);
Tim Waugh 5505e2
+	    exit( 1 );
Tim Waugh 5505e2
+	  }
Tim Waugh 5505e2
+	  break;
Tim Waugh 5505e2
+#endif
Tim Waugh 5505e2
 
Tim Waugh 5505e2
 	case REPLY_OPTION: /* Deprecated */
Tim Waugh 5505e2
 	  x.interactive = XARGMATCH ("--reply", optarg,
Tim Waugh 5505e2
--- coreutils-5.94/src/install.c.selinux	2006-03-24 13:23:44.000000000 +0000
Tim Waugh 5505e2
+++ coreutils-5.94/src/install.c	2006-03-24 13:23:45.000000000 +0000
Tim Waugh 5505e2
@@ -48,6 +48,43 @@
Tim Waugh 5505e2
 # include <sys/wait.h>
Tim Waugh 5505e2
 #endif
Tim Waugh 5505e2
 
Tim Waugh 5505e2
+#ifdef WITH_SELINUX
Tim Waugh 5505e2
+#include <selinux/selinux.h>          /* for is_selinux_enabled() */
Tim Waugh 5505e2
+int selinux_enabled=0;
Tim Waugh 5505e2
+static int use_default_selinux_context = 1;
Tim Waugh 5505e2
+/* Modify file context to match the specified policy,  
Tim Waugh 5505e2
+   If an error occurs the file will remain with the default directory 
Tim Waugh 5505e2
+   context.*/
Tim Waugh 5505e2
+static void setdefaultfilecon(const char *path) {
Tim Waugh 5505e2
+	struct stat st;
Tim Waugh 5505e2
+	security_context_t scontext=NULL;
Tim Waugh 5505e2
+	if (selinux_enabled != 1) {
Tim Waugh 5505e2
+		/* Indicate no context found. */
Tim Waugh 5505e2
+		return;
Tim Waugh 5505e2
+	}
Tim Waugh 5505e2
+	if (lstat(path, &st) != 0)
Tim Waugh 5505e2
+		return;
cvsdist 5adf0d
+
Tim Waugh 5505e2
+	/* If there's an error determining the context, or it has none, 
Tim Waugh 5505e2
+	   return to allow default context */
Tim Waugh 5505e2
+	if ((matchpathcon(path, st.st_mode, &scontext) != 0) ||
Tim Waugh 5505e2
+	    (strcmp(scontext, "<<none>>") == 0)) {
Tim Waugh 5505e2
+		if (scontext != NULL) {
Tim Waugh 5505e2
+			freecon(scontext);
Tim Waugh 5505e2
+		}
Tim Waugh 5505e2
+		return;
Daniel J Walsh 129baa
+	}
Tim Waugh 5505e2
+	if (lsetfilecon(path, scontext) < 0) {
Tim Waugh 5505e2
+		if (errno != ENOTSUP) {
Tim Waugh 5505e2
+			error (0, errno,
Tim Waugh 5505e2
+			       _("warning: failed to change context of %s to %s"), path, scontext);
Tim Waugh 5505e2
+		}
Tim Waugh 5505e2
+	}
Tim Waugh 5505e2
+	freecon(scontext);
Tim Waugh 5505e2
+	return;
Tim Waugh 5505e2
+}
Tim Waugh 5505e2
+#endif
cvsdist 5adf0d
+
Tim Waugh 5505e2
 #if ! HAVE_ENDGRENT
Tim Waugh 5505e2
 # define endgrent() ((void) 0)
Tim Waugh 5505e2
 #endif
Tim Waugh 5505e2
@@ -109,12 +146,18 @@
Tim Waugh 5505e2
 static struct option const long_options[] =
Tim Waugh 5505e2
 {
Tim Waugh 5505e2
   {"backup", optional_argument, NULL, 'b'},
Tim Waugh 5505e2
+#ifdef WITH_SELINUX
Tim Waugh 5505e2
+  {"context", required_argument, NULL, 'Z'},
Tim Waugh 5505e2
+#endif
Tim Waugh 5505e2
   {"directory", no_argument, NULL, 'd'},
Tim Waugh 5505e2
   {"group", required_argument, NULL, 'g'},
Tim Waugh 5505e2
   {"mode", required_argument, NULL, 'm'},
Tim Waugh 5505e2
   {"no-target-directory", no_argument, NULL, 'T'},
Tim Waugh 5505e2
   {"owner", required_argument, NULL, 'o'},
Tim Waugh 5505e2
   {"preserve-timestamps", no_argument, NULL, 'p'},
Tim Waugh 5505e2
+#ifdef WITH_SELINUX
Tim Waugh 5505e2
+  {"preserve_context", no_argument, NULL, 'P'},
Tim Waugh 5505e2
+#endif
Tim Waugh 5505e2
   {"strip", no_argument, NULL, 's'},
Tim Waugh 5505e2
   {"suffix", required_argument, NULL, 'S'},
Tim Waugh 5505e2
   {"target-directory", required_argument, NULL, 't'},
Tim Waugh 5505e2
@@ -154,6 +197,9 @@
Tim Waugh 5505e2
   x->stdin_tty = false;
Tim Waugh 5505e2
 
Tim Waugh 5505e2
   x->update = false;
Tim Waugh 5505e2
+#ifdef WITH_SELINUX
Tim Waugh 5505e2
+  x->preserve_security_context = 0;
Tim Waugh 5505e2
+#endif
Tim Waugh 5505e2
   x->verbose = false;
Tim Waugh 5505e2
   x->dest_info = NULL;
Tim Waugh 5505e2
   x->src_info = NULL;
Tim Waugh 5505e2
@@ -195,6 +241,11 @@
Tim Waugh 5505e2
   bool no_target_directory = false;
Tim Waugh 5505e2
   int n_files;
Tim Waugh 5505e2
   char **file;
Tim Waugh 5505e2
+#ifdef WITH_SELINUX
Tim Waugh 5505e2
+  security_context_t scontext = NULL;
Tim Waugh 5505e2
+ /* set iff kernel has extra selinux system calls */
Tim Waugh 5505e2
+  selinux_enabled = (is_selinux_enabled()>0);
Tim Waugh 5505e2
+#endif
Tim Waugh 5505e2
 
Tim Waugh 5505e2
   initialize_main (&argc, &argv);
Tim Waugh 5505e2
   program_name = argv[0];
Tim Waugh 5505e2
@@ -216,7 +267,11 @@
Tim Waugh 5505e2
      we'll actually use backup_suffix_string.  */
Tim Waugh 5505e2
   backup_suffix_string = getenv ("SIMPLE_BACKUP_SUFFIX");
Tim Waugh 5505e2
 
Tim Waugh 5505e2
+#ifdef WITH_SELINUX
Tim Waugh 5505e2
+  while ((optc = getopt_long (argc, argv, "bcsDdg:m:o:pPt:TvS:Z:", long_options,
Tim Waugh 5505e2
+#else
Tim Waugh 5505e2
   while ((optc = getopt_long (argc, argv, "bcsDdg:m:o:pt:TvS:", long_options,
Tim Waugh 5505e2
+#endif
Tim Waugh 5505e2
 			      NULL)) != -1)
Tim Waugh 5505e2
     {
Tim Waugh 5505e2
       switch (optc)
Tim Waugh 5505e2
@@ -278,6 +333,41 @@
Tim Waugh 5505e2
 	case 'T':
Tim Waugh 5505e2
 	  no_target_directory = true;
Tim Waugh 5505e2
 	  break;
Tim Waugh 5505e2
+#ifdef WITH_SELINUX
Tim Waugh 5505e2
+ 	case 'P':
Tim Waugh 5505e2
+	/* politely decline if we're not on a selinux-enabled kernel. */
Tim Waugh 5505e2
+	  if( !selinux_enabled ) {
Tim Waugh 5505e2
+ 	    fprintf( stderr, "Warning:  ignoring --preserve_context (-P) "
Tim Waugh 5505e2
+		             "because the kernel is not selinux-enabled.\n" );
Tim Waugh 5505e2
+ 	    break;
Tim Waugh 5505e2
+ 	  }
Tim Waugh 5505e2
+ 	  if ( scontext!=NULL ) { /* scontext could be NULL because of calloc() failure */
Tim Waugh 5505e2
+ 	      (void) fprintf(stderr, "%s: cannot force target context to '%s' and preserve it\n", argv[0], scontext);
Tim Waugh 5505e2
+ 	    exit( 1 );
Tim Waugh 5505e2
+ 	  }
Tim Waugh 5505e2
+ 	  x.preserve_security_context = 1;
Tim Waugh 5505e2
+ 	  use_default_selinux_context = 0;
Tim Waugh 5505e2
+ 	  break ;
Tim Waugh 5505e2
+ 	case 'Z':
Tim Waugh 5505e2
+ 	  /* politely decline if we're not on a selinux-enabled kernel. */
Tim Waugh 5505e2
+	  if( !selinux_enabled) {
Tim Waugh 5505e2
+ 	    fprintf( stderr, "Warning:  ignoring --context (-Z) "
Tim Waugh 5505e2
+ 		             "because the kernel is not selinux-enabled.\n" );
Tim Waugh 5505e2
+ 	    break;
Tim Waugh 5505e2
+ 	  }
Tim Waugh 5505e2
+ 	  if ( x.preserve_security_context ) {
Daniel J Walsh 129baa
+
Tim Waugh 5505e2
+	     	    (void) fprintf(stderr, "%s: cannot force target context == '%s' and preserve it\n", argv[0], optarg);
Tim Waugh 5505e2
+ 	    exit( 1 );
Tim Waugh 5505e2
+ 	  }
Tim Waugh 5505e2
+ 	  scontext = optarg;
Tim Waugh 5505e2
+ 	  use_default_selinux_context = 0;
Tim Waugh 5505e2
+	  if (setfscreatecon(scontext)) {
Tim Waugh 5505e2
+ 	    (void) fprintf(stderr, "%s: cannot setup default context == '%s'\n", argv[0], scontext);
Tim Waugh 5505e2
+	    exit(1);
Tim Waugh 5505e2
+	  }
Tim Waugh 5505e2
+ 	  break;
Tim Waugh 5505e2
+#endif
Tim Waugh 5505e2
 	case_GETOPT_HELP_CHAR;
Tim Waugh 5505e2
 	case_GETOPT_VERSION_CHAR (PROGRAM_NAME, AUTHORS);
Tim Waugh 5505e2
 	default:
Tim Waugh 5505e2
@@ -519,6 +609,10 @@
Tim Waugh 5505e2
       ok = false;
Tim Waugh 5505e2
     }
Tim Waugh 5505e2
 
Tim Waugh 5505e2
+#ifdef WITH_SELINUX
Tim Waugh 5505e2
+  if (use_default_selinux_context)
Tim Waugh 5505e2
+    setdefaultfilecon(name);
Tim Waugh 5505e2
+#endif
Tim Waugh 5505e2
   return ok;
Tim Waugh 5505e2
 }
Tim Waugh 5505e2
 
Tim Waugh 5505e2
@@ -663,6 +757,11 @@
Tim Waugh 5505e2
   -T, --no-target-directory  treat DEST as a normal file\n\
Tim Waugh 5505e2
   -v, --verbose       print the name of each directory as it is created\n\
Tim Waugh 5505e2
 "), stdout);
Tim Waugh 5505e2
+      fputs (_("\
Tim Waugh 5505e2
+  -P, --preserve_context (SELinux) Preserve security context\n\
Tim Waugh 5505e2
+  -Z, --context=CONTEXT  (SELinux) Set security context of files and directories\n\
Tim Waugh 5505e2
+"), stdout);
Daniel J Walsh 129baa
+
Tim Waugh 5505e2
       fputs (HELP_OPTION_DESCRIPTION, stdout);
Tim Waugh 5505e2
       fputs (VERSION_OPTION_DESCRIPTION, stdout);
Tim Waugh 5505e2
       fputs (_("\
Tim Waugh 5505e2
--- coreutils-5.94/src/copy.h.selinux	2006-03-24 13:23:38.000000000 +0000
Tim Waugh 5505e2
+++ coreutils-5.94/src/copy.h	2006-03-24 13:23:45.000000000 +0000
Tim Waugh 5505e2
@@ -127,6 +127,9 @@
Tim Waugh 5505e2
   bool preserve_ownership;
Tim Waugh 5505e2
   bool preserve_mode;
Tim Waugh 5505e2
   bool preserve_timestamps;
Tim Waugh 5505e2
+#ifdef WITH_SELINUX
Tim Waugh 5505e2
+  bool preserve_security_context;
Tim Waugh 5505e2
+#endif
Tim Waugh 5505e2
 
Tim Waugh 5505e2
   /* Enabled for mv, and for cp by the --preserve=links option.
Tim Waugh 5505e2
      If true, attempt to preserve in the destination files any
Tim Waugh 5505e2
--- coreutils-5.94/src/Makefile.am.selinux	2006-03-24 13:23:43.000000000 +0000
Tim Waugh 5505e2
+++ coreutils-5.94/src/Makefile.am	2006-03-24 13:23:45.000000000 +0000
Tim Waugh 5505e2
@@ -20,13 +20,13 @@
Tim Waugh 5505e2
 EXTRA_PROGRAMS = chroot df hostid nice pinky stty su runuser uname uptime users who
Tim Waugh 5505e2
 
Tim Waugh 5505e2
 bin_SCRIPTS = groups
Tim Waugh 5505e2
-bin_PROGRAMS = [ chgrp chown chmod cp dd dircolors du \
Tim Waugh 5505e2
+bin_PROGRAMS = [ chgrp chown chmod chcon cp dd dircolors du \
Tim Waugh 5505e2
   ginstall link ln dir vdir ls mkdir \
Tim Waugh 5505e2
   mkfifo mknod mv nohup readlink rm rmdir shred stat sync touch unlink \
Tim Waugh 5505e2
   cat cksum comm csplit cut expand fmt fold head join md5sum \
Tim Waugh 5505e2
   nl od paste pr ptx sha1sum sort split sum tac tail tr tsort unexpand uniq wc \
Tim Waugh 5505e2
   basename date dirname echo env expr factor false \
Tim Waugh 5505e2
-  hostname id kill logname pathchk printenv printf pwd seq sleep tee \
Tim Waugh 5505e2
+  hostname id kill logname pathchk printenv printf pwd runcon seq sleep tee \
Tim Waugh 5505e2
   test true tty whoami yes \
Tim Waugh 5505e2
   $(OPTIONAL_BIN_PROGS) $(DF_PROG)
Tim Waugh 5505e2
 
Tim Waugh 5505e2
@@ -50,9 +50,9 @@
Tim Waugh 5505e2
 LDADD = ../lib/libcoreutils.a $(LIBINTL) ../lib/libcoreutils.a
Tim Waugh 5505e2
 
Tim Waugh 5505e2
 # for eaccess in lib/euidaccess.c.
Tim Waugh 5505e2
-cp_LDADD = $(LDADD) $(LIB_EACCESS) @LIBACL@
Tim Waugh 5505e2
-ginstall_LDADD = $(LDADD) $(LIB_EACCESS) @LIBACL@
Tim Waugh 5505e2
-mv_LDADD = $(LDADD) $(LIB_EACCESS) @LIBACL@
Tim Waugh 5505e2
+cp_LDADD = $(LDADD) $(LIB_EACCESS) @LIBACL@ @LIB_SELINUX@
Tim Waugh 5505e2
+ginstall_LDADD = $(LDADD) $(LIB_EACCESS) @LIBACL@ @LIB_SELINUX@
Tim Waugh 5505e2
+mv_LDADD = $(LDADD) $(LIB_EACCESS) @LIBACL@ @LIB_SELINUX@
Tim Waugh 5505e2
 pathchk_LDADD = $(LDADD) $(LIB_EACCESS)
Tim Waugh 5505e2
 rm_LDADD = $(LDADD) $(LIB_EACCESS)
Tim Waugh 5505e2
 test_LDADD = $(LDADD) $(LIB_EACCESS)
Tim Waugh 5505e2
@@ -61,11 +61,18 @@
Tim Waugh 5505e2
 
Tim Waugh 5505e2
 # for clock_gettime and fdatasync
Tim Waugh 5505e2
 dd_LDADD = $(LDADD) $(LIB_GETHRXTIME) $(LIB_FDATASYNC)
Tim Waugh 5505e2
-dir_LDADD = $(LDADD) $(LIB_CLOCK_GETTIME) @LIBACL@
Tim Waugh 5505e2
-ls_LDADD = $(LDADD) $(LIB_CLOCK_GETTIME) @LIBACL@
Tim Waugh 5505e2
+dir_LDADD = $(LDADD) $(LIB_CLOCK_GETTIME) @LIBACL@ @LIB_SELINUX@
Tim Waugh 5505e2
+ls_LDADD = $(LDADD) $(LIB_CLOCK_GETTIME) @LIBACL@ @LIB_SELINUX@
Tim Waugh 5505e2
 pr_LDADD = $(LDADD) $(LIB_CLOCK_GETTIME)
Tim Waugh 5505e2
 shred_LDADD = $(LDADD) $(LIB_GETHRXTIME) $(LIB_FDATASYNC)
Tim Waugh 5505e2
-vdir_LDADD = $(LDADD) $(LIB_CLOCK_GETTIME) @LIBACL@
Tim Waugh 5505e2
+vdir_LDADD = $(LDADD) $(LIB_CLOCK_GETTIME) @LIBACL@ @LIB_SELINUX@
Tim Waugh 5505e2
+chcon_LDADD = $(LDADD) @LIB_SELINUX@
Tim Waugh 5505e2
+id_LDADD = $(LDADD) @LIB_SELINUX@
Tim Waugh 5505e2
+mkdir_LDADD = $(LDADD) @LIB_SELINUX@
Tim Waugh 5505e2
+mkfifo_LDADD = $(LDADD) @LIB_SELINUX@
Tim Waugh 5505e2
+mknod_LDADD = $(LDADD) @LIB_SELINUX@
Tim Waugh 5505e2
+stat_LDADD = $(LDADD) @LIB_SELINUX@
Tim Waugh 5505e2
+runcon_LDADD = $(LDADD) @LIB_SELINUX@
Tim Waugh 5505e2
 
Tim Waugh 5505e2
 ## If necessary, add -lm to resolve use of pow in lib/strtod.c.
Tim Waugh 5505e2
 sort_LDADD = $(LDADD) $(POW_LIB)
Tim Waugh 5505e2
--- /dev/null	2006-03-24 08:16:09.803715750 +0000
Tim Waugh 5505e2
+++ coreutils-5.94/src/runcon.c	2006-03-24 13:23:44.000000000 +0000
Tim Waugh 5505e2
@@ -0,0 +1,253 @@
Tim Waugh 5505e2
+/*
Tim Waugh 5505e2
+ * runcon [ context |
Tim Waugh 5505e2
+ *         ( [ -c ] [ -r role ] [-t type] [ -u user ] [ -l levelrange ] )
Tim Waugh 5505e2
+ *         command [arg1 [arg2 ...] ]
Tim Waugh 5505e2
+ *
Tim Waugh 5505e2
+ * attempt to run the specified command with the specified context.
Tim Waugh 5505e2
+ * 
Tim Waugh 5505e2
+ * -r role  : use the current context with the specified role
Tim Waugh 5505e2
+ * -t type  : use the current context with the specified type
Tim Waugh 5505e2
+ * -u user  : use the current context with the specified user
Tim Waugh 5505e2
+ * -l level : use the current context with the specified level range
Tim Waugh 5505e2
+ * -c       : compute process transition context before modifying
Tim Waugh 5505e2
+ *
Tim Waugh 5505e2
+ * Contexts are interpreted as follows:
Tim Waugh 5505e2
+ *
Tim Waugh 5505e2
+ * Number of       MLS
Tim Waugh 5505e2
+ * components    system?
Tim Waugh 5505e2
+ *
Tim Waugh 5505e2
+ *     1            -         type
Tim Waugh 5505e2
+ *     2            -         role:type
Tim Waugh 5505e2
+ *     3            Y         role:type:range
Tim Waugh 5505e2
+ *     3            N         user:role:type
Tim Waugh 5505e2
+ *     4            Y         user:role:type:range
Tim Waugh 5505e2
+ *     4            N         error
Tim Waugh 5505e2
+ */
Daniel J Walsh 129baa
+
Tim Waugh 5505e2
+#include <config.h>
Tim Waugh 5505e2
+#include <unistd.h>
Tim Waugh 5505e2
+#include <stdio.h>
Tim Waugh 5505e2
+#include <getopt.h>
Tim Waugh 5505e2
+#include <selinux/context.h>
Tim Waugh 5505e2
+#include <selinux/selinux.h>
Tim Waugh 5505e2
+#include <selinux/flask.h>
Tim Waugh 5505e2
+#include <errno.h>
Tim Waugh 5505e2
+#include "system.h"
Tim Waugh 5505e2
+extern int errno;
cvsdist 5adf0d
+
Tim Waugh 5505e2
+/* The name the program was run with. */
Tim Waugh 5505e2
+char *program_name;
cvsdist 5adf0d
+
Tim Waugh 5505e2
+/* If nonzero, display usage information and exit.  */
Tim Waugh 5505e2
+static int show_help;
cvsdist 5adf0d
+
Tim Waugh 5505e2
+/* If nonzero, print the version on standard output and exit.  */
Tim Waugh 5505e2
+static int show_version;
cvsdist 4d15f3
+
Tim Waugh 5505e2
+void
Tim Waugh 5505e2
+usage(int status)
Daniel J Walsh 129baa
+{
Tim Waugh 5505e2
+  printf(_("Usage: %s CONTEXT COMMAND [args]\n"
Tim Waugh 5505e2
+         "  or:  %s [ -c ] [-u USER] [-r ROLE] [-t TYPE] [-l RANGE] COMMAND [args]\n"
Tim Waugh 5505e2
+         "Run a program in a different security context.\n\n"
Tim Waugh 5505e2
+         "  CONTEXT            Complete security context\n"
Tim Waugh 5505e2
+         "  -c, --compute      compute process transition context before modifying\n"
Tim Waugh 5505e2
+         "  -t, --type=TYPE    type (for same role as parent)\n"
Tim Waugh 5505e2
+         "  -u, --user=USER    user identity\n"
Tim Waugh 5505e2
+         "  -r, --role=ROLE    role\n"
Tim Waugh 5505e2
+         "  -l, --range=RANGE  levelrange\n"
Tim Waugh 5505e2
+         "      --help         display this help and exit\n"
Tim Waugh 5505e2
+         "      --version      output version information and exit\n"),
Tim Waugh 5505e2
+         program_name, program_name);
Tim Waugh 5505e2
+  exit(status);
Daniel J Walsh 129baa
+}
cvsdist 5adf0d
+
Tim Waugh 5505e2
+int 
Tim Waugh 5505e2
+main(int argc,char **argv,char **envp )
cvsdist 4d15f3
+{
Tim Waugh 5505e2
+  char *role    = 0;
Tim Waugh 5505e2
+  char *range   = 0;
Tim Waugh 5505e2
+  char *user    = 0;
Tim Waugh 5505e2
+  char *type    = 0;
Tim Waugh 5505e2
+  char *context = NULL;
Tim Waugh 5505e2
+  security_context_t cur_context = NULL;
Tim Waugh 5505e2
+  security_context_t file_context = NULL;
Tim Waugh 5505e2
+  security_context_t new_context = NULL;
Tim Waugh 5505e2
+  int compute_trans = 0;
Tim Waugh 5505e2
+
Tim Waugh 5505e2
+  context_t      con;
cvsdist 5adf0d
+
Daniel J Walsh 129baa
+  program_name = argv[0];
Daniel J Walsh 129baa
+  setlocale (LC_ALL, "");
Daniel J Walsh 129baa
+  bindtextdomain (PACKAGE, LOCALEDIR);
Daniel J Walsh 129baa
+  textdomain (PACKAGE);
Daniel J Walsh 129baa
+  
Tim Waugh 5505e2
+  while (1) {
Tim Waugh 5505e2
+    int c;
Tim Waugh 5505e2
+    int this_option_optind = optind ? optind : 1;
Tim Waugh 5505e2
+    int option_index = 0;
Tim Waugh 5505e2
+    static struct option long_options[] = {
Tim Waugh 5505e2
+      { "role", 1, 0, 'r' },
Tim Waugh 5505e2
+      { "type", 1, 0, 't' },
Tim Waugh 5505e2
+      { "user", 1, 0, 'u' },
Tim Waugh 5505e2
+      { "range", 1, 0, 'l' },
Tim Waugh 5505e2
+      { "compute", 0, 0, 'c' },
Tim Waugh 5505e2
+      { "help", 0, &show_help, 1 },
Tim Waugh 5505e2
+      { "version", 0, &show_version, 1 },
Tim Waugh 5505e2
+      { 0, 0, 0, 0 }
Tim Waugh 5505e2
+    };
Tim Waugh 5505e2
+    c = getopt_long(argc, argv, "r:t:u:l:c", long_options, &option_index);
Tim Waugh 5505e2
+    if ( c == -1 ) {
Tim Waugh 5505e2
+      break;
Tim Waugh 5505e2
+    }
Tim Waugh 5505e2
+    switch ( c ) {
Tim Waugh 5505e2
+    case 0:
Tim Waugh 5505e2
+      break;
Tim Waugh 5505e2
+    case 'r':
Tim Waugh 5505e2
+      if ( role ) {
Tim Waugh 5505e2
+	fprintf(stderr,_("multiple roles\n"));
Tim Waugh 5505e2
+	exit(1);
Tim Waugh 5505e2
+      }
Tim Waugh 5505e2
+      role = optarg;
Tim Waugh 5505e2
+      break;
Tim Waugh 5505e2
+    case 't':
Tim Waugh 5505e2
+      if ( type ) {
Tim Waugh 5505e2
+	fprintf(stderr,_("multiple types\n"));
Tim Waugh 5505e2
+	exit(1);
Tim Waugh 5505e2
+      }
Tim Waugh 5505e2
+      type = optarg;
Tim Waugh 5505e2
+      break;
Tim Waugh 5505e2
+    case 'u':
Tim Waugh 5505e2
+      if ( user ) {
Tim Waugh 5505e2
+	fprintf(stderr,_("multiple users\n"));
Tim Waugh 5505e2
+	exit(1);
Tim Waugh 5505e2
+      }
Tim Waugh 5505e2
+      user = optarg;
Tim Waugh 5505e2
+      break;
Tim Waugh 5505e2
+    case 'l':
Tim Waugh 5505e2
+      if ( range ) {
Tim Waugh 5505e2
+	fprintf(stderr,_("multiple levelranges\n"));
Tim Waugh 5505e2
+	exit(1);
Tim Waugh 5505e2
+      }
Tim Waugh 5505e2
+      range = optarg;
Tim Waugh 5505e2
+      break;
Tim Waugh 5505e2
+    case 'c':
Tim Waugh 5505e2
+      compute_trans = 1;
Tim Waugh 5505e2
+      break;
Tim Waugh 5505e2
+    default:
Tim Waugh 5505e2
+      usage(1);
Tim Waugh 5505e2
+      break;
Tim Waugh 5505e2
+    }
Daniel J Walsh 129baa
+  }
cvsdist 5adf0d
+
Tim Waugh 5505e2
+  if (show_version) {
Tim Waugh 5505e2
+    printf("runcon (%s) %s\n", GNU_PACKAGE, VERSION);
Tim Waugh 5505e2
+    exit(0);
Daniel J Walsh 129baa
+  }
cvsdist 4d15f3
+
Daniel J Walsh 129baa
+  if (show_help)
Tim Waugh 5505e2
+    usage(0);
cvsdist 4d15f3
+
Tim Waugh 5505e2
+  if ( !(user || role || type || range || compute_trans)) {
Tim Waugh 5505e2
+    if ( optind >= argc ) {
Tim Waugh 5505e2
+      fprintf(stderr,_("must specify -c, -t, -u, -l, -r, or context\n"));
Tim Waugh 5505e2
+      usage(1);
Tim Waugh 5505e2
+    }
Tim Waugh 5505e2
+    context = argv[optind++];
Tim Waugh 5505e2
+  }
Daniel J Walsh 129baa
+  
Tim Waugh 5505e2
+  if ( optind >= argc ) {
Tim Waugh 5505e2
+    fprintf(stderr,_("no command found\n"));
Tim Waugh 5505e2
+    usage(1);
Tim Waugh 5505e2
+  }
Tim Waugh 5505e2
+
Tim Waugh 5505e2
+ if( is_selinux_enabled() != 1 ) {
Tim Waugh 5505e2
+    fprintf( stderr,
Tim Waugh 5505e2
+             _("runcon may be used only on a SELinux kernel.\n") );
Tim Waugh 5505e2
+    exit(-1);
Tim Waugh 5505e2
+  }
Tim Waugh 5505e2
+  
Tim Waugh 5505e2
+  if ( context ) {
Tim Waugh 5505e2
+    con = context_new(context);
Tim Waugh 5505e2
+    if (!con) {
Tim Waugh 5505e2
+      fprintf(stderr,_("%s is not a valid context\n"), context);
Tim Waugh 5505e2
+      exit(1);
Tim Waugh 5505e2
+    }
Tim Waugh 5505e2
+  }
Tim Waugh 5505e2
+  else {
Tim Waugh 5505e2
+    if (getcon(&cur_context) < 0) {
Tim Waugh 5505e2
+      fprintf(stderr,_("Couldn't get current context.\n"));
Tim Waugh 5505e2
+      exit(1);
Daniel J Walsh 129baa
+    }
cvsdist 4d15f3
+
Tim Waugh 5505e2
+    /* We will generate context based on process transition */
Tim Waugh 5505e2
+    if ( compute_trans ) {
Tim Waugh 5505e2
+      /* Get context of file to be executed */
Tim Waugh 5505e2
+      if (getfilecon(argv[optind], &file_context) == -1) {
Tim Waugh 5505e2
+        fprintf(stderr,_("unable to retrieve attributes of %s\n"),
Tim Waugh 5505e2
+                argv[optind]);
Tim Waugh 5505e2
+        exit(1);
Tim Waugh 5505e2
+      }
Tim Waugh 5505e2
+      /* compute result of process transition */
Tim Waugh 5505e2
+      if (security_compute_create(cur_context, file_context,
Tim Waugh 5505e2
+                                  SECCLASS_PROCESS, &new_context) != 0) {
Tim Waugh 5505e2
+        fprintf(stderr,_("unable to compute a new context\n"));
Tim Waugh 5505e2
+        exit(1);
Tim Waugh 5505e2
+      }
Tim Waugh 5505e2
+      /* free contexts */
Tim Waugh 5505e2
+      freecon(file_context);
Tim Waugh 5505e2
+      freecon(cur_context);
Tim Waugh 5505e2
+
Tim Waugh 5505e2
+      /* set cur_context equal to new_context */
Tim Waugh 5505e2
+      cur_context = new_context;
Daniel J Walsh 129baa
+    }
Tim Waugh 5505e2
+
Tim Waugh 5505e2
+    con = context_new(cur_context);
Tim Waugh 5505e2
+    if (!con) {
Tim Waugh 5505e2
+      fprintf(stderr,_("%s is not a valid context\n"), cur_context);
Tim Waugh 5505e2
+      exit(1);
Tim Waugh 5505e2
+    }
Tim Waugh 5505e2
+    if ( user ) {
Tim Waugh 5505e2
+      if ( context_user_set(con,user)) {
Tim Waugh 5505e2
+        fprintf(stderr,_("failed to set new user %s\n"),user);
Tim Waugh 5505e2
+        exit(1);
Tim Waugh 5505e2
+      }
Tim Waugh 5505e2
+    }
Tim Waugh 5505e2
+    if ( type ) {
Tim Waugh 5505e2
+      if ( context_type_set(con,type)) {
Tim Waugh 5505e2
+        fprintf(stderr,_("failed to set new type %s\n"),type);
Tim Waugh 5505e2
+        exit(1);
Tim Waugh 5505e2
+      }
Tim Waugh 5505e2
+    }
Tim Waugh 5505e2
+    if ( range ) {
Tim Waugh 5505e2
+      if ( context_range_set(con,range)) {
Tim Waugh 5505e2
+        fprintf(stderr,_("failed to set new range %s\n"),range);
Tim Waugh 5505e2
+        exit(1);
Tim Waugh 5505e2
+      }
Tim Waugh 5505e2
+    }
Tim Waugh 5505e2
+    if ( role ) {
Tim Waugh 5505e2
+      if (context_role_set(con,role)) {
Tim Waugh 5505e2
+        fprintf(stderr,_("failed to set new role %s\n"),role);
Tim Waugh 5505e2
+        exit(1);
Tim Waugh 5505e2
+      }
cvsdist 5adf0d
+    }
cvsdist 5adf0d
+  }
cvsdist 5adf0d
+
Tim Waugh 5505e2
+  if (security_check_context(context_str(con)) < 0) {
Tim Waugh 5505e2
+    fprintf(stderr, _("%s is not a valid context\n"), context_str(con));
Tim Waugh 5505e2
+    exit(1);
Tim Waugh 5505e2
+  }
Tim Waugh 5505e2
+  
Tim Waugh 5505e2
+  if (setexeccon(context_str(con))!=0) {
Tim Waugh 5505e2
+    fprintf(stderr,_("unable to setup security context %s\n"), context_str(con));
Tim Waugh 5505e2
+    exit(1);
Tim Waugh 5505e2
+  }
Tim Waugh 5505e2
+  if (cur_context!=NULL) 
Tim Waugh 5505e2
+    freecon(cur_context);
Tim Waugh 5505e2
+
Tim Waugh 5505e2
+  if ( execvp(argv[optind],argv+optind) ) {
Tim Waugh 5505e2
+    perror("execvp");
Tim Waugh 5505e2
+    exit(1);
Tim Waugh 5505e2
+  }
Tim Waugh 5505e2
+  return 1; /* can't reach this statement.... */
Tim Waugh 5505e2
+}
Tim Waugh 49a3f8
--- coreutils-5.94/src/ls.c	2006-03-24 13:23:45.000000000 +0000
Tim Waugh 49a3f8
+++ coreutils-5.94/src/ls.c	2006-04-20 12:24:40.000000000 +0100
Tim Waugh 5505e2
@@ -135,6 +135,18 @@
Tim Waugh 5505e2
 
Tim Waugh 5505e2
 #define AUTHORS "Richard Stallman", "David MacKenzie"
Tim Waugh 5505e2
 
Tim Waugh 5505e2
+#ifdef WITH_SELINUX
Tim Waugh 5505e2
+#include <selinux/selinux.h>
Tim Waugh 5505e2
+
Tim Waugh 5505e2
+static int print_scontext       = 0;
Tim Waugh 5505e2
+
Tim Waugh 5505e2
+
Tim Waugh 5505e2
+
Tim Waugh 5505e2
+
Tim Waugh 5505e2
+
Tim Waugh 5505e2
+
Tim Waugh 5505e2
+#endif
Tim Waugh 5505e2
+
Tim Waugh 5505e2
 #define obstack_chunk_alloc malloc
Tim Waugh 5505e2
 #define obstack_chunk_free free
Tim Waugh 5505e2
 
Tim Waugh 5505e2
@@ -170,7 +182,8 @@
Tim Waugh 5505e2
     symbolic_link DT_INIT (DT_LNK),
Tim Waugh 5505e2
     sock DT_INIT (DT_SOCK),
Tim Waugh 5505e2
     arg_directory DT_INIT (2 * (DT_UNKNOWN | DT_FIFO | DT_CHR | DT_DIR | DT_BLK
Tim Waugh 5505e2
-				| DT_REG | DT_LNK | DT_SOCK))
Tim Waugh 5505e2
+				| DT_REG | DT_LNK | DT_SOCK)),
Tim Waugh 5505e2
+    command_line
Tim Waugh 5505e2
   };
Tim Waugh 5505e2
 
Tim Waugh 5505e2
 struct fileinfo
Tim Waugh 5505e2
@@ -179,6 +192,7 @@
Tim Waugh 5505e2
     char *name;
Tim Waugh 5505e2
 
Tim Waugh 5505e2
     struct stat stat;
Tim Waugh 5505e2
+    int stat_failed;
Tim Waugh 5505e2
 
Tim Waugh 5505e2
     /* For symbolic link, name of the file linked to, otherwise zero.  */
Tim Waugh 5505e2
     char *linkname;
Tim Waugh 5505e2
@@ -197,6 +211,10 @@
Tim Waugh 5505e2
     /* For long listings, true if the file has an access control list.  */
Tim Waugh 5505e2
     bool have_acl;
Tim Waugh 5505e2
 #endif
Tim Waugh 5505e2
+
Tim Waugh 5505e2
+#ifdef WITH_SELINUX
Tim Waugh 5505e2
+    security_context_t scontext;
Tim Waugh 5505e2
+#endif
Tim Waugh 5505e2
   };
Tim Waugh 5505e2
 
Tim Waugh 5505e2
 #if HAVE_ACL || USE_ACL
Tim Waugh 5505e2
@@ -232,7 +250,8 @@
Tim Waugh 5505e2
 static bool file_ignored (char const *name);
Tim Waugh 5505e2
 static uintmax_t gobble_file (char const *name, enum filetype type,
Tim Waugh 5505e2
 			      bool command_line_arg, char const *dirname);
Tim Waugh 5505e2
-static void print_color_indicator (const char *name, mode_t mode, int linkok);
Tim Waugh 5505e2
+static void print_color_indicator (const char *name, mode_t mode, int linkok,
Tim Waugh 5505e2
+				   int stat_failed);
Tim Waugh 5505e2
 static void put_indicator (const struct bin_str *ind);
Tim Waugh 5505e2
 static void add_ignore_pattern (const char *pattern);
Tim Waugh 5505e2
 static void attach (char *dest, const char *dirname, const char *name);
Tim Waugh 5505e2
@@ -253,7 +272,7 @@
Tim Waugh 5505e2
 static void print_long_format (const struct fileinfo *f);
Tim Waugh 5505e2
 static void print_many_per_line (void);
Tim Waugh 5505e2
 static void print_name_with_quoting (const char *p, mode_t mode,
Tim Waugh 5505e2
-				     int linkok,
Tim Waugh 5505e2
+				     int linkok, int stat_failed,
Tim Waugh 5505e2
 				     struct obstack *stack);
Tim Waugh 5505e2
 static void prep_non_filename_text (void);
Tim Waugh 5505e2
 static void print_type_indicator (mode_t mode);
Tim Waugh 5505e2
@@ -263,6 +282,9 @@
Tim Waugh 5505e2
 static void sort_files (void);
Tim Waugh 5505e2
 static void parse_ls_color (void);
Tim Waugh 5505e2
 void usage (int status);
Tim Waugh 5505e2
+#ifdef WITH_SELINUX
Tim Waugh 5505e2
+static void print_scontext_format (const struct fileinfo *f);
Tim Waugh 5505e2
+#endif
Tim Waugh 5505e2
 
Tim Waugh 5505e2
 /* The name this program was run with.  */
Tim Waugh 5505e2
 char *program_name;
Tim Waugh 5505e2
@@ -371,7 +393,11 @@
Tim Waugh 5505e2
     one_per_line,		/* -1 */
Tim Waugh 5505e2
     many_per_line,		/* -C */
Tim Waugh 5505e2
     horizontal,			/* -x */
Tim Waugh 5505e2
-    with_commas			/* -m */
Tim Waugh 5505e2
+    with_commas,	        /* -m */
Tim Waugh 5505e2
+#ifdef WITH_SELINUX
Tim Waugh 5505e2
+    security_format,		/* -Z */
Tim Waugh 5505e2
+#endif
Tim Waugh 5505e2
+    invalid_format
Tim Waugh 5505e2
   };
Tim Waugh 5505e2
 
Tim Waugh 5505e2
 static enum format format;
Tim Waugh 5505e2
@@ -740,6 +766,11 @@
Tim Waugh 5505e2
   SHOW_CONTROL_CHARS_OPTION,
Tim Waugh 5505e2
   SI_OPTION,
Tim Waugh 5505e2
   SORT_OPTION,
Tim Waugh 5505e2
+#ifdef WITH_SELINUX
Tim Waugh 5505e2
+  CONTEXT_OPTION,
Tim Waugh 5505e2
+  LCONTEXT_OPTION,
Tim Waugh 5505e2
+  SCONTEXT_OPTION,
Tim Waugh 5505e2
+#endif
Tim Waugh 5505e2
   TIME_OPTION,
Tim Waugh 5505e2
   TIME_STYLE_OPTION
Tim Waugh 5505e2
 };
Tim Waugh 5505e2
@@ -784,6 +815,11 @@
Tim Waugh 5505e2
   {"time-style", required_argument, NULL, TIME_STYLE_OPTION},
Tim Waugh 5505e2
   {"color", optional_argument, NULL, COLOR_OPTION},
Tim Waugh 5505e2
   {"block-size", required_argument, NULL, BLOCK_SIZE_OPTION},
Tim Waugh 5505e2
+#ifdef WITH_SELINUX
Tim Waugh 5505e2
+  {"context", no_argument, 0, CONTEXT_OPTION},
Tim Waugh 5505e2
+  {"lcontext", no_argument, 0, LCONTEXT_OPTION},
Tim Waugh 5505e2
+  {"scontext", no_argument, 0, SCONTEXT_OPTION},
Tim Waugh 5505e2
+#endif
Tim Waugh 5505e2
   {"author", no_argument, NULL, AUTHOR_OPTION},
Tim Waugh 5505e2
   {GETOPT_HELP_OPTION_DECL},
Tim Waugh 5505e2
   {GETOPT_VERSION_OPTION_DECL},
Tim Waugh 5505e2
@@ -793,12 +829,19 @@
Tim Waugh 5505e2
 static char const *const format_args[] =
Tim Waugh 5505e2
 {
Tim Waugh 5505e2
   "verbose", "long", "commas", "horizontal", "across",
Tim Waugh 5505e2
-  "vertical", "single-column", NULL
Tim Waugh 5505e2
+  "vertical", "single-column",
Tim Waugh 5505e2
+#ifdef WITH_SELINUX
Tim Waugh 5505e2
+  "context",
Tim Waugh 5505e2
+#endif
Tim Waugh 5505e2
+  NULL
Tim Waugh 5505e2
 };
Tim Waugh 5505e2
 static enum format const format_types[] =
Tim Waugh 5505e2
 {
Tim Waugh 5505e2
   long_format, long_format, with_commas, horizontal, horizontal,
Tim Waugh 5505e2
   many_per_line, one_per_line
Tim Waugh 5505e2
+#ifdef WITH_SELINUX
Tim Waugh 5505e2
+  , security_format
Tim Waugh 5505e2
+#endif
Tim Waugh 5505e2
 };
Tim Waugh 5505e2
 ARGMATCH_VERIFY (format_args, format_types);
Tim Waugh 5505e2
 
Tim Waugh 5505e2
@@ -1222,6 +1265,9 @@
Tim Waugh 5505e2
 
Tim Waugh 5505e2
   format_needs_stat = sort_type == sort_time || sort_type == sort_size
Tim Waugh 5505e2
     || format == long_format
Tim Waugh 5505e2
+#ifdef WITH_SELINUX
Tim Waugh 5505e2
+    || format == security_format || print_scontext
Tim Waugh 5505e2
+#endif
Tim Waugh 5505e2
     || dereference == DEREF_ALWAYS
Tim Waugh 5505e2
     || print_block_size || print_inode;
Tim Waugh 5505e2
   format_needs_type = (!format_needs_stat
Tim Waugh 5505e2
@@ -1251,7 +1297,7 @@
Tim Waugh 5505e2
     }
Tim Waugh 5505e2
   else
Tim Waugh 5505e2
     do
Tim Waugh 5505e2
-      gobble_file (argv[i++], unknown, true, "");
Tim Waugh 5505e2
+      gobble_file (argv[i++], command_line, true, "");
Tim Waugh 5505e2
     while (i < argc);
Tim Waugh 5505e2
 
Tim Waugh 5505e2
   if (files_index)
Tim Waugh 5505e2
@@ -1414,6 +1460,9 @@
Tim Waugh 5505e2
   ignore_mode = IGNORE_DEFAULT;
Tim Waugh 5505e2
   ignore_patterns = NULL;
Tim Waugh 5505e2
   hide_patterns = NULL;
Tim Waugh 5505e2
+#ifdef WITH_SELINUX
Tim Waugh 5505e2
+  print_scontext       = 0;
Tim Waugh 5505e2
+#endif
Tim Waugh 5505e2
 
Tim Waugh 5505e2
   /* FIXME: put this in a function.  */
Tim Waugh 5505e2
   {
Tim Waugh 5505e2
@@ -1489,7 +1538,7 @@
Tim Waugh 5505e2
   }
Tim Waugh 5505e2
 
Tim Waugh 5505e2
   while ((c = getopt_long (argc, argv,
Tim Waugh 5505e2
-			   "abcdfghiklmnopqrstuvw:xABCDFGHI:LNQRST:UX1",
Tim Waugh 5505e2
+			   "abcdfghiklmnopqrstuvw:xABCDFGHI:LNQRST:UX1Z",
Tim Waugh 5505e2
 			   long_options, NULL)) != -1)
Tim Waugh 5505e2
     {
Tim Waugh 5505e2
       switch (c)
Tim Waugh 5505e2
@@ -1608,6 +1657,13 @@
Tim Waugh 5505e2
 	  format = horizontal;
Tim Waugh 5505e2
 	  break;
Tim Waugh 5505e2
 
Tim Waugh 5505e2
+#ifdef WITH_SELINUX
Tim Waugh 5505e2
+	case 'Z':
Tim Waugh 5505e2
+
Tim Waugh 5505e2
+	  print_scontext = 1;
Tim Waugh 5505e2
+	  format = security_format;
Tim Waugh 5505e2
+	  break;
Tim Waugh 5505e2
+#endif
Tim Waugh 5505e2
 	case 'A':
Tim Waugh 5505e2
 	  if (ignore_mode == IGNORE_DEFAULT)
Tim Waugh 5505e2
 	    ignore_mode = IGNORE_DOT_AND_DOTDOT;
Tim Waugh 5505e2
@@ -1784,6 +1840,25 @@
Daniel J Walsh 129baa
 
Tim Waugh 5505e2
 	case_GETOPT_VERSION_CHAR (PROGRAM_NAME, AUTHORS);
Daniel J Walsh 129baa
 
Daniel J Walsh 129baa
+#ifdef WITH_SELINUX
Daniel J Walsh 129baa
+
Tim Waugh 5505e2
+	case CONTEXT_OPTION: /* new security format */
Tim Waugh 5505e2
+
Tim Waugh 5505e2
+		print_scontext = 1;
Tim Waugh 5505e2
+		format = security_format;
Tim Waugh 5505e2
+		break;
Tim Waugh 5505e2
+	case LCONTEXT_OPTION: /* long format plus security context */
Tim Waugh 5505e2
+
Tim Waugh 5505e2
+		print_scontext = 1;
Tim Waugh 5505e2
+		format = long_format;
Tim Waugh 5505e2
+		break;
Tim Waugh 5505e2
+	case SCONTEXT_OPTION: /* short form of new security format */
Daniel J Walsh 129baa
+
Tim Waugh 5505e2
+		print_scontext = 0;
Tim Waugh 5505e2
+		format = security_format;
Tim Waugh 5505e2
+		break;
Daniel J Walsh 129baa
+#endif
Daniel J Walsh 129baa
+
Tim Waugh 5505e2
 	default:
Tim Waugh 5505e2
 	  usage (LS_FAILURE);
Tim Waugh 5505e2
 	}
Tim Waugh 5505e2
@@ -2468,6 +2543,12 @@
Tim Waugh 5505e2
     {
Tim Waugh 5505e2
       free (files[i].name);
Tim Waugh 5505e2
       free (files[i].linkname);
Tim Waugh 5505e2
+#ifdef WITH_SELINUX
Tim Waugh 5505e2
+      if (files[i].scontext) {
Tim Waugh 5505e2
+	freecon (files[i].scontext);
Tim Waugh 5505e2
+	files[i].scontext=NULL;
Tim Waugh 5505e2
+      }
Tim Waugh 5505e2
+#endif
Tim Waugh 5505e2
     }
Daniel J Walsh 129baa
 
Tim Waugh 5505e2
   files_index = 0;
Tim Waugh 5505e2
@@ -2506,11 +2587,14 @@
Tim Waugh 5505e2
   f->linkname = NULL;
Tim Waugh 5505e2
   f->linkmode = 0;
Tim Waugh 5505e2
   f->linkok = false;
Tim Waugh 5505e2
+#ifdef WITH_SELINUX
Tim Waugh 5505e2
+  f->scontext = NULL;
Tim Waugh 5505e2
+#endif
Daniel J Walsh 129baa
 
Tim Waugh 5505e2
   if (command_line_arg
Tim Waugh 5505e2
       || format_needs_stat
Tim Waugh 5505e2
       || (format_needs_type
Tim Waugh 5505e2
-	  && (type == unknown
Tim Waugh 5505e2
+	  && (type == unknown || type == command_line
Daniel J Walsh 129baa
 
Tim Waugh 5505e2
 	      /* FIXME: remove this disjunct.
Tim Waugh 5505e2
 		 I don't think we care about symlinks here, but for now
Tim Waugh 5505e2
@@ -2547,6 +2631,11 @@
Daniel J Walsh 129baa
 	{
Tim Waugh 5505e2
 	case DEREF_ALWAYS:
Tim Waugh 5505e2
 	  err = stat (absolute_name, &f->stat);
Tim Waugh 5505e2
+#ifdef WITH_SELINUX
Tim Waugh 5505e2
+	  if (err>=0) 
Tim Waugh 5505e2
+	    if (format == security_format || print_scontext)
Tim Waugh 5505e2
+	      getfilecon(absolute_name, &f->scontext);
Tim Waugh 5505e2
+#endif
Daniel J Walsh 129baa
 	  break;
Tim Waugh 5505e2
 
Tim Waugh 5505e2
 	case DEREF_COMMAND_LINE_ARGUMENTS:
Tim Waugh 5505e2
@@ -2555,6 +2644,11 @@
Tim Waugh 5505e2
 	    {
Tim Waugh 5505e2
 	      bool need_lstat;
Tim Waugh 5505e2
 	      err = stat (absolute_name, &f->stat);
Daniel J Walsh 129baa
+#ifdef WITH_SELINUX
Tim Waugh 5505e2
+	      if (err>=0) 
Tim Waugh 5505e2
+		if (format == security_format || print_scontext)
Tim Waugh 5505e2
+		  getfilecon(absolute_name, &f->scontext);
Tim Waugh 5505e2
+#endif
Tim Waugh 5505e2
 
Tim Waugh 5505e2
 	      if (dereference == DEREF_COMMAND_LINE_ARGUMENTS)
Tim Waugh 5505e2
 		break;
Tim Waugh 5505e2
@@ -2573,17 +2667,41 @@
Tim Waugh 5505e2
 
Tim Waugh 5505e2
 	default: /* DEREF_NEVER */
Tim Waugh 5505e2
 	  err = lstat (absolute_name, &f->stat);
Tim Waugh 5505e2
+#ifdef WITH_SELINUX
Tim Waugh 5505e2
+	  if (err>=0) 
Tim Waugh 5505e2
+	    if (format == security_format || print_scontext)
Tim Waugh 5505e2
+	      lgetfilecon(absolute_name, &f->scontext);
Daniel J Walsh 129baa
+#endif
Daniel J Walsh 129baa
 	  break;
Daniel J Walsh 129baa
 	}
Daniel J Walsh 129baa
 
Tim Waugh 5505e2
-      if (err < 0)
Tim Waugh 5505e2
+      f->stat_failed = (err < 0);
Tim Waugh 5505e2
+      if (f->stat_failed)
Tim Waugh 5505e2
 	{
Tim Waugh 5505e2
-	  file_failure (command_line_arg, "%s", absolute_name);
Tim Waugh 5505e2
+	  /* We treat stat failures for files the user named special.
Tim Waugh 5505e2
+	     There is no guarantee that these files really exist so
Tim Waugh 5505e2
+	     we do not print any information.  */
Tim Waugh 5505e2
+	  if (type == command_line)
Tim Waugh 5505e2
+	    {
Tim Waugh 5505e2
+	      file_failure (1, "%s", absolute_name);
Tim Waugh 5505e2
+	      return 0;
Tim Waugh 5505e2
+	    }
Daniel J Walsh 129baa
+
Tim Waugh 5505e2
+	  f->filetype = type;
Tim Waugh 5505e2
+	  memset (&f->stat, '\0', sizeof (f->stat));
Daniel J Walsh 129baa
+
Tim Waugh 5505e2
+	  f->name = xstrdup (absolute_name);
Tim Waugh 5505e2
+	  files_index++;
Daniel J Walsh 129baa
+
Tim Waugh 5505e2
 	  return 0;
Tim Waugh 5505e2
 	}
Daniel J Walsh 129baa
 
Tim Waugh 5505e2
 #if HAVE_ACL || USE_ACL
Tim Waugh 5505e2
-      if (format == long_format)
Tim Waugh 5505e2
+      if (format == long_format
Daniel J Walsh 129baa
+#ifdef WITH_SELINUX
Tim Waugh 5505e2
+	  || format == security_format
Daniel J Walsh 129baa
+#endif
Tim Waugh 5505e2
+	      )
Tim Waugh 5505e2
 	{
Tim Waugh 5505e2
 	  int n = file_has_acl (absolute_name, &f->stat);
Tim Waugh 5505e2
 	  f->have_acl = (0 < n);
Tim Waugh 5505e2
@@ -3072,6 +3190,16 @@
Tim Waugh 5505e2
 	  DIRED_PUTCHAR ('\n');
Tim Waugh 5505e2
 	}
Tim Waugh 5505e2
       break;
Tim Waugh 5505e2
+
Daniel J Walsh 129baa
+#ifdef WITH_SELINUX
Tim Waugh 5505e2
+    case security_format:
Tim Waugh 5505e2
+      for (i = 0; i < files_index; i++)
Tim Waugh 5505e2
+      {
Tim Waugh 5505e2
+        print_scontext_format (files + i);
Tim Waugh 5505e2
+        DIRED_PUTCHAR ('\n');
Tim Waugh 5505e2
+      }
Tim Waugh 5505e2
+      break;
Daniel J Walsh 129baa
+#endif
Tim Waugh 5505e2
     }
Daniel J Walsh 129baa
 }
Tim Waugh 5505e2
 
Tim Waugh 5505e2
@@ -3179,17 +3307,19 @@
Tim Waugh 5505e2
    WIDTH.  */
Tim Waugh 5505e2
 
Tim Waugh 5505e2
 static void
Tim Waugh 5505e2
-format_user (uid_t u, int width)
Tim Waugh 5505e2
+format_user (uid_t u, int width, int stat_failed)
Tim Waugh 5505e2
 {
Tim Waugh 5505e2
-  format_user_or_group (numeric_ids ? NULL : getuser (u), u, width);
Tim Waugh 5505e2
+  format_user_or_group (stat_failed ? "?" :
Tim Waugh 5505e2
+			(numeric_ids ? NULL : getuser (u)), u, width);
Tim Waugh 5505e2
 }
Tim Waugh 5505e2
 
Tim Waugh 5505e2
 /* Likewise, for groups.  */
Tim Waugh 5505e2
 
Tim Waugh 5505e2
 static void
Tim Waugh 5505e2
-format_group (gid_t g, int width)
Tim Waugh 5505e2
+format_group (gid_t g, int width, int stat_failed)
Tim Waugh 5505e2
 {
Tim Waugh 5505e2
-  format_user_or_group (numeric_ids ? NULL : getgroup (g), g, width);
Tim Waugh 5505e2
+  format_user_or_group (stat_failed ? "?" :
Tim Waugh 5505e2
+			(numeric_ids ? NULL : getgroup (g)), g, width);
Tim Waugh 5505e2
 }
Tim Waugh 5505e2
 
Tim Waugh 5505e2
 /* Return the number of columns that format_user_or_group will print.  */
Tim Waugh 5505e2
@@ -3279,7 +3409,7 @@
Tim Waugh 5505e2
     {
Tim Waugh 5505e2
       char hbuf[INT_BUFSIZE_BOUND (uintmax_t)];
Tim Waugh 5505e2
       sprintf (p, "%*s ", inode_number_width,
Tim Waugh 5505e2
-	       umaxtostr (f->stat.st_ino, hbuf));
Tim Waugh 5505e2
+	       f->stat_failed ? "?" : umaxtostr (f->stat.st_ino, hbuf));
Tim Waugh 5505e2
       p += inode_number_width + 1;
Tim Waugh 5505e2
     }
Tim Waugh 5505e2
 
Tim Waugh 5505e2
@@ -3287,8 +3417,10 @@
Tim Waugh 5505e2
     {
Tim Waugh 5505e2
       char hbuf[LONGEST_HUMAN_READABLE + 1];
Tim Waugh 5505e2
       char const *blocks =
Tim Waugh 5505e2
-	human_readable (ST_NBLOCKS (f->stat), hbuf, human_output_opts,
Tim Waugh 5505e2
-			ST_NBLOCKSIZE, output_block_size);
Tim Waugh 5505e2
+	f->stat_failed
Tim Waugh 5505e2
+	? "?"
Tim Waugh 5505e2
+	: human_readable (ST_NBLOCKS (f->stat), hbuf, human_output_opts,
Tim Waugh 5505e2
+			  ST_NBLOCKSIZE, output_block_size);
Tim Waugh 5505e2
       int pad;
Tim Waugh 5505e2
       for (pad = block_size_width - mbswidth (blocks, 0); 0 < pad; pad--)
Tim Waugh 5505e2
 	*p++ = ' ';
Tim Waugh 5505e2
@@ -3302,10 +3434,18 @@
Tim Waugh 5505e2
   {
Tim Waugh 5505e2
     char hbuf[INT_BUFSIZE_BOUND (uintmax_t)];
Tim Waugh 5505e2
     sprintf (p, "%s %*s ", modebuf, nlink_width,
Tim Waugh 5505e2
-	     umaxtostr (f->stat.st_nlink, hbuf));
Tim Waugh 5505e2
+	     f->stat_failed ? "?" : umaxtostr (f->stat.st_nlink, hbuf));
Tim Waugh 5505e2
   }
Tim Waugh 5505e2
   p += sizeof modebuf - 2 + any_has_acl + 1 + nlink_width + 1;
Daniel J Walsh 129baa
 
Daniel J Walsh 129baa
+#ifdef WITH_SELINUX
Daniel J Walsh 129baa
+
Tim Waugh 5505e2
+  if ( print_scontext ) {
Tim Waugh 5505e2
+    sprintf (p, "%-32s ", f->scontext ?: "");
Tim Waugh 5505e2
+    p += strlen (p);
Tim Waugh 5505e2
+  }
cvsdist 4d15f3
+#endif
Daniel J Walsh 129baa
+
Tim Waugh 5505e2
   DIRED_INDENT ();
Daniel J Walsh 129baa
 
Tim Waugh 5505e2
   if (print_owner | print_group | print_author)
Tim Waugh 5505e2
@@ -3313,18 +3453,19 @@
Tim Waugh 5505e2
       DIRED_FPUTS (buf, stdout, p - buf);
Tim Waugh 5505e2
 
Tim Waugh 5505e2
       if (print_owner)
Tim Waugh 5505e2
-	format_user (f->stat.st_uid, owner_width);
Tim Waugh 5505e2
+	format_user (f->stat.st_uid, owner_width, f->stat_failed);
Tim Waugh 5505e2
 
Tim Waugh 5505e2
       if (print_group)
Tim Waugh 5505e2
-	format_group (f->stat.st_gid, group_width);
Tim Waugh 5505e2
+	format_group (f->stat.st_gid, group_width, f->stat_failed);
Tim Waugh 5505e2
 
Tim Waugh 5505e2
       if (print_author)
Tim Waugh 5505e2
-	format_user (f->stat.st_author, author_width);
Tim Waugh 5505e2
+	format_user (f->stat.st_author, author_width, f->stat_failed);
Tim Waugh 5505e2
 
Tim Waugh 5505e2
       p = buf;
Tim Waugh 5505e2
     }
Tim Waugh 5505e2
 
Tim Waugh 5505e2
-  if (S_ISCHR (f->stat.st_mode) || S_ISBLK (f->stat.st_mode))
Tim Waugh 5505e2
+  if (!f->stat_failed
Tim Waugh 5505e2
+      && (S_ISCHR (f->stat.st_mode) || S_ISBLK (f->stat.st_mode)))
Tim Waugh 5505e2
     {
Tim Waugh 5505e2
       char majorbuf[INT_BUFSIZE_BOUND (uintmax_t)];
Tim Waugh 5505e2
       char minorbuf[INT_BUFSIZE_BOUND (uintmax_t)];
Tim Waugh 5505e2
@@ -3342,8 +3483,10 @@
Tim Waugh 5505e2
     {
Tim Waugh 5505e2
       char hbuf[LONGEST_HUMAN_READABLE + 1];
Tim Waugh 5505e2
       char const *size =
Tim Waugh 5505e2
-	human_readable (unsigned_file_size (f->stat.st_size),
Tim Waugh 5505e2
-			hbuf, human_output_opts, 1, file_output_block_size);
Tim Waugh 5505e2
+	f->stat_failed
Tim Waugh 5505e2
+	? "?"
Tim Waugh 5505e2
+	: human_readable (unsigned_file_size (f->stat.st_size),
Tim Waugh 5505e2
+			  hbuf, human_output_opts, 1, file_output_block_size);
Tim Waugh 5505e2
       int pad;
Tim Waugh 5505e2
       for (pad = file_size_width - mbswidth (size, 0); 0 < pad; pad--)
Tim Waugh 5505e2
 	*p++ = ' ';
Tim Waugh 5505e2
@@ -3356,7 +3499,7 @@
Tim Waugh 5505e2
   s = 0;
Tim Waugh 5505e2
   *p = '\1';
Tim Waugh 5505e2
 
Tim Waugh 5505e2
-  if (when_local)
Tim Waugh 5505e2
+  if (!f->stat_failed && when_local)
Tim Waugh 5505e2
     {
Tim Waugh 5505e2
       time_t six_months_ago;
Tim Waugh 5505e2
       bool recent;
Tim Waugh 5505e2
@@ -3403,15 +3546,17 @@
Tim Waugh 5505e2
 	 print it as a huge integer number of seconds.  */
Tim Waugh 5505e2
       char hbuf[INT_BUFSIZE_BOUND (intmax_t)];
Tim Waugh 5505e2
       sprintf (p, "%*s ", long_time_expected_width (),
Tim Waugh 5505e2
-	       (TYPE_SIGNED (time_t)
Tim Waugh 5505e2
-		? imaxtostr (when, hbuf)
Tim Waugh 5505e2
-		: umaxtostr (when, hbuf)));
Tim Waugh 5505e2
+	       f->stat_failed
Tim Waugh 5505e2
+	       ? "?"
Tim Waugh 5505e2
+	       : (TYPE_SIGNED (time_t)
Tim Waugh 5505e2
+		  ? imaxtostr (when, hbuf)
Tim Waugh 5505e2
+		  : umaxtostr (when, hbuf)));
Tim Waugh 5505e2
       p += strlen (p);
Tim Waugh 5505e2
     }
Daniel J Walsh 129baa
 
Tim Waugh 5505e2
   DIRED_FPUTS (buf, stdout, p - buf);
Tim Waugh 5505e2
   print_name_with_quoting (f->name, FILE_OR_LINK_MODE (f), f->linkok,
Tim Waugh 5505e2
-			   &dired_obstack);
Tim Waugh 5505e2
+			   f->stat_failed, &dired_obstack);
Daniel J Walsh 129baa
 
Tim Waugh 5505e2
   if (f->filetype == symbolic_link)
Daniel J Walsh 129baa
     {
Tim Waugh 5505e2
@@ -3419,7 +3564,7 @@
Tim Waugh 5505e2
 	{
Tim Waugh 5505e2
 	  DIRED_FPUTS_LITERAL (" -> ", stdout);
Tim Waugh 5505e2
 	  print_name_with_quoting (f->linkname, f->linkmode, f->linkok - 1,
Tim Waugh 5505e2
-				   NULL);
Tim Waugh 5505e2
+				   f->stat_failed, NULL);
Tim Waugh 5505e2
 	  if (indicator_style != none)
Tim Waugh 5505e2
 	    print_type_indicator (f->linkmode);
Tim Waugh 5505e2
 	}
Tim Waugh 5505e2
@@ -3601,10 +3746,10 @@
Daniel J Walsh 129baa
 
Tim Waugh 5505e2
 static void
Tim Waugh 5505e2
 print_name_with_quoting (const char *p, mode_t mode, int linkok,
Tim Waugh 5505e2
-			 struct obstack *stack)
Tim Waugh 5505e2
+			 int stat_failed, struct obstack *stack)
Tim Waugh 5505e2
 {
Tim Waugh 5505e2
   if (print_with_color)
Tim Waugh 5505e2
-    print_color_indicator (p, mode, linkok);
Tim Waugh 5505e2
+    print_color_indicator (p, mode, linkok, stat_failed);
Tim Waugh 5505e2
 
Tim Waugh 5505e2
   if (stack)
Tim Waugh 5505e2
     PUSH_CURRENT_DIRED_POS (stack);
Tim Waugh 5505e2
@@ -3652,7 +3797,8 @@
Tim Waugh 5505e2
 	    human_readable (ST_NBLOCKS (f->stat), buf, human_output_opts,
Tim Waugh 5505e2
 			    ST_NBLOCKSIZE, output_block_size));
Tim Waugh 5505e2
 
Tim Waugh 5505e2
-  print_name_with_quoting (f->name, FILE_OR_LINK_MODE (f), f->linkok, NULL);
Tim Waugh 5505e2
+  print_name_with_quoting (f->name, FILE_OR_LINK_MODE (f), f->linkok,
Tim Waugh 5505e2
+			   f->stat_failed, NULL);
Tim Waugh 5505e2
 
Tim Waugh 5505e2
   if (indicator_style != none)
Tim Waugh 5505e2
     print_type_indicator (f->stat.st_mode);
Tim Waugh 5505e2
@@ -3693,7 +3839,8 @@
Daniel J Walsh 129baa
 }
Daniel J Walsh 129baa
 
Tim Waugh 5505e2
 static void
Tim Waugh 5505e2
-print_color_indicator (const char *name, mode_t mode, int linkok)
Tim Waugh 5505e2
+print_color_indicator (const char *name, mode_t mode, int linkok,
Tim Waugh 5505e2
+		       int stat_failed)
Tim Waugh 5505e2
 {
Tim Waugh 5505e2
   int type = C_FILE;
Tim Waugh 5505e2
   struct color_ext_type *ext;	/* Color extension */
Tim Waugh 5505e2
@@ -3732,6 +3879,8 @@
Tim Waugh 5505e2
 	type = C_CHR;
Tim Waugh 5505e2
       else if (S_ISDOOR (mode))
Tim Waugh 5505e2
 	type = C_DOOR;
Tim Waugh 5505e2
+      else if (stat_failed)
Tim Waugh 5505e2
+	type = C_ORPHAN;
Tim Waugh 5505e2
 
Tim Waugh 5505e2
       if (type == C_FILE)
Tim Waugh 5505e2
 	{
Tim Waugh 5505e2
@@ -4221,6 +4370,16 @@
Tim Waugh 5505e2
   -X                         sort alphabetically by entry extension\n\
Tim Waugh 5505e2
   -1                         list one file per line\n\
Daniel J Walsh 129baa
 "), stdout);
Tim Waugh 5505e2
+#ifdef WITH_SELINUX
Tim Waugh 5505e2
+printf(_("\nSELINUX options:\n\n\
Tim Waugh 5505e2
+      --lcontext             Display security context.   Enable -l. Lines\n\
Tim Waugh 5505e2
+                               will probably be too wide for most displays.\n\
Tim Waugh 5505e2
+      -Z, --context          Display security context so it fits on most\n\
Tim Waugh 5505e2
+                               displays.  Displays only mode, user, group,\n\
Tim Waugh 5505e2
+                               security context and file name.\n\
Tim Waugh 5505e2
+      --scontext             Display only security context and file name.\n\
Tim Waugh 5505e2
+\n\n"));
Tim Waugh 5505e2
+#endif
Daniel J Walsh 129baa
       fputs (HELP_OPTION_DESCRIPTION, stdout);
Daniel J Walsh 129baa
       fputs (VERSION_OPTION_DESCRIPTION, stdout);
Tim Waugh 5505e2
       fputs (_("\n\
Tim Waugh 49a3f8
@@ -4246,0 +4406,67 @@
Tim Waugh 5505e2
+
Daniel J Walsh 129baa
+#ifdef WITH_SELINUX
Tim Waugh 5505e2
+
Tim Waugh 5505e2
+static void
Tim Waugh 5505e2
+print_scontext_format (const struct fileinfo *f)
Tim Waugh 5505e2
+{
Tim Waugh 5505e2
+  char modebuf[12];
Tim Waugh 5505e2
+
Tim Waugh 5505e2
+  /* 7 fields that may require LONGEST_HUMAN_READABLE bytes,
Tim Waugh 5505e2
+     1 10-byte mode string,
Tim Waugh 5505e2
+     9 spaces, one following each of these fields, and
Tim Waugh 5505e2
+     1 trailing NUL byte.  */
Tim Waugh 5505e2
+
Tim Waugh 5505e2
+  char init_bigbuf[7 * LONGEST_HUMAN_READABLE + 10  + 9 + 1];
Tim Waugh 5505e2
+  char *buf = init_bigbuf;
Tim Waugh 5505e2
+  size_t bufsize = sizeof (init_bigbuf);
Tim Waugh 5505e2
+  size_t s;
Tim Waugh 5505e2
+  char *p;
Tim Waugh 5505e2
+  const char *fmt;
Tim Waugh 5505e2
+  char *user_name;
Tim Waugh 5505e2
+  char *group_name;
Tim Waugh 5505e2
+  int rv;
Tim Waugh 5505e2
+  char *scontext;
Tim Waugh 5505e2
+
Tim Waugh 5505e2
+  p = buf;
Tim Waugh 5505e2
+
Tim Waugh 5505e2
+  if ( print_scontext ) { /* zero means terse listing */
Tim Waugh 5505e2
+    mode_string (f->stat.st_mode, modebuf);
Tim Waugh 5505e2
+    modebuf[10] = (FILE_HAS_ACL (f) ? '+' : ' ');
Tim Waugh 5505e2
+    modebuf[11] = '\0';
Tim Waugh 5505e2
+
Tim Waugh 5505e2
+    /* print mode */
Tim Waugh 5505e2
+
Tim Waugh 5505e2
+    (void) sprintf (p, "%s ", modebuf);
Tim Waugh 5505e2
+    p += strlen (p);
Tim Waugh 5505e2
+
Tim Waugh 5505e2
+    /* print standard user and group */
Tim Waugh 5505e2
+
Tim Waugh 49a3f8
+    DIRED_FPUTS (buf, stdout, p - buf);
Tim Waugh 49a3f8
+    format_user (f->stat.st_uid, owner_width, f->stat_failed);
Tim Waugh 49a3f8
+    format_group (f->stat.st_gid, group_width, f->stat_failed);
Tim Waugh 49a3f8
+    p = buf;
Tim Waugh 5505e2
+  }
Tim Waugh 5505e2
+
Tim Waugh 5505e2
+  (void) sprintf (p, "%-32s ", f->scontext ?: "");
Tim Waugh 5505e2
+  p += strlen (p);
Tim Waugh 5505e2
+ 
Tim Waugh 5505e2
+  DIRED_INDENT ();
Tim Waugh 5505e2
+  DIRED_FPUTS (buf, stdout, p - buf);
Tim Waugh 5505e2
+  print_name_with_quoting (f->name, f->stat.st_mode, f->linkok,
Tim Waugh 5505e2
+			   f->stat_failed,  &dired_obstack);
Tim Waugh 5505e2
+ 
Tim Waugh 5505e2
+  if (f->filetype == symbolic_link) {
Tim Waugh 5505e2
+      if (f->linkname) {
Tim Waugh 5505e2
+	  DIRED_FPUTS_LITERAL (" -> ", stdout);
Tim Waugh 5505e2
+	  print_name_with_quoting (f->linkname, f->linkmode, f->linkok - 1,
Tim Waugh 5505e2
+				   f->stat_failed, NULL);
Tim Waugh 5505e2
+	  if (indicator_style != none)
Tim Waugh 5505e2
+	    print_type_indicator (f->linkmode);
Tim Waugh 5505e2
+      }
Tim Waugh 5505e2
+  }
Tim Waugh 5505e2
+  else {
Tim Waugh 5505e2
+    if (indicator_style != none)
Tim Waugh 5505e2
+      print_type_indicator (f->stat.st_mode);
Tim Waugh 5505e2
+  }
Tim Waugh 5505e2
+}
Daniel J Walsh 129baa
+#endif
Tim Waugh 5505e2
--- coreutils-5.94/src/stat.c.selinux	2005-12-15 21:25:53.000000000 +0000
Tim Waugh 5505e2
+++ coreutils-5.94/src/stat.c	2006-03-24 13:25:44.000000000 +0000
Tim Waugh 5505e2
@@ -42,6 +42,13 @@
Tim Waugh 5505e2
 # endif
Tim Waugh 5505e2
 #endif
Daniel J Walsh 129baa
 
Tim Waugh 5505e2
+#ifdef WITH_SELINUX
Tim Waugh 5505e2
+#include <selinux/selinux.h>
Tim Waugh 5505e2
+#define SECURITY_ID_T security_context_t
Tim Waugh 5505e2
+#else
Tim Waugh 5505e2
+#define SECURITY_ID_T char *
Tim Waugh 5505e2
+#endif
Tim Waugh 5505e2
+
Tim Waugh 5505e2
 #include "system.h"
Daniel J Walsh 129baa
 
Tim Waugh 5505e2
 #include "error.h"
Tim Waugh 5505e2
@@ -112,6 +119,7 @@
Tim Waugh 5505e2
 };
Tim Waugh c3e4c8
 
Tim Waugh 5505e2
 static struct option const long_options[] = {
Tim Waugh 5505e2
+  {"context", no_argument, 0, 'Z'},
Tim Waugh 5505e2
   {"dereference", no_argument, NULL, 'L'},
Tim Waugh 5505e2
   {"file-system", no_argument, NULL, 'f'},
Tim Waugh 5505e2
   {"filesystem", no_argument, NULL, 'f'}, /* obsolete and undocumented alias */
Tim Waugh 5505e2
@@ -331,7 +339,7 @@
Tim Waugh 5505e2
 /* print statfs info */
Tim Waugh 5505e2
 static void
Tim Waugh 5505e2
 print_statfs (char *pformat, size_t buf_len, char m, char const *filename,
Tim Waugh 5505e2
-	      void const *data)
Tim Waugh 5505e2
+	      void const *data, SECURITY_ID_T scontext)
Tim Waugh 5505e2
 {
Tim Waugh 5505e2
   STRUCT_STATVFS const *statfsbuf = data;
Tim Waugh c3e4c8
 
Tim Waugh 5505e2
@@ -403,7 +411,10 @@
Tim Waugh 5505e2
       xstrcat (pformat, buf_len, PRIdMAX);
Tim Waugh 5505e2
       printf (pformat, (intmax_t) (statfsbuf->f_ffree));
Tim Waugh 5505e2
       break;
Tim Waugh 5505e2
-
Tim Waugh 5505e2
+    case 'C':
Tim Waugh 5505e2
+      strcat (pformat, "s");
Tim Waugh 5505e2
+      printf(scontext);
Tim Waugh 5505e2
+      break;
Tim Waugh 5505e2
     default:
Tim Waugh 5505e2
       xstrcat (pformat, buf_len, "c");
Tim Waugh 5505e2
       printf (pformat, m);
Tim Waugh 5505e2
@@ -414,7 +425,7 @@
Tim Waugh 5505e2
 /* print stat info */
Tim Waugh 5505e2
 static void
Tim Waugh 5505e2
 print_stat (char *pformat, size_t buf_len, char m,
Tim Waugh 5505e2
-	    char const *filename, void const *data)
Tim Waugh 5505e2
+	    char const *filename, void const *data, SECURITY_ID_T scontext)
Tim Waugh 5505e2
 {
Tim Waugh 5505e2
   struct stat *statbuf = (struct stat *) data;
Tim Waugh 5505e2
   struct passwd *pw_ent;
Tim Waugh 5505e2
@@ -548,6 +559,10 @@
Tim Waugh 5505e2
       xstrcat (pformat, buf_len, TYPE_SIGNED (time_t) ? "ld" : "lu");
Tim Waugh 5505e2
       printf (pformat, (unsigned long int) statbuf->st_ctime);
Tim Waugh 5505e2
       break;
Tim Waugh 5505e2
+    case 'C':
Tim Waugh 5505e2
+      strcat (pformat, "s");
Tim Waugh 5505e2
+      printf(pformat,scontext);
Tim Waugh 5505e2
+      break;
Tim Waugh 5505e2
     default:
Tim Waugh 5505e2
       xstrcat (pformat, buf_len, "c");
Tim Waugh 5505e2
       printf (pformat, m);
Tim Waugh 5505e2
@@ -595,8 +610,9 @@
Daniel J Walsh 129baa
 
Tim Waugh 5505e2
 static void
Tim Waugh 5505e2
 print_it (char const *format, char const *filename,
Tim Waugh 5505e2
-	  void (*print_func) (char *, size_t, char, char const *, void const *),
Tim Waugh 5505e2
-	  void const *data)
Tim Waugh 5505e2
+	  void (*print_func) (char *, size_t, char, char const *, void const *,
Tim Waugh 5505e2
+			      SECURITY_ID_T ),
Tim Waugh 5505e2
+	  void const *data, SECURITY_ID_T scontext)
Tim Waugh 5505e2
 {
Tim Waugh 5505e2
   /* Add 2 to accommodate our conversion of the stat `%s' format string
Tim Waugh 5505e2
      to the longer printf `%llu' one.  */
Tim Waugh 5505e2
@@ -627,7 +643,7 @@
Tim Waugh 5505e2
 		putchar ('%');
Tim Waugh 5505e2
 		break;
Tim Waugh 5505e2
 	      default:
Tim Waugh 5505e2
-		print_func (dest, n_alloc, *fmt_char, filename, data);
Tim Waugh 5505e2
+		print_func (dest, n_alloc, *fmt_char, filename, data, scontext);
Tim Waugh 5505e2
 		break;
Tim Waugh 5505e2
 	      }
Tim Waugh 5505e2
 	    break;
Tim Waugh 5505e2
@@ -690,9 +706,17 @@
Daniel J Walsh 129baa
 
Tim Waugh 5505e2
 /* Stat the file system and print what we find.  */
Tim Waugh 5505e2
 static bool
Tim Waugh 5505e2
-do_statfs (char const *filename, bool terse, char const *format)
Tim Waugh 5505e2
+do_statfs (char const *filename, bool terse, bool secure, char const *format)
Tim Waugh 5505e2
 {
Tim Waugh 5505e2
   STRUCT_STATVFS statfsbuf;
Tim Waugh 5505e2
+  SECURITY_ID_T scontext = NULL;
Daniel J Walsh 129baa
+#ifdef WITH_SELINUX
Tim Waugh 5505e2
+  if(secure)
Tim Waugh 5505e2
+    if (getfilecon(filename,&scontext)<0) {
Tim Waugh 5505e2
+      perror (filename);
Tim Waugh 5505e2
+      return;
Tim Waugh 5505e2
+    }
Daniel J Walsh 129baa
+#endif
Daniel J Walsh 129baa
 
Tim Waugh 5505e2
   if (STATFS (filename, &statfsbuf) != 0)
Tim Waugh 5505e2
     {
Tim Waugh 5505e2
@@ -703,25 +727,46 @@
Tim Waugh 5505e2
 
Tim Waugh 5505e2
   if (format == NULL)
Tim Waugh 5505e2
     {
Tim Waugh 5505e2
-      format = (terse
Tim Waugh 5505e2
-		? "%n %i %l %t %s %S %b %f %a %c %d\n"
Tim Waugh 5505e2
-		: "  File: \"%n\"\n"
Tim Waugh 5505e2
-		"    ID: %-8i Namelen: %-7l Type: %T\n"
Tim Waugh 5505e2
-		"Block size: %-10s Fundamental block size: %S\n"
Tim Waugh 5505e2
-		"Blocks: Total: %-10b Free: %-10f Available: %a\n"
Tim Waugh 5505e2
-		"Inodes: Total: %-10c Free: %d\n");
Tim Waugh 5505e2
+      if (terse)
Daniel J Walsh 129baa
+	{
Tim Waugh 5505e2
+	  if (secure)
Tim Waugh 5505e2
+	    format = "%n %i %l %t %s %S %b %f %a %c %d %C\n";
Tim Waugh 5505e2
+	  else
Tim Waugh 5505e2
+	    format = "%n %i %l %t %s %S %b %f %a %c %d\n";
Daniel J Walsh 129baa
+	}
Tim Waugh 5505e2
+      else
Tim Waugh 5505e2
+	{
Tim Waugh 5505e2
+	  if (secure)
Tim Waugh 5505e2
+	    format = "  File: \"%n\"\n"
Tim Waugh 5505e2
+	      "    ID: %-8i Namelen: %-7l Type: %T\n"
Tim Waugh 5505e2
+	      "Block size: %-10s Fundamental block size: %S\n"
Tim Waugh 5505e2
+	      "Blocks: Total: %-10b Free: %-10f Available: %a\n"
Tim Waugh 5505e2
+	      "Inodes: Total: %-10c Free: %d\n"
Tim Waugh 5505e2
+	      "   S_Context: %C\n";
Tim Waugh 5505e2
+	  else
Tim Waugh 5505e2
+	    format = "  File: \"%n\"\n"
Tim Waugh 5505e2
+	      "    ID: %-8i Namelen: %-7l Type: %T\n"
Tim Waugh 5505e2
+	      "Block size: %-10s Fundamental block size: %S\n"
Tim Waugh 5505e2
+	      "Blocks: Total: %-10b Free: %-10f Available: %a\n"
Tim Waugh 5505e2
+	      "Inodes: Total: %-10c Free: %d\n";
Daniel J Walsh 129baa
+	}
Tim Waugh 5505e2
     }
Tim Waugh 5505e2
 
Tim Waugh 5505e2
-  print_it (format, filename, print_statfs, &statfsbuf);
Tim Waugh 5505e2
+  print_it (format, filename, print_statfs, &statfsbuf, scontext);
Tim Waugh 5505e2
+#ifdef WITH_SELINUX
Tim Waugh 5505e2
+  if (scontext != NULL)
Tim Waugh 5505e2
+    freecon(scontext);
Tim Waugh 5505e2
+#endif
Tim Waugh 5505e2
   return true;
Tim Waugh 5505e2
 }
Tim Waugh 5505e2
 
Tim Waugh 5505e2
 /* stat the file and print what we find */
Tim Waugh 5505e2
 static bool
Tim Waugh 5505e2
-do_stat (char const *filename, bool follow_links, bool terse,
Tim Waugh 5505e2
+do_stat (char const *filename, bool follow_links, bool terse, bool secure,
Tim Waugh 5505e2
 	 char const *format)
Tim Waugh 5505e2
 {
Tim Waugh 5505e2
   struct stat statbuf;
Tim Waugh 5505e2
+  SECURITY_ID_T scontext = NULL;
Tim Waugh 5505e2
 
Tim Waugh 5505e2
   if ((follow_links ? stat : lstat) (filename, &statbuf) != 0)
Tim Waugh 5505e2
     {
Tim Waugh 5505e2
@@ -729,11 +774,29 @@
Tim Waugh 5505e2
       return false;
Tim Waugh 5505e2
     }
Tim Waugh 5505e2
 
Tim Waugh 5505e2
+#ifdef WITH_SELINUX
Tim Waugh 5505e2
+  if(secure) {
Tim Waugh 5505e2
+    int i;
Tim Waugh 5505e2
+    if (!follow_links) 
Tim Waugh 5505e2
+      i=lgetfilecon(filename, &scontext);
Tim Waugh 5505e2
+    else
Tim Waugh 5505e2
+      i=getfilecon(filename, &scontext);
Tim Waugh 5505e2
+    if (i == -1)
Tim Waugh 5505e2
+      {
Tim Waugh 5505e2
+	perror (filename);
Tim Waugh 5505e2
+	return false;
Daniel J Walsh 129baa
+      }
Daniel J Walsh 129baa
+  }
Daniel J Walsh 129baa
+#endif
Daniel J Walsh 129baa
+
Tim Waugh 5505e2
   if (format == NULL)
Daniel J Walsh 129baa
     {
Tim Waugh 5505e2
       if (terse)
Tim Waugh 5505e2
 	{
Tim Waugh 5505e2
-	  format = "%n %s %b %f %u %g %D %i %h %t %T %X %Y %Z %o\n";
Tim Waugh 5505e2
+	   if (secure)
Tim Waugh 5505e2
+	     format = "%n %s %b %f %u %g %D %i %h %t %T %X %Y %Z %o %C\n";
Tim Waugh 5505e2
+	   else
Tim Waugh 5505e2
+	     format = "%n %s %b %f %u %g %D %i %h %t %T %X %Y %Z %o\n";
Tim Waugh 5505e2
 	}
Tim Waugh 5505e2
       else
Tim Waugh 5505e2
 	{
Tim Waugh 5505e2
@@ -751,16 +814,30 @@
Tim Waugh 5505e2
 	    }
Tim Waugh 5505e2
 	  else
Tim Waugh 5505e2
 	    {
Tim Waugh 5505e2
-	      format =
Tim Waugh 5505e2
-		"  File: %N\n"
Tim Waugh 5505e2
-		"  Size: %-10s\tBlocks: %-10b IO Block: %-6o %F\n"
Tim Waugh 5505e2
-		"Device: %Dh/%dd\tInode: %-10i  Links: %h\n"
Tim Waugh 5505e2
-		"Access: (%04a/%10.10A)  Uid: (%5u/%8U)   Gid: (%5g/%8G)\n"
Tim Waugh 5505e2
-		"Access: %x\n" "Modify: %y\n" "Change: %z\n";
Tim Waugh 5505e2
+	      if (secure)
Tim Waugh 5505e2
+		format =
Tim Waugh 5505e2
+		  "  File: %N\n"
Tim Waugh 5505e2
+		  "  Size: %-10s\tBlocks: %-10b IO Block: %-6o %F\n"
Tim Waugh 5505e2
+		  "Device: %Dh/%dd\tInode: %-10i  Links: %-5h"
Tim Waugh 5505e2
+		  " Device type: %t,%T\n"
Tim Waugh 5505e2
+		  "Access: (%04a/%10.10A)  Uid: (%5u/%8U)   Gid: (%5g/%8G)\n"
Tim Waugh 5505e2
+		  "   S_Context: %C\n"
Tim Waugh 5505e2
+		  "Access: %x\n" "Modify: %y\n" "Change: %z\n";
Tim Waugh 5505e2
+	      else
Tim Waugh 5505e2
+		format =
Tim Waugh 5505e2
+		  "  File: %N\n"
Tim Waugh 5505e2
+		  "  Size: %-10s\tBlocks: %-10b IO Block: %-6o %F\n"
Tim Waugh 5505e2
+		  "Device: %Dh/%dd\tInode: %-10i  Links: %h\n"
Tim Waugh 5505e2
+		  "Access: (%04a/%10.10A)  Uid: (%5u/%8U)   Gid: (%5g/%8G)\n"
Tim Waugh 5505e2
+		  "Access: %x\n" "Modify: %y\n" "Change: %z\n";
Tim Waugh 5505e2
 	    }
Tim Waugh 5505e2
 	}
Tim Waugh 5505e2
     }
Tim Waugh 5505e2
-  print_it (format, filename, print_stat, &statbuf);
Tim Waugh 5505e2
+  print_it (format, filename, print_stat, &statbuf, scontext);
Tim Waugh 5505e2
+#ifdef WITH_SELINUX
Tim Waugh 5505e2
+  if (scontext) 
Tim Waugh 5505e2
+    freecon(scontext);
Tim Waugh 5505e2
+#endif
Tim Waugh 5505e2
   return true;
Tim Waugh 5505e2
 }
Tim Waugh 5505e2
 
Tim Waugh 5505e2
@@ -777,6 +854,7 @@
Tim Waugh 5505e2
 Display file or file system status.\n\
Tim Waugh 5505e2
 \n\
Tim Waugh 5505e2
   -L, --dereference     follow links\n\
Tim Waugh 5505e2
+  -Z, --context         print the security context \n\
Tim Waugh 5505e2
   -f, --file-system     display file system status instead of file status\n\
Tim Waugh 5505e2
 "), stdout);
Tim Waugh 5505e2
       fputs (_("\
Tim Waugh 5505e2
@@ -836,6 +914,7 @@
Tim Waugh 5505e2
   %c   Total file nodes in file system\n\
Tim Waugh 5505e2
   %d   Free file nodes in file system\n\
Tim Waugh 5505e2
   %f   Free blocks in file system\n\
Tim Waugh 5505e2
+  %C - Security context in SELinux\n\
Tim Waugh 5505e2
 "), stdout);
Tim Waugh 5505e2
       fputs (_("\
Tim Waugh 5505e2
   %i   File System ID in hex\n\
Tim Waugh 5505e2
@@ -860,6 +939,7 @@
Tim Waugh 5505e2
   bool follow_links = false;
Tim Waugh 5505e2
   bool fs = false;
Tim Waugh 5505e2
   bool terse = false;
Tim Waugh 5505e2
+  bool secure = false;
Tim Waugh 5505e2
   char *format = NULL;
Tim Waugh 5505e2
   bool ok = true;
Daniel J Walsh 129baa
 
Tim Waugh 5505e2
@@ -871,7 +951,7 @@
Daniel J Walsh 129baa
 
Tim Waugh 5505e2
   atexit (close_stdout);
Daniel J Walsh 129baa
 
Tim Waugh 5505e2
-  while ((c = getopt_long (argc, argv, "c:fLt", long_options, NULL)) != -1)
Tim Waugh 5505e2
+  while ((c = getopt_long (argc, argv, "c:fLtZ", long_options, NULL)) != -1)
Tim Waugh 5505e2
     {
Tim Waugh 5505e2
       switch (c)
Tim Waugh 5505e2
 	{
Tim Waugh 5505e2
@@ -898,6 +978,14 @@
Tim Waugh 5505e2
 	case 't':
Tim Waugh 5505e2
 	  terse = true;
Tim Waugh 5505e2
 	  break;
Tim Waugh 5505e2
+	case 'Z':
Tim Waugh 5505e2
+	  if((is_selinux_enabled()>0))
Tim Waugh 5505e2
+	    secure = 1;
Tim Waugh 5505e2
+	  else {
Tim Waugh 5505e2
+	    error (0, 0, _("Kernel is not SELinux enabled"));
Tim Waugh 5505e2
+	    usage (EXIT_FAILURE);
Tim Waugh 5505e2
+	  }
Tim Waugh 5505e2
+	  break;
Daniel J Walsh 129baa
 
Tim Waugh 5505e2
 	case_GETOPT_HELP_CHAR;
Daniel J Walsh 129baa
 
Tim Waugh 5505e2
@@ -916,8 +1004,8 @@
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)
Tim Waugh 5505e2
-	   : do_stat (argv[i], follow_links, terse, format));
Tim Waugh 5505e2
+	   ? do_statfs (argv[i], terse, secure, format)
Tim Waugh 5505e2
+	   : do_stat (argv[i], follow_links, terse, secure, format));
Tim Waugh 5505e2
 
Tim Waugh 5505e2
   exit (ok ? EXIT_SUCCESS : EXIT_FAILURE);
Tim Waugh 5505e2
 }
Tim Waugh 5505e2
--- coreutils-5.94/src/mkfifo.c.selinux	2005-05-14 08:58:37.000000000 +0100
Tim Waugh 5505e2
+++ coreutils-5.94/src/mkfifo.c	2006-03-24 13:23:45.000000000 +0000
Tim Waugh 5505e2
@@ -32,11 +32,18 @@
Tim Waugh 5505e2
 
Tim Waugh 5505e2
 #define AUTHORS "David MacKenzie"
Daniel J Walsh 129baa
 
Daniel J Walsh 129baa
+#ifdef WITH_SELINUX
Tim Waugh 5505e2
+#include <selinux/selinux.h>          /* for is_selinux_enabled() */
Daniel J Walsh 129baa
+#endif
Daniel J Walsh 129baa
+
Daniel J Walsh 129baa
 /* The name this program was run with. */
Daniel J Walsh 129baa
 char *program_name;
Daniel J Walsh 129baa
 
Daniel J Walsh 129baa
 static struct option const longopts[] =
Daniel J Walsh 129baa
 {
Daniel J Walsh 129baa
+#ifdef WITH_SELINUX
Daniel J Walsh 129baa
+  {"context", required_argument, NULL, 'Z'},
Daniel J Walsh 129baa
+#endif
Daniel J Walsh 129baa
   {"mode", required_argument, NULL, 'm'},
Daniel J Walsh 129baa
   {GETOPT_HELP_OPTION_DECL},
Daniel J Walsh 129baa
   {GETOPT_VERSION_OPTION_DECL},
Tim Waugh 5505e2
@@ -57,6 +64,11 @@
Tim Waugh 5505e2
 Create named pipes (FIFOs) with the given NAMEs.\n\
Daniel J Walsh 129baa
 \n\
Daniel J Walsh 129baa
 "), stdout);
Daniel J Walsh 129baa
+#ifdef WITH_SELINUX
Tim Waugh 5505e2
+      printf (_("\
Daniel J Walsh 129baa
+  -Z, --context=CONTEXT   set security context (quoted string)\n\
Daniel J Walsh 129baa
+"), stdout);
Daniel J Walsh 129baa
+#endif
Daniel J Walsh 129baa
       fputs (_("\
Daniel J Walsh 129baa
 Mandatory arguments to long options are mandatory for short options too.\n\
Daniel J Walsh 129baa
 "), stdout);
Tim Waugh 5505e2
@@ -92,13 +104,30 @@
Tim Waugh 5505e2
 #ifndef S_ISFIFO
Tim Waugh 5505e2
   error (EXIT_FAILURE, 0, _("fifo files not supported"));
Tim Waugh 5505e2
 #else
Daniel J Walsh 129baa
+#ifdef WITH_SELINUX
Daniel J Walsh 129baa
+  while ((optc = getopt_long (argc, argv, "m:Z:", longopts, NULL)) != -1)
Daniel J Walsh 129baa
+#else
Daniel J Walsh 129baa
   while ((optc = getopt_long (argc, argv, "m:", longopts, NULL)) != -1)
Daniel J Walsh 129baa
+#endif
Daniel J Walsh 129baa
     {
Daniel J Walsh 129baa
       switch (optc)
Daniel J Walsh 129baa
 	{
Daniel J Walsh 129baa
 	case 'm':
Daniel J Walsh 129baa
 	  specified_mode = optarg;
Daniel J Walsh 129baa
 	  break;
Daniel J Walsh 129baa
+#ifdef WITH_SELINUX
Daniel J Walsh 129baa
+ 	case 'Z':
Tim Waugh 5505e2
+ 	  if( !(is_selinux_enabled()>0)) {
Daniel J Walsh 129baa
+ 	    fprintf( stderr, "Sorry, --context (-Z) can be used only on "
Daniel J Walsh 129baa
+		             "a selinux-enabled kernel.\n" );
Daniel J Walsh 129baa
+ 	    exit( 1 );
Daniel J Walsh 129baa
+ 	  }
Daniel J Walsh 129baa
+	  if (setfscreatecon(optarg)) {
Daniel J Walsh 129baa
+ 	    fprintf( stderr, "Sorry, cannot set default context to %s.\n", optarg);
Daniel J Walsh 129baa
+ 	    exit( 1 );
Daniel J Walsh 129baa
+ 	  }
Daniel J Walsh 129baa
+ 	  break;
Daniel J Walsh 129baa
+#endif
Daniel J Walsh 129baa
 	case_GETOPT_HELP_CHAR;
Daniel J Walsh 129baa
 	case_GETOPT_VERSION_CHAR (PROGRAM_NAME, AUTHORS);
Daniel J Walsh 129baa
 	default:
Tim Waugh 5505e2
--- coreutils-5.94/src/id.c.selinux	2006-03-24 13:23:44.000000000 +0000
Tim Waugh 5505e2
+++ coreutils-5.94/src/id.c	2006-03-24 13:23:45.000000000 +0000
Tim Waugh 5505e2
@@ -37,6 +37,20 @@
Daniel J Walsh 129baa
 
Tim Waugh 5505e2
 int getugroups ();
Daniel J Walsh 129baa
 
Daniel J Walsh 129baa
+#ifdef WITH_SELINUX
Tim Waugh 5505e2
+#include <selinux/selinux.h>
Tim Waugh 5505e2
+static void print_context (char* context);
Tim Waugh 5505e2
+/* Print the SELinux context */
Tim Waugh 5505e2
+static void
Tim Waugh 5505e2
+print_context(char *context)
Tim Waugh 5505e2
+{
Tim Waugh 5505e2
+  printf ("%s", context);
Tim Waugh 5505e2
+}
Tim Waugh 5505e2
+
Tim Waugh 5505e2
+/* If nonzero, output only the SELinux context. -Z */
Tim Waugh 5505e2
+static int just_context = 0;
Tim Waugh 5505e2
+
Daniel J Walsh 129baa
+#endif
Tim Waugh 5505e2
 static void print_user (uid_t uid);
Tim Waugh 5505e2
 static void print_group (gid_t gid);
Tim Waugh 5505e2
 static void print_group_list (const char *username);
Tim Waugh 5505e2
@@ -55,8 +69,14 @@
Tim Waugh 5505e2
 /* True unless errors have been encountered.  */
Tim Waugh 5505e2
 static bool ok = true;
Tim Waugh 5505e2
 
Tim Waugh 5505e2
+/* The SELinux context */
Tim Waugh 5505e2
+/* Set `context' to a known invalid value so print_full_info() will *
Tim Waugh 5505e2
+ * know when `context' has not been set to a meaningful value.      */
Tim Waugh 5505e2
+static security_context_t context=NULL;
Daniel J Walsh 129baa
+
Tim Waugh 5505e2
 static struct option const longopts[] =
Tim Waugh 5505e2
 {
Tim Waugh 5505e2
+  {"context", no_argument, NULL, 'Z'},
Tim Waugh 5505e2
   {"group", no_argument, NULL, 'g'},
Tim Waugh 5505e2
   {"groups", no_argument, NULL, 'G'},
Tim Waugh 5505e2
   {"name", no_argument, NULL, 'n'},
Tim Waugh 5505e2
@@ -80,6 +100,7 @@
Tim Waugh 5505e2
 Print information for USERNAME, or the current user.\n\
Tim Waugh 5505e2
 \n\
Tim Waugh 5505e2
   -a              ignore, for compatibility with other versions\n\
Tim Waugh 5505e2
+  -Z, --context   print only the context\n\
Tim Waugh 5505e2
   -g, --group     print only the effective group ID\n\
Tim Waugh 5505e2
   -G, --groups    print all group IDs\n\
Tim Waugh 5505e2
   -n, --name      print a name instead of a number, for -ugG\n\
Tim Waugh 5505e2
@@ -101,6 +122,7 @@
Tim Waugh 5505e2
 main (int argc, char **argv)
Tim Waugh 5505e2
 {
Tim Waugh 5505e2
   int optc;
Tim Waugh 5505e2
+  int selinux_enabled=(is_selinux_enabled()>0);
Tim Waugh 5505e2
 
Tim Waugh 5505e2
   /* If true, output the list of all group IDs. -G */
Tim Waugh 5505e2
   bool just_group_list = false;
Tim Waugh 5505e2
@@ -119,13 +141,24 @@
Tim Waugh 5505e2
 
Tim Waugh 5505e2
   atexit (close_stdout);
Tim Waugh 5505e2
 
Tim Waugh 5505e2
-  while ((optc = getopt_long (argc, argv, "agnruG", longopts, NULL)) != -1)
Tim Waugh 5505e2
+  while ((optc = getopt_long (argc, argv, "agnruGZ", longopts, NULL)) != -1)
Tim Waugh 5505e2
     {
Tim Waugh 5505e2
       switch (optc)
Tim Waugh 5505e2
 	{
Tim Waugh 5505e2
 	case 'a':
Tim Waugh 5505e2
 	  /* Ignore -a, for compatibility with SVR4.  */
Tim Waugh 5505e2
 	  break;
Daniel J Walsh 129baa
+#ifdef WITH_SELINUX
Tim Waugh 5505e2
+        case 'Z':
Tim Waugh 5505e2
+	  /* politely decline if we're not on a selinux-enabled kernel. */
Tim Waugh 5505e2
+	  if( !selinux_enabled ) {
Tim Waugh 5505e2
+	    fprintf( stderr, "Sorry, --context (-Z) can be used only on "
Tim Waugh 5505e2
+		             "a selinux-enabled kernel.\n" );
Tim Waugh 5505e2
+	    exit( 1 );
Tim Waugh 5505e2
+	  }
Tim Waugh 5505e2
+          just_context = 1;
Tim Waugh 5505e2
+          break;
Daniel J Walsh 129baa
+#endif
Tim Waugh 5505e2
 	case 'g':
Tim Waugh 5505e2
 	  just_group = true;
Tim Waugh 5505e2
 	  break;
Tim Waugh 5505e2
@@ -148,8 +181,28 @@
Tim Waugh 5505e2
 	}
Tim Waugh 5505e2
     }
Tim Waugh 5505e2
 
Tim Waugh 5505e2
-  if (just_user + just_group + just_group_list > 1)
Tim Waugh 5505e2
-    error (EXIT_FAILURE, 0, _("cannot print only user and only group"));
Tim Waugh 5505e2
+#ifdef WITH_SELINUX
Tim Waugh 5505e2
+  if (argc - optind == 1)
Tim Waugh 5505e2
+    selinux_enabled = 0;
Tim Waugh 5505e2
+
Tim Waugh 5505e2
+  if( just_context  && !selinux_enabled)
Tim Waugh 5505e2
+    error (1, 0, _("\
Tim Waugh 5505e2
+cannot display context when selinux not enabled or when displaying the id\n\
Tim Waugh 5505e2
+of a different user"));
Tim Waugh 5505e2
+
Tim Waugh 5505e2
+  /* If we are on a selinux-enabled kernel, get our context.    *
Tim Waugh 5505e2
+   * Otherwise, leave the context variable alone - it has *
Tim Waugh 5505e2
+   * been initialized known invalid value; if we see this invalid   *
Tim Waugh 5505e2
+   * value later, we will know we are on a non-selinux kernel.         */
Tim Waugh 5505e2
+  if( selinux_enabled )
Tim Waugh 5505e2
+    {
Tim Waugh 5505e2
+      if (getcon(&context) && just_context)
Tim Waugh 5505e2
+        error (1, 0, "can't get process context");
Tim Waugh 5505e2
+    }
Tim Waugh 5505e2
+#endif
Tim Waugh 5505e2
+
Tim Waugh 5505e2
+  if (just_user + just_group + just_group_list + just_context > 1)
Tim Waugh 5505e2
+    error (EXIT_FAILURE, 0, _("cannot print \"only\" of more than one choice"));
Tim Waugh 5505e2
 
Tim Waugh 5505e2
   if (just_user + just_group + just_group_list == 0 && (use_real | use_name))
Tim Waugh 5505e2
     error (EXIT_FAILURE, 0,
Tim Waugh 5505e2
@@ -183,6 +236,10 @@
Tim Waugh 5505e2
     print_group (use_real ? rgid : egid);
Tim Waugh 5505e2
   else if (just_group_list)
Tim Waugh 5505e2
     print_group_list (argv[optind]);
Tim Waugh 5505e2
+#ifdef WITH_SELINUX
Tim Waugh 5505e2
+  else if (just_context)
Tim Waugh 5505e2
+    print_context (context);
Tim Waugh 5505e2
+#endif
Tim Waugh 5505e2
   else
Tim Waugh 5505e2
     print_full_info (argv[optind]);
Tim Waugh 5505e2
   putchar ('\n');
Tim Waugh 5505e2
@@ -407,4 +464,9 @@
Tim Waugh 5505e2
     free (groups);
Tim Waugh 5505e2
   }
Tim Waugh 5505e2
 #endif /* HAVE_GETGROUPS */
Tim Waugh 5505e2
+#ifdef WITH_SELINUX
Tim Waugh 5505e2
+  if ( context != NULL ) {
Tim Waugh 5505e2
+    printf(" context=%s",context);
Tim Waugh 5505e2
+  }
Tim Waugh 5505e2
+#endif
Tim Waugh 5505e2
 }
Tim Waugh 679161
--- coreutils-5.94/src/copy.c	2006-03-24 13:23:45.000000000 +0000
Tim Waugh 679161
+++ coreutils-5.94/src/copy.c	2006-04-26 14:06:02.000000000 +1000
Tim Waugh 5505e2
@@ -51,6 +51,11 @@
Tim Waugh 5505e2
 #include "xreadlink.h"
Tim Waugh 5505e2
 #include "yesno.h"
Tim Waugh 5505e2
 
Tim Waugh 5505e2
+#ifdef WITH_SELINUX
Tim Waugh 5505e2
+#include <selinux/selinux.h>          /* for is_selinux_enabled() */
Tim Waugh 5505e2
+extern int  selinux_enabled;
Tim Waugh 5505e2
+#endif
Tim Waugh 5505e2
+
Tim Waugh 5505e2
 #ifndef HAVE_FCHMOD
Tim Waugh 5505e2
 # define HAVE_FCHMOD false
Tim Waugh 5505e2
 #endif
Tim Waugh 679161
@@ -238,6 +243,25 @@
Tim Waugh 679161
     {
Tim Waugh 679161
       dest_desc = open (dst_name, O_WRONLY | O_TRUNC | O_BINARY, dst_mode);
Tim Waugh 679161
 
Tim Waugh 679161
+#ifdef WITH_SELINUX
Tim Waugh 679161
+      if (dest_desc >= 0)
Tim Waugh 679161
+	{
Tim Waugh 679161
+	  security_context_t con;
Tim Waugh 679161
+	  if(getfscreatecon(&con) == -1)
Tim Waugh 679161
+	    {
Tim Waugh 679161
+	      return_val = false;
Tim Waugh 679161
+	      goto close_src_desc;
Tim Waugh 679161
+	    }
Tim Waugh 679161
+	  if(fsetfilecon(dest_desc, con) == -1)
Tim Waugh 679161
+	    {
Tim Waugh 679161
+	      return_val = false;
Tim Waugh 679161
+	      freecon(con);
Tim Waugh 679161
+	      goto close_src_desc;
Tim Waugh 679161
+	    }
Tim Waugh 679161
+	  freecon(con);
Tim Waugh 679161
+	}
Tim Waugh 679161
+#endif
Tim Waugh 679161
+
Tim Waugh 679161
       if (dest_desc < 0 && x->unlink_dest_after_failed_open)
Tim Waugh 679161
 	{
Tim Waugh 679161
 	  if (unlink (dst_name) != 0)
Tim Waugh 679161
@@ -1416,6 +1440,32 @@
Tim Waugh 5505e2
      In such cases, set this variable to zero.  */
Tim Waugh 5505e2
   preserve_metadata = true;
Daniel J Walsh 129baa
 
Daniel J Walsh 129baa
+#ifdef WITH_SELINUX
Tim Waugh 5505e2
+  if (x->preserve_security_context && selinux_enabled)
Tim Waugh 5505e2
+    {
Tim Waugh 5505e2
+      security_context_t con;
Tim Waugh 5505e2
+
Tim Waugh 5505e2
+      if (lgetfilecon (src_name, &con) >= 0)
Tim Waugh 5505e2
+	{
Tim Waugh 5505e2
+	  if (setfscreatecon(con) < 0) 
Tim Waugh 5505e2
+	    {
Tim Waugh 5505e2
+	      error (0, errno, _("cannot set setfscreatecon %s"), quote (con));
Tim Waugh 5505e2
+	      if (x->require_preserve) {
Tim Waugh 5505e2
+		freecon(con);
Tim Waugh 5505e2
+		return 1;
Tim Waugh 5505e2
+	      }
Tim Waugh 5505e2
+	    }
Tim Waugh 5505e2
+	  freecon(con);
Tim Waugh 5505e2
+	}
Tim Waugh 5505e2
+      else {
Tim Waugh 5505e2
+	if (( errno != ENOTSUP ) && ( errno != ENODATA )) {
Tim Waugh 5505e2
+	  error (0, errno, _("cannot lgetfilecon %s"), quote (src_name));
Tim Waugh 5505e2
+	  return 1;
Tim Waugh 5505e2
+	}
Tim Waugh 5505e2
+      }
Tim Waugh 5505e2
+  }
Daniel J Walsh 129baa
+#endif
Daniel J Walsh 129baa
+
Tim Waugh 5505e2
   if (S_ISDIR (src_mode))
Daniel J Walsh 129baa
     {
Tim Waugh 5505e2
       struct dir_list *dir;
Tim Waugh 679161
@@ -1486,7 +1536,13 @@
Daniel J Walsh 129baa
 
Tim Waugh 5505e2
       /* Are we crossing a file system boundary?  */
Tim Waugh 5505e2
       if (x->one_file_system && device != 0 && device != src_sb.st_dev)
Tim Waugh 5505e2
-	return true;
Tim Waugh 5505e2
+	{
Daniel J Walsh 129baa
+#ifdef WITH_SELINUX
Tim Waugh 5505e2
+	  if (x->preserve_security_context && selinux_enabled)
Tim Waugh 5505e2
+	    setfscreatecon(NULL);
Daniel J Walsh 129baa
+#endif
Tim Waugh 5505e2
+	  return true;
Tim Waugh 5505e2
+	}
Daniel J Walsh 129baa
 
Tim Waugh 5505e2
       /* Copy the contents of the directory.  */
Tim Waugh 5505e2
 
Tim Waugh 679161
@@ -1622,6 +1678,11 @@
Tim Waugh 5505e2
 	    }
Tim Waugh 5505e2
 	}
Daniel J Walsh 129baa
 
Daniel J Walsh 129baa
+#ifdef WITH_SELINUX
Tim Waugh 5505e2
+      if (x->preserve_security_context && selinux_enabled)
Tim Waugh 5505e2
+	setfscreatecon(NULL);
Daniel J Walsh 129baa
+#endif
Daniel J Walsh 129baa
+
Tim Waugh 5505e2
       /* There's no need to preserve timestamps or permissions.  */
Tim Waugh 5505e2
       preserve_metadata = false;
Daniel J Walsh 129baa
 
Tim Waugh 679161
@@ -1760,6 +1821,11 @@
Daniel J Walsh 129baa
 
Tim Waugh 5505e2
 un_backup:
Daniel J Walsh 129baa
 
Daniel J Walsh 129baa
+#ifdef WITH_SELINUX
Tim Waugh 5505e2
+  if (x->preserve_security_context && selinux_enabled)
Tim Waugh 5505e2
+    setfscreatecon(NULL);
Daniel J Walsh 129baa
+#endif
Daniel J Walsh 129baa
+
Tim Waugh 5505e2
   /* We have failed to create the destination file.
Tim Waugh 5505e2
      If we've just added a dev/ino entry via the remember_copied
Tim Waugh 5505e2
      call above (i.e., unless we've just failed to create a hard link),
Tim Waugh 5505e2
--- coreutils-5.94/src/mknod.c.selinux	2005-05-14 08:58:37.000000000 +0100
Tim Waugh 5505e2
+++ coreutils-5.94/src/mknod.c	2006-03-24 13:23:45.000000000 +0000
Tim Waugh 5505e2
@@ -36,8 +36,15 @@
Daniel J Walsh 129baa
 /* The name this program was run with. */
Daniel J Walsh 129baa
 char *program_name;
Daniel J Walsh 129baa
 
Tim Waugh 5505e2
+#ifdef WITH_SELINUX
Tim Waugh 5505e2
+#include <selinux/selinux.h>
Tim Waugh 5505e2
+#endif
Tim Waugh 5505e2
+
Daniel J Walsh 129baa
 static struct option const longopts[] =
Daniel J Walsh 129baa
 {
Daniel J Walsh 129baa
+#ifdef WITH_SELINUX
Daniel J Walsh 129baa
+  {"context", required_argument, NULL, 'Z'},
Daniel J Walsh 129baa
+#endif
Daniel J Walsh 129baa
   {"mode", required_argument, NULL, 'm'},
Daniel J Walsh 129baa
   {GETOPT_HELP_OPTION_DECL},
Daniel J Walsh 129baa
   {GETOPT_VERSION_OPTION_DECL},
Tim Waugh 5505e2
@@ -58,6 +65,11 @@
Tim Waugh 5505e2
 Create the special file NAME of the given TYPE.\n\
Daniel J Walsh 129baa
 \n\
Daniel J Walsh 129baa
 "), stdout);
Daniel J Walsh 129baa
+#ifdef WITH_SELINUX
Tim Waugh 5505e2
+      fputs(_("\
Daniel J Walsh 129baa
+  -Z, --context=CONTEXT   set security context (quoted string)\n\
Daniel J Walsh 129baa
+"), stdout);
Daniel J Walsh 129baa
+#endif
Daniel J Walsh 129baa
       fputs (_("\
Daniel J Walsh 129baa
 Mandatory arguments to long options are mandatory for short options too.\n\
Daniel J Walsh 129baa
 "), stdout);
Tim Waugh 5505e2
@@ -103,13 +115,31 @@
Tim Waugh 5505e2
 
Tim Waugh 5505e2
   specified_mode = NULL;
Tim Waugh 5505e2
 
Daniel J Walsh 129baa
+#ifdef WITH_SELINUX
Daniel J Walsh 129baa
+  while ((optc = getopt_long (argc, argv, "m:Z:", longopts, NULL)) != -1)
Daniel J Walsh 129baa
+#else
Daniel J Walsh 129baa
   while ((optc = getopt_long (argc, argv, "m:", longopts, NULL)) != -1)
Daniel J Walsh 129baa
+#endif
Daniel J Walsh 129baa
     {
Daniel J Walsh 129baa
       switch (optc)
Daniel J Walsh 129baa
 	{
Daniel J Walsh 129baa
 	case 'm':
Daniel J Walsh 129baa
 	  specified_mode = optarg;
Daniel J Walsh 129baa
 	  break;
Daniel J Walsh 129baa
+#ifdef WITH_SELINUX
Daniel J Walsh 129baa
+ 	case 'Z':
Tim Waugh 5505e2
+ 	  /* politely decline if we're not on a selinux-enabled kernel. */
Tim Waugh 5505e2
+	  if( !(is_selinux_enabled()>0)) {
Daniel J Walsh 129baa
+ 	    fprintf( stderr, "Sorry, --context (-Z) can be used only on "
Daniel J Walsh 129baa
+		             "a selinux-enabled kernel.\n" );
Daniel J Walsh 129baa
+ 	    exit( 1 );
Daniel J Walsh 129baa
+ 	  }
Daniel J Walsh 129baa
+	  if (setfscreatecon(optarg)) {
Daniel J Walsh 129baa
+ 	    fprintf( stderr, "Sorry, cannot set default context to %s.\n", optarg);
Daniel J Walsh 129baa
+ 	    exit( 1 );
Daniel J Walsh 129baa
+ 	  }
Daniel J Walsh 129baa
+ 	  break;
Daniel J Walsh 129baa
+#endif
Daniel J Walsh 129baa
 	case_GETOPT_HELP_CHAR;
Daniel J Walsh 129baa
 	case_GETOPT_VERSION_CHAR (PROGRAM_NAME, AUTHORS);
Daniel J Walsh 129baa
 	default:
Tim Waugh 5505e2
--- coreutils-5.94/README.selinux	2006-03-24 13:23:43.000000000 +0000
Tim Waugh 5505e2
+++ coreutils-5.94/README	2006-03-24 13:23:47.000000000 +0000
Tim Waugh 5505e2
@@ -7,11 +7,11 @@
Tim Waugh 5505e2
 
Tim Waugh 5505e2
 The programs that can be built with this package are:
Tim Waugh 5505e2
 
Tim Waugh 5505e2
-  [ basename cat chgrp chmod chown chroot cksum comm cp csplit cut date dd
Tim Waugh 5505e2
+  [ basename cat chcon chgrp chmod chown chroot cksum comm cp csplit cut date dd
Tim Waugh 5505e2
   df dir dircolors dirname du echo env expand expr factor false fmt fold
Tim Waugh 5505e2
   ginstall groups head hostid hostname id join kill link ln logname ls
Tim Waugh 5505e2
   md5sum mkdir mkfifo mknod mv nice nl nohup od paste pathchk pinky pr
Tim Waugh 5505e2
-  printenv printf ptx pwd readlink rm rmdir runuser seq sha1sum shred sleep sort
Tim Waugh 5505e2
+  printenv printf ptx pwd readlink rm rmdir runcon runuser seq sha1sum shred sleep sort
Tim Waugh 5505e2
   split stat stty su sum sync tac tail tee test touch tr true tsort tty
Tim Waugh 5505e2
   uname unexpand uniq unlink uptime users vdir wc who whoami yes
Tim Waugh 5505e2
 
Tim Waugh 5505e2
--- coreutils-5.94/tests/help-version.selinux	2006-03-24 13:23:43.000000000 +0000
Tim Waugh 5505e2
+++ coreutils-5.94/tests/help-version	2006-03-24 13:23:47.000000000 +0000
Tim Waugh 5505e2
@@ -46,6 +46,8 @@
Tim Waugh 5505e2
 
Tim Waugh 5505e2
     # Skip `test'; it doesn't accept --help or --version.
Tim Waugh 5505e2
     test $i = test && continue;
Tim Waugh 5505e2
+    test $i = chcon && continue;
Tim Waugh 5505e2
+    test $i = runcon && continue;
Tim Waugh 5505e2
 
Tim Waugh 5505e2
     # false fails even when invoked with --help or --version.
Tim Waugh 5505e2
     if test $i = false; then
Tim Waugh 5505e2
@@ -162,7 +164,7 @@
Tim Waugh 5505e2
 
Tim Waugh 5505e2
 for i in $all_programs; do
Tim Waugh 5505e2
   # Skip these.
Tim Waugh 5505e2
-  case $i in chroot|stty|tty|false) continue;; esac
Tim Waugh 5505e2
+  case $i in chroot|stty|tty|false|chcon|runcon) continue;; esac
Tim Waugh 5505e2
 
Tim Waugh 5505e2
   rm -rf $tmp_in $tmp_in2 $tmp_dir $tmp_out
Tim Waugh 5505e2
   echo > $tmp_in
Tim Waugh 5505e2
--- coreutils-5.94/configure.ac.selinux	2006-03-24 13:23:41.000000000 +0000
Tim Waugh 5505e2
+++ coreutils-5.94/configure.ac	2006-03-24 13:23:47.000000000 +0000
Tim Waugh 5505e2
@@ -34,6 +34,13 @@
Tim Waugh 5505e2
 LIB_PAM="-ldl -lpam -lpam_misc"
Tim Waugh 5505e2
 AC_SUBST(LIB_PAM)])
Tim Waugh 5505e2
 
Tim Waugh 5505e2
+dnl Give the chance to enable SELINUX
Tim Waugh 5505e2
+AC_ARG_ENABLE(selinux, dnl
Tim Waugh 5505e2
+[  --enable-selinux              Enable use of the SELINUX libraries],
Tim Waugh 5505e2
+[AC_DEFINE(WITH_SELINUX, 1, [Define if you want to use SELINUX])
Tim Waugh 5505e2
+LIB_SELINUX="-lselinux"
Tim Waugh 5505e2
+AC_SUBST(LIB_SELINUX)])
Tim Waugh 5505e2
+
Tim Waugh 5505e2
 gl_DEFAULT_POSIX2_VERSION
Tim Waugh 5505e2
 gl_USE_SYSTEM_EXTENSIONS
Tim Waugh 5505e2
 gl_PERL
Tim Waugh 5505e2
--- coreutils-5.94/config.hin.selinux	2006-03-24 13:23:41.000000000 +0000
Tim Waugh 5505e2
+++ coreutils-5.94/config.hin	2006-03-24 13:23:47.000000000 +0000
Tim Waugh 5505e2
@@ -411,10 +411,6 @@
Tim Waugh 5505e2
    don't. */
Tim Waugh 5505e2
 #undef HAVE_DECL_TTYNAME
Tim Waugh 5505e2
 
Tim Waugh 5505e2
-/* Define to 1 if you have the declaration of `tzname', and to 0 if you don't.
Tim Waugh 5505e2
-   */
Tim Waugh 5505e2
-#undef HAVE_DECL_TZNAME
Tim Waugh 5505e2
-
Tim Waugh 5505e2
 /* Define to 1 if you have the declaration of wcwidth(), and to 0 otherwise.
Tim Waugh 5505e2
    */
Tim Waugh 5505e2
 #undef HAVE_DECL_WCWIDTH
Tim Waugh 5505e2
@@ -519,6 +515,9 @@
Tim Waugh 5505e2
 /* Define to 1 if you have the `getdelim' function. */
Tim Waugh 5505e2
 #undef HAVE_GETDELIM
Tim Waugh 5505e2
 
Tim Waugh 5505e2
+/* Define to 1 if you have the `getgrouplist' function. */
Tim Waugh 5505e2
+#undef HAVE_GETGROUPLIST
Tim Waugh 5505e2
+
Tim Waugh 5505e2
 /* Define to 1 if your system has a working `getgroups' function. */
Tim Waugh 5505e2
 #undef HAVE_GETGROUPS
Tim Waugh 5505e2
 
Tim Waugh 5505e2
@@ -613,9 +612,6 @@
Tim Waugh 5505e2
 /* Define to 1 if you have the `lchown' function. */
Tim Waugh 5505e2
 #undef HAVE_LCHOWN
Tim Waugh 5505e2
 
Tim Waugh 5505e2
-/* Define to 1 if you have the `acl' library (-lacl). */
Tim Waugh 5505e2
-#undef HAVE_LIBACL
Tim Waugh 5505e2
-
Tim Waugh 5505e2
 /* Define to 1 if you have the `dgc' library (-ldgc). */
Tim Waugh 5505e2
 #undef HAVE_LIBDGC
Tim Waugh 5505e2
 
Tim Waugh 5505e2
@@ -1525,17 +1521,17 @@
Tim Waugh 5505e2
 /* Define to 1 if unlink (dir) cannot possibly succeed. */
Tim Waugh 5505e2
 #undef UNLINK_CANNOT_UNLINK_DIR
Tim Waugh 5505e2
 
Tim Waugh 5505e2
-/* Define to 1 if you want getc etc. to use unlocked I/O if available.
Tim Waugh 5505e2
-   Unlocked I/O can improve performance in unithreaded apps, but it is not
Tim Waugh 5505e2
-   safe for multithreaded apps. */
Tim Waugh 5505e2
-#undef USE_UNLOCKED_IO
Tim Waugh 5505e2
-
Tim Waugh 5505e2
 /* Define if you want access control list support. */
Tim Waugh 5505e2
 #undef USE_ACL
Tim Waugh 5505e2
 
Tim Waugh 5505e2
 /* Define if you want to use PAM */
Tim Waugh 5505e2
 #undef USE_PAM
Tim Waugh 5505e2
 
Tim Waugh 5505e2
+/* Define to 1 if you want getc etc. to use unlocked I/O if available.
Tim Waugh 5505e2
+   Unlocked I/O can improve performance in unithreaded apps, but it is not
Tim Waugh 5505e2
+   safe for multithreaded apps. */
Tim Waugh 5505e2
+#undef USE_UNLOCKED_IO
Tim Waugh 5505e2
+
Tim Waugh 5505e2
 /* Version number of package */
Tim Waugh 5505e2
 #undef VERSION
Tim Waugh 5505e2
 
Tim Waugh 5505e2
@@ -1545,6 +1541,9 @@
Tim Waugh 5505e2
 /* Define if sys/ptem.h is required for struct winsize. */
Tim Waugh 5505e2
 #undef WINSIZE_IN_PTEM
Tim Waugh 5505e2
 
Tim Waugh 5505e2
+/* Define if you want to use SELINUX */
Tim Waugh 5505e2
+#undef WITH_SELINUX
Tim Waugh 5505e2
+
Tim Waugh 5505e2
 /* Define to 1 if your processor stores words with the most significant byte
Tim Waugh 5505e2
    first (like Motorola and SPARC, unlike Intel and VAX). */
Tim Waugh 5505e2
 #undef WORDS_BIGENDIAN
Tim Waugh 5505e2
@@ -1690,7 +1689,7 @@
Tim Waugh 5505e2
 /* Define to rpl_nanosleep if the replacement function should be used. */
Tim Waugh 5505e2
 #undef nanosleep
Tim Waugh 5505e2
 
Tim Waugh 5505e2
-/* Define to `long int' if <sys/types.h> does not define. */
Tim Waugh 5505e2
+/* Define to `long' if <sys/types.h> does not define. */
Tim Waugh 5505e2
 #undef off_t
Tim Waugh 5505e2
 
Tim Waugh 5505e2
 /* Define to `int' if <sys/types.h> does not define. */
Tim Waugh 5505e2
@@ -1757,7 +1756,7 @@
Tim Waugh 5505e2
 /* Define to empty if the C compiler doesn't support this keyword. */
Tim Waugh 5505e2
 #undef signed
Tim Waugh 5505e2
 
Tim Waugh 5505e2
-/* Define to `unsigned int' if <sys/types.h> does not define. */
Tim Waugh 5505e2
+/* Define to `unsigned' if <sys/types.h> does not define. */
Tim Waugh 5505e2
 #undef size_t
Tim Waugh 5505e2
 
Tim Waugh 5505e2
 /* Map `socklen_t' to `int' if it is missing. */
Tim Waugh 5505e2
--- coreutils-5.94/man/ls.1.selinux	2006-02-13 12:53:38.000000000 +0000
Tim Waugh 5505e2
+++ coreutils-5.94/man/ls.1	2006-03-24 13:23:45.000000000 +0000
Tim Waugh c3e4c8
@@ -201,6 +201,20 @@
Daniel J Walsh 129baa
 .TP
Daniel J Walsh 129baa
 \fB\-1\fR
Daniel J Walsh 129baa
 list one file per line
Daniel J Walsh 129baa
+.PP
Daniel J Walsh 129baa
+SELinux options:
Daniel J Walsh 129baa
+.TP
Daniel J Walsh 129baa
+\fB\-\-lcontext\fR
Daniel J Walsh 129baa
+Display security context.   Enable \fB\-l\fR. Lines
Daniel J Walsh 129baa
+will probably be too wide for most displays.
Daniel J Walsh 129baa
+.TP
Daniel J Walsh 129baa
+\fB\-Z\fR, \fB\-\-context\fR
Daniel J Walsh 129baa
+Display security context so it fits on most
Daniel J Walsh 129baa
+displays.  Displays only mode, user, group,
Daniel J Walsh 129baa
+security context and file name.
Daniel J Walsh 129baa
+.TP
Daniel J Walsh 129baa
+\fB\-\-scontext\fR
Tim Waugh 5505e2
+Display only security context and file name.
Tim Waugh 5505e2
 .TP
Tim Waugh 5505e2
 \fB\-\-help\fR
Tim Waugh 5505e2
 display this help and exit
Tim Waugh 5505e2
--- coreutils-5.94/man/install.1.selinux	2006-02-13 12:53:38.000000000 +0000
Tim Waugh 5505e2
+++ coreutils-5.94/man/install.1	2006-03-24 13:23:46.000000000 +0000
Tim Waugh c3e4c8
@@ -65,6 +65,11 @@
Daniel J Walsh 129baa
 .TP
Daniel J Walsh 129baa
 \fB\-v\fR, \fB\-\-verbose\fR
Daniel J Walsh 129baa
 print the name of each directory as it is created
Daniel J Walsh 129baa
+.HP
Daniel J Walsh 129baa
+\fB\-P\fR, \fB\-\-preserve_context\fR (SELinux) Preserve security context
Daniel J Walsh 129baa
+.TP
Daniel J Walsh 129baa
+\fB\-Z\fR, \fB\-\-context\fR=\fICONTEXT\fR
Daniel J Walsh 129baa
+(SELinux) Set security context of files and directories
Daniel J Walsh 129baa
 .TP
Daniel J Walsh 129baa
 \fB\-\-help\fR
Daniel J Walsh 129baa
 display this help and exit
Tim Waugh 5505e2
--- coreutils-5.94/man/id.1.selinux	2006-02-13 12:53:38.000000000 +0000
Tim Waugh 5505e2
+++ coreutils-5.94/man/id.1	2006-03-24 13:23:46.000000000 +0000
Tim Waugh 5505e2
@@ -13,6 +13,9 @@
Tim Waugh 5505e2
 \fB\-a\fR
Tim Waugh 5505e2
 ignore, for compatibility with other versions
Tim Waugh 5505e2
 .TP
Tim Waugh 5505e2
+\fB\-Z\fR, \fB\-\-context\fR
Tim Waugh 5505e2
+print only the security context
Tim Waugh 5505e2
+.TP
Tim Waugh 5505e2
 \fB\-g\fR, \fB\-\-group\fR
Tim Waugh 5505e2
 print only the effective group ID
Tim Waugh 5505e2
 .TP
Tim Waugh 5505e2
--- coreutils-5.94/man/stat.1.selinux	2006-02-13 12:53:40.000000000 +0000
Tim Waugh 5505e2
+++ coreutils-5.94/man/stat.1	2006-03-24 13:23:46.000000000 +0000
Tim Waugh 5505e2
@@ -28,6 +28,9 @@
Daniel J Walsh 129baa
 \fB\-t\fR, \fB\-\-terse\fR
Daniel J Walsh 129baa
 print the information in terse form
Daniel J Walsh 129baa
 .TP
Daniel J Walsh 129baa
+\fB\-Z\fR, \fB\-\-context\fR
Daniel J Walsh 129baa
+print security context information for SELinux if available.
Daniel J Walsh 129baa
+.TP
Daniel J Walsh 129baa
 \fB\-\-help\fR
Daniel J Walsh 129baa
 display this help and exit
Daniel J Walsh 129baa
 .TP
Tim Waugh 5505e2
@@ -51,6 +54,9 @@
Tim Waugh c3e4c8
 %d
Tim Waugh c3e4c8
 Device number in decimal
Daniel J Walsh 129baa
 .TP
Daniel J Walsh 129baa
+%C
Daniel J Walsh 129baa
+SELinux security context
Daniel J Walsh 129baa
+.TP
Daniel J Walsh 129baa
 %D
Daniel J Walsh 129baa
 Device number in hex
Daniel J Walsh 129baa
 .TP
Tim Waugh 5505e2
--- /dev/null	2006-03-24 08:16:09.803715750 +0000
Tim Waugh 5505e2
+++ coreutils-5.94/man/runcon.1	2006-03-24 13:23:46.000000000 +0000
Tim Waugh 5505e2
@@ -0,0 +1,43 @@
Tim Waugh 5505e2
+.TH RUNCON "1" "February 2005" "runcon (coreutils) 5.0" "selinux"
Tim Waugh 5505e2
+.SH NAME
Tim Waugh 5505e2
+runcon \- run command with specified security context 
Tim Waugh 5505e2
+.SH SYNOPSIS
Tim Waugh 5505e2
+.B runcon
Tim Waugh 5505e2
+[\fI-c\fR] [\fI-t TYPE\fR] [\fI-l LEVEL\fR] [\fI-u USER\fR] [\fI-r ROLE\fR] \fICOMMAND\fR [\fIARGS...\fR]
Tim Waugh 5505e2
+.PP
Tim Waugh 5505e2
+or
Tim Waugh 5505e2
+.PP
Tim Waugh 5505e2
+.B runcon
Tim Waugh 5505e2
+\fICONTEXT\fR \fICOMMAND\fR [\fIargs...\fR]
Tim Waugh 5505e2
+.PP
Tim Waugh 5505e2
+.br
Tim Waugh 5505e2
+.SH DESCRIPTION
Tim Waugh 5505e2
+.PP
Tim Waugh 5505e2
+.\" Add any additional description here
Tim Waugh 5505e2
+.PP
Tim Waugh 5505e2
+Run COMMAND with completely-specified CONTEXT, or with current or
Tim Waugh 5505e2
+transitioned security context modified by one or more of LEVEL,
Tim Waugh 5505e2
+ROLE, TYPE, and USER.
Tim Waugh 5505e2
+.TP
Tim Waugh 5505e2
+\fB\-c\fR
Tim Waugh 5505e2
+compute process transition before modifying context
Tim Waugh 5505e2
+.TP
Tim Waugh 5505e2
+\fB\-t\fR
Tim Waugh 5505e2
+change current type to the specified type
Tim Waugh 5505e2
+.TP
Tim Waugh 5505e2
+\fB\-l\fR
Tim Waugh 5505e2
+change current level range to the specified range
Tim Waugh 5505e2
+.TP
Tim Waugh 5505e2
+\fB\-r\fR
Tim Waugh 5505e2
+change current role to the specified role
Tim Waugh 5505e2
+.TP
Tim Waugh 5505e2
+\fB\-u\fR
Tim Waugh 5505e2
+change current user to the specified user
Tim Waugh 5505e2
+.PP
Tim Waugh 5505e2
+If none of \fI-c\fR, \fI-t\fR, \fI-u\fR, \fI-r\fR, or \fI-l\fR, is specified,
Tim Waugh 5505e2
+the first argument is used as the complete context.  Any additional
Tim Waugh 5505e2
+arguments after \fICOMMAND\fR are interpreted as arguments to the
Tim Waugh 5505e2
+command.
Tim Waugh 5505e2
+.PP
Tim Waugh 5505e2
+Note that only carefully-chosen contexts are likely to successfully
Tim Waugh 5505e2
+run.
Tim Waugh 5505e2
--- coreutils-5.94/man/Makefile.am.selinux	2006-03-24 13:23:43.000000000 +0000
Tim Waugh 5505e2
+++ coreutils-5.94/man/Makefile.am	2006-03-24 13:23:46.000000000 +0000
Tim Waugh 5505e2
@@ -10,7 +10,7 @@
Tim Waugh 5505e2
   rm.1 rmdir.1 runuser.1 seq.1 sha1sum.1 shred.1 sleep.1 sort.1 split.1 stat.1 stty.1 \
Tim Waugh 5505e2
   su.1 sum.1 sync.1 tac.1 tail.1 tee.1 test.1 touch.1 tr.1 true.1 tsort.1 \
Tim Waugh 5505e2
   tty.1 uname.1 unexpand.1 uniq.1 unlink.1 uptime.1 users.1 vdir.1 wc.1 \
Tim Waugh 5505e2
-  who.1 whoami.1 yes.1
Tim Waugh 5505e2
+  who.1 whoami.1 yes.1 chcon.1 runcon.1
Tim Waugh 5505e2
 
Tim Waugh 5505e2
 man_aux = $(dist_man_MANS:.1=.x)
Tim Waugh 5505e2
 
Tim Waugh 5505e2
@@ -113,6 +113,8 @@
Tim Waugh 5505e2
 who.1:		$(common_dep)	$(srcdir)/who.x		../src/who.c
Tim Waugh 5505e2
 whoami.1:	$(common_dep)	$(srcdir)/whoami.x	../src/whoami.c
Tim Waugh 5505e2
 yes.1:		$(common_dep)	$(srcdir)/yes.x		../src/yes.c
Tim Waugh 5505e2
+chcon.1:	$(common_dep)	$(srcdir)/chcon.x	../src/chcon.c
Tim Waugh 5505e2
+runcon.1:	$(common_dep)	$(srcdir)/runcon.x	../src/runcon.c
Tim Waugh 5505e2
 
Tim Waugh 5505e2
 SUFFIXES = .x .1
Tim Waugh 5505e2
 
Tim Waugh 5505e2
--- coreutils-5.94/man/cp.1.selinux	2006-02-13 12:53:36.000000000 +0000
Tim Waugh 5505e2
+++ coreutils-5.94/man/cp.1	2006-03-24 13:23:46.000000000 +0000
Tim Waugh 5505e2
@@ -57,7 +57,7 @@
Tim Waugh 5505e2
 .TP
Tim Waugh 5505e2
 \fB\-\-preserve\fR[=\fIATTR_LIST\fR]
Tim Waugh 5505e2
 preserve the specified attributes (default:
Tim Waugh 5505e2
-mode,ownership,timestamps), if possible
Tim Waugh 5505e2
+mode,ownership,timestamps) and security contexts, if possible
Tim Waugh 5505e2
 additional attributes: links, all
Tim Waugh 5505e2
 .TP
Tim Waugh 5505e2
 \fB\-\-no\-preserve\fR=\fIATTR_LIST\fR
Tim Waugh 5505e2
@@ -105,6 +105,9 @@
Tim Waugh 5505e2
 \fB\-\-help\fR
Tim Waugh 5505e2
 display this help and exit
Tim Waugh 5505e2
 .TP
Tim Waugh 5505e2
+\fB\-Z\fR, \fB\-\-context\fR=\fICONTEXT\fR
Tim Waugh 5505e2
+set security context of copy to CONTEXT
Tim Waugh 5505e2
+.TP
Tim Waugh 5505e2
 \fB\-\-version\fR
Tim Waugh 5505e2
 output version information and exit
Tim Waugh 5505e2
 .PP
Tim Waugh 5505e2
--- coreutils-5.94/man/mkfifo.1.selinux	2006-02-13 12:53:38.000000000 +0000
Tim Waugh 5505e2
+++ coreutils-5.94/man/mkfifo.1	2006-03-24 13:23:45.000000000 +0000
Tim Waugh 5505e2
@@ -12,6 +12,9 @@
Tim Waugh 5505e2
 .PP
Tim Waugh 5505e2
 Mandatory arguments to long options are mandatory for short options too.
Tim Waugh 5505e2
 .TP
Tim Waugh 5505e2
+\fB\-Z\fR, \fB\-\-context\fR=\fICONTEXT\fR
Tim Waugh 5505e2
+set security context (quoted string)
Tim Waugh 5505e2
+.TP
Tim Waugh 5505e2
 \fB\-m\fR, \fB\-\-mode\fR=\fIMODE\fR
Tim Waugh 5505e2
 set permission mode (as in chmod), not a=rw \- umask
Tim Waugh 5505e2
 .TP
Tim Waugh 5505e2
--- coreutils-5.94/man/mknod.1.selinux	2006-02-13 12:53:38.000000000 +0000
Tim Waugh 5505e2
+++ coreutils-5.94/man/mknod.1	2006-03-24 13:23:46.000000000 +0000
Tim Waugh 5505e2
@@ -12,6 +12,9 @@
Tim Waugh 5505e2
 .PP
Tim Waugh 5505e2
 Mandatory arguments to long options are mandatory for short options too.
Tim Waugh 5505e2
 .TP
Tim Waugh 5505e2
+\fB\-Z\fR, \fB\-\-context\fR=\fICONTEXT\fR
Tim Waugh 5505e2
+set security context (quoted string)
Tim Waugh 5505e2
+.TP
Tim Waugh 5505e2
 \fB\-m\fR, \fB\-\-mode\fR=\fIMODE\fR
Tim Waugh 5505e2
 set permission mode (as in chmod), not a=rw \- umask
Tim Waugh 5505e2
 .TP
Tim Waugh 5505e2
--- coreutils-5.94/man/mkdir.1.selinux	2006-02-13 12:53:39.000000000 +0000
Tim Waugh 5505e2
+++ coreutils-5.94/man/mkdir.1	2006-03-24 13:23:46.000000000 +0000
Tim Waugh 5505e2
@@ -12,6 +12,8 @@
Tim Waugh 5505e2
 .PP
Tim Waugh 5505e2
 Mandatory arguments to long options are mandatory for short options too.
Tim Waugh 5505e2
 .TP
Tim Waugh 5505e2
+\fB\-Z\fR, \fB\-\-context\fR=\fICONTEXT\fR (SELinux) set security context to CONTEXT
Tim Waugh 5505e2
+.TP
Tim Waugh 5505e2
 \fB\-m\fR, \fB\-\-mode\fR=\fIMODE\fR
Tim Waugh 5505e2
 set permission mode (as in chmod), not rwxrwxrwx \- umask
Tim Waugh 5505e2
 .TP
Tim Waugh 5505e2
--- coreutils-5.94/man/dir.1.selinux	2006-02-13 12:53:37.000000000 +0000
Tim Waugh 5505e2
+++ coreutils-5.94/man/dir.1	2006-03-24 13:23:45.000000000 +0000
Tim Waugh 5505e2
@@ -201,6 +201,20 @@
Tim Waugh 5505e2
 .TP
Tim Waugh 5505e2
 \fB\-1\fR
Tim Waugh 5505e2
 list one file per line
Tim Waugh 5505e2
+.PP
Tim Waugh 5505e2
+SELINUX options:
Tim Waugh 5505e2
+.TP
Tim Waugh 5505e2
+\fB\-\-lcontext\fR
Tim Waugh 5505e2
+Display security context.   Enable \fB\-l\fR. Lines
Tim Waugh 5505e2
+will probably be too wide for most displays.
Tim Waugh 5505e2
+.TP
Tim Waugh 5505e2
+\fB\-\-context\fR
Tim Waugh 5505e2
+Display security context so it fits on most
Tim Waugh 5505e2
+displays.  Displays only mode, user, group,
Tim Waugh 5505e2
+security context and file name.
Tim Waugh 5505e2
+.TP
Tim Waugh 5505e2
+\fB\-\-scontext\fR
Tim Waugh 5505e2
+Display only security context and file name.
Tim Waugh 5505e2
 .TP
Tim Waugh 5505e2
 \fB\-\-help\fR
Tim Waugh 5505e2
 display this help and exit
Tim Waugh 5505e2
--- /dev/null	2006-03-24 08:16:09.803715750 +0000
Tim Waugh 5505e2
+++ coreutils-5.94/man/runcon.x	2006-03-24 13:23:46.000000000 +0000
Tim Waugh 5505e2
@@ -0,0 +1,14 @@
Tim Waugh 5505e2
+[NAME]
Tim Waugh 5505e2
+runcon \- run command with specified security context
Tim Waugh 5505e2
+[DESCRIPTION]
Tim Waugh 5505e2
+Run COMMAND with completely-specified CONTEXT, or with current or
Tim Waugh 5505e2
+transitioned security context modified by one or more of LEVEL,
Tim Waugh 5505e2
+ROLE, TYPE, and USER.
Tim Waugh 5505e2
+.PP
Tim Waugh 5505e2
+If none of \fI-c\fR, \fI-t\fR, \fI-u\fR, \fI-r\fR, or \fI-l\fR, is specified,
Tim Waugh 5505e2
+the first argument is used as the complete context.  Any additional
Tim Waugh 5505e2
+arguments after \fICOMMAND\fR are interpreted as arguments to the
Tim Waugh 5505e2
+command.
Tim Waugh 5505e2
+.PP
Tim Waugh 5505e2
+Note that only carefully-chosen contexts are likely to successfully
Tim Waugh 5505e2
+run.
Tim Waugh 5505e2
--- coreutils-5.94/man/vdir.1.selinux	2006-02-13 12:53:42.000000000 +0000
Tim Waugh 5505e2
+++ coreutils-5.94/man/vdir.1	2006-03-24 13:23:46.000000000 +0000
Tim Waugh 5505e2
@@ -201,6 +201,20 @@
Tim Waugh 5505e2
 .TP
Tim Waugh 5505e2
 \fB\-1\fR
Tim Waugh 5505e2
 list one file per line
Tim Waugh 5505e2
+.PP
Tim Waugh 5505e2
+SELINUX options:
Tim Waugh 5505e2
+.TP
Tim Waugh 5505e2
+\fB\-\-lcontext\fR
Tim Waugh 5505e2
+Display security context.   Enable \fB\-l\fR. Lines
Tim Waugh 5505e2
+will probably be too wide for most displays.
Tim Waugh 5505e2
+.TP
Tim Waugh 5505e2
+\fB\-\-context\fR
Tim Waugh 5505e2
+Display security context so it fits on most
Tim Waugh 5505e2
+displays.  Displays only mode, user, group,
Tim Waugh 5505e2
+security context and file name.
Tim Waugh 5505e2
+.TP
Tim Waugh 5505e2
+\fB\-\-scontext\fR
Tim Waugh 5505e2
+Display only security context and file name.
Tim Waugh 5505e2
 .TP
Tim Waugh 5505e2
 \fB\-\-help\fR
Tim Waugh 5505e2
 display this help and exit
Tim Waugh 5505e2
--- /dev/null	2006-03-24 08:16:09.803715750 +0000
Tim Waugh 5505e2
+++ coreutils-5.94/man/chcon.x	2006-03-24 13:23:46.000000000 +0000
Tim Waugh 5505e2
@@ -0,0 +1,4 @@
Tim Waugh 5505e2
+[NAME]
Tim Waugh 5505e2
+chcon \- change file security context
Tim Waugh 5505e2
+[DESCRIPTION]
Tim Waugh 5505e2
+.\" Add any additional description here
Tim Waugh 5505e2
--- /dev/null	2006-03-24 08:16:09.803715750 +0000
Tim Waugh 5505e2
+++ coreutils-5.94/man/chcon.1	2006-03-24 13:23:46.000000000 +0000
cvsdist 4d15f3
@@ -0,0 +1,64 @@
cvsdist 4d15f3
+.TH CHCON 1 "July 2003" "chcon (coreutils) 5.0" "User Commands"
cvsdist 4d15f3
+.SH NAME
cvsdist 4d15f3
+chcon \- change security context
cvsdist 4d15f3
+.SH SYNOPSIS
cvsdist 4d15f3
+.B chcon
cvsdist 4d15f3
+[\fIOPTION\fR]...\fI CONTEXT FILE\fR...
cvsdist 4d15f3
+.br
cvsdist 4d15f3
+.B chcon
cvsdist 4d15f3
+[\fIOPTION\fR]...\fI --reference=RFILE FILE\fR...
cvsdist 4d15f3
+.SH DESCRIPTION
cvsdist 4d15f3
+.PP
cvsdist 4d15f3
+." Add any additional description here
cvsdist 4d15f3
+.PP
cvsdist 4d15f3
+Change the security context of each FILE to CONTEXT.
cvsdist 4d15f3
+.TP
cvsdist 4d15f3
+\fB\-c\fR, \fB\-\-changes\fR
cvsdist 4d15f3
+like verbose but report only when a change is made
cvsdist 4d15f3
+.TP
cvsdist 4d15f3
+\fB\-h\fR, \fB\-\-no\-dereference\fR
cvsdist 4d15f3
+affect symbolic links instead of any referenced file (available only on systems with lchown system call)
cvsdist 4d15f3
+.TP
cvsdist 4d15f3
+\fB\-f\fR, \fB\-\-silent\fR, \fB\-\-quiet\fR
cvsdist 4d15f3
+suppress most error messages
cvsdist 4d15f3
+.TP
cvsdist 4d15f3
+\fB\-l\fR, \fB\-\-range\fR
cvsdist 4d15f3
+set range RANGE in the target security context
cvsdist 4d15f3
+.TP
cvsdist 4d15f3
+\fB\-\-reference\fR=\fIRFILE\fR
cvsdist 4d15f3
+use RFILE's context instead of using a CONTEXT value
cvsdist 4d15f3
+.TP
cvsdist 4d15f3
+\fB\-R\fR, \fB\-\-recursive\fR
cvsdist 4d15f3
+change files and directories recursively
cvsdist 4d15f3
+.TP
cvsdist 4d15f3
+\fB\-r\fR, \fB\-\-role\fR
cvsdist 4d15f3
+set role ROLE in the target security context
cvsdist 4d15f3
+.TP
cvsdist 4d15f3
+\fB\-t\fR, \fB\-\-type\fR
cvsdist 4d15f3
+set type TYPE in the target security context
cvsdist 4d15f3
+.TP
cvsdist 4d15f3
+\fB\-u\fR, \fB\-\-user\fR
cvsdist 4d15f3
+set user USER in the target security context
cvsdist 4d15f3
+.TP
cvsdist 4d15f3
+\fB\-v\fR, \fB\-\-verbose\fR
cvsdist 4d15f3
+output a diagnostic for every file processed
cvsdist 4d15f3
+.TP
cvsdist 4d15f3
+\fB\-\-help\fR
cvsdist 4d15f3
+display this help and exit
cvsdist 4d15f3
+.TP
cvsdist 4d15f3
+\fB\-\-version\fR
cvsdist 4d15f3
+output version information and exit
cvsdist 4d15f3
+.SH "REPORTING BUGS"
Tim Waugh 84c17f
+Report bugs to <https://bugzilla.redhat.com/bugzilla>.
cvsdist 4d15f3
+.SH "SEE ALSO"
cvsdist 4d15f3
+The full documentation for
cvsdist 4d15f3
+.B chcon
cvsdist 4d15f3
+is maintained as a Texinfo manual.  If the
cvsdist 4d15f3
+.B info
cvsdist 4d15f3
+and
cvsdist 4d15f3
+.B chcon
cvsdist 4d15f3
+programs are properly installed at your site, the command
cvsdist 4d15f3
+.IP
cvsdist 4d15f3
+.B info chcon
cvsdist 4d15f3
+.PP
cvsdist 4d15f3
+should give you access to the complete manual.
Tim Waugh 5505e2
--- coreutils-5.94/man/Makefile.in.selinux	2006-02-13 12:51:58.000000000 +0000
Tim Waugh 5505e2
+++ coreutils-5.94/man/Makefile.in	2006-03-24 13:23:46.000000000 +0000
Tim Waugh 5505e2
@@ -107,25 +107,25 @@
Tim Waugh 5505e2
 	$(top_srcdir)/m4/onceonly_2_57.m4 $(top_srcdir)/m4/openat.m4 \
Tim Waugh 5505e2
 	$(top_srcdir)/m4/pathmax.m4 $(top_srcdir)/m4/perl.m4 \
Tim Waugh 5505e2
 	$(top_srcdir)/m4/physmem.m4 $(top_srcdir)/m4/po.m4 \
Tim Waugh 5505e2
-	$(top_srcdir)/m4/posixtm.m4 $(top_srcdir)/m4/posixver.m4 \
Tim Waugh 5505e2
-	$(top_srcdir)/m4/prereq.m4 $(top_srcdir)/m4/progtest.m4 \
Tim Waugh 5505e2
-	$(top_srcdir)/m4/putenv.m4 $(top_srcdir)/m4/quote.m4 \
Tim Waugh 5505e2
-	$(top_srcdir)/m4/quotearg.m4 $(top_srcdir)/m4/readlink.m4 \
Tim Waugh 5505e2
-	$(top_srcdir)/m4/readtokens.m4 $(top_srcdir)/m4/readutmp.m4 \
Tim Waugh 5505e2
-	$(top_srcdir)/m4/regex.m4 $(top_srcdir)/m4/rename.m4 \
Tim Waugh 5505e2
-	$(top_srcdir)/m4/restrict.m4 $(top_srcdir)/m4/rmdir-errno.m4 \
Tim Waugh 5505e2
-	$(top_srcdir)/m4/rmdir.m4 $(top_srcdir)/m4/root-dev-ino.m4 \
Tim Waugh 5505e2
-	$(top_srcdir)/m4/rpmatch.m4 $(top_srcdir)/m4/safe-read.m4 \
Tim Waugh 5505e2
-	$(top_srcdir)/m4/safe-write.m4 $(top_srcdir)/m4/same.m4 \
Tim Waugh 5505e2
-	$(top_srcdir)/m4/save-cwd.m4 $(top_srcdir)/m4/savedir.m4 \
Tim Waugh 5505e2
-	$(top_srcdir)/m4/setenv.m4 $(top_srcdir)/m4/settime.m4 \
Tim Waugh 5505e2
-	$(top_srcdir)/m4/sha1.m4 $(top_srcdir)/m4/sig2str.m4 \
Tim Waugh 5505e2
-	$(top_srcdir)/m4/signed.m4 $(top_srcdir)/m4/socklen.m4 \
Tim Waugh 5505e2
-	$(top_srcdir)/m4/sockpfaf.m4 $(top_srcdir)/m4/ssize_t.m4 \
Tim Waugh 5505e2
-	$(top_srcdir)/m4/st_dm_mode.m4 $(top_srcdir)/m4/stat-macros.m4 \
Tim Waugh 5505e2
-	$(top_srcdir)/m4/stat-prog.m4 $(top_srcdir)/m4/stat-time.m4 \
Tim Waugh 5505e2
-	$(top_srcdir)/m4/stdbool.m4 $(top_srcdir)/m4/stdint_h.m4 \
Tim Waugh 5505e2
-	$(top_srcdir)/m4/stdio-safer.m4 \
Tim Waugh 5505e2
+	$(top_srcdir)/m4/posix_acl.m4 $(top_srcdir)/m4/posixtm.m4 \
Tim Waugh 5505e2
+	$(top_srcdir)/m4/posixver.m4 $(top_srcdir)/m4/prereq.m4 \
Tim Waugh 5505e2
+	$(top_srcdir)/m4/progtest.m4 $(top_srcdir)/m4/putenv.m4 \
Tim Waugh 5505e2
+	$(top_srcdir)/m4/quote.m4 $(top_srcdir)/m4/quotearg.m4 \
Tim Waugh 5505e2
+	$(top_srcdir)/m4/readlink.m4 $(top_srcdir)/m4/readtokens.m4 \
Tim Waugh 5505e2
+	$(top_srcdir)/m4/readutmp.m4 $(top_srcdir)/m4/regex.m4 \
Tim Waugh 5505e2
+	$(top_srcdir)/m4/rename.m4 $(top_srcdir)/m4/restrict.m4 \
Tim Waugh 5505e2
+	$(top_srcdir)/m4/rmdir-errno.m4 $(top_srcdir)/m4/rmdir.m4 \
Tim Waugh 5505e2
+	$(top_srcdir)/m4/root-dev-ino.m4 $(top_srcdir)/m4/rpmatch.m4 \
Tim Waugh 5505e2
+	$(top_srcdir)/m4/safe-read.m4 $(top_srcdir)/m4/safe-write.m4 \
Tim Waugh 5505e2
+	$(top_srcdir)/m4/same.m4 $(top_srcdir)/m4/save-cwd.m4 \
Tim Waugh 5505e2
+	$(top_srcdir)/m4/savedir.m4 $(top_srcdir)/m4/setenv.m4 \
Tim Waugh 5505e2
+	$(top_srcdir)/m4/settime.m4 $(top_srcdir)/m4/sha1.m4 \
Tim Waugh 5505e2
+	$(top_srcdir)/m4/sig2str.m4 $(top_srcdir)/m4/signed.m4 \
Tim Waugh 5505e2
+	$(top_srcdir)/m4/socklen.m4 $(top_srcdir)/m4/sockpfaf.m4 \
Tim Waugh 5505e2
+	$(top_srcdir)/m4/ssize_t.m4 $(top_srcdir)/m4/st_dm_mode.m4 \
Tim Waugh 5505e2
+	$(top_srcdir)/m4/stat-macros.m4 $(top_srcdir)/m4/stat-prog.m4 \
Tim Waugh 5505e2
+	$(top_srcdir)/m4/stat-time.m4 $(top_srcdir)/m4/stdbool.m4 \
Tim Waugh 5505e2
+	$(top_srcdir)/m4/stdint_h.m4 $(top_srcdir)/m4/stdio-safer.m4 \
Tim Waugh 5505e2
 	$(top_srcdir)/m4/stdlib-safer.m4 $(top_srcdir)/m4/stpcpy.m4 \
Tim Waugh 5505e2
 	$(top_srcdir)/m4/strcase.m4 $(top_srcdir)/m4/strcspn.m4 \
Tim Waugh 5505e2
 	$(top_srcdir)/m4/strdup.m4 $(top_srcdir)/m4/strftime.m4 \
Tim Waugh 5505e2
@@ -199,7 +199,6 @@
Tim Waugh 5505e2
 GLIBC21 = @GLIBC21@
Tim Waugh 5505e2
 GMSGFMT = @GMSGFMT@
Tim Waugh 5505e2
 GNU_PACKAGE = @GNU_PACKAGE@
Tim Waugh 5505e2
-GREP = @GREP@
Tim Waugh 5505e2
 HAVE__BOOL = @HAVE__BOOL@
Tim Waugh 5505e2
 HELP2MAN = @HELP2MAN@
Tim Waugh 5505e2
 INSTALL_DATA = @INSTALL_DATA@
Tim Waugh 5505e2
@@ -210,6 +209,7 @@
Tim Waugh 5505e2
 INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@
Tim Waugh 5505e2
 KMEM_GROUP = @KMEM_GROUP@
Tim Waugh 5505e2
 LDFLAGS = @LDFLAGS@
Tim Waugh 5505e2
+LIBACL = @LIBACL@
Tim Waugh 5505e2
 LIBICONV = @LIBICONV@
Tim Waugh 5505e2
 LIBINTL = @LIBINTL@
Tim Waugh 5505e2
 LIBOBJS = @LIBOBJS@
Tim Waugh 5505e2
@@ -220,6 +220,8 @@
Tim Waugh 5505e2
 LIB_FDATASYNC = @LIB_FDATASYNC@
Tim Waugh 5505e2
 LIB_GETHRXTIME = @LIB_GETHRXTIME@
Tim Waugh 5505e2
 LIB_NANOSLEEP = @LIB_NANOSLEEP@
Tim Waugh 5505e2
+LIB_PAM = @LIB_PAM@
Tim Waugh 5505e2
+LIB_SELINUX = @LIB_SELINUX@
Tim Waugh 5505e2
 LN_S = @LN_S@
Tim Waugh 5505e2
 LTLIBICONV = @LTLIBICONV@
Tim Waugh 5505e2
 LTLIBINTL = @LTLIBINTL@
Tim Waugh 5505e2
@@ -271,30 +273,23 @@
Tim Waugh 5505e2
 build_os = @build_os@
Tim Waugh 5505e2
 build_vendor = @build_vendor@
Tim Waugh 5505e2
 datadir = @datadir@
Tim Waugh 5505e2
-datarootdir = @datarootdir@
Tim Waugh 5505e2
-docdir = @docdir@
Tim Waugh 5505e2
-dvidir = @dvidir@
Tim Waugh 5505e2
 exec_prefix = @exec_prefix@
Tim Waugh 5505e2
 host = @host@
Tim Waugh 5505e2
 host_alias = @host_alias@
Tim Waugh 5505e2
 host_cpu = @host_cpu@
Tim Waugh 5505e2
 host_os = @host_os@
Tim Waugh 5505e2
 host_vendor = @host_vendor@
Tim Waugh 5505e2
-htmldir = @htmldir@
Tim Waugh 5505e2
 includedir = @includedir@
Tim Waugh 5505e2
 infodir = @infodir@
Tim Waugh 5505e2
 install_sh = @install_sh@
Tim Waugh 5505e2
 libdir = @libdir@
Tim Waugh 5505e2
 libexecdir = @libexecdir@
Tim Waugh 5505e2
-localedir = @localedir@
Tim Waugh 5505e2
 localstatedir = @localstatedir@
Tim Waugh 5505e2
 mandir = @mandir@
Tim Waugh 5505e2
 mkdir_p = @mkdir_p@
Tim Waugh 5505e2
 oldincludedir = @oldincludedir@
Tim Waugh 5505e2
-pdfdir = @pdfdir@
Tim Waugh 5505e2
 prefix = @prefix@
Tim Waugh 5505e2
 program_transform_name = @program_transform_name@
Tim Waugh 5505e2
-psdir = @psdir@
Tim Waugh 5505e2
 sbindir = @sbindir@
Tim Waugh 5505e2
 sharedstatedir = @sharedstatedir@
Tim Waugh 5505e2
 sysconfdir = @sysconfdir@
Tim Waugh 5505e2
@@ -307,10 +302,10 @@
Tim Waugh 5505e2
   link.1 ln.1 logname.1 \
Tim Waugh 5505e2
   ls.1 md5sum.1 mkdir.1 mkfifo.1 mknod.1 mv.1 nice.1 nl.1 nohup.1 od.1 \
Tim Waugh 5505e2
   paste.1 pathchk.1 pinky.1 pr.1 printenv.1 printf.1 ptx.1 pwd.1 readlink.1 \
Tim Waugh 5505e2
-  rm.1 rmdir.1 seq.1 sha1sum.1 shred.1 sleep.1 sort.1 split.1 stat.1 stty.1 \
Tim Waugh 5505e2
+  rm.1 rmdir.1 runuser.1 seq.1 sha1sum.1 shred.1 sleep.1 sort.1 split.1 stat.1 stty.1 \
cvsdist 4d15f3
   su.1 sum.1 sync.1 tac.1 tail.1 tee.1 test.1 touch.1 tr.1 true.1 tsort.1 \
cvsdist 4d15f3
   tty.1 uname.1 unexpand.1 uniq.1 unlink.1 uptime.1 users.1 vdir.1 wc.1 \
cvsdist 4d15f3
-  who.1 whoami.1 yes.1
cvsdist 4d15f3
+  who.1 whoami.1 yes.1 chcon.1 runcon.1
cvsdist 4d15f3
 
cvsdist 4d15f3
 man_aux = $(dist_man_MANS:.1=.x)
Tim Waugh 5505e2
 EXTRA_DIST = $(man_aux) help2man
Tim Waugh 5505e2
@@ -600,6 +595,7 @@
Tim Waugh 5505e2
 readlink.1:	$(common_dep)	$(srcdir)/readlink.x	../src/readlink.c
Tim Waugh 5505e2
 rm.1:		$(common_dep)	$(srcdir)/rm.x		../src/rm.c
Tim Waugh 5505e2
 rmdir.1:	$(common_dep)	$(srcdir)/rmdir.x	../src/rmdir.c
Tim Waugh 5505e2
+runuser.1:	$(common_dep)	$(srcdir)/runuser.x	../src/runuser.c
Tim Waugh 5505e2
 seq.1:		$(common_dep)	$(srcdir)/seq.x		../src/seq.c
Tim Waugh 5505e2
 sha1sum.1:	$(common_dep)	$(srcdir)/sha1sum.x	../src/md5sum.c
Tim Waugh 5505e2
 shred.1:	$(common_dep)	$(srcdir)/shred.x	../src/shred.c
Tim Waugh 5505e2
@@ -631,6 +627,8 @@
cvsdist 4d15f3
 who.1:		$(common_dep)	$(srcdir)/who.x		../src/who.c
cvsdist 4d15f3
 whoami.1:	$(common_dep)	$(srcdir)/whoami.x	../src/whoami.c
cvsdist 4d15f3
 yes.1:		$(common_dep)	$(srcdir)/yes.x		../src/yes.c
cvsdist 4d15f3
+chcon.1:	$(common_dep)	$(srcdir)/chcon.x	../src/chcon.c
cvsdist 4d15f3
+runcon.1:	$(common_dep)	$(srcdir)/runcon.x	../src/runcon.c
cvsdist 4d15f3
 
Tim Waugh 5505e2
 # Note the use of $t/$*, rather than just `$*' as in other packages.
Tim Waugh 5505e2
 # That is necessary to avoid failures for programs that are also shell built-in