Ondrej Vasik c77f9b
diff -urNp coreutils-8.1-orig/AUTHORS coreutils-8.1/AUTHORS
Ondrej Vasik c77f9b
--- coreutils-8.1-orig/AUTHORS	2009-11-06 18:04:10.000000000 +0100
Ondrej Vasik c77f9b
+++ coreutils-8.1/AUTHORS	2009-11-20 13:06:26.000000000 +0100
Ondrej Vasik c77f9b
@@ -65,6 +65,7 @@ readlink: Dmitry V. Levin
Ondrej Vasik e18e41
 rm: Paul Rubin, David MacKenzie, Richard M. Stallman, Jim Meyering
Ondrej Vasik 893c38
 rmdir: David MacKenzie
Ondrej Vasik 893c38
 runcon: Russell Coker
Ondrej Vasik 67e264
+runuser: David MacKenzie, Dan Walsh
Ondrej Vasik 893c38
 seq: Ulrich Drepper
Ondrej Vasik 893c38
 sha1sum: Ulrich Drepper, Scott Miller, David Madore
Ondrej Vasik 67e264
 sha224sum: Ulrich Drepper, Scott Miller, David Madore
Ondrej Vasik c77f9b
diff -urNp coreutils-8.1-orig/man/help2man coreutils-8.1/man/help2man
Ondrej Vasik c77f9b
--- coreutils-8.1-orig/man/help2man	2009-09-23 10:25:44.000000000 +0200
Ondrej Vasik c77f9b
+++ coreutils-8.1/man/help2man	2009-11-20 13:06:26.000000000 +0100
Ondrej Vasik c77f9b
@@ -556,6 +556,9 @@ while (length)
Ondrej Vasik c77f9b
     $include{$sect} .= $content;
Ondrej Vasik c77f9b
 }
Ondrej Vasik c77f9b
 
Ondrej Vasik c77f9b
+# There is no info documentation for runuser (shared with su).
Ondrej Vasik c77f9b
+$opt_no_info = 1 if $program eq 'runuser';
Ondrej Vasik c77f9b
+
Ondrej Vasik c77f9b
 # Refer to the real documentation.
Ondrej Vasik c77f9b
 unless ($opt_no_info)
