/* vi: set sw=4 ts=4: */
/*
 * tiny-ls.c version 0.1.0: A minimalist 'ls'
 * Copyright (C) 1996 Brian Candler <B.Candler@pobox.com>
 *
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 2 of the License, or
 *  (at your option) any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program; if not, write to the Free Software
 *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 */

/*
 * To achieve a small memory footprint, this version of 'ls' doesn't do any
 * file sorting, and only has the most essential command line switches
 * (i.e., the ones I couldn't live without :-) All features which involve
 * linking in substantial chunks of libc can be disabled.
 *
 * Although I don't really want to add new features to this program to
 * keep it small, I *am* interested to receive bug fixes and ways to make
 * it more portable.
 *
 * KNOWN BUGS:
 * 1. ls -l of a directory doesn't give "total <blocks>" header
 * 2. ls of a symlink to a directory doesn't list directory contents
 * 3. hidden files can make column width too large
 *
 * NON-OPTIMAL BEHAVIOUR:
 * 1. autowidth reads directories twice
 * 2. if you do a short directory listing without filetype characters
 *    appended, there's no need to stat each one
 * PORTABILITY:
 * 1. requires lstat (BSD) - how do you do it without?
 */

enum {
	TERMINAL_WIDTH = 80,	/* use 79 if terminal has linefold bug */
	COLUMN_GAP = 2,		/* includes the file type char */
};

/************************************************************************/

#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>
#include <unistd.h>
#include <dirent.h>
#include <errno.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <fcntl.h>
#include <signal.h>
#include <termios.h>
#include <sys/ioctl.h>
#include "busybox.h"
#ifdef CONFIG_SELINUX
#include <fs_secure.h>
#include <flask_util.h>
#include <ss.h>
#endif

#ifdef CONFIG_FEATURE_LS_TIMESTAMPS
#include <time.h>
#endif

#ifndef MAJOR
#define MAJOR(dev) (((dev)>>8)&0xff)
#define MINOR(dev) ((dev)&0xff)
#endif

/* what is the overall style of the listing */
#define STYLE_AUTO      (0)
#define STYLE_COLUMNS   (1U<<21)	/* fill columns */
#define STYLE_LONG      (2U<<21)	/* one record per line, extended info */
#define STYLE_SINGLE    (3U<<21)	/* one record per line */

#define STYLE_MASK                 STYLE_SINGLE
#define STYLE_ONE_RECORD_FLAG      STYLE_LONG

/* 51306 lrwxrwxrwx  1 root     root         2 May 11 01:43 /bin/view -> vi* */
/* what file information will be listed */
#define LIST_INO		(1U<<0)
#define LIST_BLOCKS		(1U<<1)
#define LIST_MODEBITS	(1U<<2)
#define LIST_NLINKS		(1U<<3)
#define LIST_ID_NAME	(1U<<4)
#define LIST_ID_NUMERIC	(1U<<5)
#define LIST_CONTEXT	(1U<<6)
#define LIST_SIZE		(1U<<7)
#define LIST_DEV		(1U<<8)
#define LIST_DATE_TIME	(1U<<9)
#define LIST_FULLTIME	(1U<<10)
#define LIST_FILENAME	(1U<<11)
#define LIST_SYMLINK	(1U<<12)
#define LIST_FILETYPE	(1U<<13)
#define LIST_EXEC	(1U<<14)

#define LIST_MASK       ((LIST_EXEC << 1) - 1)

/* what files will be displayed */
/* TODO -- We may be able to make DISP_NORMAL 0 to save a bit slot. */
#define DISP_NORMAL		(1U<<14)	/* show normal filenames */
#define DISP_DIRNAME	(1U<<15)	/* 2 or more items? label directories */
#define DISP_HIDDEN		(1U<<16)	/* show filenames starting with .  */
#define DISP_DOT		(1U<<17)	/* show . and .. */
#define DISP_NOLIST		(1U<<18)	/* show directory as itself, not contents */
#define DISP_RECURSIVE	(1U<<19)	/* show directory and everything below it */
#define DISP_ROWS		(1U<<20)	/* print across rows */

#define DISP_MASK       (((DISP_ROWS << 1) - 1) & ~(DISP_NORMAL - 1))

#ifdef CONFIG_FEATURE_LS_SORTFILES
/* how will the files be sorted */
#define SORT_ORDER_FORWARD   0			/* sort in reverse order */
#define SORT_ORDER_REVERSE   (1U<<27)	/* sort in reverse order */

