svn commit: r363525 - in stable/12: bin/csh bin/sh share/skel

Piotr Pawel Stefaniak pstef at FreeBSD.org
Sat Jul 25 11:57:41 UTC 2020


Author: pstef
Date: Sat Jul 25 11:57:39 2020
New Revision: 363525
URL: https://svnweb.freebsd.org/changeset/base/363525

Log:
  MFC r342576-342577,342645,342812,342881,343231,343399 (by trasz):
  
  r342577 Make sh(1) collapse $HOME into "~" in PS1
  r342576 Simplify the way we set the default sh(1) PS1
  r342645 Add current working directory to the default sh prompt
  r342812 Give sh(1) a proper default prompt instead of just "$".
  r342881 Make sh(1) recognize the default $HOME
  r343231 Don't mess with BLOCKSIZE in shell startup files
  r343399 Make sh(1) support \u in PS1

Modified:
  stable/12/bin/csh/csh.login
  stable/12/bin/csh/dot.cshrc
  stable/12/bin/sh/parser.c
  stable/12/bin/sh/profile
  stable/12/bin/sh/sh.1
  stable/12/share/skel/dot.cshrc
  stable/12/share/skel/dot.profile
  stable/12/share/skel/dot.shrc
Directory Properties:
  stable/12/   (props changed)

Modified: stable/12/bin/csh/csh.login
==============================================================================
--- stable/12/bin/csh/csh.login	Sat Jul 25 11:34:50 2020	(r363524)
+++ stable/12/bin/csh/csh.login	Sat Jul 25 11:57:39 2020	(r363525)
@@ -1,9 +1,6 @@
 # $FreeBSD$
 #
 # System-wide .login file for csh(1).
-# Uncomment this to give you the default 4.2 behavior, where disk
-# information is shown in K-Blocks
-# setenv BLOCKSIZE	K
 #
 # For the setting of languages and character sets please see
 # login.conf(5) and in particular the charset and lang options.

Modified: stable/12/bin/csh/dot.cshrc
==============================================================================
--- stable/12/bin/csh/dot.cshrc	Sat Jul 25 11:34:50 2020	(r363524)
+++ stable/12/bin/csh/dot.cshrc	Sat Jul 25 11:57:39 2020	(r363525)
@@ -23,7 +23,6 @@ set path = (/sbin /bin /usr/sbin /usr/bin /usr/local/s
 
 setenv	EDITOR	vi
 setenv	PAGER	less
-setenv	BLOCKSIZE	K
 
 if ($?prompt) then
 	# An interactive shell -- set some stuff up

Modified: stable/12/bin/sh/parser.c
==============================================================================
--- stable/12/bin/sh/parser.c	Sat Jul 25 11:34:50 2020	(r363524)
+++ stable/12/bin/sh/parser.c	Sat Jul 25 11:57:39 2020	(r363525)
@@ -40,6 +40,8 @@ static char sccsid[] = "@(#)parser.c	8.7 (Berkeley) 5/
 #include <sys/cdefs.h>
 __FBSDID("$FreeBSD$");
 
+#include <sys/param.h>
+#include <pwd.h>
 #include <stdlib.h>
 #include <unistd.h>
 #include <stdio.h>
@@ -130,6 +132,7 @@ static void synexpect(int) __dead2;
 static void synerror(const char *) __dead2;
 static void setprompt(int);
 static int pgetc_linecont(void);
+static void getusername(char *, size_t);
 
 
 static void *
@@ -1969,6 +1972,53 @@ pgetc_linecont(void)
 	return (c);
 }
 
+
+static struct passwd *
+getpwlogin(void)
+{
+	const char *login;
+
+	login = getlogin();
+	if (login == NULL)
+		return (NULL);
+
+	return (getpwnam(login));
+}
+
+
+static void
+getusername(char *name, size_t namelen)
+{
+	static char cached_name[MAXLOGNAME];
+	struct passwd *pw;
+	uid_t euid;
+
+	if (cached_name[0] == '\0') {
+		euid = geteuid();
+
+		/*
+		 * Handle the case when there is more than one
+		 * login with the same UID, or when the login
+		 * returned by getlogin(2) does no longer match
+		 * the current UID.
+		 */
+		pw = getpwlogin();
+		if (pw == NULL || pw->pw_uid != euid)
+			pw = getpwuid(euid);
+
+		if (pw != NULL) {
+			strlcpy(cached_name, pw->pw_name,
+			    sizeof(cached_name));
+		} else {
+			snprintf(cached_name, sizeof(cached_name),
+			    "%u", euid);
+		}
+	}
+
+	strlcpy(name, cached_name, namelen);
+}
+
+
 /*
  * called by editline -- any expansions to the prompt
  *    should be added here.
@@ -1978,7 +2028,9 @@ getprompt(void *unused __unused)
 {
 	static char ps[PROMPTLEN];
 	const char *fmt;
+	const char *home;
 	const char *pwd;
+	size_t homelen;
 	int i, trim;
 	static char internal_error[] = "??";
 
@@ -2025,6 +2077,17 @@ getprompt(void *unused __unused)
 				break;
 
 				/*
+				 * User name.
+				 */
+			case 'u':
+				ps[i] = '\0';
+				getusername(&ps[i], PROMPTLEN - i);
+				/* Skip to end of username. */
+				while (ps[i + 1] != '\0')
+					i++;
+				break;
+
+				/*
 				 * Working directory.
 				 *
 				 * \W specifies just the final component,
@@ -2039,8 +2102,24 @@ getprompt(void *unused __unused)
 				    *pwd == '/' && pwd[1] != '\0')
 					strlcpy(&ps[i], strrchr(pwd, '/') + 1,
 					    PROMPTLEN - i);
-				else
-					strlcpy(&ps[i], pwd, PROMPTLEN - i);
+				else {
+					home = lookupvar("HOME");
+					if (home != NULL)
+						homelen = strlen(home);
+					if (home != NULL &&
+					    strcmp(home, "/") != 0 &&
+					    strncmp(pwd, home, homelen) == 0 &&
+					    (pwd[homelen] == '/' ||
+					    pwd[homelen] == '\0')) {
+						strlcpy(&ps[i], "~",
+						    PROMPTLEN - i);
+						strlcpy(&ps[i + 1],
+						    pwd + homelen,
+						    PROMPTLEN - i - 1);
+					} else {
+						strlcpy(&ps[i], pwd, PROMPTLEN - i);
+					}
+				}
 				/* Skip to end of path. */
 				while (ps[i + 1] != '\0')
 					i++;