Ondrej Vasik c77f9b
 {
Ondrej Vasik c77f9b
diff -urNp coreutils-8.1-orig/man/Makefile.am coreutils-8.1/man/Makefile.am
Ondrej Vasik c77f9b
--- coreutils-8.1-orig/man/Makefile.am	2009-11-06 18:04:10.000000000 +0100
Ondrej Vasik c77f9b
+++ coreutils-8.1/man/Makefile.am	2009-11-20 13:06:26.000000000 +0100
Ondrej Vasik c77f9b
@@ -94,6 +94,7 @@ readlink.1:	$(common_dep)	$(srcdir)/read
Ondrej Vasik 893c38
 rm.1:		$(common_dep)	$(srcdir)/rm.x		../src/rm.c
Ondrej Vasik 893c38
 rmdir.1:	$(common_dep)	$(srcdir)/rmdir.x	../src/rmdir.c
Ondrej Vasik 893c38
 runcon.1:	$(common_dep)	$(srcdir)/runcon.x	../src/runcon.c
Ondrej Vasik 893c38
+runuser.1:	$(common_dep)	$(srcdir)/runuser.x	../src/su.c
Ondrej Vasik 893c38
 seq.1:		$(common_dep)	$(srcdir)/seq.x		../src/seq.c
Ondrej Vasik 893c38
 sha1sum.1:	$(common_dep)	$(srcdir)/sha1sum.x	../src/md5sum.c
Ondrej Vasik 893c38
 sha224sum.1:	$(common_dep)	$(srcdir)/sha224sum.x	../src/md5sum.c
Ondrej Vasik c77f9b
diff -urNp coreutils-8.1-orig/man/runuser.x coreutils-8.1/man/runuser.x
Ondrej Vasik c77f9b
--- coreutils-8.1-orig/man/runuser.x	1970-01-01 01:00:00.000000000 +0100
Ondrej Vasik c77f9b
+++ coreutils-8.1/man/runuser.x	2009-11-20 13:06:26.000000000 +0100
Kamil Dudka b26491
@@ -0,0 +1,12 @@
Kamil Dudka b26491
+[NAME]
Kamil Dudka b26491
+runuser \- run a shell with substitute user and group IDs
Kamil Dudka b26491
+[DESCRIPTION]
Kamil Dudka b26491
+.\" Add any additional description here
Kamil Dudka b26491
+[SEE ALSO]
Kamil Dudka b26491
+.TP
Kamil Dudka b26491
+More detailed Texinfo documentation could be found by command
Kamil Dudka b26491
+.TP
Ondrej Vasik 066fd3
+\t\fBinfo coreutils \(aqsu invocation\(aq\fR\t
Kamil Dudka b26491
+.TP
Ondrej Vasik 066fd3
+since the command \fBrunuser\fR is trimmed down version of command \fBsu\fR.
Kamil Dudka b26491
+.br
Ondrej Vasik c77f9b
diff -urNp coreutils-8.1-orig/README coreutils-8.1/README
Ondrej Vasik c77f9b
--- coreutils-8.1-orig/README	2009-11-06 18:04:10.000000000 +0100
Ondrej Vasik c77f9b
+++ coreutils-8.1/README	2009-11-20 13:06:26.000000000 +0100
Ondrej Vasik e18e41
@@ -12,10 +12,10 @@ The programs that can be built with this
Ondrej Vasik 0363d6
   factor false fmt fold groups head hostid hostname id install join kill
Ondrej Vasik 0363d6
   link ln logname ls md5sum mkdir mkfifo mknod mktemp mv nice nl nohup
Ondrej Vasik c77f9b
   nproc od paste pathchk pinky pr printenv printf ptx pwd readlink rm rmdir
Ondrej Vasik 0363d6
-  runcon seq sha1sum sha224sum sha256sum sha384sum sha512sum shred shuf
Ondrej Vasik e1052e
-  sleep sort split stat stdbuf stty su sum sync tac tail tee test timeout
Ondrej Vasik e1052e
-  touch tr true truncate tsort tty uname unexpand uniq unlink uptime users
Ondrej Vasik e1052e
-  vdir wc who whoami yes
Ondrej Vasik 0363d6
+  runcon runuser seq sha1sum sha224sum sha256sum sha384sum sha512sum shred
Ondrej Vasik e1052e
+  shuf sleep sort split stat stdbuf stty su sum sync tac tail tee test
Ondrej Vasik e1052e
+  timeout touch tr true truncate tsort tty uname unexpand uniq unlink uptime
Ondrej Vasik e1052e
+  users vdir wc who whoami yes
Ondrej Vasik 893c38
 
Ondrej Vasik 0363d6
 See the file NEWS for a list of major changes in the current release.
Ondrej Vasik e18e41
 
Ondrej Vasik c77f9b
diff -urNp coreutils-8.1-orig/src/Makefile.am coreutils-8.1/src/Makefile.am
Ondrej Vasik c77f9b
--- coreutils-8.1-orig/src/Makefile.am	2009-11-20 13:06:00.000000000 +0100
Ondrej Vasik c77f9b
+++ coreutils-8.1/src/Makefile.am	2009-11-20 13:06:26.000000000 +0100
Ondrej Vasik c77f9b
@@ -100,6 +100,7 @@ EXTRA_PROGRAMS = \
Ondrej Vasik c77f9b
   rm		\
Ondrej Vasik c77f9b
   rmdir		\
Ondrej Vasik c77f9b
   runcon	\
Ondrej Vasik c77f9b
+  runuser \
Ondrej Vasik c77f9b
   seq		\
Ondrej Vasik c77f9b
   sha1sum	\
Ondrej Vasik c77f9b
   sha224sum	\
Ondrej Vasik c77f9b
@@ -296,6 +297,10 @@ cp_LDADD += $(copy_LDADD)
Ondrej Vasik c77f9b
 ginstall_LDADD += $(copy_LDADD)
Ondrej Vasik c77f9b
 mv_LDADD += $(copy_LDADD)
Ondrej Vasik 893c38
 
Ondrej Vasik 893c38
+runuser_SOURCES = su.c
Ondrej Vasik 893c38
+runuser_CFLAGS = -DRUNUSER -DAUTHORS="\"David MacKenzie, Dan Walsh\""
Ondrej Vasik 893c38
+runuser_LDADD = $(LDADD) $(LIB_CRYPT) @LIB_PAM@
Ondrej Vasik 893c38
+
Ondrej Vasik c77f9b
 remove_LDADD =
Ondrej Vasik c77f9b
 mv_LDADD += $(remove_LDADD)
Ondrej Vasik c77f9b
 rm_LDADD += $(remove_LDADD)
Ondrej Vasik c77f9b
@@ -396,7 +401,7 @@ RELEASE_YEAR = \
Ondrej Vasik 893c38
   `sed -n '/.*COPYRIGHT_YEAR = \([0-9][0-9][0-9][0-9]\) };/s//\1/p' \
Ondrej Vasik 893c38
     $(top_srcdir)/lib/version-etc.c`
Ondrej Vasik 893c38
 
Ondrej Vasik 893c38
-all-local: su$(EXEEXT)
Ondrej Vasik 893c38
+all-local: su$(EXEEXT) runuser
Ondrej Vasik 893c38
 
Ondrej Vasik 893c38
 installed_su = $(DESTDIR)$(bindir)/`echo su|sed '$(transform)'`
Ondrej Vasik 893c38
 
Ondrej Vasik c77f9b
diff -urNp coreutils-8.1-orig/src/su.c coreutils-8.1/src/su.c
Ondrej Vasik c77f9b
--- coreutils-8.1-orig/src/su.c	2009-11-20 13:06:00.000000000 +0100
Ondrej Vasik c77f9b
+++ coreutils-8.1/src/su.c	2009-11-20 13:06:26.000000000 +0100
Ondrej Vasik c77f9b
@@ -102,9 +102,15 @@
Tim Waugh 2190ea
 #include "error.h"
Tim Waugh 2190ea
 
Tim Waugh c3e4c8
 /* The official name of this program (e.g., no `g' prefix).  */
Tim Waugh 2190ea
+#ifndef RUNUSER
Tim Waugh c3e4c8
 #define PROGRAM_NAME "su"
Tim Waugh 2190ea
+#else
Tim Waugh 2190ea
+#define PROGRAM_NAME "runuser"
Tim Waugh 2190ea
+#endif
Tim Waugh c3e4c8
 
Tim Waugh c3e4c8
+#ifndef AUTHORS
Ondrej Vasik 5f9af7
 #define AUTHORS proper_name ("David MacKenzie")
Tim Waugh c3e4c8
+#endif
Tim Waugh c3e4c8
 
Tim Waugh c3e4c8
 #if HAVE_PATHS_H
Tim Waugh c3e4c8
 # include <paths.h>
Ondrej Vasik c77f9b
@@ -142,9 +148,16 @@
Tim Waugh c3e4c8
 #ifndef USE_PAM
Ondrej Vasik c4b1fe
 char *crypt (char const *key, char const *salt);
Tim Waugh c3e4c8
 #endif
Tim Waugh c3e4c8
+#ifndef CHECKPASSWD
Tim Waugh c3e4c8
+#define CHECKPASSWD 1
Tim Waugh c3e4c8
+#endif
Ondrej Vasik 207519
 
Tim Waugh dfdbf3
 static void run_shell (char const *, char const *, char **, size_t,
Tim Waugh dfdbf3
-	const struct passwd *)
Ondrej Vasik 250517
+        const struct passwd *
Tim Waugh dfdbf3
+#ifdef RUNUSER
Ondrej Vasik 250517
+                       , gid_t *groups, int num_groups
Tim Waugh dfdbf3
+#endif
Ondrej Vasik 250517
+        )
Tim Waugh dfdbf3
 #ifdef USE_PAM
Tim Waugh dfdbf3
 	;
Tim Waugh dfdbf3
 #else
Ondrej Vasik c77f9b
@@ -171,6 +184,10 @@ static struct option const longopts[] =
Tim Waugh dfdbf3
   {"login", no_argument, NULL, 'l'},
Tim Waugh dfdbf3
   {"preserve-environment", no_argument, NULL, 'p'},
Tim Waugh dfdbf3
   {"shell", required_argument, NULL, 's'},
Tim Waugh dfdbf3
+#ifdef RUNUSER
Tim Waugh dfdbf3
+  {"group", required_argument, NULL, 'g'},
Tim Waugh dfdbf3
+  {"supp-group", required_argument, NULL, 'G'},
Tim Waugh dfdbf3
+#endif
Tim Waugh dfdbf3
   {GETOPT_HELP_OPTION_DECL},
Tim Waugh dfdbf3
   {GETOPT_VERSION_OPTION_DECL},
Tim Waugh dfdbf3
   {NULL, 0, NULL, 0}
Ondrej Vasik c77f9b
@@ -272,10 +289,12 @@ correct_password (const struct passwd *p
Tim Waugh 2190ea
   retval = pam_start(PROGRAM_NAME, pw->pw_name, &conv, &pamh);
Tim Waugh 2190ea
   PAM_BAIL_P;
Tim Waugh 2190ea
 
Tim Waugh 2190ea
+#ifndef RUNUSER
Tim Waugh 2190ea
   if (getuid() != 0 && !isatty(0)) {
Tim Waugh 2190ea
 	fprintf(stderr, "standard in must be a tty\n");
Tim Waugh 2190ea
 	exit(1);
Tim Waugh 2190ea
   }
Tim Waugh 2190ea
+#endif
Tim Waugh 2190ea
 
Tim Waugh 2190ea
   caller = getpwuid(getuid());
Tim Waugh 2190ea
   if(caller != NULL && caller->pw_name != NULL) {
Ondrej Vasik c77f9b
@@ -292,6 +311,11 @@ correct_password (const struct passwd *p
Tim Waugh 2190ea
     retval = pam_set_item(pamh, PAM_TTY, tty_name);
Tim Waugh 2190ea
     PAM_BAIL_P;
Tim Waugh 2190ea
   }
Tim Waugh 2190ea
+#ifdef RUNUSER
Tim Waugh 2190ea
+  if (getuid() != geteuid())
Tim Waugh 2190ea
+    /* safety net: deny operation if we are suid by accident */
Ondrej Vasik 0363d6
+    error(EXIT_FAILURE, 1, "runuser may not be setuid");
Tim Waugh 2190ea
+#else
Tim Waugh 2190ea
   retval = pam_authenticate(pamh, 0);
Tim Waugh 2190ea
   PAM_BAIL_P;
Tim Waugh 2190ea
   retval = pam_acct_mgmt(pamh, 0);
Ondrej Vasik c77f9b
@@ -301,6 +325,7 @@ correct_password (const struct passwd *p
Tim Waugh 2190ea
     PAM_BAIL_P;
Tim Waugh 2190ea
   }
Tim Waugh 2190ea
   PAM_BAIL_P;
Tim Waugh 2190ea
+#endif
Tim Waugh 2190ea
   /* must be authenticated if this point was reached */
Tim Waugh 2190ea
   return 1;
Tim Waugh 2190ea
 #else /* !USE_PAM */
Ondrej Vasik c77f9b
@@ -382,11 +407,22 @@ modify_environment (const struct passwd 
Tim Waugh dfdbf3
 /* Become the user and group(s) specified by PW.  */
Tim Waugh dfdbf3
 
Tim Waugh dfdbf3
 static void
Tim Waugh dfdbf3
-change_identity (const struct passwd *pw)
Tim Waugh dfdbf3
+change_identity (const struct passwd *pw
Tim Waugh dfdbf3
+#ifdef RUNUSER
Ondrej Vasik 250517
+                 , gid_t *groups, int num_groups
Tim Waugh dfdbf3
+#endif
Ondrej Vasik 250517
+        )
Tim Waugh dfdbf3
 {
Tim Waugh dfdbf3
 #ifdef HAVE_INITGROUPS
Tim Waugh dfdbf3
+  int rc = 0;
Tim Waugh dfdbf3
   errno = 0;
Tim Waugh dfdbf3
-  if (initgroups (pw->pw_name, pw->pw_gid) == -1) {
Tim Waugh dfdbf3
+#ifdef RUNUSER
Tim Waugh dfdbf3
+  if (num_groups)
Tim Waugh dfdbf3
+    rc = setgroups(num_groups, groups);
Tim Waugh dfdbf3
+  else
Tim Waugh dfdbf3
+#endif
Tim Waugh dfdbf3
+    rc = initgroups(pw->pw_name, pw->pw_gid);
Tim Waugh dfdbf3
+  if (rc == -1) {
Tim Waugh dfdbf3
 #ifdef USE_PAM
Tim Waugh dfdbf3
     pam_close_session(pamh, 0);
Tim Waugh dfdbf3
     pam_end(pamh, PAM_ABORT);
Ondrej Vasik c77f9b
@@ -433,7 +469,11 @@ pam_copyenv (pam_handle_t *pamh)
Tim Waugh dfdbf3
 
Tim Waugh dfdbf3
 static void
Tim Waugh dfdbf3
 run_shell (char const *shell, char const *command, char **additional_args,
Ondrej Vasik 250517
-           size_t n_additional_args, const struct passwd *pw)
Ondrej Vasik 250517
+           size_t n_additional_args, const struct passwd *pw
Tim Waugh dfdbf3
+#ifdef RUNUSER
Ondrej Vasik 250517
+           , gid_t *groups, int num_groups
Tim Waugh dfdbf3
+#endif
Ondrej Vasik 250517
+        )
Tim Waugh dfdbf3
 {
Tim Waugh dfdbf3
   size_t n_args = 1 + fast_startup + 2 * !!command + n_additional_args + 1;
Tim Waugh dfdbf3
   char const **args = xnmalloc (n_args, sizeof *args);
Ondrej Vasik c77f9b
@@ -464,7 +504,11 @@ run_shell (char const *shell, char const
Tim Waugh dfdbf3
 
Tim Waugh dfdbf3
   child = fork();
Tim Waugh dfdbf3
   if (child == 0) {  /* child shell */
Tim Waugh dfdbf3
-  change_identity (pw);
Tim Waugh dfdbf3
+  change_identity (pw
Tim Waugh dfdbf3
+#ifdef RUNUSER
Ondrej Vasik 250517
+                   , groups, num_groups
Tim Waugh dfdbf3
+#endif
Ondrej Vasik 250517
+          );
Tim Waugh dfdbf3
   pam_end(pamh, 0);
Tim Waugh dfdbf3
   if (!same_session)
Tim Waugh dfdbf3
     setsid ();
Ondrej Vasik c77f9b
@@ -608,6 +652,28 @@ usage (int status)
Ondrej Vasik 893c38
   else
Ondrej Vasik 893c38
     {
Ondrej Vasik 893c38
       printf (_("Usage: %s [OPTION]... [-] [USER [ARG]...]\n"), program_name);
Ondrej Vasik 893c38
+#ifdef RUNUSER
Ondrej Vasik 066fd3
+      printf (_("\
Ondrej Vasik 066fd3
+Change the effective user id and group id to that of USER.  Only session PAM\n\
Ondrej Vasik 066fd3
+hooks are run, and there is no password prompt.  This command is useful only\n\
Ondrej Vasik 893c38
+when run as the root user.  If run as a non-root user without privilege\n\
Ondrej Vasik 066fd3
+to set user ID, the command will fail as the binary is not setuid.\n\
Ondrej Vasik 066fd3
+As %s doesn't run auth and account PAM hooks, it runs with lower overhead\n\
Ondrej Vasik 066fd3
+than su.\n\
Ondrej Vasik 893c38
+\n\
Ondrej Vasik 893c38
+  -, -l, --login               make the shell a login shell, uses runuser-l\n\
Ondrej Vasik 893c38
+                               PAM file instead of default one\n\
Ondrej Vasik 893c38
+  -g --group=group             specify the primary group\n\
Ondrej Vasik 893c38
+  -G --supp-group=group        specify a supplemental group\n\
Ondrej Vasik 893c38
+  -c, --command=COMMAND        pass a single COMMAND to the shell with -c\n\
Ondrej Vasik 893c38
+  --session-command=COMMAND    pass a single COMMAND to the shell with -c\n\
Ondrej Vasik 893c38
+                               and do not create a new session\n\
Ondrej Vasik 893c38
+  -f, --fast                   pass -f to the shell (for csh or tcsh)\n\
Ondrej Vasik 893c38
+  -m, --preserve-environment   do not reset environment variables\n\
Ondrej Vasik 893c38
+  -p                           same as -m\n\
Ondrej Vasik 893c38
+  -s, --shell=SHELL            run SHELL if /etc/shells allows it\n\
Ondrej Vasik 066fd3
+"), program_name);
Ondrej Vasik 893c38
+#else
Ondrej Vasik 893c38
       fputs (_("\
Ondrej Vasik 893c38
 Change the effective user id and group id to that of USER.\n\
Ondrej Vasik 893c38
 \n\
Ondrej Vasik c77f9b
@@ -620,6 +686,7 @@ Change the effective user id and group i
Ondrej Vasik 893c38
   -p                           same as -m\n\
Ondrej Vasik 893c38
   -s, --shell=SHELL            run SHELL if /etc/shells allows it\n\
Ondrej Vasik 893c38
 "), stdout);
Ondrej Vasik 893c38
+#endif
Ondrej Vasik 893c38
       fputs (HELP_OPTION_DESCRIPTION, stdout);
Ondrej Vasik 893c38
       fputs (VERSION_OPTION_DESCRIPTION, stdout);
Ondrej Vasik 893c38
       fputs (_("\
Ondrej Vasik c77f9b
@@ -641,6 +708,12 @@ main (int argc, char **argv)
Tim Waugh dfdbf3
   char *shell = NULL;
Tim Waugh dfdbf3
   struct passwd *pw;
Tim Waugh dfdbf3
   struct passwd pw_copy;
Tim Waugh dfdbf3
+#ifdef RUNUSER
Tim Waugh dfdbf3
+  struct group *gr;
Tim Waugh dfdbf3
+  gid_t groups[NGROUPS_MAX];
Tim Waugh dfdbf3
+  int num_supp_groups = 0;
Tim Waugh dfdbf3
+  int use_gid = 0;
Tim Waugh dfdbf3
+#endif
Tim Waugh dfdbf3
 
Tim Waugh dfdbf3
   initialize_main (&argc, &argv);
Ondrej Vasik e18e41
   set_program_name (argv[0]);
Ondrej Vasik c77f9b
@@ -655,7 +728,11 @@ main (int argc, char **argv)
Tim Waugh dfdbf3
   simulate_login = false;
Tim Waugh dfdbf3
   change_environment = true;
Tim Waugh dfdbf3
 
Tim Waugh dfdbf3
-  while ((optc = getopt_long (argc, argv, "c:flmps:", longopts, NULL)) != -1)
Tim Waugh dfdbf3
+  while ((optc = getopt_long (argc, argv, "c:flmps:"
Tim Waugh dfdbf3
+#ifdef RUNUSER
Ondrej Vasik 250517
+                              "g:G:"
Tim Waugh dfdbf3
+#endif
Ondrej Vasik 250517
+                              , longopts, NULL)) != -1)
Tim Waugh dfdbf3
     {
Tim Waugh dfdbf3
       switch (optc)
Ondrej Vasik 250517
         {
Ondrej Vasik c77f9b
@@ -685,6 +762,28 @@ main (int argc, char **argv)
Ondrej Vasik 250517
           shell = optarg;
Ondrej Vasik 250517
           break;
Tim Waugh dfdbf3
 
Tim Waugh dfdbf3
+#ifdef RUNUSER
Ondrej Vasik 250517
+        case 'g':
Ondrej Vasik 250517
+          gr = getgrnam(optarg);
Ondrej Vasik 250517
+          if (!gr)
Ondrej Vasik 250517
+            error (EXIT_FAILURE, 0, _("group %s does not exist"), optarg);
Ondrej Vasik 250517
+          use_gid = 1;
Ondrej Vasik 250517
+          groups[0] = gr->gr_gid;
Ondrej Vasik 250517
+          break;
Tim Waugh dfdbf3
+
Ondrej Vasik 250517
+        case 'G':
Ondrej Vasik 250517
+          num_supp_groups++;
Ondrej Vasik 250517
+          if (num_supp_groups >= NGROUPS_MAX)
Ondrej Vasik 250517
+            error (EXIT_FAILURE, 0,
Ondrej Vasik 250517
+                   _("Can't specify more than %d supplemental groups"),
Ondrej Vasik 250517
+                   NGROUPS_MAX - 1);
Ondrej Vasik 250517
+          gr = getgrnam(optarg);
Ondrej Vasik 250517
+          if (!gr)
Ondrej Vasik 250517
+            error (EXIT_FAILURE, 0, _("group %s does not exist"), optarg);
Ondrej Vasik 250517
+          groups[num_supp_groups] = gr->gr_gid;
Ondrej Vasik 250517
+          break;
Tim Waugh dfdbf3
+#endif
Tim Waugh dfdbf3
+
Ondrej Vasik 250517
         case_GETOPT_HELP_CHAR;
Tim Waugh dfdbf3
 
Ondrej Vasik 250517
         case_GETOPT_VERSION_CHAR (PROGRAM_NAME, AUTHORS);
Ondrej Vasik c77f9b
@@ -723,7 +822,20 @@ main (int argc, char **argv)
Ondrej Vasik 250517
                           : DEFAULT_SHELL);
Tim Waugh c3e4c8
   endpwent ();
Tim Waugh c3e4c8
 
Tim Waugh c3e4c8
-  if (!correct_password (pw))
Tim Waugh dfdbf3
+#ifdef RUNUSER
Tim Waugh dfdbf3
+  if (num_supp_groups && !use_gid)
Tim Waugh dfdbf3
+  {
Tim Waugh dfdbf3
+    pw->pw_gid = groups[1];
Tim Waugh dfdbf3
+    memmove (groups, groups + 1, sizeof(gid_t) * num_supp_groups);
Tim Waugh dfdbf3
+  }
Tim Waugh dfdbf3
+  else if (use_gid)
Tim Waugh dfdbf3
+  {
Tim Waugh dfdbf3
+    pw->pw_gid = groups[0];
Tim Waugh dfdbf3
+    num_supp_groups++;
Tim Waugh dfdbf3
+  }
Tim Waugh dfdbf3
+#endif
Tim Waugh dfdbf3
+
Tim Waugh c3e4c8
+  if (CHECKPASSWD && !correct_password (pw))
Tim Waugh c3e4c8
     {
Tim Waugh c3e4c8
 #ifdef SYSLOG_FAILURE
Tim Waugh c3e4c8
       log_su (pw, false);
Ondrej Vasik c77f9b
@@ -755,7 +867,11 @@ main (int argc, char **argv)
Tim Waugh dfdbf3
   modify_environment (pw, shell);
Tim Waugh dfdbf3
 
Tim Waugh dfdbf3
 #ifndef USE_PAM
Tim Waugh dfdbf3
-  change_identity (pw);
Tim Waugh dfdbf3
+  change_identity (pw
Tim Waugh dfdbf3
+#ifdef RUNUSER
Ondrej Vasik 250517
+                   , groups, num_supp_groups
Tim Waugh dfdbf3
+#endif
Ondrej Vasik 250517
+                   );
Tim Waugh dfdbf3
 #endif
Tim Waugh dfdbf3
 
Ondrej Vasik c77f9b
   /* error() flushes stderr, but does not check for write failure.
Ondrej Vasik c77f9b
@@ -766,5 +882,9 @@ main (int argc, char **argv)
Ondrej Vasik c77f9b
   if (ferror (stderr))
Ondrej Vasik c77f9b
     exit (EXIT_CANCELED);
Ondrej Vasik c77f9b
 
Tim Waugh dfdbf3
-  run_shell (shell, command, argv + optind, MAX (0, argc - optind), pw);
Tim Waugh dfdbf3
+  run_shell (shell, command, argv + optind, MAX (0, argc - optind), pw
Tim Waugh dfdbf3
+#ifdef RUNUSER
Ondrej Vasik 250517
+             , groups, num_supp_groups
Tim Waugh dfdbf3
+#endif
Ondrej Vasik 250517
+             );
Tim Waugh dfdbf3
 }
Ondrej Vasik c77f9b
diff -urNp coreutils-8.1-orig/tests/misc/help-version coreutils-8.1/tests/misc/help-version
Ondrej Vasik c77f9b
--- coreutils-8.1-orig/tests/misc/help-version	2009-11-14 15:01:44.000000000 +0100
Ondrej Vasik c77f9b
+++ coreutils-8.1/tests/misc/help-version	2009-11-20 13:06:26.000000000 +0100
Ondrej Vasik c77f9b
@@ -34,6 +34,7 @@ expected_failure_status_nohup=125
Ondrej Vasik c77f9b
 expected_failure_status_stdbuf=125
Ondrej Vasik c77f9b
 expected_failure_status_su=125
Ondrej Vasik c77f9b
 expected_failure_status_timeout=125
Ondrej Vasik c77f9b
+expected_failure_status_runuser=125
Ondrej Vasik c77f9b
 expected_failure_status_printenv=2
Ondrej Vasik c77f9b
 expected_failure_status_tty=3
Ondrej Vasik c77f9b
 expected_failure_status_sort=2
Ondrej Vasik c77f9b
@@ -153,6 +154,7 @@ seq_args=10
Ondrej Vasik 12996d
 sleep_setup () { args=0; }
Ondrej Vasik 12996d
 su_setup () { args=--version; }
Ondrej Vasik 12996d
 stdbuf_setup () { args="-oL true"; }
Ondrej Vasik 12996d
+runuser_setup () { args=--version; }
Ondrej Vasik 12996d
 timeout_setup () { args=--version; }
Tim Waugh c3e4c8
 
Ondrej Vasik 893c38
 # I'd rather not run sync, since it spins up disks that I've
Ondrej Vasik c77f9b
diff -urNp coreutils-8.1-orig/tests/misc/invalid-opt coreutils-8.1/tests/misc/invalid-opt
Ondrej Vasik c77f9b
--- coreutils-8.1-orig/tests/misc/invalid-opt	2009-10-26 10:05:25.000000000 +0100
Ondrej Vasik c77f9b
+++ coreutils-8.1/tests/misc/invalid-opt	2009-11-20 13:06:26.000000000 +0100
Ondrej Vasik c77f9b
@@ -37,6 +37,7 @@ my %exit_status =
Ondrej Vasik c77f9b
     sort => 2,
Ondrej Vasik c77f9b
     stdbuf => 125,
Ondrej Vasik c77f9b
     su => 125,
Ondrej Vasik c77f9b
+    runuser => 125,
Ondrej Vasik c77f9b
     test => 0,
Ondrej Vasik c77f9b
     timeout => 125,
Ondrej Vasik c77f9b
     true => 0,