The branch stable/15 has been updated by des:

URL: 
https://cgit.FreeBSD.org/src/commit/?id=eff786f23611582e518f038e4086a1306c019d23

commit eff786f23611582e518f038e4086a1306c019d23
Author:     Dag-Erling Smørgrav <[email protected]>
AuthorDate: 2025-10-28 16:51:56 +0000
Commit:     Dag-Erling Smørgrav <[email protected]>
CommitDate: 2025-10-30 10:37:36 +0000

    id: Add -d and -s options
    
    These options may not be combined with any other options and print the
    current or specified user's home directory and shell respectively.
    
    Reviewed by:    imp, bcr
    Differential Revision:  https://reviews.freebsd.org/D53301
    
    (cherry picked from commit f41b1eb637f576634be0df9d657f46aa57afea59)
---
 usr.bin/id/id.1 | 28 +++++++++++++++++++++++++---
 usr.bin/id/id.c | 48 +++++++++++++++++++++++++++++++++++++++++++++---
 2 files changed, 70 insertions(+), 6 deletions(-)

diff --git a/usr.bin/id/id.1 b/usr.bin/id/id.1
index b8dafb6650b0..62c941f84798 100644
--- a/usr.bin/id/id.1
+++ b/usr.bin/id/id.1
@@ -28,7 +28,7 @@
 .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 .\" SUCH DAMAGE.
 .\"
-.Dd March 5, 2011
+.Dd October 23, 2025
 .Dt ID 1
 .Os
 .Sh NAME
@@ -50,12 +50,18 @@
 .Nm
 .Fl c
 .Nm
+.Fl d
+.Op Ar user
+.Nm
 .Fl g Op Fl nr
 .Op Ar user
 .Nm
 .Fl p
 .Op Ar user
 .Nm
+.Fl s
+.Op Ar user
+.Nm
 .Fl u Op Fl nr
 .Op Ar user
 .Sh DESCRIPTION
@@ -90,6 +96,8 @@ Ignored for compatibility with other
 implementations.
 .It Fl c
 Display current login class.
+.It Fl d
+Display the home directory of the current or specified user.
 .It Fl g
 Display the effective group ID as a number.
 .It Fl n
@@ -128,6 +136,8 @@ Display the real ID for the
 and
 .Fl u
 options instead of the effective ID.
+.It Fl s
+Display the shell of the current or specified user.
 .It Fl u
 Display the effective user ID as a number.
 .El
@@ -174,8 +184,20 @@ bob          pts/5        Dec  4 19:51
 .Sh STANDARDS
 The
 .Nm
-function is expected to conform to
-.St -p1003.2 .
+utility is expected to conform to
+.St -p1003.1-2024 .
+The
+.Fl A ,
+.Fl M ,
+.Fl P ,
+.Fl c ,
+.Fl d ,
+.Fl p ,
+and
+.Fl s
+options are
+.Fx
+extensions.
 .Sh HISTORY
 The
 historic
diff --git a/usr.bin/id/id.c b/usr.bin/id/id.c
index a326aa14c7c7..5f9d2670caa3 100644
--- a/usr.bin/id/id.c
+++ b/usr.bin/id/id.c
@@ -55,6 +55,8 @@ static void   auditid(void);
 #endif
 static void    group(struct passwd *, bool);
 static void    maclabel(void);
+static void    dir(struct passwd *);
+static void    shell(struct passwd *);
 static void    usage(void);
 static struct passwd *who(char *);
 
@@ -69,7 +71,7 @@ main(int argc, char *argv[])
        bool Aflag;
 #endif
        bool Gflag, Mflag, Pflag;
-       bool cflag, gflag, nflag, pflag, rflag, uflag;
+       bool cflag, dflag, gflag, nflag, pflag, rflag, sflag, uflag;
        int ch, combo, error, id;
        const char *myname, *optstr;
        char loginclass[MAXLOGNAME];
@@ -78,10 +80,10 @@ main(int argc, char *argv[])
        Aflag = false;
 #endif
        Gflag = Mflag = Pflag = false;
-       cflag = gflag = nflag = pflag = rflag = uflag = false;
+       cflag = dflag = gflag = nflag = pflag = rflag = sflag = uflag = false;
 
        myname = getprogname();
-       optstr = "AGMPacgnpru";
+       optstr = "AGMPacdgnprsu";
        if (strcmp(myname, "groups") == 0) {
                isgroups = true;
                optstr = "";
@@ -114,6 +116,9 @@ main(int argc, char *argv[])
                case 'c':
                        cflag = true;
                        break;
+               case 'd':
+                       dflag = true;
+                       break;
                case 'g':
                        gflag = true;
                        break;
@@ -126,6 +131,9 @@ main(int argc, char *argv[])
                case 'r':
                        rflag = true;
                        break;
+               case 's':
+                       sflag = true;
+                       break;
                case 'u':
                        uflag = true;
                        break;
@@ -142,6 +150,8 @@ main(int argc, char *argv[])
                usage();
 
        combo = Aflag + Gflag + Mflag + Pflag + gflag + pflag + uflag;
+       if (combo + dflag + sflag > 1)
+               usage();
        if (combo > 1)
                usage();
        if (combo == 0 && (nflag || rflag))
@@ -185,6 +195,11 @@ main(int argc, char *argv[])
                exit(0);
        }
 
+       if (dflag) {
+               dir(pw);
+               exit(0);
+       }
+
        if (Gflag) {
                group(pw, nflag);
                exit(0);
@@ -205,6 +220,11 @@ main(int argc, char *argv[])
                exit(0);
        }
 
+       if (sflag) {
+               shell(pw);
+               exit(0);
+       }
+
        id_print(pw);
        exit(0);
 }
@@ -464,6 +484,26 @@ pline(struct passwd *pw)
            pw->pw_dir, pw->pw_shell);
 }
 
+static void
+dir(struct passwd *pw)
+{
+       if (pw == NULL) {
+               if ((pw = getpwuid(getuid())) == NULL)
+                       err(1, "getpwuid");
+       }
+       printf("%s\n", pw->pw_dir);
+}
+
+static void
+shell(struct passwd *pw)
+{
+       if (pw == NULL) {
+               if ((pw = getpwuid(getuid())) == NULL)
+                       err(1, "getpwuid");
+       }
+       printf("%s\n", pw->pw_shell);
+}
+
 static void
 usage(void)
 {
@@ -481,8 +521,10 @@ usage(void)
                    "       id -M\n"
                    "       id -P [user]\n"
                    "       id -c\n"
+                   "       id -d [user]\n"
                    "       id -g [-nr] [user]\n"
                    "       id -p [user]\n"
+                   "       id -s [user]\n"
                    "       id -u [-nr] [user]\n");
        exit(1);
 }

Reply via email to