diff --git a/coreutils-remove_kill_documentation.patch b/coreutils-remove_kill_documentation.patch new file mode 100644 index 0000000..438d4de --- /dev/null +++ b/coreutils-remove_kill_documentation.patch @@ -0,0 +1,122 @@ +Index: doc/coreutils.texi +=================================================================== +--- doc/coreutils.texi.orig ++++ doc/coreutils.texi +@@ -69,7 +69,6 @@ + * id: (coreutils)id invocation. Print user identity. + * install: (coreutils)install invocation. Copy and change attributes. + * join: (coreutils)join invocation. Join lines on a common field. +-* kill: (coreutils)kill invocation. Send a signal to processes. + * link: (coreutils)link invocation. Make hard links between files. + * ln: (coreutils)ln invocation. Make links between files. + * logname: (coreutils)logname invocation. Print current login name. +@@ -200,7 +199,6 @@ Free Documentation License''. + * System context:: date arch nproc uname hostid uptime + * SELinux context:: chcon runcon + * Modified command invocation:: chroot env nice nohup stdbuf timeout +-* Process control:: kill + * Delaying:: sleep + * Numeric operations:: factor seq + * File permissions:: Access modes +@@ -446,10 +444,6 @@ Modified command invocation + * stdbuf invocation:: Run a command with modified I/O buffering + * timeout invocation:: Run a command with a time limit + +-Process control +- +-* kill invocation:: Sending a signal to processes. +- + Delaying + + * sleep invocation:: Delay for a specified time +@@ -16380,90 +16374,6 @@ the exit status of @var{command} otherwi + @end display + + +-@node Process control +-@chapter Process control +- +-@cindex processes, commands for controlling +-@cindex commands for controlling processes +- +-@menu +-* kill invocation:: Sending a signal to processes. +-@end menu +- +- +-@node kill invocation +-@section @command{kill}: Send a signal to processes +- +-@pindex kill +-@cindex send a signal to processes +- +-The @command{kill} command sends a signal to processes, causing them +-to terminate or otherwise act upon receiving the signal in some way. +-Alternatively, it lists information about signals. Synopses: +- +-@example +-kill [-s @var{signal} | --signal @var{signal} | -@var{signal}] @var{pid}@dots{} +-kill [-l | --list | -t | --table] [@var{signal}]@dots{} +-@end example +- +-@mayConflictWithShellBuiltIn{kill} +- +-The first form of the @command{kill} command sends a signal to all +-@var{pid} arguments. The default signal to send if none is specified +-is @samp{TERM}@. The special signal number @samp{0} does not denote a +-valid signal, but can be used to test whether the @var{pid} arguments +-specify processes to which a signal could be sent. +- +-If @var{pid} is positive, the signal is sent to the process with the +-process ID @var{pid}. If @var{pid} is zero, the signal is sent to all +-processes in the process group of the current process. If @var{pid} +-is @minus{}1, the signal is sent to all processes for which the user has +-permission to send a signal. If @var{pid} is less than @minus{}1, the signal +-is sent to all processes in the process group that equals the absolute +-value of @var{pid}. +- +-If @var{pid} is not positive, a system-dependent set of system +-processes is excluded from the list of processes to which the signal +-is sent. +- +-If a negative @var{pid} argument is desired as the first one, it +-should be preceded by @option{--}. However, as a common extension to +-POSIX, @option{--} is not required with @samp{kill +--@var{signal} -@var{pid}}. The following commands are equivalent: +- +-@example +-kill -15 -1 +-kill -TERM -1 +-kill -s TERM -- -1 +-kill -- -1 +-@end example +- +-The first form of the @command{kill} command succeeds if every @var{pid} +-argument specifies at least one process that the signal was sent to. +- +-The second form of the @command{kill} command lists signal information. +-Either the @option{-l} or @option{--list} option, or the @option{-t} +-or @option{--table} option must be specified. Without any +-@var{signal} argument, all supported signals are listed. The output +-of @option{-l} or @option{--list} is a list of the signal names, one +-per line; if @var{signal} is already a name, the signal number is +-printed instead. The output of @option{-t} or @option{--table} is a +-table of signal numbers, names, and descriptions. This form of the +-@command{kill} command succeeds if all @var{signal} arguments are valid +-and if there is no output error. +- +-The @command{kill} command also supports the @option{--help} and +-@option{--version} options. @xref{Common options}. +- +-A @var{signal} may be a signal name like @samp{HUP}, or a signal +-number like @samp{1}, or an exit status of a process terminated by the +-signal. A signal name can be given in canonical form or prefixed by +-@samp{SIG}@. The case of the letters is ignored, except for the +-@option{-@var{signal}} option which must use upper case to avoid +-ambiguity with lower case option letters. +-@xref{Signal specifications}, for a list of supported +-signal names and numbers. +- + @node Delaying + @chapter Delaying + diff --git a/coreutils-su.patch b/coreutils-su.patch deleted file mode 100644 index 95c50b8..0000000 --- a/coreutils-su.patch +++ /dev/null @@ -1,1664 +0,0 @@ -From: Bernhard Voelker -Date: Tue, 19 Mar 2013 17:00:00 +0200 -Subject: add su again for compatibility - -As su(1) has been moved from coreutils to util-linux upstreams, this package -must provide it via compatibility symlinks to the old coreutils version. -This is needed until there is a newer version of the receiving util-linux -package available which would then provide su. - ---- - doc/coreutils.texi | 141 +++++++ - man/local.mk | 2 - man/su.x | 4 - po/coreutils.pot | 67 +++ - src/cu-progs.mk | 1 - src/getdef.c | 259 +++++++++++++ - src/getdef.h | 29 + - src/local.mk | 6 - src/su.c | 945 ++++++++++++++++++++++++++++++++++++++++++++++++++ - tests/local.mk | 1 - tests/misc/su-fail.sh | 30 + - 11 files changed, 1483 insertions(+), 2 deletions(-) - -Index: src/cu-progs.mk -=================================================================== ---- src/cu-progs.mk.orig -+++ src/cu-progs.mk -@@ -87,6 +87,7 @@ default__progs += src/sleep - default__progs += src/sort - default__progs += src/split - default__progs += src/stat -+default__progs += src/su - default__progs += src/sum - default__progs += src/sync - default__progs += src/tac -Index: src/local.mk -=================================================================== ---- src/local.mk.orig -+++ src/local.mk -@@ -205,6 +205,12 @@ src_who_LDADD = $(LDADD) - src_whoami_LDADD = $(LDADD) - src_yes_LDADD = $(LDADD) - -+ -+src_su_CFLAGS = -fpie -DUSE_PAM=1 -+src_su_LDFLAGS = -pie -+PAM_LIBS = -lpam -lpam_misc -+src_su_LDADD = src/getdef.c $(LDADD) -lcrypt $(PAM_LIBS) -+ - # Synonyms. Recall that Automake transliterates '[' and '/' to '_'. - src___LDADD = $(src_test_LDADD) - src_dir_LDADD = $(src_ls_LDADD) -Index: src/su.c -=================================================================== ---- /dev/null -+++ src/su.c -@@ -0,0 +1,945 @@ -+/* su for GNU. Run a shell with substitute user and group IDs. -+ Copyright (C) 1992-2012 Free Software Foundation, Inc. -+ -+ This program is free software: you can redistribute it and/or modify -+ it under the terms of the GNU General Public License as published by -+ the Free Software Foundation, either version 3 of the License, or -+ (at your option) any later version. -+ -+ This program is distributed in the hope that it will be useful, -+ but WITHOUT ANY WARRANTY; without even the implied warranty of -+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ GNU General Public License for more details. -+ -+ You should have received a copy of the GNU General Public License -+ along with this program. If not, see . */ -+ -+/* Run a shell with the real and effective UID and GID and groups -+ of USER, default 'root'. -+ -+ The shell run is taken from USER's password entry, /bin/sh if -+ none is specified there. If the account has a password, su -+ prompts for a password unless run by a user with real UID 0. -+ -+ Does not change the current directory. -+ Sets 'HOME' and 'SHELL' from the password entry for USER, and if -+ USER is not root, sets 'USER' and 'LOGNAME' to USER. -+ The subshell is not a login shell. -+ -+ If one or more ARGs are given, they are passed as additional -+ arguments to the subshell. -+ -+ Does not handle /bin/sh or other shells specially -+ (setting argv[0] to "-su", passing -c only to certain shells, etc.). -+ I don't see the point in doing that, and it's ugly. -+ -+ This program intentionally does not support a "wheel group" that -+ restricts who can su to UID 0 accounts. RMS considers that to -+ be fascist. -+ -+#ifdef USE_PAM -+ -+ Actually, with PAM, su has nothing to do with whether or not a -+ wheel group is enforced by su. RMS tries to restrict your access -+ to a su which implements the wheel group, but PAM considers that -+ to be fascist, and gives the user/sysadmin the opportunity to -+ enforce a wheel group by proper editing of /etc/pam.d/su -+ -+#endif -+ -+ Compile-time options: -+ -DSYSLOG_SUCCESS Log successful su's (by default, to root) with syslog. -+ -DSYSLOG_FAILURE Log failed su's (by default, to root) with syslog. -+ -+ -DSYSLOG_NON_ROOT Log all su's, not just those to root (UID 0). -+ Never logs attempted su's to nonexistent accounts. -+ -+ Written by David MacKenzie . */ -+ -+#include -+#include -+#include -+#include -+#include -+#include -+#ifdef USE_PAM -+#include -+#include -+#include -+#include -+#include -+#endif -+ -+#include "system.h" -+#include "getpass.h" -+ -+#if HAVE_SYSLOG_H && HAVE_SYSLOG -+# include -+# define SYSLOG_SUCCESS 1 -+# define SYSLOG_FAILURE 1 -+# define SYSLOG_NON_ROOT 1 -+#else -+# undef SYSLOG_SUCCESS -+# undef SYSLOG_FAILURE -+# undef SYSLOG_NON_ROOT -+#endif -+ -+#if HAVE_SYS_PARAM_H -+# include -+#endif -+ -+#ifndef HAVE_ENDGRENT -+# define endgrent() ((void) 0) -+#endif -+ -+#ifndef HAVE_ENDPWENT -+# define endpwent() ((void) 0) -+#endif -+ -+#if HAVE_SHADOW_H -+# include -+#endif -+ -+#include "error.h" -+ -+/* The official name of this program (e.g., no 'g' prefix). */ -+#define PROGRAM_NAME "su" -+ -+#define AUTHORS proper_name ("David MacKenzie") -+ -+#if HAVE_PATHS_H -+# include -+#endif -+ -+#include "getdef.h" -+ -+/* The default PATH for simulated logins to non-superuser accounts. */ -+#define DEFAULT_LOGIN_PATH "/usr/local/bin:/bin:/usr/bin" -+ -+/* The default PATH for simulated logins to superuser accounts. */ -+#define DEFAULT_ROOT_LOGIN_PATH "/usr/sbin:/bin:/usr/bin:/sbin" -+ -+/* The shell to run if none is given in the user's passwd entry. */ -+#define DEFAULT_SHELL "/bin/sh" -+ -+/* The user to become if none is specified. */ -+#define DEFAULT_USER "root" -+ -+#ifndef USE_PAM -+char *crypt (char const *key, char const *salt); -+#endif -+ -+static void run_shell (char const *, char const *, char **, size_t) -+ ATTRIBUTE_NORETURN; -+ -+/* If true, pass the '-f' option to the subshell. */ -+static bool fast_startup; -+ -+/* If true, simulate a login instead of just starting a shell. */ -+static bool simulate_login; -+ -+/* If true, change some environment vars to indicate the user su'd to. */ -+static bool change_environment; -+ -+/* If true, then don't call setsid() with a command. */ -+int same_session = 0; -+ -+#ifdef USE_PAM -+static bool _pam_session_opened; -+static bool _pam_cred_established; -+#endif -+ -+static struct option const longopts[] = -+{ -+ {"command", required_argument, NULL, 'c'}, -+ {"session-command", required_argument, NULL, 'C'}, -+ {"fast", no_argument, NULL, 'f'}, -+ {"login", no_argument, NULL, 'l'}, -+ {"preserve-environment", no_argument, NULL, 'p'}, -+ {"shell", required_argument, NULL, 's'}, -+ {GETOPT_HELP_OPTION_DECL}, -+ {GETOPT_VERSION_OPTION_DECL}, -+ {NULL, 0, NULL, 0} -+}; -+ -+/* Add NAME=VAL to the environment, checking for out of memory errors. */ -+ -+static void -+xsetenv (char const *name, char const *val) -+{ -+ size_t namelen = strlen (name); -+ size_t vallen = strlen (val); -+ char *string = xmalloc (namelen + 1 + vallen + 1); -+ strcpy (string, name); -+ string[namelen] = '='; -+ strcpy (string + namelen + 1, val); -+ if (putenv (string) != 0) -+ xalloc_die (); -+} -+ -+#if defined SYSLOG_SUCCESS || defined SYSLOG_FAILURE -+/* Log the fact that someone has run su to the user given by PW; -+ if SUCCESSFUL is true, they gave the correct password, etc. */ -+ -+static void -+log_su (struct passwd const *pw, bool successful) -+{ -+ const char *new_user, *old_user, *tty; -+ -+# ifndef SYSLOG_NON_ROOT -+ if (pw->pw_uid) -+ return; -+# endif -+ new_user = pw->pw_name; -+ /* The utmp entry (via getlogin) is probably the best way to identify -+ the user, especially if someone su's from a su-shell. */ -+ old_user = getlogin (); -+ if (!old_user) -+ { -+ /* getlogin can fail -- usually due to lack of utmp entry. -+ Resort to getpwuid. */ -+ errno = 0; -+ uid_t ruid = getuid (); -+ uid_t NO_UID = -1; -+ struct passwd *pwd = (ruid == NO_UID && errno ? NULL : getpwuid (ruid)); -+ old_user = (pwd ? pwd->pw_name : ""); -+ } -+ tty = ttyname (STDERR_FILENO); -+ if (!tty) -+ tty = "none"; -+ /* 4.2BSD openlog doesn't have the third parameter. */ -+ openlog (last_component (program_name), 0 -+# ifdef LOG_AUTH -+ , LOG_AUTH -+# endif -+ ); -+ syslog (LOG_NOTICE, -+# ifdef SYSLOG_NON_ROOT -+ "%s(to %s) %s on %s", -+# else -+ "%s%s on %s", -+# endif -+ successful ? "" : "FAILED SU ", -+# ifdef SYSLOG_NON_ROOT -+ new_user, -+# endif -+ old_user, tty); -+ closelog (); -+} -+#endif -+ -+#ifdef USE_PAM -+#define PAM_SERVICE_NAME PROGRAM_NAME -+#define PAM_SERVICE_NAME_L PROGRAM_NAME "-l" -+static sig_atomic_t volatile caught_signal = false; -+static pam_handle_t *pamh = NULL; -+static int retval; -+static struct pam_conv conv = -+{ -+ misc_conv, -+ NULL -+}; -+ -+#define PAM_BAIL_P(a) \ -+ if (retval) \ -+ { \ -+ pam_end (pamh, retval); \ -+ a; \ -+ } -+ -+static void -+cleanup_pam (int retcode) -+{ -+ if (_pam_session_opened) -+ pam_close_session (pamh, 0); -+ -+ if (_pam_cred_established) -+ pam_setcred (pamh, PAM_DELETE_CRED | PAM_SILENT); -+ -+ pam_end(pamh, retcode); -+} -+ -+/* Signal handler for parent process. */ -+static void -+su_catch_sig (int sig) -+{ -+ caught_signal = true; -+} -+ -+/* Export env variables declared by PAM modules. */ -+static void -+export_pamenv (void) -+{ -+ char **env; -+ -+ /* This is a copy but don't care to free as we exec later anyways. */ -+ env = pam_getenvlist (pamh); -+ while (env && *env) -+ { -+ if (putenv (*env) != 0) -+ xalloc_die (); -+ env++; -+ } -+} -+ -+static void -+create_watching_parent (void) -+{ -+ pid_t child; -+ sigset_t ourset; -+ int status = 0; -+ -+ retval = pam_open_session (pamh, 0); -+ if (retval != PAM_SUCCESS) -+ { -+ cleanup_pam (retval); -+ error (EXIT_FAILURE, 0, _("cannot not open session: %s"), -+ pam_strerror (pamh, retval)); -+ } -+ else -+ _pam_session_opened = 1; -+ -+ child = fork (); -+ if (child == (pid_t) -1) -+ { -+ cleanup_pam (PAM_ABORT); -+ error (EXIT_FAILURE, errno, _("cannot create child process")); -+ } -+ -+ /* the child proceeds to run the shell */ -+ if (child == 0) -+ return; -+ -+ /* In the parent watch the child. */ -+ -+ /* su without pam support does not have a helper that keeps -+ sitting on any directory so let's go to /. */ -+ if (chdir ("/") != 0) -+ error (0, errno, _("warning: cannot change directory to %s"), "/"); -+ -+ sigfillset (&ourset); -+ if (sigprocmask (SIG_BLOCK, &ourset, NULL)) -+ { -+ error (0, errno, _("cannot block signals")); -+ caught_signal = true; -+ } -+ if (!caught_signal) -+ { -+ struct sigaction action; -+ action.sa_handler = su_catch_sig; -+ sigemptyset (&action.sa_mask); -+ action.sa_flags = 0; -+ sigemptyset (&ourset); -+ -+ if (!same_session) -+ { -+ if (sigaddset(&ourset, SIGINT) || sigaddset(&ourset, SIGQUIT)) -+ { -+ error (0, errno, _("cannot set signal handler")); -+ caught_signal = true; -+ } -+ } -+ if (!caught_signal && (sigaddset(&ourset, SIGTERM) -+ || sigaddset(&ourset, SIGALRM) -+ || sigaction(SIGTERM, &action, NULL) -+ || sigprocmask(SIG_UNBLOCK, &ourset, NULL))) -+ { -+ error (0, errno, _("cannot set signal handler")); -+ caught_signal = true; -+ } -+ if (!caught_signal && !same_session && (sigaction(SIGINT, &action, NULL) -+ || sigaction(SIGQUIT, &action, NULL))) -+ { -+ error (0, errno, _("cannot set signal handler")); -+ caught_signal = true; -+ } -+ } -+ if (!caught_signal) -+ { -+ pid_t pid; -+ for (;;) -+ { -+ pid = waitpid (child, &status, WUNTRACED); -+ -+ if (pid != (pid_t)-1 && WIFSTOPPED (status)) -+ { -+ kill (getpid (), SIGSTOP); -+ /* once we get here, we must have resumed */ -+ kill (pid, SIGCONT); -+ } -+ else -+ break; -+ } -+ if (pid != (pid_t)-1) -+ if (WIFSIGNALED (status)) -+ status = WTERMSIG (status) + 128; -+ else -+ status = WEXITSTATUS (status); -+ else -+ status = 1; -+ } -+ else -+ status = 1; -+ -+ if (caught_signal) -+ { -+ fprintf (stderr, _("\nSession terminated, killing shell...")); -+ kill (child, SIGTERM); -+ } -+ -+ cleanup_pam (PAM_SUCCESS); -+ -+ if (caught_signal) -+ { -+ sleep (2); -+ kill (child, SIGKILL); -+ fprintf (stderr, _(" ...killed.\n")); -+ } -+ exit (status); -+} -+#endif -+ -+/* Ask the user for a password. -+ If PAM is in use, let PAM ask for the password if necessary. -+ Return true if the user gives the correct password for entry PW, -+ false if not. Return true without asking for a password if run by UID 0 -+ or if PW has an empty password. */ -+ -+static bool -+correct_password (const struct passwd *pw) -+{ -+#ifdef USE_PAM -+ const struct passwd *lpw; -+ const char *cp; -+ -+ retval = pam_start (simulate_login ? PAM_SERVICE_NAME_L : PAM_SERVICE_NAME, -+ pw->pw_name, &conv, &pamh); -+ PAM_BAIL_P (return false); -+ -+ if (isatty (0) && (cp = ttyname (0)) != NULL) -+ { -+ const char *tty; -+ -+ if (strncmp (cp, "/dev/", 5) == 0) -+ tty = cp + 5; -+ else -+ tty = cp; -+ retval = pam_set_item (pamh, PAM_TTY, tty); -+ PAM_BAIL_P (return false); -+ } -+#if 0 /* Manpage discourages use of getlogin. */ -+ cp = getlogin (); -+ if (!(cp && *cp && (lpw = getpwnam (cp)) != NULL && lpw->pw_uid == getuid ())) -+#endif -+ lpw = getpwuid (getuid ()); -+ if (lpw && lpw->pw_name) -+ { -+ retval = pam_set_item (pamh, PAM_RUSER, (const void *) lpw->pw_name); -+ PAM_BAIL_P (return false); -+ } -+ retval = pam_authenticate (pamh, 0); -+ PAM_BAIL_P (return false); -+ retval = pam_acct_mgmt (pamh, 0); -+ if (retval == PAM_NEW_AUTHTOK_REQD) -+ { -+ /* Password has expired. Offer option to change it. */ -+ retval = pam_chauthtok (pamh, PAM_CHANGE_EXPIRED_AUTHTOK); -+ PAM_BAIL_P (return false); -+ } -+ PAM_BAIL_P (return false); -+ /* Must be authenticated if this point was reached. */ -+ return true; -+#else /* !USE_PAM */ -+ char *unencrypted, *encrypted, *correct; -+#if HAVE_GETSPNAM && HAVE_STRUCT_SPWD_SP_PWDP -+ /* Shadow passwd stuff for SVR3 and maybe other systems. */ -+ const struct spwd *sp = getspnam (pw->pw_name); -+ -+ endspent (); -+ if (sp) -+ correct = sp->sp_pwdp; -+ else -+#endif -+ correct = pw->pw_passwd; -+ -+ if (getuid () == 0 || !correct || correct[0] == '\0') -+ return true; -+ -+ unencrypted = getpass (_("Password:")); -+ if (!unencrypted) -+ { -+ error (0, 0, _("getpass: cannot open /dev/tty")); -+ return false; -+ } -+ encrypted = crypt (unencrypted, correct); -+ memset (unencrypted, 0, strlen (unencrypted)); -+ return STREQ (encrypted, correct); -+#endif /* !USE_PAM */ -+} -+ -+/* Add or clear /sbin and /usr/sbin for the su command -+ used without `-'. */ -+ -+/* Set if /sbin is found in path. */ -+#define SBIN_MASK 0x01 -+/* Set if /usr/sbin is found in path. */ -+#define USBIN_MASK 0x02 -+ -+static char * -+addsbin (const char *const path) -+{ -+ unsigned char smask = 0; -+ char *ptr, *tmp, *cur, *ret = NULL; -+ size_t len; -+ -+ if (!path || *path == 0) -+ return NULL; -+ -+ tmp = xstrdup (path); -+ cur = tmp; -+ for (ptr = strsep (&cur, ":"); ptr != NULL; ptr = strsep (&cur, ":")) -+ { -+ if (!strcmp (ptr, "/sbin")) -+ smask |= SBIN_MASK; -+ if (!strcmp (ptr, "/usr/sbin")) -+ smask |= USBIN_MASK; -+ } -+ -+ if ((smask & (USBIN_MASK|SBIN_MASK)) == (USBIN_MASK|SBIN_MASK)) -+ { -+ free (tmp); -+ return NULL; -+ } -+ -+ len = strlen (path); -+ if (!(smask & USBIN_MASK)) -+ len += strlen ("/usr/sbin:"); -+ -+ if (!(smask & SBIN_MASK)) -+ len += strlen (":/sbin"); -+ -+ ret = xmalloc (len + 1); -+ strcpy (tmp, path); -+ -+ *ret = 0; -+ cur = tmp; -+ for (ptr = strsep (&cur, ":"); ptr; ptr = strsep (&cur, ":")) -+ { -+ if (!strcmp (ptr, ".")) -+ continue; -+ if (*ret) -+ strcat (ret, ":"); -+ if (!(smask & USBIN_MASK) && !strcmp (ptr, "/bin")) -+ { -+ strcat (ret, "/usr/sbin:"); -+ strcat (ret, ptr); -+ smask |= USBIN_MASK; -+ continue; -+ } -+ if (!(smask & SBIN_MASK) && !strcmp (ptr, "/usr/bin")) -+ { -+ strcat (ret, ptr); -+ strcat (ret, ":/sbin"); -+ smask |= SBIN_MASK; -+ continue; -+ } -+ strcat (ret, ptr); -+ } -+ free (tmp); -+ -+ if (!(smask & USBIN_MASK)) -+ strcat (ret, ":/usr/sbin"); -+ -+ if (!(smask & SBIN_MASK)) -+ strcat (ret, ":/sbin"); -+ -+ return ret; -+} -+ -+static char * -+clearsbin (const char *const path) -+{ -+ char *ptr, *tmp, *cur, *ret = NULL; -+ -+ if (!path || *path == 0) -+ return NULL; -+ -+ tmp = strdup (path); -+ if (!tmp) -+ return NULL; -+ -+ ret = xmalloc (strlen (path) + 1); -+ *ret = 0; -+ cur = tmp; -+ for (ptr = strsep (&cur, ":"); ptr; ptr = strsep (&cur, ":")) -+ { -+ if (!strcmp (ptr, "/sbin")) -+ continue; -+ if (!strcmp (ptr, "/usr/sbin")) -+ continue; -+ if (!strcmp (ptr, "/usr/local/sbin")) -+ continue; -+ if (*ret) -+ strcat (ret, ":"); -+ strcat (ret, ptr); -+ } -+ free (tmp); -+ -+ return ret; -+} -+ -+/* Update 'environ' for the new shell based on PW, with SHELL being -+ the value for the SHELL environment variable. */ -+ -+static void -+modify_environment (const struct passwd *pw, const char *shell) -+{ -+ if (simulate_login) -+ { -+ /* Leave TERM unchanged. Set HOME, SHELL, USER, LOGNAME, PATH. -+ Unset all other environment variables. */ -+ char const *term = getenv ("TERM"); -+ if (term) -+ term = xstrdup (term); -+ environ = xmalloc ((6 + !!term) * sizeof (char *)); -+ environ[0] = NULL; -+ if (term) -+ xsetenv ("TERM", term); -+ xsetenv ("HOME", pw->pw_dir); -+ xsetenv ("SHELL", shell); -+ xsetenv ("USER", pw->pw_name); -+ xsetenv ("LOGNAME", pw->pw_name); -+ xsetenv ("PATH", (pw->pw_uid -+ ? getdef_str ("PATH", DEFAULT_LOGIN_PATH) -+ : getdef_str ("SUPATH", DEFAULT_ROOT_LOGIN_PATH))); -+ } -+ else -+ { -+ /* Set HOME, SHELL, and if not becoming a super-user, -+ USER and LOGNAME. */ -+ if (change_environment) -+ { -+ xsetenv ("HOME", pw->pw_dir); -+ xsetenv ("SHELL", shell); -+ if (getdef_bool ("ALWAYS_SET_PATH", 0)) -+ xsetenv ("PATH", (pw->pw_uid -+ ? getdef_str ("PATH", -+ DEFAULT_LOGIN_PATH) -+ : getdef_str ("SUPATH", -+ DEFAULT_ROOT_LOGIN_PATH))); -+ else -+ { -+ char const *path = getenv ("PATH"); -+ char *new = NULL; -+ -+ if (pw->pw_uid) -+ new = clearsbin (path); -+ else -+ new = addsbin (path); -+ -+ if (new) -+ { -+ xsetenv ("PATH", new); -+ free (new); -+ } -+ } -+ if (pw->pw_uid) -+ { -+ xsetenv ("USER", pw->pw_name); -+ xsetenv ("LOGNAME", pw->pw_name); -+ } -+ } -+ } -+ -+#ifdef USE_PAM -+ export_pamenv (); -+#endif -+} -+ -+/* Become the user and group(s) specified by PW. */ -+ -+static void -+init_groups (const struct passwd *pw) -+{ -+#ifdef HAVE_INITGROUPS -+ errno = 0; -+ if (initgroups (pw->pw_name, pw->pw_gid) == -1) -+ { -+#ifdef USE_PAM -+ cleanup_pam (PAM_ABORT); -+#endif -+ error (EXIT_FAILURE, errno, _("cannot set groups")); -+ } -+ endgrent (); -+#endif -+ -+#ifdef USE_PAM -+ retval = pam_setcred (pamh, PAM_ESTABLISH_CRED); -+ if (retval != PAM_SUCCESS) -+ error (EXIT_FAILURE, 0, "%s", pam_strerror (pamh, retval)); -+ else -+ _pam_cred_established = 1; -+#endif -+} -+ -+static void -+change_identity (const struct passwd *pw) -+{ -+ if (setgid (pw->pw_gid)) -+ error (EXIT_CANCELED, errno, _("cannot set group id")); -+ if (setuid (pw->pw_uid)) -+ error (EXIT_CANCELED, errno, _("cannot set user id")); -+} -+ -+/* Run SHELL, or DEFAULT_SHELL if SHELL is empty. -+ If COMMAND is nonzero, pass it to the shell with the -c option. -+ Pass ADDITIONAL_ARGS to the shell as more arguments; there -+ are N_ADDITIONAL_ARGS extra arguments. */ -+ -+static void -+run_shell (char const *shell, char const *command, char **additional_args, -+ size_t n_additional_args) -+{ -+ size_t n_args = 1 + fast_startup + 2 * !!command + n_additional_args + 1; -+ char const **args = xnmalloc (n_args, sizeof *args); -+ size_t argno = 1; -+ -+ if (simulate_login) -+ { -+ char *arg0; -+ char *shell_basename; -+ -+ shell_basename = last_component (shell); -+ arg0 = xmalloc (strlen (shell_basename) + 2); -+ arg0[0] = '-'; -+ strcpy (arg0 + 1, shell_basename); -+ args[0] = arg0; -+ } -+ else -+ args[0] = last_component (shell); -+ if (fast_startup) -+ args[argno++] = "-f"; -+ if (command) -+ { -+ args[argno++] = "-c"; -+ args[argno++] = command; -+ } -+ memcpy (args + argno, additional_args, n_additional_args * sizeof *args); -+ args[argno + n_additional_args] = NULL; -+ execv (shell, (char **) args); -+ -+ { -+ int exit_status = (errno == ENOENT ? EXIT_ENOENT : EXIT_CANNOT_INVOKE); -+ error (0, errno, "%s", shell); -+ exit (exit_status); -+ } -+} -+ -+/* Return true if SHELL is a restricted shell (one not returned by -+ getusershell), else false, meaning it is a standard shell. */ -+ -+static bool -+restricted_shell (const char *shell) -+{ -+ char *line; -+ -+ setusershell (); -+ while ((line = getusershell ()) != NULL) -+ { -+ if (*line != '#' && STREQ (line, shell)) -+ { -+ endusershell (); -+ return false; -+ } -+ } -+ endusershell (); -+ return true; -+} -+ -+void -+usage (int status) -+{ -+ if (status != EXIT_SUCCESS) -+ emit_try_help (); -+ else -+ { -+ printf (_("Usage: %s [OPTION]... [-] [USER [ARG]...]\n"), program_name); -+ fputs (_("\ -+Change the effective user id and group id to that of USER.\n\ -+\n\ -+ -, -l, --login make the shell a login shell\n\ -+ -c, --command=COMMAND pass a single COMMAND to the shell with -c\n\ -+ --session-command=COMMAND pass a single COMMAND to the shell with -c\n\ -+ and do not create a new session\n\ -+ -f, --fast pass -f to the shell (for csh or tcsh)\n\ -+ -m, --preserve-environment do not reset environment variables\n\ -+ -p same as -m\n\ -+ -s, --shell=SHELL run SHELL if /etc/shells allows it\n\ -+"), stdout); -+ fputs (HELP_OPTION_DESCRIPTION, stdout); -+ fputs (VERSION_OPTION_DESCRIPTION, stdout); -+ fputs (_("\ -+\n\ -+A mere - implies -l. If USER not given, assume root.\n\ -+"), stdout); -+ emit_ancillary_info (); -+ } -+ exit (status); -+} -+ -+int -+main (int argc, char **argv) -+{ -+ int optc; -+ const char *new_user = DEFAULT_USER; -+ char *command = NULL; -+ int request_same_session = 0; -+ char *shell = NULL; -+ struct passwd *pw; -+ struct passwd pw_copy; -+ -+ initialize_main (&argc, &argv); -+ set_program_name (argv[0]); -+ setlocale (LC_ALL, ""); -+ bindtextdomain (PACKAGE, LOCALEDIR); -+ textdomain (PACKAGE); -+ -+ initialize_exit_failure (EXIT_CANCELED); -+ atexit (close_stdout); -+ -+ fast_startup = false; -+ simulate_login = false; -+ change_environment = true; -+ -+ while ((optc = getopt_long (argc, argv, "c:C:flmps:", longopts, NULL)) != -1) -+ { -+ switch (optc) -+ { -+ case 'c': -+ command = optarg; -+ if (NULL != getenv ("SU_COMMAND_SAME_SESSION") || -+ NULL != getenv ("SU_COMMAND_OPENS_SESSION")) -+ request_same_session = 1; -+ break; -+ -+ case 'C': -+ command = optarg; -+ request_same_session = 1; -+ break; -+ -+ case 'f': -+ fast_startup = true; -+ break; -+ -+ case 'l': -+ simulate_login = true; -+ break; -+ -+ case 'm': -+ case 'p': -+ change_environment = false; -+ break; -+ -+ case 's': -+ shell = optarg; -+ break; -+ -+ case_GETOPT_HELP_CHAR; -+ -+ case_GETOPT_VERSION_CHAR (PROGRAM_NAME, AUTHORS); -+ -+ default: -+ usage (EXIT_CANCELED); -+ } -+ } -+ -+ if (optind < argc && STREQ (argv[optind], "-")) -+ { -+ simulate_login = true; -+ ++optind; -+ } -+ if (optind < argc) -+ new_user = argv[optind++]; -+ -+ 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_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 -+ the static data through the getlogin call from log_su. -+ Also, make sure pw->pw_shell is a nonempty string. -+ It may be NULL when NEW_USER is a username that is retrieved via NIS (YP), -+ but that doesn't have a default shell listed. */ -+ pw_copy = *pw; -+ pw = &pw_copy; -+ pw->pw_name = xstrdup (pw->pw_name); -+ pw->pw_passwd = xstrdup (pw->pw_passwd); -+ pw->pw_dir = xstrdup (pw->pw_dir); -+ pw->pw_shell = xstrdup (pw->pw_shell && pw->pw_shell[0] -+ ? pw->pw_shell -+ : DEFAULT_SHELL); -+ endpwent (); -+ -+ if (!correct_password (pw)) -+ { -+#ifdef SYSLOG_FAILURE -+ log_su (pw, false); -+#endif -+ sleep (getdef_num ("FAIL_DELAY", 1)); -+ error (EXIT_CANCELED, 0, _("incorrect password")); -+ } -+#ifdef SYSLOG_SUCCESS -+ else -+ { -+ log_su (pw, true); -+ } -+#endif -+ -+ if (request_same_session || !command || !pw->pw_uid) -+ same_session = 1; -+ -+ if (!shell && !change_environment) -+ shell = getenv ("SHELL"); -+ if (shell && getuid () != 0 && restricted_shell (pw->pw_shell)) -+ { -+ /* The user being su'd to has a nonstandard shell, and so is -+ probably a uucp account or has restricted access. Don't -+ compromise the account by allowing access with a standard -+ shell. */ -+ error (0, 0, _("using restricted shell %s"), pw->pw_shell); -+ shell = NULL; -+ } -+ shell = xstrdup (shell ? shell : pw->pw_shell); -+ -+ init_groups (pw); -+ -+#ifdef USE_PAM -+ create_watching_parent (); -+ /* Now we're in the child. */ -+#endif -+ -+ change_identity (pw); -+ -+ if (!same_session) -+ setsid (); -+ -+ /* Set environment after pam_open_session, which may put KRB5CCNAME -+ into the pam_env, etc. */ -+ -+ modify_environment (pw, shell); -+ -+ if (simulate_login && chdir (pw->pw_dir) != 0) -+ error (0, errno, _("warning: cannot change directory to %s"), pw->pw_dir); -+ -+ /* error() flushes stderr, but does not check for write failure. -+ Normally, we would catch this via our atexit() hook of -+ close_stdout, but execv() gets in the way. If stderr -+ encountered a write failure, there is no need to try calling -+ error() again. */ -+ if (ferror (stderr)) -+ exit (EXIT_CANCELED); -+ -+ run_shell (shell, command, argv + optind, MAX (0, argc - optind)); -+} -Index: src/getdef.h -=================================================================== ---- /dev/null -+++ src/getdef.h -@@ -0,0 +1,29 @@ -+/* Copyright (C) 2003, 2005 Thorsten Kukuk -+ Author: Thorsten Kukuk -+ -+ This program is free software; you can redistribute it and/or modify -+ it under the terms of the GNU General Public License version 2 or -+ later published by the Free Software Foundation. -+ -+ This program is distributed in the hope that it will be useful, -+ but WITHOUT ANY WARRANTY; without even the implied warranty of -+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ GNU General Public License for more details. -+ -+ You should have received a copy of the GNU General Public License -+ along with this program; if not, write to the Free Software Foundation, -+ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -+ -+#ifndef _GETDEF_H_ -+ -+#define _GETDEF_H_ 1 -+ -+extern int getdef_bool (const char *name, int dflt); -+extern long getdef_num (const char *name, long dflt); -+extern unsigned long getdef_unum (const char *name, unsigned long dflt); -+extern const char *getdef_str (const char *name, const char *dflt); -+ -+/* Free all data allocated by getdef_* calls before. */ -+extern void free_getdef_data (void); -+ -+#endif /* _GETDEF_H_ */ -Index: src/getdef.c -=================================================================== ---- /dev/null -+++ src/getdef.c -@@ -0,0 +1,259 @@ -+/* Copyright (C) 2003, 2004, 2005 Thorsten Kukuk -+ Author: Thorsten Kukuk -+ -+ This program is free software; you can redistribute it and/or modify -+ it under the terms of the GNU General Public License version 2 or -+ later as published by the Free Software Foundation. -+ -+ This program is distributed in the hope that it will be useful, -+ but WITHOUT ANY WARRANTY; without even the implied warranty of -+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ GNU General Public License for more details. -+ -+ You should have received a copy of the GNU General Public License -+ along with this program; if not, write to the Free Software Foundation, -+ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -+ -+#ifdef HAVE_CONFIG_H -+#include -+#endif -+ -+#define _GNU_SOURCE -+ -+#include -+#include -+#include -+#include -+#include -+#include -+ -+#include "getdef.h" -+ -+struct item { -+ char *name; /* Name of the option. */ -+ char *value; /* Value of the option. */ -+ struct item *next; /* Pointer to next option. */ -+}; -+ -+static struct item *list = NULL; -+ -+void -+free_getdef_data (void) -+{ -+ struct item *ptr; -+ -+ ptr = list; -+ while (ptr != NULL) -+ { -+ struct item *tmp; -+ tmp = ptr->next; -+ free (ptr->name); -+ free (ptr->value); -+ free (ptr); -+ ptr = tmp; -+ } -+ -+ list = NULL; -+} -+ -+/* Add a new entry to the list. */ -+static void -+store (const char *name, const char *value) -+{ -+ struct item *new = malloc (sizeof (struct item)); -+ -+ if (new == NULL) -+ abort (); -+ -+ if (name == NULL) -+ abort (); -+ -+ new->name = strdup (name); -+ new->value = strdup (value ?: ""); -+ new->next = list; -+ list = new; -+} -+ -+/* Search a special entry in the list and return the value. */ -+static const char * -+search (const char *name) -+{ -+ struct item *ptr; -+ -+ ptr = list; -+ while (ptr != NULL) -+ { -+ if (strcasecmp (name, ptr->name) == 0) -+ return ptr->value; -+ ptr = ptr->next; -+ } -+ -+ return NULL; -+} -+ -+/* Load the login.defs file (/etc/login.defs). */ -+static void -+load_defaults_internal (const char *filename) -+{ -+ FILE *fp; -+ char *buf = NULL; -+ size_t buflen = 0; -+ -+ fp = fopen (filename, "r"); -+ if (NULL == fp) -+ return; -+ -+ while (!feof (fp)) -+ { -+ char *tmp, *cp; -+#if defined(HAVE_GETLINE) -+ ssize_t n = getline (&buf, &buflen, fp); -+#elif defined (HAVE_GETDELIM) -+ ssize_t n = getdelim (&buf, &buflen, '\n', fp); -+#else -+ ssize_t n; -+ -+ if (buf == NULL) -+ { -+ buflen = 8096; -+ buf = malloc (buflen); -+ } -+ buf[0] = '\0'; -+ fgets (buf, buflen - 1, fp); -+ if (buf != NULL) -+ n = strlen (buf); -+ else -+ n = 0; -+#endif /* HAVE_GETLINE / HAVE_GETDELIM */ -+ cp = buf; -+ -+ if (n < 1) -+ break; -+ -+ tmp = strchr (cp, '#'); /* remove comments */ -+ if (tmp) -+ *tmp = '\0'; -+ while (isspace ((unsigned char) *cp)) /* remove spaces and tabs */ -+ ++cp; -+ if (*cp == '\0') /* ignore empty lines */ -+ continue; -+ -+ if (cp[strlen (cp) - 1] == '\n') -+ cp[strlen (cp) - 1] = '\0'; -+ -+ tmp = strsep (&cp, " \t="); -+ if (cp != NULL) -+ while (isspace ((unsigned char) *cp) || *cp == '=') -+ ++cp; -+ -+ store (tmp, cp); -+ } -+ fclose (fp); -+ -+ if (buf) -+ free (buf); -+} -+ -+static void -+load_defaults (void) -+{ -+ load_defaults_internal ("/etc/default/su"); -+ load_defaults_internal ("/etc/login.defs"); -+} -+ -+int -+getdef_bool (const char *name, int dflt) -+{ -+ const char *val; -+ -+ if (list == NULL) -+ load_defaults (); -+ -+ val = search (name); -+ -+ if (val == NULL) -+ return dflt; -+ -+ return (strcasecmp (val, "yes") == 0); -+} -+ -+long -+getdef_num (const char *name, long dflt) -+{ -+ const char *val; -+ char *cp; -+ long retval; -+ -+ if (list == NULL) -+ load_defaults (); -+ -+ val = search (name); -+ -+ if (val == NULL) -+ return dflt; -+ -+ errno = 0; -+ retval = strtol (val, &cp, 0); -+ if (*cp != '\0' -+ || ((retval == LONG_MAX || retval == LONG_MIN) && errno == ERANGE)) -+ { -+ fprintf (stderr, -+ "%s contains invalid numerical value: %s!\n", -+ name, val); -+ retval = dflt; -+ } -+ return retval; -+} -+ -+unsigned long -+getdef_unum (const char *name, unsigned long dflt) -+{ -+ const char *val; -+ char *cp; -+ unsigned long retval; -+ -+ if (list == NULL) -+ load_defaults (); -+ -+ val = search (name); -+ -+ if (val == NULL) -+ return dflt; -+ -+ errno = 0; -+ retval = strtoul (val, &cp, 0); -+ if (*cp != '\0' || (retval == ULONG_MAX && errno == ERANGE)) -+ { -+ fprintf (stderr, -+ "%s contains invalid numerical value: %s!\n", -+ name, val); -+ retval = dflt; -+ } -+ return retval; -+} -+ -+const char * -+getdef_str (const char *name, const char *dflt) -+{ -+ const char *retval; -+ -+ if (list == NULL) -+ load_defaults (); -+ -+ retval = search (name); -+ -+ return retval ?: dflt; -+} -+ -+#if defined(TEST) -+ -+int -+main () -+{ -+ printf ("CYPT=%s\n", getdef_str ("cRypt", "no")); -+ printf ("LOG_UNKFAIL_ENAB=%s\n", getdef_str ("log_unkfail_enab","")); -+ printf ("DOESNOTEXIST=%s\n", getdef_str ("DOESNOTEXIST","yes")); -+ return 0; -+} -+ -+#endif -Index: doc/coreutils.texi -=================================================================== ---- doc/coreutils.texi.orig -+++ doc/coreutils.texi -@@ -109,6 +109,7 @@ - * stat: (coreutils)stat invocation. Report file(system) status. - * stdbuf: (coreutils)stdbuf invocation. Modify stdio buffering. - * stty: (coreutils)stty invocation. Print/change terminal settings. -+* su: (coreutils)su invocation. Modify user and group ID. - * sum: (coreutils)sum invocation. Print traditional checksum. - * sync: (coreutils)sync invocation. Synchronize memory and disk. - * tac: (coreutils)tac invocation. Reverse files. -@@ -199,7 +200,7 @@ Free Documentation License''. - * User information:: id logname whoami groups users who - * System context:: date arch nproc uname hostid uptime - * SELinux context:: chcon runcon --* Modified command invocation:: chroot env nice nohup stdbuf timeout -+* Modified command invocation:: chroot env nice nohup stdbuf su timeout - * Process control:: kill - * Delaying:: sleep - * Numeric operations:: factor seq -@@ -444,6 +445,7 @@ Modified command invocation - * nice invocation:: Run a command with modified niceness - * nohup invocation:: Run a command immune to hangups - * stdbuf invocation:: Run a command with modified I/O buffering -+* su invocation:: Run a command with substitute user and group ID - * timeout invocation:: Run a command with a time limit - - Process control -@@ -767,7 +769,8 @@ meanings with the values @samp{0} and @s - Here are some of the exceptions: - @command{chroot}, @command{env}, @command{expr}, @command{nice}, - @command{nohup}, @command{numfmt}, @command{printenv}, @command{sort}, --@command{stdbuf}, @command{test}, @command{timeout}, @command{tty}. -+@command{su}, @command{stdbuf}, @command{test}, @command{timeout}, -+@command{tty}. - - - @node Backup options -@@ -15762,6 +15765,7 @@ user, etc. - * nice invocation:: Modify niceness. - * nohup invocation:: Immunize to hangups. - * stdbuf invocation:: Modify buffering of standard streams. -+* su invocation:: Modify user and group ID. - * timeout invocation:: Run with time limit. - @end menu - -@@ -16293,6 +16297,149 @@ the exit status of @var{command} otherwi - @end display - - -+@node su invocation -+@section @command{su}: Run a command with substitute user and group ID -+ -+@pindex su -+@cindex substitute user and group IDs -+@cindex user ID, switching -+@cindex super-user, becoming -+@cindex root, becoming -+ -+@command{su} allows one user to temporarily become another user. It runs a -+command (often an interactive shell) with the real and effective user -+ID, group ID, and supplemental groups of a given @var{user}. Synopsis: -+ -+@example -+su [@var{option}]@dots{} [@var{user} [@var{arg}]@dots{}] -+@end example -+ -+@cindex passwd entry, and @command{su} shell -+@flindex /bin/sh -+@flindex /etc/passwd -+If no @var{user} is given, the default is @code{root}, the super-user. -+The shell to use is taken from @var{user}'s @code{passwd} entry, or -+@file{/bin/sh} if none is specified there. If @var{user} has a -+password, @command{su} prompts for the password unless run by a user with -+effective user ID of zero (the super-user). -+ -+@vindex HOME -+@vindex SHELL -+@vindex USER -+@vindex LOGNAME -+@cindex login shell -+By default, @command{su} does not change the current directory. -+It sets the environment variables @env{HOME} and @env{SHELL} -+from the password entry for @var{user}, and if @var{user} is not -+the super-user, sets @env{USER} and @env{LOGNAME} to @var{user}. -+By default, the shell is not a login shell. -+ -+Any additional @var{arg}s are passed as additional arguments to the -+shell. -+ -+@cindex @option{-su} -+GNU @command{su} does not treat @file{/bin/sh} or any other shells specially -+(e.g., by setting @code{argv[0]} to @option{-su}, passing @option{-c} only -+to certain shells, etc.). -+ -+@findex syslog -+@command{su} can optionally be compiled to use @code{syslog} to report -+failed, and optionally successful, @command{su} attempts. (If the system -+supports @code{syslog}.) -+ -+This version of @command{su} has support for using PAM for -+authentication. You can edit @file{/etc/pam.d/su} resp @file{/etc/pam.d/su-l} -+to customize its behaviour. -+ -+If the environment variable SU_COMMAND_SAME_SESSION is set, @command{su} su will -+not open a new session for running a command thus making @option{-c} behaves -+just like @option{--session-command}. -+ -+The program accepts the following options. Also see @ref{Common options}. -+ -+@table @samp -+@item -c @var{command} -+@itemx --command=@var{command} -+@opindex -c -+@opindex --command -+Pass @var{command}, a single command line to run, to the shell with -+a @option{-c} option instead of starting an interactive shell. -+ -+@itemx --session-command=@var{command} -+@opindex --session-command -+Pass @var{command}, a single command line to run, to the shell with a -+@option{-c} option instead of starting an interactive and do not create -+a new session for it. -+ -+@item -f -+@itemx --fast -+@opindex -f -+@opindex --fast -+@flindex .cshrc -+@cindex file name pattern expansion, disabled -+@cindex globbing, disabled -+Pass the @option{-f} option to the shell. This probably only makes sense -+if the shell run is @command{csh} or @command{tcsh}, for which the @option{-f} -+option prevents reading the startup file (@file{.cshrc}). With -+Bourne-like shells, the @option{-f} option disables file name pattern -+expansion (globbing), which is not likely to be useful. -+ -+@item - -+@itemx -l -+@itemx --login -+@opindex - -+@opindex -l -+@opindex --login -+@c other variables already indexed above -+@vindex TERM -+@vindex PATH -+@cindex login shell, creating -+Make the shell a login shell. This means the following. Unset all -+environment variables except @env{TERM}, @env{HOME}, and @env{SHELL} -+(which are set as described above), and @env{USER} and @env{LOGNAME} -+(which are set, even for the super-user, as described above), and set -+@env{PATH} to a compiled-in default value. Change to @var{user}'s home -+directory. Prepend @samp{-} to the shell's name, intended to make it -+read its login startup file(s). -+ -+@item -m -+@itemx -p -+@itemx --preserve-environment -+@opindex -m -+@opindex -p -+@opindex --preserve-environment -+@cindex environment, preserving -+@flindex /etc/shells -+@cindex restricted shell -+Do not change the environment variables @env{HOME}, @env{USER}, -+@env{LOGNAME}, or @env{SHELL}. Run the shell given in the environment -+variable @env{SHELL} instead of the shell from @var{user}'s passwd -+entry, unless the user running @command{su} is not the super-user and -+@var{user}'s shell is restricted. A @dfn{restricted shell} is one that -+is not listed in the file @file{/etc/shells}, or in a compiled-in list -+if that file does not exist. Parts of what this option does can be -+overridden by @option{--login} and @option{--shell}. -+ -+@item -s @var{shell} -+@itemx --shell=@var{shell} -+@opindex -s -+@opindex --shell -+Run @var{shell} instead of the shell from @var{user}'s passwd entry, -+unless the user running @command{su} is not the super-user and @var{user}'s -+shell is restricted (see @option{-m} just above). -+ -+@end table -+ -+@cindex exit status of @command{su} -+Exit status: -+ -+@display -+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 -+@end display -+ - @node timeout invocation - @section @command{timeout}: Run a command with a time limit - -Index: man/local.mk -=================================================================== ---- man/local.mk.orig -+++ man/local.mk -@@ -26,6 +26,7 @@ run_help2man = $(SHELL) $(srcdir)/man/du - endif - - man1_MANS = @man1_MANS@ -+man1_MANS += man/su.1 - EXTRA_DIST += $(man1_MANS:.1=.x) - - EXTRA_MANS = @EXTRA_MANS@ -@@ -144,6 +145,7 @@ man/split.1: src/split - man/stat.1: src/stat - man/stdbuf.1: src/stdbuf - man/stty.1: src/stty -+man/su.1: src/su - man/sum.1: src/sum - man/sync.1: src/sync - man/tac.1: src/tac -Index: man/su.x -=================================================================== ---- /dev/null -+++ man/su.x -@@ -0,0 +1,4 @@ -+[NAME] -+su \- run a shell with substitute user and group IDs -+[DESCRIPTION] -+.\" Add any additional description here -Index: tests/misc/su-fail.sh -=================================================================== ---- /dev/null -+++ tests/misc/su-fail.sh -@@ -0,0 +1,30 @@ -+#!/bin/sh -+# Test su failure cases -+ -+# Copyright (C) 2009-2012 Free Software Foundation, Inc. -+ -+# This program is free software: you can redistribute it and/or modify -+# it under the terms of the GNU General Public License as published by -+# the Free Software Foundation, either version 3 of the License, or -+# (at your option) any later version. -+ -+# This program is distributed in the hope that it will be useful, -+# but WITHOUT ANY WARRANTY; without even the implied warranty of -+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+# GNU General Public License for more details. -+ -+# You should have received a copy of the GNU General Public License -+# along with this program. If not, see . -+ -+. "${srcdir=.}/tests/init.sh"; path_prepend_ ./src -+print_ver_ su -+ -+#require_built_ su -+ -+# Very little that we can test without a root password -+su --- / true # unknown option -+test $? = 125 || fail=1 -+su no_such_user -+test $? = 125 || fail=1 -+ -+Exit $fail -Index: tests/local.mk -=================================================================== ---- tests/local.mk.orig -+++ tests/local.mk -@@ -361,6 +361,7 @@ all_tests = \ - tests/misc/stty-invalid.sh \ - tests/misc/stty-pairs.sh \ - tests/misc/stty-row-col.sh \ -+ tests/misc/su-fail.sh \ - tests/misc/sum.pl \ - tests/misc/sum-sysv.sh \ - tests/misc/tac.pl \ -Index: po/coreutils.pot -=================================================================== ---- po/coreutils.pot.orig -+++ po/coreutils.pot -@@ -8461,6 +8461,73 @@ msgstr "" - msgid "invalid integer argument %s" - msgstr "" - -+#: src/su.c:229 -+msgid "Password:" -+msgstr "" -+ -+#: src/su.c:232 -+#, c-format -+msgid "getpass: cannot open /dev/tty" -+msgstr "" -+ -+#: src/su.c:290 -+#, c-format -+msgid "cannot set groups" -+msgstr "" -+ -+#: src/su.c:294 -+#, c-format -+msgid "cannot set group id" -+msgstr "" -+ -+#: src/su.c:296 -+#, c-format -+msgid "cannot set user id" -+msgstr "" -+ -+#: src/su.c:371 -+#, c-format -+msgid "Usage: %s [OPTION]... [-] [USER [ARG]...]\n" -+msgstr "" -+ -+#: src/su.c:372 -+msgid "" -+"Change the effective user id and group id to that of USER.\n" -+"\n" -+" -, -l, --login make the shell a login shell\n" -+" -c, --command=COMMAND pass a single COMMAND to the shell with -c\n" -+" -f, --fast pass -f to the shell (for csh or tcsh)\n" -+" -m, --preserve-environment do not reset environment variables\n" -+" -p same as -m\n" -+" -s, --shell=SHELL run SHELL if /etc/shells allows it\n" -+msgstr "" -+ -+#: src/su.c:384 -+msgid "" -+"\n" -+"A mere - implies -l. If USER not given, assume root.\n" -+msgstr "" -+ -+#: src/su.c:461 -+#, c-format -+msgid "user %s does not exist" -+msgstr "" -+ -+#: src/su.c:484 -+#, c-format -+msgid "incorrect password" -+msgstr "" -+ -+#: src/su.c:501 -+#, c-format -+msgid "using restricted shell %s" -+msgstr "" -+ -+#: src/su.c:509 -+#, c-format -+msgid "warning: cannot change directory to %s" -+msgstr "" -+ - #. This is a proper name. See the gettext manual, section Names. - #: src/sum.c:37 - msgid "Kayvan Aghaiepour" -Index: README -=================================================================== ---- README.orig -+++ README -@@ -13,7 +13,7 @@ The programs that can be built with this - link ln logname ls md5sum mkdir mkfifo mknod mktemp mv nice nl nohup - nproc numfmt od paste pathchk pinky pr printenv printf ptx pwd readlink - realpath rm rmdir runcon seq sha1sum sha224sum sha256sum sha384sum sha512sum -- shred shuf sleep sort split stat stdbuf stty sum sync tac tail tee test -+ shred shuf sleep sort split stat stdbuf stty su sum sync tac tail tee test - timeout touch tr true truncate tsort tty uname unexpand uniq unlink - uptime users vdir wc who whoami yes - diff --git a/coreutils-testsuite.changes b/coreutils-testsuite.changes index 2fa1631..ba2961d 100644 --- a/coreutils-testsuite.changes +++ b/coreutils-testsuite.changes @@ -1,3 +1,26 @@ +------------------------------------------------------------------- +Fri Jun 7 14:36:26 UTC 2013 - schwab@suse.de + +- longlong-aarch64.patch: fix build on aarch64 + +------------------------------------------------------------------- +Fri Jun 7 01:50:04 UTC 2013 - mail@bernhard-voelker.de + +- Remove su(1) and kill(1) - both are provided by util-linux now. + * su.pamd, su.default, coreutils-su.patch: Remove patch and PAM + config files related to su(1). + * coreutils-remove_kill_documentation.patch: Add patch to remove + kill from the texinfo manual. + * coreutils.spec: Remove above, su-related patch and sources. + Remove Requires:pam and BuildRequires:pam-devel. + Remove Provides:/bin/{su,kill}. + Remove paragraph mentioning su(1) and kill(1) in %description. + Remove `moving su trickery` and other left-overs from %install, + %post and %files. + Remove %posttrans and %verifyscript sections (as these contained + su-related stuff). + Add code to %install to remove kill's program and man page. + ------------------------------------------------------------------- Mon May 20 15:38:30 UTC 2013 - mail@bernhard-voelker.de diff --git a/coreutils-testsuite.spec b/coreutils-testsuite.spec index 9e792ec..ea393e0 100644 --- a/coreutils-testsuite.spec +++ b/coreutils-testsuite.spec @@ -24,6 +24,15 @@ Url: http://www.gnu.org/software/coreutils/ Version: 8.21 Release: 0 +################################################################# +################################################################# +### ! ! ! R E M I N D E R ! ! ! ### +################################################################# +### Please call "./pre_checkin.sh" prior to submitting. ### +### (This will regenerate coreutils-testsuite.spec) ### +################################################################# +################################################################# + BuildRequires: automake BuildRequires: gmp-devel BuildRequires: help2man @@ -44,8 +53,6 @@ BuildRequires: valgrind Provides: %{name} = %{version} %if "%{name}" == "coreutils" -Provides: /bin/kill -Provides: /bin/su Provides: fileutils = %{version} Provides: mktemp = %{version} Provides: sh-utils = %{version} @@ -57,10 +64,6 @@ Provides: textutils = %{version} Recommends: %{name}-lang = %version %endif -# Needed for su. -BuildRequires: pam-devel -Requires: pam >= 1.1.1.90 - # this will create a cycle, broken up randomly - coreutils is just # too core to have other prerequisites. #PreReq: permissions @@ -80,22 +83,21 @@ Source: http://ftp.gnu.org/gnu/%{name}/%{name}-%{version}.tar.xz Source: coreutils-%{version}.tar.xz %endif -Source1: su.pamd -Source2: su.default -Source3: baselibs.conf -Source4: coreutils-%{version}.de.po.xz +Source1: baselibs.conf +Source2: coreutils-%{version}.de.po.xz Patch1: coreutils-remove_hostname_documentation.patch #Patch2: coreutils-gl_printf_safe.patch +Patch3: coreutils-remove_kill_documentation.patch Patch4: coreutils-i18n.patch Patch8: coreutils-sysinfo.patch Patch16: coreutils-invalid-ids.patch +Patch17: longlong-aarch64.patch # #Patch33: coreutils-8.9-singlethreaded-sort.patch # OBS / RPMLINT require /usr/bin/timeout to be built with the -fpie option. Patch100: coreutils-build-timeout-as-pie.patch -Patch101: coreutils-su.patch # Fix gnulib-test failures related to gnulib-tests/nap.h. Patch200: coreutils-gnulib-tests-fix-nap-race.patch @@ -119,31 +121,27 @@ the GNU fileutils, sh-utils, and textutils packages. timeout touch tr true truncate tsort tty uname unexpand uniq unlink uptime users vdir wc who whoami yes -As su(1) and kill(1) have been moved from coreutils to util-linux upstreams, -this package provides compatibility symlinks to the old coreutils versions -of both programs. This is needed until there's a newer version of the -receiving util-linux package available which comes with the new binaries. - # ================================================ %lang_package %prep %setup -q -n coreutils-%{version} %patch4 %patch1 +%patch3 #%%if 0%%{suse_version} > 1200 #%%patch2 #%%endif %patch8 %patch16 +%patch17 -p1 # #%%patch33 %patch100 -%patch101 %patch200 %patch201 -xz -dc %{S:4} >po/de.po +xz -dc %{S:2} >po/de.po #???## We need to statically link to gmp, otherwise we have a build loop #???#sed -i s,'$(LIB_GMP)',%%{_libdir}/libgmp.a,g Makefile.in @@ -184,27 +182,9 @@ make all %{?_smp_mflags} V=1 %if "%{name}" == "coreutils" %makeinstall pkglibexecdir=%{_libdir}/%{name} -# === TRICKERY - PART 1/3 === -# trickery to make the move of su and kill to util-linux as easy as possible -# this all needs to go when util-linux 2.22 has been checked in and -# everything has settled. 15.10.2012 pth@suse.de -# Install su and kill with a ".core" suffix. - -install -d -m 755 %{buildroot}/etc/pam.d -install -m 644 %{S:1} %{buildroot}/etc/pam.d/su.core -install -m 644 %{S:1} %{buildroot}/etc/pam.d/su-l.core - -install -d -m 755 %{buildroot}/etc/default -install -m 644 %{S:2} %{buildroot}/etc/default/su.core - -install -s -m 755 src/su %{buildroot}%{_bindir}/su.core -install -m 644 man/su.1 %{buildroot}%{_mandir}/man1/su.core.1 -rm -f %{buildroot}%{_mandir}/man1/su.1 - -# kill is still part of coreutils, so rename it (stripped). -install -s -m 755 %{buildroot}%{_bindir}/kill %{buildroot}%{_bindir}/kill.core -rm -f %{buildroot}%{_bindir}/kill -mv -v %{buildroot}%{_mandir}/man1/kill.1 %{buildroot}%{_mandir}/man1/kill.core.1 +# remove kill +rm -v %{buildroot}%{_bindir}/kill +rm -v %{buildroot}/%{_mandir}/man1/kill.1 #UsrMerge install -d %{buildroot}/bin @@ -223,30 +203,6 @@ echo '.so man1/test.1' > %{buildroot}/%{_mandir}/man1/\[.1 %post %if "%{name}" == "coreutils" %install_info --info-dir=%{_infodir} %{_infodir}/coreutils.info.gz - -# may fail if permissions is not there, but there is no way around that -%set_permissions %{_bindir}/su.core -%endif - -# ================================================ -%posttrans -%if "%{name}" == "coreutils" -# === TRICKERY - PART 2/3 === -# If the files are missing after installation, then create links to the -# saved ones (with suffix .core). -if [ ! -r %{_bindir}/su -a -e %{_bindir}/su.core ]; then - echo "%{_bindir}/su does not exist, setting compat symlink to %{_bindir}/su.core" - ln -svf %{_bindir}/su.core %{_bindir}/su - ln -svf %{_bindir}/kill.core %{_bindir}/kill - ln -svf %{_bindir}/su.core /bin/su - ln -svf %{_bindir}/kill.core /bin/kill - ln -svf /etc/pam.d/su.core /etc/pam.d/su - ln -svf /etc/pam.d/su-l.core /etc/pam.d/su-l - ln -svf /etc/default/su.core /etc/default/su - # man pages are already zipped at that point. - mv -vf %{_mandir}/man1/kill.core.1.gz %{_mandir}/man1/kill.1.gz - mv -vf %{_mandir}/man1/su.core.1.gz %{_mandir}/man1/su.1.gz -fi %endif # ================================================ @@ -255,19 +211,12 @@ fi %install_info_delete --info-dir=%{_infodir} %{_infodir}/coreutils.info.gz %endif -# ================================================ -%verifyscript -%if "%{name}" == "coreutils" -%verify_permissions -e %{_bindir}/su.core -%endif - # ================================================ %files %if "%{name}" == "coreutils" %defattr(-,root,root) %doc COPYING NEWS README THANKS -%attr(4755,root,root) %{_bindir}/su.core %{_bindir}/* #UsrMerge /bin/* @@ -276,10 +225,6 @@ fi %doc %{_infodir}/coreutils.info*.gz %doc %{_mandir}/man1/*.1.gz %dir %{_datadir}/locale/*/LC_TIME -# === TRICKERY - PART 3/3 === -%config /etc/default/su.core -%config /etc/pam.d/su-l.core -%config /etc/pam.d/su.core %files lang -f coreutils.lang %defattr(-,root,root) diff --git a/coreutils.changes b/coreutils.changes index 2fa1631..ba2961d 100644 --- a/coreutils.changes +++ b/coreutils.changes @@ -1,3 +1,26 @@ +------------------------------------------------------------------- +Fri Jun 7 14:36:26 UTC 2013 - schwab@suse.de + +- longlong-aarch64.patch: fix build on aarch64 + +------------------------------------------------------------------- +Fri Jun 7 01:50:04 UTC 2013 - mail@bernhard-voelker.de + +- Remove su(1) and kill(1) - both are provided by util-linux now. + * su.pamd, su.default, coreutils-su.patch: Remove patch and PAM + config files related to su(1). + * coreutils-remove_kill_documentation.patch: Add patch to remove + kill from the texinfo manual. + * coreutils.spec: Remove above, su-related patch and sources. + Remove Requires:pam and BuildRequires:pam-devel. + Remove Provides:/bin/{su,kill}. + Remove paragraph mentioning su(1) and kill(1) in %description. + Remove `moving su trickery` and other left-overs from %install, + %post and %files. + Remove %posttrans and %verifyscript sections (as these contained + su-related stuff). + Add code to %install to remove kill's program and man page. + ------------------------------------------------------------------- Mon May 20 15:38:30 UTC 2013 - mail@bernhard-voelker.de diff --git a/coreutils.spec b/coreutils.spec index c8e802d..6de95d4 100644 --- a/coreutils.spec +++ b/coreutils.spec @@ -24,6 +24,15 @@ Url: http://www.gnu.org/software/coreutils/ Version: 8.21 Release: 0 +################################################################# +################################################################# +### ! ! ! R E M I N D E R ! ! ! ### +################################################################# +### Please call "./pre_checkin.sh" prior to submitting. ### +### (This will regenerate coreutils-testsuite.spec) ### +################################################################# +################################################################# + BuildRequires: automake BuildRequires: gmp-devel BuildRequires: help2man @@ -44,8 +53,6 @@ BuildRequires: valgrind Provides: %{name} = %{version} %if "%{name}" == "coreutils" -Provides: /bin/kill -Provides: /bin/su Provides: fileutils = %{version} Provides: mktemp = %{version} Provides: sh-utils = %{version} @@ -57,10 +64,6 @@ Provides: textutils = %{version} Recommends: %{name}-lang = %version %endif -# Needed for su. -BuildRequires: pam-devel -Requires: pam >= 1.1.1.90 - # this will create a cycle, broken up randomly - coreutils is just # too core to have other prerequisites. #PreReq: permissions @@ -80,22 +83,21 @@ Source: http://ftp.gnu.org/gnu/%{name}/%{name}-%{version}.tar.xz Source: coreutils-%{version}.tar.xz %endif -Source1: su.pamd -Source2: su.default -Source3: baselibs.conf -Source4: coreutils-%{version}.de.po.xz +Source1: baselibs.conf +Source2: coreutils-%{version}.de.po.xz Patch1: coreutils-remove_hostname_documentation.patch #Patch2: coreutils-gl_printf_safe.patch +Patch3: coreutils-remove_kill_documentation.patch Patch4: coreutils-i18n.patch Patch8: coreutils-sysinfo.patch Patch16: coreutils-invalid-ids.patch +Patch17: longlong-aarch64.patch # #Patch33: coreutils-8.9-singlethreaded-sort.patch # OBS / RPMLINT require /usr/bin/timeout to be built with the -fpie option. Patch100: coreutils-build-timeout-as-pie.patch -Patch101: coreutils-su.patch # Fix gnulib-test failures related to gnulib-tests/nap.h. Patch200: coreutils-gnulib-tests-fix-nap-race.patch @@ -119,31 +121,27 @@ the GNU fileutils, sh-utils, and textutils packages. timeout touch tr true truncate tsort tty uname unexpand uniq unlink uptime users vdir wc who whoami yes -As su(1) and kill(1) have been moved from coreutils to util-linux upstreams, -this package provides compatibility symlinks to the old coreutils versions -of both programs. This is needed until there's a newer version of the -receiving util-linux package available which comes with the new binaries. - # ================================================ %lang_package %prep %setup -q -n coreutils-%{version} %patch4 %patch1 +%patch3 #%%if 0%%{suse_version} > 1200 #%%patch2 #%%endif %patch8 %patch16 +%patch17 -p1 # #%%patch33 %patch100 -%patch101 %patch200 %patch201 -xz -dc %{S:4} >po/de.po +xz -dc %{S:2} >po/de.po #???## We need to statically link to gmp, otherwise we have a build loop #???#sed -i s,'$(LIB_GMP)',%%{_libdir}/libgmp.a,g Makefile.in @@ -184,27 +182,9 @@ make all %{?_smp_mflags} V=1 %if "%{name}" == "coreutils" %makeinstall pkglibexecdir=%{_libdir}/%{name} -# === TRICKERY - PART 1/3 === -# trickery to make the move of su and kill to util-linux as easy as possible -# this all needs to go when util-linux 2.22 has been checked in and -# everything has settled. 15.10.2012 pth@suse.de -# Install su and kill with a ".core" suffix. - -install -d -m 755 %{buildroot}/etc/pam.d -install -m 644 %{S:1} %{buildroot}/etc/pam.d/su.core -install -m 644 %{S:1} %{buildroot}/etc/pam.d/su-l.core - -install -d -m 755 %{buildroot}/etc/default -install -m 644 %{S:2} %{buildroot}/etc/default/su.core - -install -s -m 755 src/su %{buildroot}%{_bindir}/su.core -install -m 644 man/su.1 %{buildroot}%{_mandir}/man1/su.core.1 -rm -f %{buildroot}%{_mandir}/man1/su.1 - -# kill is still part of coreutils, so rename it (stripped). -install -s -m 755 %{buildroot}%{_bindir}/kill %{buildroot}%{_bindir}/kill.core -rm -f %{buildroot}%{_bindir}/kill -mv -v %{buildroot}%{_mandir}/man1/kill.1 %{buildroot}%{_mandir}/man1/kill.core.1 +# remove kill +rm -v %{buildroot}%{_bindir}/kill +rm -v %{buildroot}/%{_mandir}/man1/kill.1 #UsrMerge install -d %{buildroot}/bin @@ -223,30 +203,6 @@ echo '.so man1/test.1' > %{buildroot}/%{_mandir}/man1/\[.1 %post %if "%{name}" == "coreutils" %install_info --info-dir=%{_infodir} %{_infodir}/coreutils.info.gz - -# may fail if permissions is not there, but there is no way around that -%set_permissions %{_bindir}/su.core -%endif - -# ================================================ -%posttrans -%if "%{name}" == "coreutils" -# === TRICKERY - PART 2/3 === -# If the files are missing after installation, then create links to the -# saved ones (with suffix .core). -if [ ! -r %{_bindir}/su -a -e %{_bindir}/su.core ]; then - echo "%{_bindir}/su does not exist, setting compat symlink to %{_bindir}/su.core" - ln -svf %{_bindir}/su.core %{_bindir}/su - ln -svf %{_bindir}/kill.core %{_bindir}/kill - ln -svf %{_bindir}/su.core /bin/su - ln -svf %{_bindir}/kill.core /bin/kill - ln -svf /etc/pam.d/su.core /etc/pam.d/su - ln -svf /etc/pam.d/su-l.core /etc/pam.d/su-l - ln -svf /etc/default/su.core /etc/default/su - # man pages are already zipped at that point. - mv -vf %{_mandir}/man1/kill.core.1.gz %{_mandir}/man1/kill.1.gz - mv -vf %{_mandir}/man1/su.core.1.gz %{_mandir}/man1/su.1.gz -fi %endif # ================================================ @@ -255,19 +211,12 @@ fi %install_info_delete --info-dir=%{_infodir} %{_infodir}/coreutils.info.gz %endif -# ================================================ -%verifyscript -%if "%{name}" == "coreutils" -%verify_permissions -e %{_bindir}/su.core -%endif - # ================================================ %files %if "%{name}" == "coreutils" %defattr(-,root,root) %doc COPYING NEWS README THANKS -%attr(4755,root,root) %{_bindir}/su.core %{_bindir}/* #UsrMerge /bin/* @@ -276,10 +225,6 @@ fi %doc %{_infodir}/coreutils.info*.gz %doc %{_mandir}/man1/*.1.gz %dir %{_datadir}/locale/*/LC_TIME -# === TRICKERY - PART 3/3 === -%config /etc/default/su.core -%config /etc/pam.d/su-l.core -%config /etc/pam.d/su.core %files lang -f coreutils.lang %defattr(-,root,root) diff --git a/longlong-aarch64.patch b/longlong-aarch64.patch new file mode 100644 index 0000000..facdbf2 --- /dev/null +++ b/longlong-aarch64.patch @@ -0,0 +1,51 @@ +From 9fe7c5b6eb373d859390dd5a7844a666d8b7818b Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Torbj=C3=B6rn=20Granlund?= +Date: Mon, 4 Mar 2013 17:57:33 +0000 +Subject: [PATCH] build: fix factor build failure on aarch64 + +* src/longlong.h (__aarch64__): Make add_ssaaaa and sub_ddmmss work. +* NEWS: Mention the build fix. +Reported at https://bugzilla.redhat.com/917735 +--- + NEWS | 4 ++++ + src/longlong.h | 21 +++++++-------------- + 2 files changed, 11 insertions(+), 14 deletions(-) + +diff --git a/src/longlong.h b/src/longlong.h +index 4681642..eba2417 100644 +--- a/src/longlong.h ++++ b/src/longlong.h +@@ -529,23 +529,16 @@ extern UWtype __MPN(udiv_qrnnd) (UWtype *, UWtype, UWtype, UWtype); + #endif /* __arm__ */ + + #if defined (__aarch64__) && W_TYPE_SIZE == 64 ++/* FIXME: Extend the immediate range for the low word by using both ++ ADDS and SUBS, since they set carry in the same way. */ + #define add_ssaaaa(sh, sl, ah, al, bh, bl) \ +- __asm__ ("adds\t%1, %4, %5\n\tadc\t%0, %2, %3" \ ++ __asm__ ("adds\t%1, %x4, %5\n\tadc\t%0, %x2, %x3" \ + : "=r" (sh), "=&r" (sl) \ +- : "r" (ah), "rZ" (bh), "%r" (al), "rI" (bl) __CLOBBER_CC) ++ : "rZ" (ah), "rZ" (bh), "%r" (al), "rI" (bl) __CLOBBER_CC) + #define sub_ddmmss(sh, sl, ah, al, bh, bl) \ +- do { \ +- if (__builtin_constant_p (bl)) \ +- { \ +- __asm__ ("subs\t%1, %4, %5\n\tsbc\t%0, %2, %3" \ +- : "=r" (sh), "=&r" (sl) \ +- : "r" (ah), "r" (bh), "r" (al), "rI" (bl) __CLOBBER_CC); \ +- } \ +- else /* only bh might be a constant */ \ +- __asm__ ("subs\t%1, %4, %5\n\tsbc\t%0, %2, %3" \ +- : "=r" (sh), "=&r" (sl) \ +- : "r" (ah), "rZ" (bh), "r" (al), "rI" (bl) __CLOBBER_CC);\ +- } while (0) ++ __asm__ ("subs\t%1, %x4, %5\n\tsbc\t%0, %x2, %x3" \ ++ : "=r,r" (sh), "=&r,&r" (sl) \ ++ : "rZ,rZ" (ah), "rZ,rZ" (bh), "r,Z" (al), "rI,r" (bl) __CLOBBER_CC) + #define umul_ppmm(ph, pl, m0, m1) \ + do { \ + UDItype __m0 = (m0), __m1 = (m1); \ +-- +1.8.3 + diff --git a/su.default b/su.default deleted file mode 100644 index 62d1702..0000000 --- a/su.default +++ /dev/null @@ -1,11 +0,0 @@ -# Per default, only "su -" will set a new PATH. -# If this variable is changed to "yes" (default is "no"), -# every su call will overwrite the PATH variable. -ALWAYS_SET_PATH=no - -# Default path. -PATH=/usr/local/bin:/bin:/usr/bin - -# Default path for a user invoking su to root. -SUPATH=/usr/sbin:/bin:/usr/bin:/sbin - diff --git a/su.pamd b/su.pamd deleted file mode 100644 index 88ddbaf..0000000 --- a/su.pamd +++ /dev/null @@ -1,8 +0,0 @@ -#%PAM-1.0 -auth sufficient pam_rootok.so -auth include common-auth -account sufficient pam_rootok.so -account include common-account -password include common-password -session include common-session -session optional pam_xauth.so