svn commit: r343399 - in head: bin/sh share/skel
Edward Tomasz Napierala
trasz at FreeBSD.org
Thu Jan 24 11:59:48 UTC 2019
Author: trasz
Date: Thu Jan 24 11:59:46 2019
New Revision: 343399
URL: https://svnweb.freebsd.org/changeset/base/343399
Log:
Make sh(1) support \u in PS1. This removes one fork/exec on interactive
shell startup.
Reviewed by: 0mp (man page), jilles
MFC after: 2 weeks
Sponsored by: DARPA, AFRL
Differential Revision: https://reviews.freebsd.org/D18790
Modified:
head/bin/sh/parser.c
head/bin/sh/sh.1
head/share/skel/dot.shrc
Modified: head/bin/sh/parser.c
==============================================================================
--- head/bin/sh/parser.c Thu Jan 24 11:31:57 2019 (r343398)
+++ head/bin/sh/parser.c Thu Jan 24 11:59:46 2019 (r343399)
@@ -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.
@@ -2024,6 +2074,17 @@ getprompt(void *unused __unused)
while ((ps[i] != '\0') && (ps[i] != trim))
i++;
--i;
+ 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;
/*
Modified: head/bin/sh/sh.1
==============================================================================
--- head/bin/sh/sh.1 Thu Jan 24 11:31:57 2019 (r343398)
+++ head/bin/sh/sh.1 Thu Jan 24 11:59:46 2019 (r343399)
@@ -32,7 +32,7 @@
.\" from: @(#)sh.1 8.6 (Berkeley) 5/4/95
.\" $FreeBSD$
.\"
-.Dd December 8, 2018
+.Dd January 24, 2019
.Dt SH 1
.Os
.Sh NAME
@@ -1402,6 +1402,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: head/share/skel/dot.shrc
==============================================================================
--- head/share/skel/dot.shrc Thu Jan 24 11:31:57 2019 (r343398)
+++ head/share/skel/dot.shrc Thu Jan 24 11:59:46 2019 (r343399)
@@ -33,7 +33,7 @@ alias g='egrep -i'
# set prompt: ``username at hostname:directory $ ''
-PS1="`whoami`@\h:\w \\$ "
+PS1="\u@\h:\w \\$ "
# search path for cd(1)
# CDPATH=:$HOME
More information about the svn-src-all
mailing list