#define SORT_NAME      0			/* sort by file name */
#define SORT_SIZE      (1U<<28)		/* sort by file size */
#define SORT_ATIME     (2U<<28)		/* sort by last access time */
#define SORT_CTIME     (3U<<28)		/* sort by last change time */
#define SORT_MTIME     (4U<<28)		/* sort by last modification time */
#define SORT_VERSION   (5U<<28)		/* sort by version */
#define SORT_EXT       (6U<<28)		/* sort by file name extension */
#define SORT_DIR       (7U<<28)		/* sort by file or directory */

#define SORT_MASK      (7U<<28)
#endif

#ifdef CONFIG_FEATURE_LS_TIMESTAMPS
/* which of the three times will be used */
#define TIME_MOD       0
#define TIME_CHANGE    (1U<<23)
#define TIME_ACCESS    (1U<<24)

#define TIME_MASK      (3U<<23)
#endif

#ifdef CONFIG_FEATURE_LS_FOLLOWLINKS
#define FOLLOW_LINKS   (1U<<25)
#endif
#ifdef CONFIG_FEATURE_HUMAN_READABLE
#define LS_DISP_HR     (1U<<26)
#endif

#define LIST_SHORT	(LIST_FILENAME)
#define LIST_ISHORT	(LIST_INO | LIST_FILENAME)
#define LIST_LONG	(LIST_MODEBITS | LIST_NLINKS | LIST_ID_NAME | LIST_SIZE | \
						LIST_DATE_TIME | LIST_FILENAME | LIST_SYMLINK)
#define LIST_ILONG	(LIST_INO | LIST_LONG)

#define SPLIT_DIR      1
#define SPLIT_FILE     0
#define SPLIT_SUBDIR   2

#define TYPEINDEX(mode) (((mode) >> 12) & 0x0f)
#define TYPECHAR(mode)  ("0pcCd?bB-?l?s???" [TYPEINDEX(mode)])

#if defined(CONFIG_FEATURE_LS_FILETYPES) || defined(CONFIG_FEATURE_LS_COLOR)
# define APPCHAR(mode)   ("\0|\0\0/\0\0\0\0\0@\0=\0\0\0" [TYPEINDEX(mode)])
#endif

/* colored LS support by JaWi, janwillem.janssen@lxtreme.nl */
#ifdef CONFIG_FEATURE_LS_COLOR
static int show_color = 0;

#define COLOR(mode)	("\000\043\043\043\042\000\043\043"\
					"\000\000\044\000\043\000\000\040" [TYPEINDEX(mode)])
#define ATTR(mode)	("\00\00\01\00\01\00\01\00"\
					"\00\00\01\00\01\00\00\01" [TYPEINDEX(mode)])
#endif

/*
 * a directory entry and its stat info are stored here
 */
struct dnode {			/* the basic node */
	char *name;			/* the dir entry name */
	char *fullname;		/* the dir entry name */
	struct stat dstat;	/* the file stat info */
#ifdef CONFIG_SELINUX
	security_id_t sid;
#endif
	struct dnode *next;	/* point at the next node */
};
typedef struct dnode dnode_t;

static struct dnode **list_dir(const char *);
static struct dnode **dnalloc(int);
static int list_single(struct dnode *);

static unsigned int all_fmt;

#ifdef CONFIG_SELINUX
static int is_flask_enabled_flag;
#endif

#ifdef CONFIG_FEATURE_AUTOWIDTH
static unsigned short terminal_width = TERMINAL_WIDTH;
static unsigned short tabstops = COLUMN_GAP;
#else
#define tabstops COLUMN_GAP
#define terminal_width TERMINAL_WIDTH
#endif

static int status = EXIT_SUCCESS;

static struct dnode *my_stat(char *fullname, char *name)
{
	struct stat dstat;
	struct dnode *cur;
#ifdef CONFIG_SELINUX
	security_id_t sid;
#endif
	int rc;

#ifdef CONFIG_FEATURE_LS_FOLLOWLINKS
	if (all_fmt & FOLLOW_LINKS) {
#ifdef CONFIG_SELINUX
		if(is_flask_enabled_flag)
			rc = stat_secure(fullname, &dstat, &sid);
		else
#endif
			rc = stat(fullname, &dstat);
		if(rc)
		{
			bb_perror_msg("%s", fullname);
			status = EXIT_FAILURE;
			return 0;
		}
	} else
#endif
	{
#ifdef CONFIG_SELINUX
		if(is_flask_enabled_flag)
			rc = lstat_secure(fullname, &dstat, &sid);
		else
#endif
			rc = lstat(fullname, &dstat);
		if(rc)
		{
			bb_perror_msg("%s", fullname);
			status = EXIT_FAILURE;
			return 0;
		}
	}

	cur = (struct dnode *) xmalloc(sizeof(struct dnode));
	cur->fullname = fullname;
	cur->name = name;
	cur->dstat = dstat;
#ifdef CONFIG_SELINUX
	cur->sid = sid;
#endif
	return cur;
}