Modified: stable/12/bin/sh/profile
==============================================================================
--- stable/12/bin/sh/profile	Sat Jul 25 11:34:50 2020	(r363524)
+++ stable/12/bin/sh/profile	Sat Jul 25 11:57:39 2020	(r363525)
@@ -2,10 +2,6 @@
 #
 # System-wide .profile file for sh(1).
 #
-# Uncomment this to give you the default 4.2 behavior, where disk
-# information is shown in K-Blocks
-# BLOCKSIZE=K; export BLOCKSIZE
-#
 # For the setting of languages and character sets please see
 # login.conf(5) and in particular the charset and lang options.
 # For full locales list check /usr/share/locale/*

Modified: stable/12/bin/sh/sh.1
==============================================================================
--- stable/12/bin/sh/sh.1	Sat Jul 25 11:34:50 2020	(r363524)
+++ stable/12/bin/sh/sh.1	Sat Jul 25 11:57:39 2020	(r363525)
@@ -1417,6 +1417,8 @@ which are replaced by the given information:
 This system's fully-qualified hostname (FQDN).
 .It Li \eh
 This system's hostname.
+.It Li \eu
+User name.
 .It Li \eW
 The final component of the current working directory.
 .It Li \ew

Modified: stable/12/share/skel/dot.cshrc
==============================================================================
--- stable/12/share/skel/dot.cshrc	Sat Jul 25 11:34:50 2020	(r363524)
+++ stable/12/share/skel/dot.cshrc	Sat Jul 25 11:57:39 2020	(r363525)
@@ -15,7 +15,6 @@ alias ll	ls -lAF
 # These are normally set through /etc/login.conf.  You may override them here
 # if wanted.
 # set path = (/sbin /bin /usr/sbin /usr/bin /usr/local/sbin /usr/local/bin $HOME/bin)
-# setenv	BLOCKSIZE	K
 # A righteous umask
 # umask 22
 

Modified: stable/12/share/skel/dot.profile
==============================================================================
--- stable/12/share/skel/dot.profile	Sat Jul 25 11:34:50 2020	(r363524)
+++ stable/12/share/skel/dot.profile	Sat Jul 25 11:57:39 2020	(r363525)
@@ -8,7 +8,6 @@
 # These are normally set through /etc/login.conf.  You may override them here
 # if wanted.
 # PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin:$HOME/bin; export PATH
-# BLOCKSIZE=K;	export BLOCKSIZE
 
 # Setting TERM is normally done through /etc/ttys.  Do only override
 # if you're sure that you'll never log in via telnet or xterm or a
@@ -20,6 +19,9 @@ PAGER=less;  	export PAGER
 
 # set ENV to a file invoked each time sh is started for interactive use.
 ENV=$HOME/.shrc; export ENV
+
+# Let sh(1) know it's at home, despite /home being a symlink.
+if [ "$PWD" != "$HOME" ] && [ "$PWD" -ef "$HOME" ] ; then cd ; fi
 
 # Query terminal size; useful for serial lines.
 if [ -x /usr/bin/resizewin ] ; then /usr/bin/resizewin -z ; fi

Modified: stable/12/share/skel/dot.shrc
==============================================================================
--- stable/12/share/skel/dot.shrc	Sat Jul 25 11:34:50 2020	(r363524)
+++ stable/12/share/skel/dot.shrc	Sat Jul 25 11:57:39 2020	(r363525)
@@ -32,12 +32,8 @@ alias g='egrep -i'
 # alias rm='rm -i'
 
 
-# # set prompt: ``username at hostname$ '' 
-# PS1="`whoami`@`hostname | sed 's/\..*//'`"
-# case `id -u` in
-# 	0) PS1="${PS1}# ";;
-# 	*) PS1="${PS1}$ ";;
-# esac
+# set prompt: ``username at hostname:directory $ ''
+PS1="\u@\h:\w \\$ "
 
 # search path for cd(1)
 # CDPATH=:$HOME


More information about the svn-src-all mailing list