From owner-freebsd-bugs@FreeBSD.ORG Sun Apr 27 17:50:00 2014 Return-Path: Delivered-To: freebsd-bugs@smarthost.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [8.8.178.115]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTPS id B296342D for ; Sun, 27 Apr 2014 17:50:00 +0000 (UTC) Received: from freefall.freebsd.org (freefall.freebsd.org [IPv6:2001:1900:2254:206c::16:87]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id 8DB7BFAE for ; Sun, 27 Apr 2014 17:50:00 +0000 (UTC) Received: from freefall.freebsd.org (localhost [127.0.0.1]) by freefall.freebsd.org (8.14.8/8.14.8) with ESMTP id s3RHo0SN031964 for ; Sun, 27 Apr 2014 17:50:00 GMT (envelope-from gnats@freefall.freebsd.org) Received: (from gnats@localhost) by freefall.freebsd.org (8.14.8/8.14.8/Submit) id s3RHo0i9031963; Sun, 27 Apr 2014 17:50:00 GMT (envelope-from gnats) Resent-Date: Sun, 27 Apr 2014 17:50:00 GMT Resent-Message-Id: <201404271750.s3RHo0i9031963@freefall.freebsd.org> Resent-From: FreeBSD-gnats-submit@FreeBSD.org (GNATS Filer) Resent-To: freebsd-bugs@FreeBSD.org Resent-Reply-To: FreeBSD-gnats-submit@FreeBSD.org, "A.J. van Werven" Received: from mx1.freebsd.org (mx1.freebsd.org [8.8.178.115]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTPS id 7185829C for ; Sun, 27 Apr 2014 17:41:39 +0000 (UTC) Received: from cgiserv.freebsd.org (cgiserv.freebsd.org [IPv6:2001:1900:2254:206a::50:4]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id 5DBAAF77 for ; Sun, 27 Apr 2014 17:41:39 +0000 (UTC) Received: from cgiserv.freebsd.org ([127.0.1.6]) by cgiserv.freebsd.org (8.14.8/8.14.8) with ESMTP id s3RHfdjh017530 for ; Sun, 27 Apr 2014 17:41:39 GMT (envelope-from nobody@cgiserv.freebsd.org) Received: (from nobody@localhost) by cgiserv.freebsd.org (8.14.8/8.14.8/Submit) id s3RHfd41017524; Sun, 27 Apr 2014 17:41:39 GMT (envelope-from nobody) Message-Id: <201404271741.s3RHfd41017524@cgiserv.freebsd.org> Date: Sun, 27 Apr 2014 17:41:39 GMT From: "A.J. van Werven" To: freebsd-gnats-submit@FreeBSD.org X-Send-Pr-Version: www-3.1 Subject: bin/189057: [PATCH] Adding an option to /bin/ls to display file permissions in octal X-BeenThere: freebsd-bugs@freebsd.org X-Mailman-Version: 2.1.17 Precedence: list List-Id: Bug reports List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 27 Apr 2014 17:50:00 -0000 >Number: 189057 >Category: bin >Synopsis: [PATCH] Adding an option to /bin/ls to display file permissions in octal >Confidential: no >Severity: non-critical >Priority: low >Responsible: freebsd-bugs >State: open >Quarter: >Keywords: >Date-Required: >Class: change-request >Submitter-Id: current-users >Arrival-Date: Sun Apr 27 17:50:00 UTC 2014 >Closed-Date: >Last-Modified: >Originator: A.J. van Werven >Release: 9.2-RELEASE-p3 >Organization: >Environment: >Description: A user of the FreeBSD Forums requested that an option be added to /bin/ls that makes the long format (-l option) display the file permissions in octal rather than symbolically, e.g. instead of "-rwxr-xr-x" it would say "-0755". The attached patch does just that and has been proposed on freebsd-hackers@, where it was suggested that a PR be submitted to prevent it from "getting lost". If the proposed addition has already been incorporated or rejected, this PR can be closed. >How-To-Repeat: N/A: this is a feature request, not a bug report. >Fix: Apply the attached patch. It includes an update to the usage message and to the man page, although the STANDARDS part probably needs some reviewing. Patch attached with submission follows: diff -ruN ls.orig/ls.1 ls/ls.1 --- ls.orig/ls.1 2014-04-08 18:22:46.000000000 +0200 +++ ls/ls.1 2014-04-08 19:04:01.000000000 +0200 @@ -40,7 +40,7 @@ .Nd list directory contents .Sh SYNOPSIS .Nm -.Op Fl ABCFGHILPRSTUWZabcdfghiklmnopqrstuwxy1, +.Op Fl ABCFGHILOPRSTUWZabcdfghiklmnopqrstuwxy1, .Op Fl D Ar format .Op Ar .Sh DESCRIPTION @@ -150,6 +150,11 @@ This option cancels the .Fl P option. +.It Fl O +When used with the +.Fl l +option, display the file permissions in octal notation. Note that the file type +is still displayed symbolically. .It Fl P If argument is a symbolic link, list the link itself rather than the object the link references. @@ -526,6 +531,15 @@ use .Xr getfacl 1 to do this. +.Pp +When the +.Fl O +option is used, the entry type is displayed as described above, but the +permissions are displayed in +.Dq raw +octal mode, consisting of four octal digits. The first digit indicates whether +any of the set-user-ID, set-group-ID or sticky bits have been set. The other +three digits represent the owner, group and other permissions respectively. .Sh ENVIRONMENT The following environment variables affect the execution of .Nm : @@ -739,9 +753,9 @@ .Xr getfmac 8 .Sh STANDARDS With the exception of options -.Fl I , g , n -and -.Fl o , +.Fl I , g , n, o +and possibly +.Fl O , the .Nm utility conforms to diff -ruN ls.orig/ls.c ls/ls.c --- ls.orig/ls.c 2014-04-08 18:22:46.000000000 +0200 +++ ls/ls.c 2014-04-08 19:03:27.000000000 +0200 @@ -120,6 +120,7 @@ int f_notabs; /* don't use tab-separated multi-col output */ static int f_numericonly; /* don't convert uid/gid to name */ int f_octal; /* show unprintables as \xxx */ + int f_octalperms; /* print permissions and modes in octal */ int f_octal_escape; /* like f_octal but use C escapes if possible */ static int f_recursive; /* ls subdirectories also */ static int f_reversesort; /* reverse whatever sort is used */ @@ -186,7 +187,7 @@ if (getenv("LS_SAMESORT")) f_samesort = 1; while ((ch = getopt(argc, argv, - "1ABCD:FGHILPRSTUWXZabcdfghiklmnopqrstuwxy,")) != -1) { + "1ABCD:FGHILOPRSTUWXZabcdfghiklmnopqrstuwxy,")) != -1) { switch (ch) { /* * The -1, -C, -x and -l options all override each other so @@ -272,6 +273,9 @@ fts_options |= FTS_LOGICAL; f_nofollow = 0; break; + case 'O': + f_octalperms=1; + break; case 'P': fts_options &= ~FTS_COMFOLLOW; fts_options &= ~FTS_LOGICAL; diff -ruN ls.orig/ls.h ls/ls.h --- ls.orig/ls.h 2014-04-08 18:22:46.000000000 +0200 +++ ls/ls.h 2014-04-08 16:18:33.000000000 +0200 @@ -47,6 +47,7 @@ extern int f_inode; /* print inode */ extern int f_longform; /* long listing format */ extern int f_octal; /* print unprintables in octal */ +extern int f_octalperms; /* print permissions and modes in octal */ extern int f_octal_escape; /* like f_octal but use C escapes if possible */ extern int f_nonprint; /* show unprintables as ? */ extern int f_samesort; /* sort time and name in same direction */ diff -ruN ls.orig/print.c ls/print.c --- ls.orig/print.c 2014-04-08 18:22:46.000000000 +0200 +++ ls/print.c 2014-04-08 22:32:54.000000000 +0200 @@ -73,6 +73,7 @@ static int colortype(mode_t); #endif static void aclmode(char *, const FTSENT *); +static void octalmode(int, char *); #define IS_NOPRINT(p) ((p)->fts_number == NO_PRINT) @@ -141,12 +142,15 @@ #ifdef COLORLS int color_printed = 0; #endif + void (*strmodefcn)(int, char *); if ((dp->list == NULL || dp->list->fts_level != FTS_ROOTLEVEL) && (f_longform || f_size)) { (void)printf("total %lu\n", howmany(dp->btotal, blocksize)); } + strmodefcn = (f_octalperms > 0) ? octalmode : strmode; + for (p = dp->list; p; p = p->fts_link) { if (IS_NOPRINT(p)) continue; @@ -157,7 +161,7 @@ if (f_size) (void)printf("%*jd ", dp->s_block, howmany(sp->st_blocks, blocksize)); - strmode(sp->st_mode, buf); + strmodefcn(sp->st_mode, buf); aclmode(buf, p); np = p->fts_pointer; (void)printf("%s %*u %-*s %-*s ", buf, dp->s_nlink, @@ -684,3 +688,44 @@ buf[10] = '+'; acl_free(facl); } + +/* + * Print file mode and permissions in octal mode. Like the regular strmode(), + * add a space at the end for (potential) use by aclmode(). + */ +static void +octalmode(int mode, char *bp) +{ + /* Print the file type symbolically, this makes no sense in octal. */ + switch (mode & S_IFMT) { + case S_IFDIR: + *bp++ = 'd'; + break; + case S_IFCHR: + *bp++ = 'c'; + break; + case S_IFBLK: + *bp++ = 'b'; + break; + case S_IFREG: + *bp++ = '-'; + break; + case S_IFLNK: + *bp++ = 'l'; + break; + case S_IFSOCK: + *bp++ = 's'; + break; + case S_IFIFO: + *bp++ = 'p'; + break; + case S_IFWHT: + *bp++ = 'w'; + break; + default: + *bp++ = '?'; + break; + } + (void)snprintf(bp, 6, "%o%o%o%o ", (mode & 0007000) >> 9, + (mode & S_IRWXU) >> 6, (mode & S_IRWXG) >> 3, mode & S_IRWXO); +} diff -ruN ls.orig/util.c ls/util.c --- ls.orig/util.c 2014-04-08 18:22:46.000000000 +0200 +++ ls/util.c 2014-04-08 17:17:01.000000000 +0200 @@ -222,9 +222,9 @@ { (void)fprintf(stderr, #ifdef COLORLS - "usage: ls [-ABCFGHILPRSTUWZabcdfghiklmnopqrstuwxy1,] [-D format]" + "usage: ls [-ABCFGHILOPRSTUWZabcdfghiklmnopqrstuwxy1,] [-D format]" #else - "usage: ls [-ABCFHILPRSTUWZabcdfghiklmnopqrstuwxy1,] [-D format]" + "usage: ls [-ABCFHILOPRSTUWZabcdfghiklmnopqrstuwxy1,] [-D format]" #endif " [file ...]\n"); exit(1); >Release-Note: >Audit-Trail: >Unformatted: