* src/chroot.c (main): Use EXIT_CANCELED, not EXIT_FAILURE.
* src/env.c (main): Likewise.
* src/nice.c (main): Likewise.
* src/su.c (change_identity, main): Likewise.
* doc/coreutils.texi (chroot invocation, env invocation)
(nice invocation, su invocation): Document this.
* NEWS: Likewise.
* tests/misc/invalid-opt (exit_status): Adjust expected results.
* tests/misc/help-version (expected_failure_status): Likewise.
were first renamed or unlinked or never modified.
[The race was introduced in coreutils-7.5]
+** Changes in behavior
+
+ chroot, env, nice, and su fail with status 125, rather than 1, on
+ internal error such as failure to parse command line arguments; this
+ is for consistency with stdbuf and timeout, and avoids ambiguity
+ with the invoked command failing with status 1.
+
** New features
md5sum --check now also accepts openssl-style checksums.
Exit status:
@display
-1 if @command{chroot} itself fails
+125 if @command{chroot} itself fails
126 if @var{command} is found but cannot be invoked
127 if @var{command} cannot be found
the exit status of @var{command} otherwise
@display
0 if no @var{command} is specified and the environment is output
-1 if @command{env} itself fails
+125 if @command{env} itself fails
126 if @var{command} is found but cannot be invoked
127 if @var{command} cannot be found
the exit status of @var{command} otherwise
@display
0 if no @var{command} is specified and the niceness is output
-1 if @command{nice} itself fails
+125 if @command{nice} itself fails
126 if @var{command} is found but cannot be invoked
127 if @var{command} cannot be found
the exit status of @var{command} otherwise
Exit status:
@display
-1 if @command{su} itself fails
+125 if @command{su} itself fails
126 if subshell is found but cannot be invoked
127 if subshell cannot be found
the exit status of the subshell otherwise
bindtextdomain (PACKAGE, LOCALEDIR);
textdomain (PACKAGE);
- initialize_exit_failure (EXIT_FAILURE);
+ initialize_exit_failure (EXIT_CANCELED);
atexit (close_stdout);
parse_long_options (argc, argv, PROGRAM_NAME, PACKAGE_NAME, Version,
groups = optarg;
break;
default:
- usage (EXIT_FAILURE);
+ usage (EXIT_CANCELED);
}
}
if (argc <= optind)
{
error (0, 0, _("missing operand"));
- usage (EXIT_FAILURE);
+ usage (EXIT_CANCELED);
}
if (chroot (argv[optind]) != 0)
- error (EXIT_FAILURE, errno, _("cannot change root directory to %s"),
+ error (EXIT_CANCELED, errno, _("cannot change root directory to %s"),
argv[optind]);
if (chdir ("/"))
- error (EXIT_FAILURE, errno, _("cannot chdir to root directory"));
+ error (EXIT_CANCELED, errno, _("cannot chdir to root directory"));
if (argc == optind + 1)
{
char const *err = parse_user_spec (userspec, &uid, &gid, &user, &group);
if (err)
- error (EXIT_FAILURE, errno, "%s", err);
+ error (EXIT_CANCELED, errno, "%s", err);
free (user);
free (group);
}
if (fail)
- exit (EXIT_FAILURE);
+ exit (EXIT_CANCELED);
/* Execute the given command. */
execvp (argv[0], argv);
bindtextdomain (PACKAGE, LOCALEDIR);
textdomain (PACKAGE);
- initialize_exit_failure (EXIT_FAILURE);
+ initialize_exit_failure (EXIT_CANCELED);
atexit (close_stdout);
while ((optc = getopt_long (argc, argv, "+iu:", longopts, NULL)) != -1)
case_GETOPT_HELP_CHAR;
case_GETOPT_VERSION_CHAR (PROGRAM_NAME, AUTHORS);
default:
- usage (EXIT_FAILURE);
+ usage (EXIT_CANCELED);
}
}
bindtextdomain (PACKAGE, LOCALEDIR);
textdomain (PACKAGE);
- initialize_exit_failure (EXIT_FAILURE);
+ initialize_exit_failure (EXIT_CANCELED);
atexit (close_stdout);
parse_long_options (argc, argv, PROGRAM_NAME, PACKAGE_NAME, Version,
i += optind - 1;
if (optc == '?')
- usage (EXIT_FAILURE);
+ usage (EXIT_CANCELED);
else if (optc == 'n')
adjustment_given = optarg;
else /* optc == -1 */
enum { MIN_ADJUSTMENT = 1 - 2 * NZERO, MAX_ADJUSTMENT = 2 * NZERO - 1 };
long int tmp;
if (LONGINT_OVERFLOW < xstrtol (adjustment_given, NULL, 10, &tmp, ""))
- error (EXIT_FAILURE, 0, _("invalid adjustment %s"),
+ error (EXIT_CANCELED, 0, _("invalid adjustment %s"),
quote (adjustment_given));
adjustment = MAX (MIN_ADJUSTMENT, MIN (tmp, MAX_ADJUSTMENT));
}
if (adjustment_given)
{
error (0, 0, _("a command must be given with an adjustment"));
- usage (EXIT_FAILURE);
+ usage (EXIT_CANCELED);
}
/* No command given; print the niceness. */
errno = 0;
current_niceness = GET_NICENESS ();
if (current_niceness == -1 && errno != 0)
- error (EXIT_FAILURE, errno, _("cannot get niceness"));
+ error (EXIT_CANCELED, errno, _("cannot get niceness"));
printf ("%d\n", current_niceness);
exit (EXIT_SUCCESS);
}
#else
current_niceness = GET_NICENESS ();
if (current_niceness == -1 && errno != 0)
- error (EXIT_FAILURE, errno, _("cannot get niceness"));
+ error (EXIT_CANCELED, errno, _("cannot get niceness"));
ok = (setpriority (PRIO_PROCESS, 0, current_niceness + adjustment) == 0);
#endif
if (!ok)
- error (errno == EPERM ? 0 : EXIT_FAILURE, errno, _("cannot set niceness"));
+ error (errno == EPERM ? 0 : EXIT_CANCELED, errno, _("cannot set niceness"));
execvp (argv[i], &argv[i]);
#ifdef HAVE_INITGROUPS
errno = 0;
if (initgroups (pw->pw_name, pw->pw_gid) == -1)
- error (EXIT_FAILURE, errno, _("cannot set groups"));
+ error (EXIT_CANCELED, errno, _("cannot set groups"));
endgrent ();
#endif
if (setgid (pw->pw_gid))
- error (EXIT_FAILURE, errno, _("cannot set group id"));
+ error (EXIT_CANCELED, errno, _("cannot set group id"));
if (setuid (pw->pw_uid))
- error (EXIT_FAILURE, errno, _("cannot set user id"));
+ error (EXIT_CANCELED, errno, _("cannot set user id"));
}
/* Run SHELL, or DEFAULT_SHELL if SHELL is empty.
bindtextdomain (PACKAGE, LOCALEDIR);
textdomain (PACKAGE);
- initialize_exit_failure (EXIT_FAILURE);
+ initialize_exit_failure (EXIT_CANCELED);
atexit (close_stdout);
fast_startup = false;
case_GETOPT_VERSION_CHAR (PROGRAM_NAME, AUTHORS);
default:
- usage (EXIT_FAILURE);
+ usage (EXIT_CANCELED);
}
}
pw = getpwnam (new_user);
if (! (pw && pw->pw_name && pw->pw_name[0] && pw->pw_dir && pw->pw_dir[0]
&& pw->pw_passwd))
- error (EXIT_FAILURE, 0, _("user %s does not exist"), new_user);
+ error (EXIT_CANCELED, 0, _("user %s does not exist"), new_user);
/* Make a copy of the password information and point pw at the local
copy instead. Otherwise, some systems (e.g. GNU/Linux) would clobber
#ifdef SYSLOG_FAILURE
log_su (pw, false);
#endif
- error (EXIT_FAILURE, 0, _("incorrect password"));
+ error (EXIT_CANCELED, 0, _("incorrect password"));
}
#ifdef SYSLOG_SUCCESS
else
. $srcdir/test-lib.sh
+expected_failure_status_chroot=125
+expected_failure_status_env=125
+expected_failure_status_nice=125
expected_failure_status_nohup=127
expected_failure_status_stdbuf=125
+expected_failure_status_su=125
expected_failure_status_timeout=125
expected_failure_status_printenv=2
expected_failure_status_tty=3
dir => 2,
vdir => 2,
test => 2,
+ chroot => 125,
echo => 0,
+ env => 125,
expr => 0,
+ nice => 125,
nohup => 127,
sort => 2,
stdbuf => 125,
+ su => 125,
test => 0,
timeout => 125,
true => 0,