/*----------------------------------------------------------------------*/
#ifdef CONFIG_FEATURE_LS_COLOR
static char fgcolor(mode_t mode)
{
	/* Check wheter the file is existing (if so, color it red!) */
	if (errno == ENOENT) {
		return '\037';
	}
	if (LIST_EXEC && S_ISREG(mode)
		&& (mode & (S_IXUSR | S_IXGRP | S_IXOTH)))
		return COLOR(0xF000);	/* File is executable ... */
	return COLOR(mode);
}

/*----------------------------------------------------------------------*/
static char bgcolor(mode_t mode)
{
	if (LIST_EXEC && S_ISREG(mode)
		&& (mode & (S_IXUSR | S_IXGRP | S_IXOTH)))
		return ATTR(0xF000);	/* File is executable ... */
	return ATTR(mode);
}
#endif

/*----------------------------------------------------------------------*/
#if defined(CONFIG_FEATURE_LS_FILETYPES) || defined(CONFIG_FEATURE_LS_COLOR)
static char append_char(mode_t mode)
{
	if (!(all_fmt & LIST_FILETYPE))
		return '\0';
	if ((all_fmt & LIST_EXEC) && S_ISREG(mode)
		&& (mode & (S_IXUSR | S_IXGRP | S_IXOTH)))
		return '*';
	return APPCHAR(mode);
}
#endif

/*----------------------------------------------------------------------*/

#define countdirs(A,B) count_dirs((A), (B), 1)
#define countsubdirs(A,B) count_dirs((A), (B), 0)

static int count_dirs(struct dnode **dn, int nfiles, int notsubdirs)
{
	int i, dirs;

	if (dn == NULL || nfiles < 1)
		return (0);
	dirs = 0;
	for (i = 0; i < nfiles; i++) {
		if (S_ISDIR(dn[i]->dstat.st_mode)
			&& (notsubdirs
				|| ((dn[i]->name[0] != '.')
					|| (dn[i]->name[1] 
						&& ((dn[i]->name[1] != '.')
							|| dn[i]->name[2])))))
			dirs++;
	}
	return (dirs);
}

static int countfiles(struct dnode **dnp)
{
	int nfiles;
	struct dnode *cur;

	if (dnp == NULL)
		return (0);
	nfiles = 0;
	for (cur = dnp[0]; cur->next != NULL; cur = cur->next)
		nfiles++;
	nfiles++;
	return (nfiles);
}

/* get memory to hold an array of pointers */
static struct dnode **dnalloc(int num)
{
	struct dnode **p;

	if (num < 1)
		return (NULL);

	p = (struct dnode **) xcalloc((size_t) num,
								  (size_t) (sizeof(struct dnode *)));
	return (p);
}

#ifdef CONFIG_FEATURE_LS_RECURSIVE
static void dfree(struct dnode **dnp)
{
	struct dnode *cur, *next;

	if (dnp == NULL)
		return;

	cur = dnp[0];
	while (cur != NULL) {
		free(cur->fullname);	/* free the filename */
		next = cur->next;
		free(cur);		/* free the dnode */
		cur = next;
	}
	free(dnp);			/* free the array holding the dnode pointers */
}
#endif

static struct dnode **splitdnarray(struct dnode **dn, int nfiles, int which)
{
	int dncnt, i, d;
	struct dnode **dnp;

	if (dn == NULL || nfiles < 1)
		return (NULL);

	/* count how many dirs and regular files there are */
	if (which == SPLIT_SUBDIR)
		dncnt = countsubdirs(dn, nfiles);
	else {
		dncnt = countdirs(dn, nfiles);	/* assume we are looking for dirs */
		if (which == SPLIT_FILE)
			dncnt = nfiles - dncnt;	/* looking for files */
	}

	/* allocate a file array and a dir array */
	dnp = dnalloc(dncnt);

	/* copy the entrys into the file or dir array */
	for (d = i = 0; i < nfiles; i++) {
		if (S_ISDIR(dn[i]->dstat.st_mode)) {
			if (which & (SPLIT_DIR|SPLIT_SUBDIR)) {
				if ((which & SPLIT_DIR)
					|| ((dn[i]->name[0] != '.')
						|| (dn[i]->name[1]
							&& ((dn[i]->name[1] != '.')
								|| dn[i]->name[2])))) {
									dnp[d++] = dn[i];
								}
			}
		} else if (!(which & (SPLIT_DIR|SPLIT_SUBDIR))) {
			dnp[d++] = dn[i];
		}
	}
	return (dnp);
}

/*----------------------------------------------------------------------*/
#ifdef CONFIG_FEATURE_LS_SORTFILES
static int sortcmp(struct dnode *d1, struct dnode *d2)
{
	unsigned int sort_opts = all_fmt & SORT_MASK;
	int dif;

	dif = 0;			/* assume SORT_NAME */
	if (sort_opts == SORT_SIZE) {
		dif = (int) (d2->dstat.st_size - d1->dstat.st_size);
	} else if (sort_opts == SORT_ATIME) {
		dif = (int) (d2->dstat.st_atime - d1->dstat.st_atime);
	} else if (sort_opts == SORT_CTIME) {
		dif = (int) (d2->dstat.st_ctime - d1->dstat.st_ctime);
	} else if (sort_opts == SORT_MTIME) {
		dif = (int) (d2->dstat.st_mtime - d1->dstat.st_mtime);
	} else if (sort_opts == SORT_DIR) {
		dif = S_ISDIR(d2->dstat.st_mode) - S_ISDIR(d1->dstat.st_mode);
		/* } else if (sort_opts == SORT_VERSION) { */
		/* } else if (sort_opts == SORT_EXT) { */
	}

	if (dif == 0) {
		/* sort by name- may be a tie_breaker for time or size cmp */
#ifdef CONFIG_LOCALE_SUPPORT
		dif = strcoll(d1->name, d2->name);
#else
		dif = strcmp(d1->name, d2->name);
#endif
	}

	if (all_fmt & SORT_ORDER_REVERSE) {
		dif = -dif;
	}
	return (dif);
}

/*----------------------------------------------------------------------*/
static void shellsort(struct dnode **dn, int size)
{
	struct dnode *temp;
	int gap, i, j;

	/* shell short the array */
	if (dn == NULL || size < 2)
		return;

	for (gap = size / 2; gap > 0; gap /= 2) {
		for (i = gap; i < size; i++) {
			for (j = i - gap; j >= 0; j -= gap) {
				if (sortcmp(dn[j], dn[j + gap]) <= 0)
					break;
				/* they are out of order, swap them */
				temp = dn[j];
				dn[j] = dn[j + gap];
				dn[j + gap] = temp;
			}
		}
	}
}
#endif

/*----------------------------------------------------------------------*/
static void showfiles(struct dnode **dn, int nfiles)
{
	int i, ncols, nrows, row, nc;
	int column = 0;
	int nexttab = 0;
	int column_width = 0; /* for STYLE_LONG and STYLE_SINGLE not used */

	if (dn == NULL || nfiles < 1)
		return;

	if (all_fmt & STYLE_ONE_RECORD_FLAG) {
		ncols = 1;
	} else {
		/* find the longest file name-  use that as the column width */
		for (i = 0; i < nfiles; i++) {
			int len = strlen(dn[i]->name) +
#ifdef CONFIG_SELINUX
			((all_fmt & LIST_CONTEXT) ? 33 : 0) +
#endif
			((all_fmt & LIST_INO) ? 8 : 0) +
			((all_fmt & LIST_BLOCKS) ? 5 : 0);
			if (column_width < len)
				column_width = len;
		}
		column_width += tabstops;
		ncols = (int) (terminal_width / column_width);
	}

	if (ncols > 1) {
		nrows = nfiles / ncols;
		if ((nrows * ncols) < nfiles)
			nrows++;                /* round up fractionals */
	} else {
		nrows = nfiles;
		ncols = 1;
	}

	for (row = 0; row < nrows; row++) {
		for (nc = 0; nc < ncols; nc++) {
			/* reach into the array based on the column and row */
			i = (nc * nrows) + row;	/* assume display by column */
			if (all_fmt & DISP_ROWS)
				i = (row * ncols) + nc;	/* display across row */
			if (i < nfiles) {
				if (column > 0) {
					nexttab -= column;
					while (nexttab--) {
						putchar(' ');
						column++;
					}
			}
				nexttab = column + column_width;
				column += list_single(dn[i]);
		}
		}
		putchar('\n');
		column = 0;
	}
}

/*----------------------------------------------------------------------*/
static void showdirs(struct dnode **dn, int ndirs)
{
	int i, nfiles;
	struct dnode **subdnp;

#ifdef CONFIG_FEATURE_LS_RECURSIVE
	int dndirs;
	struct dnode **dnd;
#endif

	if (dn == NULL || ndirs < 1)
		return;

	for (i = 0; i < ndirs; i++) {
		if (all_fmt & (DISP_DIRNAME | DISP_RECURSIVE)) {
			printf("\n%s:\n", dn[i]->fullname);
		}
		subdnp = list_dir(dn[i]->fullname);
		nfiles = countfiles(subdnp);
		if (nfiles > 0) {
			/* list all files at this level */
#ifdef CONFIG_FEATURE_LS_SORTFILES
			shellsort(subdnp, nfiles);
#endif
			showfiles(subdnp, nfiles);
#ifdef CONFIG_FEATURE_LS_RECURSIVE
			if (all_fmt & DISP_RECURSIVE) {
				/* recursive- list the sub-dirs */
				dnd = splitdnarray(subdnp, nfiles, SPLIT_SUBDIR);
				dndirs = countsubdirs(subdnp, nfiles);
				if (dndirs > 0) {
#ifdef CONFIG_FEATURE_LS_SORTFILES
					shellsort(dnd, dndirs);
#endif
					showdirs(dnd, dndirs);
					free(dnd);	/* free the array of dnode pointers to the dirs */
				}
			}
			dfree(subdnp);	/* free the dnodes and the fullname mem */
#endif
		}
	}
}

/*----------------------------------------------------------------------*/
static struct dnode **list_dir(const char *path)
{
	struct dnode *dn, *cur, **dnp;
	struct dirent *entry;
	DIR *dir;
	int i, nfiles;

	if (path == NULL)
		return (NULL);

	dn = NULL;
	nfiles = 0;
	dir = opendir(path);
	if (dir == NULL) {
		bb_perror_msg("%s", path);
		status = EXIT_FAILURE;
		return (NULL);	/* could not open the dir */
	}
	while ((entry = readdir(dir)) != NULL) {
		char *fullname;

		/* are we going to list the file- it may be . or .. or a hidden file */
		if (entry->d_name[0] == '.') {
			if ((entry->d_name[1] == 0 || (
				entry->d_name[1] == '.'
				&& entry->d_name[2] == 0))
					&& !(all_fmt & DISP_DOT))
			continue;
			if (!(all_fmt & DISP_HIDDEN))
			continue;
		}
		fullname = concat_path_file(path, entry->d_name);
		cur = my_stat(fullname, strrchr(fullname, '/') + 1);
		if (!cur)
			continue;
		cur->next = dn;
		dn = cur;
		nfiles++;
	}
	closedir(dir);

	/* now that we know how many files there are
	   ** allocate memory for an array to hold dnode pointers
	 */
	if (dn == NULL)
		return (NULL);
	dnp = dnalloc(nfiles);
	for (i = 0, cur = dn; i < nfiles; i++) {
		dnp[i] = cur;	/* save pointer to node in array */
		cur = cur->next;
	}

	return (dnp);
}

