⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ls.c

📁 这是 gnu 程序中 ls 程序的源代码程序。
💻 C
📖 第 1 页 / 共 2 页
字号:
/*	$NetBSD: ls.c,v 1.55 2003/12/26 10:51:25 simonb Exp $	*//* * Copyright (c) 1989, 1993, 1994 *	The Regents of the University of California.  All rights reserved. * * This code is derived from software contributed to Berkeley by * Michael Fischbein. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright *    notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright *    notice, this list of conditions and the following disclaimer in the *    documentation and/or other materials provided with the distribution. * 3. Neither the name of the University nor the names of its contributors *    may be used to endorse or promote products derived from this software *    without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */#include <sys/cdefs.h>#ifndef lint__COPYRIGHT("@(#) Copyright (c) 1989, 1993, 1994\n\	The Regents of the University of California.  All rights reserved.\n");#endif /* not lint */#ifndef lint#if 0static char sccsid[] = "@(#)ls.c	8.7 (Berkeley) 8/5/94";#else__RCSID("$NetBSD: ls.c,v 1.55 2003/12/26 10:51:25 simonb Exp $");#endif#endif /* not lint */#include <sys/types.h>#include <sys/stat.h>#include <sys/ioctl.h>#include <dirent.h>#include <err.h>#include <errno.h>#include <fts.h>#include <locale.h>#include <stdio.h>#include <stdlib.h>#include <string.h>#include <unistd.h>#include <termios.h>#include <pwd.h>#include <grp.h>#include "ls.h"#include "extern.h"static void	 display(FTSENT *, FTSENT *);static int	 mastercmp(const FTSENT **, const FTSENT **);static void	 traverse(int, char **, int);static void (*printfcn)(DISPLAY *);static int (*sortfcn)(const FTSENT *, const FTSENT *);#define	BY_NAME 0#define	BY_SIZE 1#define	BY_TIME	2long blocksize;			/* block size units */int termwidth = 80;		/* default terminal width */int sortkey = BY_NAME;int rval = EXIT_SUCCESS;	/* exit value - set if error encountered *//* flags */int f_accesstime;		/* use time of last access */int f_column;			/* columnated format */int f_columnacross;		/* columnated format, sorted across */int f_flags;			/* show flags associated with a file */int f_grouponly;		/* long listing without owner */int f_humanize;			/* humanize the size field */int f_inode;			/* print inode */int f_listdir;			/* list actual directory, not contents */int f_listdot;			/* list files beginning with . */int f_longform;			/* long listing format */int f_nonprint;			/* show unprintables as ? */int f_nosort;			/* don't sort output */int f_numericonly;		/* don't convert uid/gid to name */int f_octal;			/* print octal escapes for nongraphic characters */int f_octal_escape;		/* like f_octal but use C escapes if possible */int f_recursive;		/* ls subdirectories also */int f_reversesort;		/* reverse whatever sort is used */int f_sectime;			/* print the real time for all files */int f_singlecol;		/* use single column output */int f_size;			/* list size in short listing */int f_statustime;		/* use time of last mode change */int f_stream;			/* stream format */int f_type;			/* add type character for non-regular files */int f_typedir;			/* add type character for directories */int f_whiteout;			/* show whiteout entries */intls_main(int argc, char *argv[]){	static char dot[] = ".", *dotav[] = { dot, NULL };	struct winsize win;	int ch, fts_options;	int kflag = 0;	const char *p;	setlocale(LC_ALL, "");	/* Terminal defaults to -Cq, non-terminal defaults to -1. */	if (isatty(STDOUT_FILENO)) {		if ((p = getenv("COLUMNS")) != NULL)			termwidth = atoi(p);		else if (ioctl(STDOUT_FILENO, TIOCGWINSZ, &win) == 0 &&		    win.ws_col > 0)			termwidth = win.ws_col;		f_column = f_nonprint = 1;	} else		f_singlecol = 1;	/* Root is -A automatically. */	if (!getuid())		f_listdot = 1;	fts_options = FTS_PHYSICAL;	while ((ch = getopt(argc, argv, "1ABCFLRSTWabcdfghiklmnopqrstuwx")) != -1) {		switch (ch) {		/*		 * The -1, -C, -l, -m and -x options all override each other so		 * shell aliasing works correctly.		 */		case '1':			f_singlecol = 1;			f_column = f_columnacross = f_longform = f_stream = 0;			break;		case 'C':			f_column = 1;			f_columnacross = f_longform = f_singlecol = f_stream =			    0;			break;		case 'g':			if (f_grouponly != -1)				f_grouponly = 1;			f_longform = 1;			f_column = f_columnacross = f_singlecol = f_stream = 0;			break;		case 'l':			f_longform = 1;			f_column = f_columnacross = f_singlecol = f_stream = 0;			/* Never let -g take precedence over -l. */			f_grouponly = -1;			break;		case 'm':			f_stream = 1;			f_column = f_columnacross = f_longform = f_singlecol =			    0;			break;		case 'x':			f_columnacross = 1;			f_column = f_longform = f_singlecol = f_stream = 0;			break;		/* The -c and -u options override each other. */		case 'c':			f_statustime = 1;			f_accesstime = 0;			break;		case 'u':			f_accesstime = 1;			f_statustime = 0;			break;		case 'F':			f_type = 1;			break;		case 'L':			fts_options &= ~FTS_PHYSICAL;			fts_options |= FTS_LOGICAL;			break;		case 'R':			f_recursive = 1;			break;		case 'a':			fts_options |= FTS_SEEDOT;			/* FALLTHROUGH */		case 'A':			f_listdot = 1;			break;		/* the -B option turns off the -b, -q and -w options. */		case 'B':			f_nonprint = 0;			f_octal = 1;			f_octal_escape = 0;			break;		/* the -b option turns off the -B, -q and -w options. */		case 'b':			f_nonprint = 0;			f_octal = 0;			f_octal_escape = 1;			break;		/* The -d option turns off the -R option. */		case 'd':			f_listdir = 1;			f_recursive = 0;			break;		case 'f':			f_nosort = 1;			break;		case 'i':			f_inode = 1;			break;		case 'k':			blocksize = 1024;			kflag = 1;			break;		/*		 * The -h option forces all sizes to be measured in bytes.		 * It also makes -l suppress -s.		 */		case 'h':			f_humanize = 1;			break;		case 'n':			f_numericonly = 1;			break;		case 'o':			f_flags = 1;			break;		case 'p':			f_typedir = 1;			break;		/* the -q option turns off the -B, -b and -w options. */		case 'q':			f_nonprint = 1;			f_octal = 0;			f_octal_escape = 0;			break;		case 'r':			f_reversesort = 1;			break;		case 'S':			sortkey = BY_SIZE;			break;		case 's':			f_size = 1;			break;		case 'T':			f_sectime = 1;			break;		case 't':			sortkey = BY_TIME;			break;		case 'W':			f_whiteout = 1;			break;		/* the -w option turns off the -B, -b and -q options. */		case 'w':			f_nonprint = 0;			f_octal = 0;			f_octal_escape = 0;			break;		default:		case '?':			usage();		}	}	argc -= optind;	argv += optind;	/*	 * If both -g and -l options, let -l take precedence.	 */	if (f_grouponly == -1)		f_grouponly = 0;	/*	 * If not -F, -i, -l, -p, -S, -s or -t options, don't require stat	 * information.	 */	if (!f_inode && !f_longform && !f_size && !f_type && !f_typedir &&	    sortkey == BY_NAME)		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)		fts_options |= FTS_COMFOLLOW;	/*	 * If -W, show whiteout entries	 */#ifdef FTS_WHITEOUT	if (f_whiteout)		fts_options |= FTS_WHITEOUT;#endif	/* If -l or -s, figure out block size. */	if (f_inode || f_longform || f_size) {		if (!kflag)			(void)getbsize(NULL, &blocksize);		blocksize /= 512;	}	/* Select a sort function. */	if (f_reversesort) {		switch (sortkey) {		case BY_NAME:			sortfcn = revnamecmp;			break;		case BY_SIZE:			sortfcn = revsizecmp;			break;		case BY_TIME:			if (f_accesstime)				sortfcn = revacccmp;			else if (f_statustime)				sortfcn = revstatcmp;			else /* Use modification time. */				sortfcn = revmodcmp;			break;		}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -