$NetBSD: patch-ac,v 1.5 2012/03/01 16:25:16 hans Exp $

--- ls.c.orig	1996-12-21 23:40:58.000000000 +0000
+++ ls.c
@@ -59,12 +59,26 @@ static char const sccsid[] = "@(#)ls.c	8
 #include <string.h>
 #include <unistd.h>
 #include <locale.h>
+#ifdef HAVE_NBCOMPAT_H
+#include <nbcompat/pwd.h>
+#include <nbcompat/grp.h>
+#endif
+#include <pwd.h>
+#include <grp.h>
+
+#ifdef __sun
+#include <sys/ttold.h>
+#endif
 
 #include "ls.h"
 #include "extern.h"
 
 static void	 display __P((FTSENT *, FTSENT *));
+#ifdef __DragonFly__
+static int	 mastercmp __P((const FTSENT * const *, const FTSENT * const *));
+#else
 static int	 mastercmp __P((const FTSENT **, const FTSENT **));
+#endif
 static void	 traverse __P((int, char **, int));
 
 static void (*printfcn) __P((DISPLAY *));
@@ -76,7 +90,9 @@ int termwidth = 80;		/* default terminal
 /* flags */
 int f_accesstime;		/* use time of last access */
 int f_column;			/* columnated format */
+#ifndef __sun
 int f_flags;			/* show flags associated with a file */
+#endif
 int f_inode;			/* print inode */
 int f_kblocks;			/* print size in kilobytes */
 int f_listdir;			/* list actual directory, not contents */
@@ -94,6 +110,7 @@ int f_statustime;		/* use time of last m
 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 */
 #ifndef BSD4_4_LITE
 int f_whiteout;			/* show whiteout entries */
 #endif
@@ -135,9 +152,13 @@ main(argc, argv)
 
 	fts_options = FTS_PHYSICAL;
 #ifdef BSD4_4_LITE
-	while ((ch = getopt(argc, argv, "1ACFLRTacdfgikloqrstu")) != EOF) {
+	while ((ch = getopt(argc, argv, "1ACFGLRTacdfgikloqrstu")) != EOF) {
 #else
-	while ((ch = getopt(argc, argv, "1ACFLRTWacdfgikloqrstu")) != EOF) {
+#ifndef __sun
+	while ((ch = getopt(argc, argv, "1ACFGLRTWacdfgikloqrstu")) != EOF) {
+#else
+	while ((ch = getopt(argc, argv, "1ACFGLRTWacdfgiklqrstu")) != EOF) {
+#endif
 #endif
 		switch (ch) {
 		/*
@@ -168,6 +189,10 @@ main(argc, argv)
 		case 'F':
 			f_type = 1;
 			break;
+		case 'G':
+			if (isatty(STDOUT_FILENO))
+				f_color = 1;
+			break;
 		case 'L':
 			fts_options &= ~FTS_PHYSICAL;
 			fts_options |= FTS_LOGICAL;
@@ -197,9 +222,11 @@ main(argc, argv)
 		case 'k':
 			f_kblocks = 1;
 			break;
+#ifndef __sun
 		case 'o':
 			f_flags = 1;
 			break;
+#endif
 		case 'q':
 			f_nonprint = 1;
 			break;
@@ -228,18 +255,21 @@ main(argc, argv)
 	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;
 
 #ifndef BSD4_4_LITE
@@ -384,7 +414,8 @@ display(p, list)
 	u_long btotal, maxblock, maxinode, maxlen, maxnlink;
 	int bcfile, flen, glen, ulen, maxflags, maxgroup, maxuser;
 	int entries, needstats;
-	char *user, *group, *flags, buf[20];	/* 32 bits == 10 digits */
+	const char *user, *group;
+	char *flags, buf[20];		/* 32 bits == 10 digits */
 
 	/*
 	 * If list is NULL there are two possibilities: that the parent
@@ -452,12 +483,14 @@ display(p, list)
 				group = group_from_gid(sp->st_gid, 0);
 				if ((glen = strlen(group)) > maxgroup)
 					maxgroup = glen;
+#ifndef __sun
 				if (f_flags) {
 					flags =
 					    flags_to_string(sp->st_flags, "-");
 					if ((flen = strlen(flags)) > maxflags)
 						maxflags = flen;
 				} else
+#endif
 					flen = 0;
 
 				if ((np = malloc(sizeof(NAMES) +
@@ -473,10 +506,12 @@ display(p, list)
 				    S_ISBLK(sp->st_mode))
 					bcfile = 1;
 
+#ifndef __sun
 				if (f_flags) {
 					np->flags = &np->data[ulen + glen + 2];
 				  	(void)strcpy(np->flags, flags);
 				}
+#endif
 				cur->fts_pointer = np;
 			}
 		}
@@ -521,7 +556,11 @@ display(p, list)
  */
 static int
 mastercmp(a, b)
+#ifdef __DragonFly__
+	const FTSENT * const *a, * const *b;
+#else
 	const FTSENT **a, **b;
+#endif
 {
 	int a_info, b_info;
 