/*----------------------------------------------------------------------*/
static int list_single(struct dnode *dn)
{
	int i, column = 0;

#ifdef CONFIG_FEATURE_LS_USERNAME
	char scratch[16];
#endif
#ifdef CONFIG_FEATURE_LS_TIMESTAMPS
	char *filetime;
	time_t ttime, age;
#endif
#if defined(CONFIG_FEATURE_LS_FILETYPES) || defined (CONFIG_FEATURE_LS_COLOR)
	struct stat info;
	char append;
#endif

	if (dn->fullname == NULL)
		return (0);

#ifdef CONFIG_FEATURE_LS_TIMESTAMPS
	ttime = dn->dstat.st_mtime;	/* the default time */
	if (all_fmt & TIME_ACCESS)
		ttime = dn->dstat.st_atime;
	if (all_fmt & TIME_CHANGE)
		ttime = dn->dstat.st_ctime;
	filetime = ctime(&ttime);
#endif
#ifdef CONFIG_FEATURE_LS_FILETYPES
	append = append_char(dn->dstat.st_mode);
#endif

	for (i = 0; i <= 31; i++) {
		switch (all_fmt & (1 << i)) {
		case LIST_INO:
			column += printf("%7ld ", (long int) dn->dstat.st_ino);
			break;
		case LIST_BLOCKS:
#if _FILE_OFFSET_BITS == 64
			column += printf("%4lld ", dn->dstat.st_blocks >> 1);
#else
			column += printf("%4ld ", dn->dstat.st_blocks >> 1);
#endif
			break;
		case LIST_MODEBITS:
			column += printf("%-10s ", (char *) bb_mode_string(dn->dstat.st_mode));
			break;
		case LIST_NLINKS:
			column += printf("%4ld ", (long) dn->dstat.st_nlink);
			break;
		case LIST_ID_NAME:
#ifdef CONFIG_FEATURE_LS_USERNAME
			my_getpwuid(scratch, dn->dstat.st_uid);
			printf("%-8.8s ", scratch);
			my_getgrgid(scratch, dn->dstat.st_gid);
			printf("%-8.8s", scratch);
			column += 17;
			break;
#endif
		case LIST_ID_NUMERIC:
			column += printf("%-8d %-8d", dn->dstat.st_uid, dn->dstat.st_gid);
			break;
		case LIST_SIZE:
		case LIST_DEV:
			if (S_ISBLK(dn->dstat.st_mode) || S_ISCHR(dn->dstat.st_mode)) {
				column += printf("%4d, %3d ", (int) MAJOR(dn->dstat.st_rdev),
					   (int) MINOR(dn->dstat.st_rdev));
			} else {
#ifdef CONFIG_FEATURE_HUMAN_READABLE
				if (all_fmt & LS_DISP_HR) {
					column += printf("%9s ",
							make_human_readable_str(dn->dstat.st_size, 1, 0));
				} else
#endif
				{
#if _FILE_OFFSET_BITS == 64
					column += printf("%9lld ", (long long) dn->dstat.st_size);
#else
					column += printf("%9ld ", dn->dstat.st_size);
#endif
				}
			}
			break;
#ifdef CONFIG_FEATURE_LS_TIMESTAMPS
		case LIST_FULLTIME:
		case LIST_DATE_TIME:
			if (all_fmt & LIST_FULLTIME) {
				printf("%24.24s ", filetime);
				column += 25;
				break;
			}
			age = time(NULL) - ttime;
			printf("%6.6s ", filetime + 4);
			if (age < 3600L * 24 * 365 / 2 && age > -15 * 60) {
				/* hh:mm if less than 6 months old */
				printf("%5.5s ", filetime + 11);
			} else {
				printf(" %4.4s ", filetime + 20);
			}
			column += 13;
			break;
#endif
#ifdef CONFIG_SELINUX
		case LIST_CONTEXT:
			{
				char context[64];
				int len = sizeof(context);
				if(security_sid_to_context(dn->sid, context, &len))
				{
					strcpy(context, "unknown");
					len = 7;
				}
				printf("%-32s ", context);
				column += MAX(33, len);
			}
			break;
#endif
		case LIST_FILENAME:
#ifdef CONFIG_FEATURE_LS_COLOR
			errno = 0;
			if (show_color && !lstat(dn->fullname, &info)) {
				printf("\033[%d;%dm", bgcolor(info.st_mode),
					   fgcolor(info.st_mode));
			}
#endif
			column += printf("%s", dn->name);
#ifdef CONFIG_FEATURE_LS_COLOR
			if (show_color) {
				printf("\033[0m");
			}
#endif
			break;
		case LIST_SYMLINK:
			if (S_ISLNK(dn->dstat.st_mode)) {
				char *lpath = xreadlink(dn->fullname);

				if (lpath) {
					printf(" -> ");
#if defined(CONFIG_FEATURE_LS_FILETYPES) || defined (CONFIG_FEATURE_LS_COLOR)
					if (!stat(dn->fullname, &info)) {
						append = append_char(info.st_mode);
					}
#endif
#ifdef CONFIG_FEATURE_LS_COLOR
					if (show_color) {
						errno = 0;
						printf("\033[%d;%dm", bgcolor(info.st_mode),
							   fgcolor(info.st_mode));
					}
#endif
					column += printf("%s", lpath) + 4;
#ifdef CONFIG_FEATURE_LS_COLOR
					if (show_color) {
						printf("\033[0m");
					}
#endif
					free(lpath);
				}
			}
			break;
#ifdef CONFIG_FEATURE_LS_FILETYPES
		case LIST_FILETYPE:
			if (append != '\0') {
				printf("%1c", append);
				column++;
			}
			break;
#endif
		}
	}

	return column;
}

/*----------------------------------------------------------------------*/

static const char ls_opts[] = "1AaCdgilnsx"
#ifdef CONFIG_FEATURE_LS_FILETYPES
						 "Fp"
#endif
#ifdef CONFIG_FEATURE_LS_RECURSIVE
						 "R"
#endif
#ifdef CONFIG_FEATURE_LS_SORTFILES
						 "rSvX"
#endif
#ifdef CONFIG_FEATURE_LS_TIMESTAMPS
						 "ecut"
#endif
#ifdef CONFIG_FEATURE_LS_FOLLOWLINKS
						 "L"
#endif
#ifdef CONFIG_FEATURE_HUMAN_READABLE
						 "h"
#endif
						 "k"
#ifdef CONFIG_SELINUX
						"K"
#endif
#ifdef CONFIG_FEATURE_AUTOWIDTH
						 "T:w:"
#endif
	;

#define LIST_MASK_TRIGGER   LIST_SHORT
#define STYLE_MASK_TRIGGER  STYLE_MASK
#define SORT_MASK_TRIGGER   SORT_MASK
#define DISP_MASK_TRIGGER   DISP_ROWS
#define TIME_MASK_TRIGGER   TIME_MASK

