Date: Thu, 24 Jan 2019 11:59:46 +0000 (UTC) From: Edward Tomasz Napierala <trasz@FreeBSD.org> To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r343399 - in head: bin/sh share/skel Message-ID: <201901241159.x0OBxk05080188@repo.freebsd.org>
next in thread | raw e-mail | index | archive | help
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@hostname:directory $ '' -PS1="`whoami`@\h:\w \\$ " +PS1="\u@\h:\w \\$ " # search path for cd(1) # CDPATH=:$HOME
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201901241159.x0OBxk05080188>