summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSatoshi Asami <asami@FreeBSD.org>1995-03-09 00:49:22 +0000
committerSatoshi Asami <asami@FreeBSD.org>1995-03-09 00:49:22 +0000
commitd3c5462ad09c35bf92ad6156b91735f14ee121a8 (patch)
tree5cc5ea1cdc48e601d9c8aa5eaa221f63cc8f5f0a
parent.1x -> .1.gz (diff)
Color patch for ls. Am I going to be killed for this? ;)
-rw-r--r--misc/colorls/Makefile25
-rw-r--r--misc/colorls/files/patch-aa354
-rw-r--r--misc/colorls/pkg-comment1
-rw-r--r--misc/colorls/pkg-descr11
-rw-r--r--misc/colorls/pkg-plist5
5 files changed, 396 insertions, 0 deletions
diff --git a/misc/colorls/Makefile b/misc/colorls/Makefile
new file mode 100644
index 000000000000..f814bf442624
--- /dev/null
+++ b/misc/colorls/Makefile
@@ -0,0 +1,25 @@
+# New ports collection makefile for: colorls
+# Version required: FreeBSD-current (around March '95)
+# Date created: 8 March 1995
+# Whom: Satoshi Asami
+#
+# $Id$
+#
+DISTNAME= colorls
+DISTFILES= ls.tar.gz
+FTP_SITE= ftp.freebsd.org
+FTP_DIR= /pub/FreeBSD/FreeBSD-current/src/bin/
+MASTER_SITES= ftp://ftp.freebsd.org/pub/FreeBSD/FreeBSD-current/src/bin/
+WRKSRC= ${WRKDIR}/ls
+
+.if !defined(MASTER_SITE_OVERRIDE)
+fetch: pre-fetch
+ @if [ ! -d ${DISTDIR} ]; then mkdir -p ${DISTDIR}; fi
+ @(cd ${DISTDIR}; \
+ if [ ! -f ${DISTFILES} ]; then \
+ (sleep 5; echo "cd ${FTP_DIR}"; echo "get ${DISTFILES}") | ${NCFTP} ${NCFTPFLAGS} ${FTP_SITE}; \
+ fi \
+ )
+.endif
+
+.include <bsd.port.mk>
diff --git a/misc/colorls/files/patch-aa b/misc/colorls/files/patch-aa
new file mode 100644
index 000000000000..b39cd4b073d0
--- /dev/null
+++ b/misc/colorls/files/patch-aa
@@ -0,0 +1,354 @@
+--- ./ls.c.org Wed Mar 8 02:14:11 1995
++++ ./ls.c Wed Mar 8 02:17:10 1995
+@@ -93,6 +93,7 @@
+ int f_dirname; /* if precede with directory name */
+ int f_timesort; /* sort by time vice name */
+ int f_type; /* add type character for non-regular files */
++int f_color; /* add type in color for non-regular files */
+
+ int
+ main(argc, argv)
+@@ -122,7 +123,7 @@
+ f_listdot = 1;
+
+ fts_options = FTS_PHYSICAL;
+- while ((ch = getopt(argc, argv, "1ACFLRTacdfgikloqrstu")) != EOF) {
++ while ((ch = getopt(argc, argv, "1ACFGLRTacdfgikloqrstu")) != EOF) {
+ switch (ch) {
+ /*
+ * The -1, -C and -l options all override each other so shell
+@@ -152,6 +153,9 @@
+ case 'F':
+ f_type = 1;
+ break;
++ case 'G':
++ f_color = 1;
++ break;
+ case 'L':
+ fts_options &= ~FTS_PHYSICAL;
+ fts_options |= FTS_LOGICAL;
+@@ -207,18 +211,21 @@
+ argc -= optind;
+ argv += optind;
+
++ parsecolors(getenv("LSCOLORS"));
++
+ /*
+ * If not -F, -i, -l, -s or -t options, don't require stat
+ * information.
+ */
+- if (!f_inode && !f_longform && !f_size && !f_timesort && !f_type)
++ if (!f_inode && !f_longform && !f_size && !f_timesort && !f_type
++ && !f_color)
+ fts_options |= FTS_NOSTAT;
+
+ /*
+ * If not -F, -d or -l options, follow any symbolic links listed on
+ * the command line.
+ */
+- if (!f_longform && !f_listdir && !f_type)
++ if (!f_longform && !f_listdir && !f_type && !f_color)
+ fts_options |= FTS_COMFOLLOW;
+
+ /* If -l or -s, figure out block size. */
+--- ./ls.h.org Wed Mar 8 02:14:11 1995
++++ ./ls.h Wed Mar 8 02:17:11 1995
+@@ -49,6 +49,7 @@
+ extern int f_size; /* list size in short listing */
+ extern int f_statustime; /* use time of last mode change */
+ extern int f_type; /* add type character for non-regular files */
++extern int f_color; /* add type in color for non-regular files */
+
+ typedef struct {
+ FTSENT *list;
+--- ./print.c.org Wed Mar 8 02:14:11 1995
++++ ./print.c Wed Mar 8 02:17:11 1995
+@@ -66,6 +66,26 @@
+
+ #define IS_NOPRINT(p) ((p)->fts_number == NO_PRINT)
+
++/* Most of these are taken from <sys/stat.h> */
++typedef enum Colors {
++ C_DIR, /* directory */
++ C_LNK, /* symbolic link */
++ C_SOCK, /* socket */
++ C_FIFO, /* pipe */
++ C_EXEC, /* executable */
++ C_BLK, /* block special */
++ C_CHR, /* character special */
++ C_SUID, /* setuid executable */
++ C_SGID, /* setgid executable */
++ C_WSDIR, /* directory writeble to others, with sticky bit */
++ C_WDIR, /* directory writeble to others, without sticky bit */
++ C_NUMCOLORS /* just a place-holder */
++} Colors ;
++
++char *defcolors = "4x5x2x3x1x464301060203";
++
++static int colors[C_NUMCOLORS][2];
++
+ void
+ printscol(dp)
+ DISPLAY *dp;
+@@ -122,10 +142,14 @@
+ printtime(sp->st_ctime);
+ else
+ printtime(sp->st_mtime);
++ if (f_color)
++ (void)colortype(sp->st_mode);
+ (void)printf("%s", p->fts_name);
+ if (f_type)
+ (void)printtype(sp->st_mode);
+- if (S_ISLNK(sp->st_mode))
++ if (f_color)
++ (void)printf("\033[m");
++ if (S_ISLNK(sp->st_mode))
+ printlink(p);
+ (void)putchar('\n');
+ }
+@@ -217,9 +241,13 @@
+ if (f_size)
+ chcnt += printf("%*qd ",
+ (int)sizefield, howmany(sp->st_blocks, blocksize));
++ if (f_color)
++ (void)colortype(sp->st_mode);
+ chcnt += printf("%s", p->fts_name);
+ if (f_type)
+ chcnt += printtype(sp->st_mode);
++ if (f_color)
++ printf("\033[m");
+ return (chcnt);
+ }
+
+@@ -274,6 +302,95 @@
+ return (0);
+ }
+
++void
++printcolor(c)
++ Colors c;
++{
++ printf("\033[");
++ if (colors[c][0] != -1) {
++ printf("3%d", colors[c][0]);
++ if (colors[c][1] != -1)
++ printf(";");
++ }
++ if (colors[c][1] != -1)
++ printf("4%d", colors[c][1]);
++ printf("m");
++}
++
++colortype(mode)
++ mode_t mode;
++{
++ switch(mode & S_IFMT) {
++ case S_IFDIR:
++ if (mode & S_IWOTH)
++ if (mode & S_ISTXT)
++ printcolor(C_WSDIR);
++ else
++ printcolor(C_WDIR);
++ else
++ printcolor(C_DIR);
++ return(1);
++ case S_IFLNK:
++ printcolor(C_LNK);
++ return(1);
++ case S_IFSOCK:
++ printcolor(C_SOCK);
++ return(1);
++ case S_IFIFO:
++ printcolor(C_FIFO);
++ return(1);
++ case S_IFBLK:
++ printcolor(C_BLK);
++ return(1);
++ case S_IFCHR:
++ printcolor(C_CHR);
++ return(1);
++ }
++ if (mode & (S_IXUSR | S_IXGRP | S_IXOTH)) {
++ if (mode & S_ISUID)
++ printcolor(C_SUID);
++ else if (mode & S_ISGID)
++ printcolor(C_SGID);
++ else
++ printcolor(C_EXEC);
++ return(1);
++ }
++ return(0);
++}
++
++void
++parsecolors(cs)
++char *cs;
++{
++ int i, j, len;
++ char c[2];
++ if (cs == NULL) cs = ""; /* LSCOLORS not set */
++ len = strlen(cs);
++ for (i = 0 ; i < C_NUMCOLORS ; i++) {
++ if (len <= 2*i) {
++ c[0] = defcolors[2*i];
++ c[1] = defcolors[2*i+1];
++ }
++ else {
++ c[0] = cs[2*i];
++ c[1] = cs[2*i+1];
++ }
++ for (j = 0 ; j < 2 ; j++) {
++ if ((c[j] < '0' || c[j] > '7') &&
++ tolower(c[j]) != 'x') {
++ fprintf(stderr,
++ "error: invalid character '%c' in LSCOLORS env var\n",
++ c[j]);
++ c[j] = defcolors[2*i+j];
++ }
++ if (c[j] == 'x')
++ colors[i][j] = -1;
++ else
++ colors[i][j] = c[j]-'0';
++ }
++ }
++}
++
+ static void
+ printlink(p)
+ FTSENT *p;
+--- ./Makefile.org Wed Mar 8 02:14:10 1995
++++ ./Makefile Wed Mar 8 02:20:01 1995
+@@ -1,7 +1,12 @@
+ # @(#)Makefile 8.1 (Berkeley) 6/2/93
+ # Makefile,v 1.2 1994/09/24 02:55:51 davidg Exp
+
+-PROG= ls
++PROG= colorls
+ SRCS= cmp.c stat_flags.c ls.c print.c util.c
++BINDIR= ${PREFIX}/bin
++MANDIR= ${PREFIX}/man/man
++
++beforeinstall:
++ cp ls.1 colorls.1
+
+ .include <bsd.prog.mk>
+--- ./ls.1.org Wed Mar 8 02:14:10 1995
++++ ./ls.1 Wed Mar 8 02:17:10 1995
+@@ -36,16 +36,24 @@
+ .\" ls.1,v 1.3 1994/09/24 02:55:53 davidg Exp
+ .\"
+ .Dd April 18, 1994
+-.Dt LS 1
++.Dt COLORLS 1
+ .Os
+ .Sh NAME
+-.Nm ls
+-.Nd list directory contents
++.Nm colorls
++.Nd list directory contents in color
+ .Sh SYNOPSIS
+-.Nm ls
+-.Op Fl ACFLRTacdfiloqrstu1
++.Nm colorls
++.Op Fl ACFGLRTacdfiloqrstu1
+ .Op Ar file ...
+ .Sh DESCRIPTION
++(Note: This man page describes the color version of the program. To
++minimize the differences from the original, the program is referred to
++as
++.Nm ls
++in this manual. The new option
++.Fl G
++is for color display.)
++.Pp
+ For each operand that names a
+ .Ar file
+ of a type other than
+@@ -85,6 +93,12 @@
+ and an at sign (@) after each symbolic link.
+ .\" and a vertical bar (|) after each that is a
+ .\" .Tn FIFO .
++.It Fl G
++Use ANSI color sequences to distinguish file types. (See
++.Ev LSCOLORS
++below.) In addition to those mentioned above in
++.Fl F ,
++some extra attributes (setuid bit set, etc.) are also displayed.
+ .It Fl L
+ If argument is a symbolic link, list the file or directory the link references
+ rather than the link itself.
+@@ -314,6 +328,74 @@
+ See
+ .Xr environ 7
+ for more information.
++.It LSCOLORS
++The value of this variable describes what color to use for which
++attribute when the color output
++.Pq Fl G
++is specified. This string is a concatenation of pairs of the format
++.Sy fb ,
++where
++.Sy f
++is the foreground color and
++.Sy b
++is the background color.
++.Pp
++The color designators are as follows:
++.Pp
++.Bl -tag -width 4n -offset indent -compact
++.It Sy 0
++black
++.It Sy 1
++red
++.It Sy 2
++green
++.It Sy 3
++yellow
++.It Sy 4
++blue
++.It Sy 5
++magenta
++.It Sy 6
++cyan
++.It Sy 7
++white
++.It Sy x
++default foreground or background
++.El
++.Pp
++(Note: the above are standard ANSI colors. The actual display may
++differ depending on the color capabilities of your terminal.)
++.Pp
++The order of the attributes are as follows:
++.Pp
++.Bl -enum -offset indent -compact
++.It
++directory
++.It
++symbolic link
++.It
++socket
++.It
++pipe
++.It
++executable
++.It
++block special
++.It
++character special
++.It
++executable with setuid bit set
++.It
++executable with setgid bit set
++.It
++directory writable to others, with sticky bit
++.It
++directory writable to others, without sticky bit
++.El
++.Pp
++The default is "4x5x2x3x1x464301060203", i.e., blue foreground and
++default background for regular directories, black foreground and red
++background for setuid executables, etc.
+ .El
+ .Sh COMPATIBILITY
+ The group field is now automatically included in the long listing for
diff --git a/misc/colorls/pkg-comment b/misc/colorls/pkg-comment
new file mode 100644
index 000000000000..3994714addd5
--- /dev/null
+++ b/misc/colorls/pkg-comment
@@ -0,0 +1 @@
+colorls is an ls replacement that can use color to display file attributes.
diff --git a/misc/colorls/pkg-descr b/misc/colorls/pkg-descr
new file mode 100644
index 000000000000..ba066f90b424
--- /dev/null
+++ b/misc/colorls/pkg-descr
@@ -0,0 +1,11 @@
+This is a simple hack to the 2.0R /bin/ls to use ANSI sequences to
+display file attributes in color. There is a -G flag (somewhat
+similar to the -F flag). Take a look at the man page for details.
+
+The program is called "colorls" and installs itself in /usr/local/bin.
+The file patches/patch-aa is the diffs with the 2.0-Release /usr/src/bin/ls
+directory. Stock xterm doesn't know about colors, so you should use
+color_xterm or kterm (available from ports).
+
+Satoshi Asami
+asami@cs.berkeley.edu
diff --git a/misc/colorls/pkg-plist b/misc/colorls/pkg-plist
new file mode 100644
index 000000000000..0c01088b5059
--- /dev/null
+++ b/misc/colorls/pkg-plist
@@ -0,0 +1,5 @@
+@cwd /usr/local
+@mode 555
+bin/colorls
+@mode 444
+man/man1/colorls.1.gz