static const unsigned opt_flags[] = {
	LIST_SHORT | STYLE_SINGLE,	/* 1 */
	DISP_HIDDEN,				/* A */
	DISP_HIDDEN | DISP_DOT,		/* a */
	LIST_SHORT | STYLE_COLUMNS,	/* C */
	DISP_NOLIST,				/* d */
	0,							/* g - ingored */
	LIST_INO,					/* i */
	LIST_LONG | STYLE_LONG,		/* l - remember LS_DISP_HR in mask! */
	LIST_ID_NUMERIC,			/* n */
	LIST_BLOCKS,				/* s */
	DISP_ROWS,					/* x */
#ifdef CONFIG_FEATURE_LS_FILETYPES
	LIST_FILETYPE | LIST_EXEC,	/* F */
	LIST_FILETYPE,				/* p */
#endif
#ifdef CONFIG_FEATURE_LS_RECURSIVE
	DISP_RECURSIVE,				/* R */
#endif
#ifdef CONFIG_FEATURE_LS_SORTFILES
	SORT_ORDER_REVERSE,			/* r */
	SORT_SIZE,					/* S */
	SORT_VERSION,				/* v */
	SORT_EXT,					/* v */
#endif
#ifdef CONFIG_FEATURE_LS_TIMESTAMPS
	LIST_FULLTIME,				/* e */
#ifdef CONFIG_FEATURE_LS_SORTFILES
	TIME_CHANGE | SORT_CTIME,	/* c */
#else
	TIME_CHANGE,				/* c */
#endif
#ifdef CONFIG_FEATURE_LS_SORTFILES
	TIME_ACCESS | SORT_ATIME,	/* u */
#else
	TIME_ACCESS,				/* u */
#endif
#ifdef CONFIG_FEATURE_LS_SORTFILES
	SORT_MTIME,					/* t */
#else
	0,							/* t - ignored -- is this correct? */
#endif
#endif
#ifdef CONFIG_FEATURE_LS_FOLLOWLINKS
	FOLLOW_LINKS,				/* L */
#endif
#ifdef CONFIG_FEATURE_HUMAN_READABLE
LS_DISP_HR,						/* h */
#endif
#ifndef CONFIG_SELINUX
	0,							/* k - ingored */
#else
	LIST_CONTEXT,				/* k */
	LIST_MODEBITS|LIST_NLINKS|LIST_CONTEXT|LIST_SIZE|LIST_DATE_TIME, /* K */
#endif
};


/*----------------------------------------------------------------------*/

extern int ls_main(int argc, char **argv)
{
	struct dnode **dnf, **dnd;
	int dnfiles, dndirs;
	struct dnode *dn, *cur, **dnp;
	int i, nfiles;
	int opt;
	int oi, ac;
	char **av;
#ifdef CONFIG_SELINUX
	is_flask_enabled_flag = is_flask_enabled();
#endif

#ifdef CONFIG_FEATURE_AUTOWIDTH
	struct winsize win = { 0, 0, 0, 0 };
#endif

	all_fmt = LIST_SHORT | DISP_NORMAL | STYLE_AUTO
#ifdef CONFIG_FEATURE_LS_TIMESTAMPS
		| TIME_MOD
#endif
#ifdef CONFIG_FEATURE_LS_SORTFILES
		| SORT_NAME | SORT_ORDER_FORWARD
#endif
		;
#ifdef CONFIG_FEATURE_AUTOWIDTH
	ioctl(fileno(stdout), TIOCGWINSZ, &win);
	if (win.ws_col > 0)
		terminal_width = win.ws_col - 1;
#endif
	nfiles = 0;

#ifdef CONFIG_FEATURE_LS_COLOR
	if (isatty(fileno(stdout)))
		show_color = 1;
#endif

	/* process options */
	while ((opt = getopt(argc, argv, ls_opts)) > 0) {
#ifdef CONFIG_FEATURE_AUTOWIDTH
		if (opt == 'T') {
			tabstops = atoi(optarg);
			continue;
		}
		if (opt == 'w') {
			terminal_width = atoi(optarg);
			continue;
		}
		if (opt == ':') {
			goto print_usage_message;
		}
#endif
		{
			unsigned int flags;
			const char *p = strchr(ls_opts, opt);
			if (!p) {	/* shouldn't be necessary */
				goto print_usage_message;
			}
			flags = opt_flags[(int)(p - ls_opts)];
			if (flags & LIST_MASK_TRIGGER) {
				all_fmt &= ~LIST_MASK;
			}
			if (flags & STYLE_MASK_TRIGGER) {
				all_fmt &= ~STYLE_MASK;
			}
#ifdef CONFIG_FEATURE_LS_SORTFILES
			if (flags & SORT_MASK_TRIGGER) {
				all_fmt &= ~SORT_MASK;
			}
#endif
			if (flags & DISP_MASK_TRIGGER) {
				all_fmt &= ~DISP_MASK;
			}
#ifdef CONFIG_FEATURE_LS_TIMESTAMPS
			if (flags & TIME_MASK_TRIGGER) {
				all_fmt &= ~TIME_MASK;
			}
#endif
			if (flags & LIST_CONTEXT) {
				all_fmt |= STYLE_SINGLE;
			}
#ifdef CONFIG_FEATURE_HUMAN_READABLE
			if (opt == 'l') {
				all_fmt &= ~LS_DISP_HR;
			}
#endif
			all_fmt |= flags;
		}
	}


	/* sort out which command line options take precedence */
#ifdef CONFIG_FEATURE_LS_RECURSIVE
	if (all_fmt & DISP_NOLIST)
		all_fmt &= ~DISP_RECURSIVE;	/* no recurse if listing only dir */
#endif
#if defined (CONFIG_FEATURE_LS_TIMESTAMPS) && defined (CONFIG_FEATURE_LS_SORTFILES)
	if (all_fmt & TIME_CHANGE)
		all_fmt = (all_fmt & ~SORT_MASK) | SORT_CTIME;
	if (all_fmt & TIME_ACCESS)
		all_fmt = (all_fmt & ~SORT_MASK) | SORT_ATIME;
#endif
	if ((all_fmt & STYLE_MASK) != STYLE_LONG) /* only for long list */
		all_fmt &= ~(LIST_ID_NUMERIC|LIST_FULLTIME|LIST_ID_NAME|LIST_ID_NUMERIC);
#ifdef CONFIG_FEATURE_LS_USERNAME
	if ((all_fmt & STYLE_MASK) == STYLE_LONG && (all_fmt & LIST_ID_NUMERIC))
		all_fmt &= ~LIST_ID_NAME;	/* don't list names if numeric uid */
#endif
			
	/* choose a display format */
	if ((all_fmt & STYLE_MASK) == STYLE_AUTO)
#if STYLE_AUTO != 0
		all_fmt = (all_fmt & ~STYLE_MASK)
				| (isatty(fileno(stdout)) ? STYLE_COLUMNS : STYLE_SINGLE);
#else
		all_fmt |= (isatty(fileno(stdout)) ? STYLE_COLUMNS : STYLE_SINGLE);
#endif

	/*
	 * when there are no cmd line args we have to supply a default "." arg.
	 * we will create a second argv array, "av" that will hold either
	 * our created "." arg, or the real cmd line args.  The av array
	 * just holds the pointers- we don't move the date the pointers
	 * point to.
	 */
	ac = argc - optind;	/* how many cmd line args are left */
	if (ac < 1) {
		av = (char **) xcalloc((size_t) 1, (size_t) (sizeof(char *)));
		av[0] = bb_xstrdup(".");
		ac = 1;
	} else {
		av = (char **) xcalloc((size_t) ac, (size_t) (sizeof(char *)));
		for (oi = 0; oi < ac; oi++) {
			av[oi] = argv[optind++];	/* copy pointer to real cmd line arg */
		}
	}

	/* now, everything is in the av array */
	if (ac > 1)
		all_fmt |= DISP_DIRNAME;	/* 2 or more items? label directories */

	/* stuff the command line file names into an dnode array */
	dn = NULL;
	for (oi = 0; oi < ac; oi++) {
		char *fullname = bb_xstrdup(av[oi]);

		cur = my_stat(fullname, fullname);
		if (!cur)
			continue;
		cur->next = dn;
		dn = cur;
		nfiles++;
	}

	/* now that we know how many files there are
	   ** allocate memory for an array to hold dnode pointers
	 */
	dnp = dnalloc(nfiles);
	for (i = 0, cur = dn; i < nfiles; i++) {
		dnp[i] = cur;	/* save pointer to node in array */
		cur = cur->next;
	}


	if (all_fmt & DISP_NOLIST) {
#ifdef CONFIG_FEATURE_LS_SORTFILES
		shellsort(dnp, nfiles);
#endif
		if (nfiles > 0)
			showfiles(dnp, nfiles);
	} else {
		dnd = splitdnarray(dnp, nfiles, SPLIT_DIR);
		dnf = splitdnarray(dnp, nfiles, SPLIT_FILE);
		dndirs = countdirs(dnp, nfiles);
		dnfiles = nfiles - dndirs;
		if (dnfiles > 0) {
#ifdef CONFIG_FEATURE_LS_SORTFILES
			shellsort(dnf, dnfiles);
#endif
			showfiles(dnf, dnfiles);
		}
		if (dndirs > 0) {
#ifdef CONFIG_FEATURE_LS_SORTFILES
			shellsort(dnd, dndirs);
#endif
			showdirs(dnd, dndirs);
		}
	}
	return (status);

  print_usage_message:
	bb_show_usage();
}
