9front - general discussion about 9front
 help / color / mirror / Atom feed
* Fwd: Re: Patch to remove "adult" content from spamd(8) man page
@ 2013-11-22 19:50 sl
  2013-12-01  1:44 ` [9front] " Ethan Grammatikidis
  0 siblings, 1 reply; 2+ messages in thread
From: sl @ 2013-11-22 19:50 UTC (permalink / raw)
  To: 9front

[-- Attachment #1: Type: text/plain, Size: 0 bytes --]



[-- Attachment #2: Type: message/rfc822, Size: 56734 bytes --]

From: Theo de Raadt <deraadt@cvs.openbsd.org>
To: admin@bitwise.net
Cc: "J. Lewis Muir" <jlmuir@imca-cat.org>, misc@openbsd.org
Subject: Re: Patch to remove "adult" content from spamd(8) man page
Date: Fri, 22 Nov 2013 12:31:42 -0700
Message-ID: <201311221931.rAMJVgL9005419@cvs.openbsd.org>

> 2) OpenBSD is the ultimate volunteer effort -- the developers do it in 
> their "free" time FOR PERSONAL FUN. Many of them have made it very 
> clear that they would cease development if it stops being fun. Your 
> original message (title and intro) goes to the heart of this issue. Its 
> tone and attitude is no different than the efforts in the Bible Belt to 
> ban Mark Twain's Huckleberry Fin from public libraries, i.e. since 
> somebody finds some content to be "offensive" lets get rid of it 
> irrespective of the overall true value or consideration for the fact 
> that the author has used the "offensive" language ON PURPOSE.

Personally, I find the ls command offensive.  It could show files with
"nasty words" in them.  This is about more than my adult view; I know
there are children forced by their parents to use OpenBSD, like little
Tom who lives a block over.

One option is to add a "content filter" directly inside the ls
command, so that it will simply skip those files.  Another variation
would be to add the support to the kernel itself, this would also help
other adirectory traversal code.  It might face significant kernel
growth.  Of course we would have to find a way to manage the nasty
word dictionary, and not expose it in the source tree in an open
fashion.  Blob, anyone?

If we make this change in the kernel, we also need to be sensitive
to the way that the NFS kernel code traverses directories.

For now, I have chosen a simpler solution.  (If this actually gets
commited, we could call it the final solution).

ok?

Index: Makefile
===================================================================
RCS file: /cvs/src/bin/Makefile,v
retrieving revision 1.10
diff -u -p -u -r1.10 Makefile
--- Makefile	18 May 2007 16:08:12 -0000	1.10
+++ Makefile	22 Nov 2013 19:24:12 -0000
@@ -1,7 +1,7 @@
 #	$OpenBSD: Makefile,v 1.10 2007/05/18 16:08:12 deraadt Exp $
 
 SUBDIR=	cat chio chmod cp csh date dd df domainname echo \
-	ed expr hostname kill ksh ln ls md5 mkdir mt \
+	ed expr hostname kill ksh ln md5 mkdir mt \
 	mv pax ps pwd rcp rm rmail rmdir sleep stty \
 	sync systrace test
 
Index: ls/Makefile
===================================================================
RCS file: ls/Makefile
diff -N ls/Makefile
--- ls/Makefile	6 Aug 2003 19:09:09 -0000	1.7
+++ /dev/null	1 Jan 1970 00:00:00 -0000
@@ -1,8 +0,0 @@
-#	$OpenBSD: Makefile,v 1.7 2003/08/06 19:09:09 tedu Exp $
-
-PROG=	ls
-SRCS=	cmp.c ls.c main.c print.c util.c
-DPADD= ${LIBUTIL}
-LDADD= -lutil
-
-.include <bsd.prog.mk>
Index: ls/cmp.c
===================================================================
RCS file: ls/cmp.c
diff -N ls/cmp.c
--- ls/cmp.c	27 Oct 2009 23:59:21 -0000	1.6
+++ /dev/null	1 Jan 1970 00:00:00 -0000
@@ -1,167 +0,0 @@
-/*	$OpenBSD: cmp.c,v 1.6 2009/10/27 23:59:21 deraadt Exp $	*/
-/*	$NetBSD: cmp.c,v 1.10 1996/07/08 10:32:01 mycroft Exp $	*/
-
-/*
- * Copyright (c) 1989, 1993
- *	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/types.h>
-#include <sys/stat.h>
-
-#include <fts.h>
-#include <string.h>
-
-#include "ls.h"
-#include "extern.h"
-
-int
-namecmp(const FTSENT *a, const FTSENT *b)
-{
-	return (strcmp(a->fts_name, b->fts_name));
-}
-
-int
-revnamecmp(const FTSENT *a, const FTSENT *b)
-{
-	return (strcmp(b->fts_name, a->fts_name));
-}
-
-int
-modcmp(const FTSENT *a, const FTSENT *b)
-{
-	if (b->fts_statp->st_mtime > a->fts_statp->st_mtime)
-		return (1);
-	else if (b->fts_statp->st_mtime < a->fts_statp->st_mtime)
-		return (-1);
-	else if (b->fts_statp->st_mtimensec > a->fts_statp->st_mtimensec)
-		return (1);
-	else if (b->fts_statp->st_mtimensec < a->fts_statp->st_mtimensec)
-		return (-1);
-	else
-		return (namecmp(a, b));
-}
-
-int
-revmodcmp(const FTSENT *a, const FTSENT *b)
-{
-	if (b->fts_statp->st_mtime > a->fts_statp->st_mtime)
-		return (-1);
-	else if (b->fts_statp->st_mtime < a->fts_statp->st_mtime)
-		return (1);
-	else if (b->fts_statp->st_mtimensec > a->fts_statp->st_mtimensec)
-		return (-1);
-	else if (b->fts_statp->st_mtimensec < a->fts_statp->st_mtimensec)
-		return (1);
-	else
-		return (revnamecmp(a, b));
-}
-
-int
-acccmp(const FTSENT *a, const FTSENT *b)
-{
-	if (b->fts_statp->st_atime > a->fts_statp->st_atime)
-		return (1);
-	else if (b->fts_statp->st_atime < a->fts_statp->st_atime)
-		return (-1);
-	else if (b->fts_statp->st_atimensec > a->fts_statp->st_atimensec)
-		return (1);
-	else if (b->fts_statp->st_atimensec < a->fts_statp->st_atimensec)
-		return (-1);
-	else
-		return (namecmp(a, b));
-}
-
-int
-revacccmp(const FTSENT *a, const FTSENT *b)
-{
-	if (b->fts_statp->st_atime > a->fts_statp->st_atime)
-		return (-1);
-	else if (b->fts_statp->st_atime < a->fts_statp->st_atime)
-		return (1);
-	else if (b->fts_statp->st_atimensec > a->fts_statp->st_atimensec)
-		return (-1);
-	else if (b->fts_statp->st_atimensec < a->fts_statp->st_atimensec)
-		return (1);
-	else
-		return (revnamecmp(a, b));
-}
-
-int
-statcmp(const FTSENT *a, const FTSENT *b)
-{
-	if (b->fts_statp->st_ctime > a->fts_statp->st_ctime)
-		return (1);
-	else if (b->fts_statp->st_ctime < a->fts_statp->st_ctime)
-		return (-1);
-	else if (b->fts_statp->st_ctimensec > a->fts_statp->st_ctimensec)
-		return (1);
-	else if (b->fts_statp->st_ctimensec < a->fts_statp->st_ctimensec)
-		return (-1);
-	else
-		return (namecmp(a, b));
-}
-
-int
-revstatcmp(const FTSENT *a, const FTSENT *b)
-{
-	if (b->fts_statp->st_ctime > a->fts_statp->st_ctime)
-		return (-1);
-	else if (b->fts_statp->st_ctime < a->fts_statp->st_ctime)
-		return (1);
-	else if (b->fts_statp->st_ctimensec > a->fts_statp->st_ctimensec)
-		return (-1);
-	else if (b->fts_statp->st_ctimensec < a->fts_statp->st_ctimensec)
-		return (1);
-	else
-		return (revnamecmp(a, b));
-}
-
-int
-sizecmp(const FTSENT *a, const FTSENT *b)
-{
-	if (b->fts_statp->st_size > a->fts_statp->st_size)
-		return (1);
-	if (b->fts_statp->st_size < a->fts_statp->st_size)
-		return (-1);
-	else
-		return (namecmp(a, b));
-}
-
-int
-revsizecmp(const FTSENT *a, const FTSENT *b)
-{
-	if (b->fts_statp->st_size > a->fts_statp->st_size)
-		return (-1);
-	if (b->fts_statp->st_size < a->fts_statp->st_size)
-		return (1);
-	else
-		return (revnamecmp(a, b));
-}
Index: ls/extern.h
===================================================================
RCS file: ls/extern.h
diff -N ls/extern.h
--- ls/extern.h	2 Jun 2003 23:32:08 -0000	1.9
+++ /dev/null	1 Jan 1970 00:00:00 -0000
@@ -1,54 +0,0 @@
-/*	$OpenBSD: extern.h,v 1.9 2003/06/02 23:32:08 millert Exp $	*/
-/*	$NetBSD: extern.h,v 1.5 1995/03/21 09:06:24 cgd Exp $	*/
-
-/*-
- * Copyright (c) 1991, 1993
- *	The Regents of the University of California.  All rights reserved.
- *
- * 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.
- *
- *	@(#)extern.h	8.1 (Berkeley) 5/31/93
- */
-
-extern char *__progname;
-
-int	 acccmp(const FTSENT *, const FTSENT *);
-int	 revacccmp(const FTSENT *, const FTSENT *);
-int	 modcmp(const FTSENT *, const FTSENT *);
-int	 revmodcmp(const FTSENT *, const FTSENT *);
-int	 namecmp(const FTSENT *, const FTSENT *);
-int	 revnamecmp(const FTSENT *, const FTSENT *);
-int	 statcmp(const FTSENT *, const FTSENT *);
-int	 revstatcmp(const FTSENT *, const FTSENT *);
-int	 sizecmp(const FTSENT *, const FTSENT *);
-int	 revsizecmp(const FTSENT *, const FTSENT *);
-
-int	 putname(char *);
-void	 printcol(DISPLAY *);
-void	 printacol(DISPLAY *);
-void	 printlong(DISPLAY *);
-void	 printscol(DISPLAY *);
-void	 printstream(DISPLAY *);
-void	 usage(void);
Index: ls/ls.1
===================================================================
RCS file: ls/ls.1
diff -N ls/ls.1
--- ls/ls.1	31 Aug 2011 08:48:40 -0000	1.66
+++ /dev/null	1 Jan 1970 00:00:00 -0000
@@ -1,503 +0,0 @@
-.\"	$OpenBSD: ls.1,v 1.66 2011/08/31 08:48:40 jmc Exp $
-.\"	$NetBSD: ls.1,v 1.14 1995/12/05 02:44:01 jtc Exp $
-.\"
-.\" Copyright (c) 1980, 1990, 1991, 1993, 1994
-.\"	The Regents of the University of California.  All rights reserved.
-.\"
-.\" This code is derived from software contributed to Berkeley by
-.\" the Institute of Electrical and Electronics Engineers, Inc.
-.\"
-.\" 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.
-.\"
-.\"     @(#)ls.1	8.7 (Berkeley) 7/29/94
-.\"
-.Dd $Mdocdate: August 31 2011 $
-.Dt LS 1
-.Os
-.Sh NAME
-.Nm ls
-.Nd list directory contents
-.Sh SYNOPSIS
-.Nm ls
-.Op Fl 1AaCcdFfgHhikLlmnopqRrSsTtux
-.Op Ar
-.Sh DESCRIPTION
-For each operand that names a
-.Ar file
-of a type other than directory,
-.Nm
-displays its name as well as any requested,
-associated information.
-For each named directory,
-.Nm
-displays the names of files contained
-within that directory, as well as any requested, associated
-information.
-.Pp
-If no operands are given, the contents of the current
-directory are displayed.
-If more than one operand is given,
-non-directory operands are displayed first; directory
-and non-directory operands are sorted separately and in
-lexicographical order.
-By default,
-.Nm
-lists one entry per line to standard
-output; the exceptions are to terminals or when the
-.Fl C ,
-.Fl m ,
-or
-.Fl x
-options are specified.
-.Pp
-The options are as follows:
-.Bl -tag -width Ds
-.It Fl 1
-(The numeric digit
-.Dq one . )
-Force output to be one entry per line.
-This is the default when
-output is not to a terminal.
-.It Fl A
-List all entries except for
-.Sq \&.
-and
-.Sq \&.. .
-Always set for the superuser.
-.It Fl a
-Include directory entries whose names begin with a
-dot
-.Pq Sq \&. .
-.It Fl C
-Force multi-column output; this is the default when output is to a terminal.
-.It Fl c
-Use time file's status was last changed instead of last modification
-time for sorting
-.Pq Fl t
-or printing
-.Pf ( Fl g , l ,
-or
-.Fl n ) .
-.It Fl d
-Directories are listed as plain files (not searched recursively) and
-symbolic links in the argument list are not indirected through.
-.It Fl F
-Display a slash
-.Pq Sq /
-immediately after each pathname that is a directory,
-an asterisk
-.Pq Sq *
-after each that is executable,
-an at sign
-.Pq Sq @
-after each symbolic link,
-an equal sign
-.Pq Sq =
-after each socket,
-and a vertical bar
-.Pq Sq \&|
-after each that is a FIFO.
-.It Fl f
-Output is not sorted.
-.It Fl g
-List in long format as in
-.Fl l ,
-except that the owner is not printed.
-.It Fl H
-Follow symbolic links specified on the command line.
-This is the default behaviour when none of the
-.Fl d , F ,
-or
-.Fl l
-options are specified.
-.It Fl h
-When used with a long format
-option, use unit suffixes: Byte, Kilobyte, Megabyte, Gigabyte, Terabyte,
-Petabyte, and Exabyte in order to reduce the number of digits to four or fewer
-using powers of 2 for sizes (K=1024, M=1048576, etc.).
-.It Fl i
-For each file, print its inode number.
-.It Fl k
-Modifies the
-.Fl s
-option, causing the sizes to be reported in kilobytes.
-Overrides any value specified by the
-.Ev BLOCKSIZE
-environment variable.
-.It Fl L
-If argument is a symbolic link, evaluate the file information and file type
-to be those of the file referenced by the link, and not the link itself;
-however,
-.Nm
-writes the name of the link itself and not the file referenced by the link.
-.It Fl l
-(The lowercase letter
-.Dq ell . )
-List in long format (see below).
-A total sum of all file
-sizes is output on a line before the long listing.
-Output is one entry per line.
-.It Fl m
-Stream output format; list files across the page, separated by commas.
-.It Fl n
-List in long format as in
-.Fl l ,
-but retain user and group IDs in a numeric format.
-The output of
-.Fl gn
-and
-.Fl ng
-is identical:
-a long listing with numerical group ID,
-and no numerical user ID.
-The output of
-.Fl ln
-and
-.Fl \&nl
-is identical:
-a long listing with numerical group and user ID.
-.It Fl o
-Include the file flags in a long format
-.Pf ( Fl g , l ,
-or
-.Fl n )
-output.
-.It Fl p
-Display a slash
-.Pq Sq /
-immediately after each pathname that is a directory.
-.It Fl q
-Force printing of non-graphic characters in file names as
-the character
-.Sq \&? ;
-this is the default when output is to a terminal.
-.It Fl R
-Recursively list subdirectories encountered.
-.It Fl r
-Reverse the order of the sort to get reverse
-lexicographical order or the smallest or oldest entries first.
-.It Fl S
-Sort by size, largest file first.
-.It Fl s
-Display the number of file system blocks actually used by each file,
-where partial units are rounded up to the next integer value.
-Blocks are 512 bytes unless overridden by the
-.Fl k
-flag or
-.Ev BLOCKSIZE
-environment variable.
-.It Fl T
-Display complete time information for the file, including
-month, day, hour, minute, second, and year.
-This option has no effect unless one of the long format
-.Pf ( Fl g , l ,
-or
-.Fl n )
-options is also specified.
-.It Fl t
-Sort by time modified (most recently modified
-first) before sorting the operands in lexicographical
-order.
-.It Fl u
-Use file's last access time
-instead of last modification time
-for sorting
-.Pq Fl t
-or printing
-.Pf ( Fl g , l ,
-or
-.Fl n ) .
-.It Fl x
-Multi-column output sorted across the page rather than down the page.
-.El
-.Pp
-It is not an error to specify more than one of
-the following mutually exclusive options:
-.Fl 1 ,
-.Fl C ,
-.Fl g ,
-.Fl l ,
-.Fl m ,
-.Fl n ,
-and
-.Fl x ;
-and
-.Fl c ,
-.Fl f ,
-.Fl S ,
-.Fl t ,
-and
-.Fl u .
-Where more than one option is specified from the same
-mutually exclusive group,
-the last option given overrides the others,
-except that
-.Fl l
-always overrides
-.Fl g ;
-and
-.Fl f
-always overrides
-.Fl c ,
-.Fl S ,
-.Fl t ,
-and
-.Fl u .
-.Ss The Long Format
-If the
-.Fl g ,
-.Fl l ,
-or
-.Fl n
-options are given, the following information
-is displayed for each file:
-mode,
-number of links,
-owner (though not for
-.Fl g ) ,
-group,
-size in bytes,
-time of last modification
-.Pq Dq mmm dd HH:MM ,
-and the pathname.
-In addition, for each directory whose contents are displayed, the first
-line displayed is the total number of blocks used by the files in the
-directory.
-Blocks are 512 bytes unless overridden by the
-.Fl k
-option or
-.Ev BLOCKSIZE
-environment variable.
-.Pp
-If the owner or group name is not a known user or group name, respectively,
-or the
-.Fl n
-option is given, the numeric ID is displayed.
-.Pp
-If the file is a character special or block special file,
-the major and minor device numbers for the file are displayed
-in the size field.
-.Pp
-If the
-.Fl T
-option is given, the time of last modification is displayed using the
-format
-.Dq mmm dd HH:MM:SS ccyy .
-.Pp
-If the file is a symbolic link, the pathname of the
-linked-to file is preceded by
-.Dq \-\*(Gt .
-.Pp
-The file mode printed under the
-.Fl g ,
-.Fl l ,
-or
-.Fl n
-options consists of the entry type, owner permissions, group permissions,
-and other permissions.
-The entry type character describes the type of file, as follows:
-.Pp
-.Bl -tag -width 4n -offset indent -compact
-.It Sy \-
-regular file
-.It Sy b
-block special file
-.It Sy c
-character special file
-.It Sy d
-directory
-.It Sy l
-symbolic link
-.It Sy p
-FIFO
-.It Sy s
-socket link
-.El
-.Pp
-The next three fields
-are three characters each:
-owner permissions,
-group permissions, and
-other permissions.
-Each field has three character positions:
-.Pp
-.Bl -enum -offset indent -compact
-.It
-If
-.Sy r ,
-the file is readable; if
-.Sy \- ,
-it is not readable.
-.It
-If
-.Sy w ,
-the file is writable; if
-.Sy \- ,
-it is not writable.
-.It
-The first of the following that applies:
-.Bl -tag -width 4n -offset indent
-.It Sy S
-If in the owner permissions, the file is not executable and
-set-user-ID mode is set.
-If in the group permissions, the file is not executable
-and set-group-ID mode is set.
-.It Sy s
-If in the owner permissions, the file is executable
-and set-user-ID mode is set.
-If in the group permissions, the file is executable
-and setgroup-ID mode is set.
-.It Sy x
-The file is executable or the directory is
-searchable.
-.It Sy \-
-The file is neither readable, writable, executable,
-nor set-user-ID, nor set-group-ID, nor sticky (see below).
-.El
-.Pp
-These next two apply only to the third character in the last group
-(other permissions):
-.Bl -tag -width 4n -offset indent
-.It Sy T
-The sticky bit is set
-(mode
-.Li 1000 ) ,
-but neither executable nor searchable (see
-.Xr chmod 1
-or
-.Xr sticky 8 ) .
-.It Sy t
-The sticky bit is set (mode
-.Li 1000 ) ,
-and is searchable or executable
-(see
-.Xr chmod 1
-or
-.Xr sticky 8 ) .
-.El
-.El
-.Pp
-In addition, if the
-.Fl o
-option is specified, the file flags (see
-.Xr chflags 1 )
-are displayed as comma-separated strings in front of the file size,
-abbreviated as follows:
-.Pp
-.Bl -tag -width 8n -offset indent -compact
-.It \&-
-no flags
-.It arch
-archived
-.It nodump
-do not dump
-.It sappnd
-system append-only
-.It schg
-system immutable
-.It uappnd
-user append-only
-.It uchg
-user immutable
-.El
-.Sh ENVIRONMENT
-.Bl -tag -width BLOCKSIZE
-.It Ev BLOCKSIZE
-If the environment variable
-.Ev BLOCKSIZE
-is set, and the
-.Fl k
-option is not specified, the block counts
-(see
-.Fl s )
-will be displayed in units of that size block.
-.It COLUMNS
-If this variable contains a string representing a
-decimal integer, it is used as the
-column position width for displaying
-multiple-text-column output.
-.It Ev TZ
-The time zone to use when displaying dates.
-See
-.Xr environ 7
-for more information.
-.El
-.Sh EXIT STATUS
-.Ex -std ls
-.Sh EXAMPLES
-List the contents of the current working directory in long format:
-.Pp
-.Dl $ ls -l
-.Pp
-In addition to listing the contents of the current working directory in
-long format, show inode numbers, file flags (see
-.Xr chflags 1 ) ,
-and suffix each filename with a symbol representing its file type:
-.Pp
-.Dl $ ls -lioF
-.Pp
-List the files in
-.Pa /var/log ,
-sorting the output such that the mostly recently modified entries are
-printed first:
-.Pp
-.Dl $ ls -lt /var/log
-.Sh SEE ALSO
-.Xr chflags 1 ,
-.Xr chmod 1 ,
-.Xr symlink 7 ,
-.Xr sticky 8
-.Sh STANDARDS
-The
-.Nm
-utility is compliant with the
-.St -p1003.1-2008
-specification.
-.Pp
-The flags
-.Op Fl hT
-are extensions to that specification.
-.Pp
-Historically, the
-.Fl g
-flag was used to specify that the group field be included in long listings.
-The group field is now automatically included in the long listing for
-files and the meaning of the
-.Fl g
-flag has been changed in order to be compatible with the
-.St -p1003.1-2008
-specification.
-.Pp
-Behaviour for the
-.Fl f
-and
-.Fl o
-flags differs between this implementation and
-.St -p1003.1-2008 .
-.Sh HISTORY
-An
-.Nm
-utility appeared in
-.At v3 .
Index: ls/ls.c
===================================================================
RCS file: ls/ls.c
diff -N ls/ls.c
--- ls/ls.c	30 May 2013 16:34:32 -0000	1.38
+++ /dev/null	1 Jan 1970 00:00:00 -0000
@@ -1,598 +0,0 @@
-/*	$OpenBSD: ls.c,v 1.38 2013/05/30 16:34:32 guenther Exp $	*/
-/*	$NetBSD: ls.c,v 1.18 1996/07/09 09:16:29 mycroft 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/types.h>
-#include <sys/stat.h>
-#include <sys/ioctl.h>
-
-#include <dirent.h>
-#include <err.h>
-#include <errno.h>
-#include <fts.h>
-#include <grp.h>
-#include <pwd.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <util.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	2
-
-long blocksize;			/* block size units */
-int termwidth = 80;		/* default terminal width */
-int sortkey = BY_NAME;
-
-/* 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 format without owner */
-int f_humanval;			/* show human-readable file sizes */
-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 expand uid to symbolic name */
-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 rval;
-
-int
-ls_main(int argc, char *argv[])
-{
-	static char dot[] = ".", *dotav[] = { dot, NULL };
-	struct winsize win;
-	int ch, fts_options, notused;
-	int kflag = 0;
-	char *p;
-
-	/* 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;
-		/* retrieve environment variable, in case of explicit -C */
-		if ((p = getenv("COLUMNS")) != NULL)
-			termwidth = atoi(p);
-	}
-
-	/* Root is -A automatically. */
-	if (!getuid())
-		f_listdot = 1;
-
-	fts_options = FTS_PHYSICAL;
-	while ((ch = getopt(argc, argv, "1ACFHLRSTacdfghiklmnopqrstux")) != -1) {
-		switch (ch) {
-		/*
-		 * The -1, -C and -l, -m, -n and -x options all override each
-		 * other so shell aliasing works right.
-		 */
-		case '1':
-			f_singlecol = 1;
-			f_column = f_columnacross = f_longform = 0;
-			f_numericonly = f_stream = 0;
-			break;
-		case 'C':
-			f_column = 1;
-			f_columnacross = f_longform = f_numericonly = 0;
-			f_singlecol = f_stream = 0;
-			break;
-		case 'g':
-			f_longform = 1;
-			if (f_grouponly != -1)
-				f_grouponly = 1;
-			f_column = f_columnacross = f_singlecol = f_stream = 0;
-			break;
-		case 'l':
-			f_longform = 1;
-			f_grouponly = -1;	/* -l always overrides -g */
-			f_column = f_columnacross = f_singlecol = f_stream = 0;
-			break;
-		case 'm':
-			f_stream = 1;
-			f_column = f_columnacross = f_longform = 0;
-			f_numericonly = f_singlecol = 0;
-			break;
-		case 'x':
-			f_columnacross = 1;
-			f_column = f_longform = f_numericonly = 0;
-			f_singlecol = f_stream = 0;
-			break;
-		case 'n':
-			f_longform = 1;
-			f_numericonly = 1;
-			f_column = f_columnacross = 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 'H':
-			fts_options |= FTS_COMFOLLOW;
-			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 -d option turns off the -R option. */
-		case 'd':
-			f_listdir = 1;
-			f_recursive = 0;
-			break;
-		case 'f':
-			f_nosort = 1;
-			break;
-		case 'h':
-			f_humanval = 1;
-			break;
-		case 'i':
-			f_inode = 1;
-			break;
-		case 'k':
-			blocksize = 1024;
-			kflag = 1;
-			break;
-		case 'o':
-			f_flags = 1;
-			break;
-		case 'p':
-			f_typedir = 1;
-			break;
-		case 'q':
-			f_nonprint = 1;
-			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;
-		default:
-			usage();
-		}
-	}
-	argc -= optind;
-	argv += optind;
-
-	/*
-	 * If both -g and -l options, let -l take precedence.
-	 * This preserves compatibility with the historic BSD ls -lg.
-	 */
-	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_longform && !f_inode && !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 -l or -s, figure out block size. */
-	if (f_longform || f_size) {
-		if (!kflag)
-			(void)getbsize(&notused, &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;
-		}
-	} else {
-		switch (sortkey) {
-		case BY_NAME:
-			sortfcn = namecmp;
-			break;
-		case BY_SIZE:
-			sortfcn = sizecmp;
-			break;
-		case BY_TIME:
-			if (f_accesstime)
-				sortfcn = acccmp;
-			else if (f_statustime)
-				sortfcn = statcmp;
-			else /* Use modification time. */
-				sortfcn = modcmp;
-			break;
-		}
-	}
-
-	/* Select a print function. */
-	if (f_singlecol)
-		printfcn = printscol;
-	else if (f_columnacross)
-		printfcn = printacol;
-	else if (f_longform)
-		printfcn = printlong;
-	else if (f_stream)
-		printfcn = printstream;
-	else
-		printfcn = printcol;
-
-	if (argc)
-		traverse(argc, argv, fts_options);
-	else
-		traverse(1, dotav, fts_options);
-	return (rval);
-}
-
-static int output;			/* If anything output. */
-
-/*
- * Traverse() walks the logical directory structure specified by the argv list
- * in the order specified by the mastercmp() comparison function.  During the
- * traversal it passes linked lists of structures to display() which represent
- * a superset (may be exact set) of the files to be displayed.
- */
-static void
-traverse(int argc, char *argv[], int options)
-{
-	FTS *ftsp;
-	FTSENT *p, *chp;
-	int ch_options, saved_errno;
-
-	if ((ftsp =
-	    fts_open(argv, options, f_nosort ? NULL : mastercmp)) == NULL)
-		err(1, NULL);
-
-	display(NULL, fts_children(ftsp, 0));
-	if (f_listdir)
-		return;
-
-	/*
-	 * If not recursing down this tree and don't need stat info, just get
-	 * the names.
-	 */
-	ch_options = !f_recursive && options & FTS_NOSTAT ? FTS_NAMEONLY : 0;
-
-	while ((p = fts_read(ftsp)) != NULL)
-		switch (p->fts_info) {
-		case FTS_D:
-			if (p->fts_name[0] == '.' &&
-			    p->fts_level != FTS_ROOTLEVEL && !f_listdot)
-				break;
-
-			/*
-			 * If already output something, put out a newline as
-			 * a separator.  If multiple arguments, precede each
-			 * directory with its name.
-			 */
-			if (output)
-				(void)printf("\n%s:\n", p->fts_path);
-			else if (argc > 1) {
-				(void)printf("%s:\n", p->fts_path);
-				output = 1;
-			}
-
-			chp = fts_children(ftsp, ch_options);
-			saved_errno = errno;
-			display(p, chp);
-
-			/*
-			 * On fts_children() returning error do recurse to see
-			 * the error.
-			 */
-			if (!f_recursive && !(chp == NULL && saved_errno != 0))
-				(void)fts_set(ftsp, p, FTS_SKIP);
-			break;
-		case FTS_DC:
-			warnx("%s: directory causes a cycle", p->fts_name);
-			break;
-		case FTS_DNR:
-		case FTS_ERR:
-			warnx("%s: %s", p->fts_name[0] == '\0' ? p->fts_path :
-			    p->fts_name, strerror(p->fts_errno));
-			rval = 1;
-			break;
-		}
-	if (errno)
-		err(1, "fts_read");
-}
-
-/*
- * Display() takes a linked list of FTSENT structures and passes the list
- * along with any other necessary information to the print function.  P
- * points to the parent directory of the display list.
- */
-static void
-display(FTSENT *p, FTSENT *list)
-{
-	struct stat *sp;
-	DISPLAY d;
-	FTSENT *cur;
-	NAMES *np;
-	off_t maxsize;
-	u_long maxlen, maxnlink;
-	unsigned long long btotal, maxblock;
-	ino_t maxinode;
-	int bcfile, flen, glen, ulen, maxflags, maxgroup, maxuser;
-	int entries, needstats;
-	char *user, *group, buf[21];	/* 64 bits == 20 digits */
-	char nuser[12], ngroup[12];
-	char *flags = NULL;
-
-	/*
-	 * If list is NULL there are two possibilities: that the parent
-	 * directory p has no children, or that fts_children() returned an
-	 * error.  We ignore the error case since it will be replicated
-	 * on the next call to fts_read() on the post-order visit to the
-	 * directory p, and will be signalled in traverse().
-	 */
-	if (list == NULL)
-		return;
-
-	needstats = f_inode || f_longform || f_size;
-	flen = 0;
-	btotal = maxblock = maxinode = maxlen = maxnlink = 0;
-	bcfile = 0;
-	maxuser = maxgroup = maxflags = 0;
-	maxsize = 0;
-	for (cur = list, entries = 0; cur != NULL; cur = cur->fts_link) {
-		if (cur->fts_info == FTS_ERR || cur->fts_info == FTS_NS) {
-			warnx("%s: %s",
-			    cur->fts_name, strerror(cur->fts_errno));
-			cur->fts_number = NO_PRINT;
-			rval = 1;
-			continue;
-		}
-
-		/*
-		 * P is NULL if list is the argv list, to which different rules
-		 * apply.
-		 */
-		if (p == NULL) {
-			/* Directories will be displayed later. */
-			if (cur->fts_info == FTS_D && !f_listdir) {
-				cur->fts_number = NO_PRINT;
-				continue;
-			}
-		} else {
-			/* Only display dot file if -a/-A set. */
-			if (cur->fts_name[0] == '.' && !f_listdot) {
-				cur->fts_number = NO_PRINT;
-				continue;
-			}
-		}
-		if (cur->fts_namelen > maxlen)
-			maxlen = cur->fts_namelen;
-		if (needstats) {
-			sp = cur->fts_statp;
-			if (sp->st_blocks > maxblock)
-				maxblock = sp->st_blocks;
-			if (sp->st_ino > maxinode)
-				maxinode = sp->st_ino;
-			if (sp->st_nlink > maxnlink)
-				maxnlink = sp->st_nlink;
-			if (sp->st_size > maxsize)
-				maxsize = sp->st_size;
-
-			btotal += sp->st_blocks;
-			if (f_longform) {
-				if (f_numericonly) {
-					snprintf(nuser, 12, "%u", sp->st_uid);
-					snprintf(ngroup, 12, "%u", sp->st_gid);
-					user = nuser;
-					group = ngroup;
-				} else {
-					user = user_from_uid(sp->st_uid, 0);
-					group = group_from_gid(sp->st_gid, 0);
-				}
-				if ((ulen = strlen(user)) > maxuser)
-					maxuser = ulen;
-				if ((glen = strlen(group)) > maxgroup)
-					maxgroup = glen;
-				if (f_flags) {
-					flags = fflagstostr(sp->st_flags);
-					if (*flags == '\0')
-						flags = "-";
-					if ((flen = strlen(flags)) > maxflags)
-						maxflags = flen;
-				} else
-					flen = 0;
-
-				if ((np = malloc(sizeof(NAMES) +
-				    ulen + 1 + glen + 1 + flen + 1)) == NULL)
-					err(1, NULL);
-
-				np->user = &np->data[0];
-				(void)strlcpy(np->user, user, ulen + 1);
-				np->group = &np->data[ulen + 1];
-				(void)strlcpy(np->group, group, glen + 1);
-
-				if (S_ISCHR(sp->st_mode) ||
-				    S_ISBLK(sp->st_mode))
-					bcfile = 1;
-
-				if (f_flags) {
-					np->flags = &np->data[ulen + 1 + glen + 1];
-				  	(void)strlcpy(np->flags, flags, flen + 1);
-					if (*flags != '-')
-						free(flags);
-				}
-				cur->fts_pointer = np;
-			}
-		}
-		++entries;
-	}
-
-	if (!entries)
-		return;
-
-	d.list = list;
-	d.entries = entries;
-	d.maxlen = maxlen;
-	if (needstats) {
-		d.bcfile = bcfile;
-		d.btotal = btotal;
-		(void)snprintf(buf, sizeof(buf), "%llu", maxblock);
-		d.s_block = strlen(buf);
-		d.s_flags = maxflags;
-		d.s_group = maxgroup;
-		(void)snprintf(buf, sizeof(buf), "%llu",
-		    (unsigned long long)maxinode);
-		d.s_inode = strlen(buf);
-		(void)snprintf(buf, sizeof(buf), "%lu", maxnlink);
-		d.s_nlink = strlen(buf);
-		if (!f_humanval) {
-			(void)snprintf(buf, sizeof(buf), "%lld",
-				(long long) maxsize);
-			d.s_size = strlen(buf);
-		} else
-			d.s_size = FMT_SCALED_STRSIZE-2; /* no - or '\0' */
-		d.s_user = maxuser;
-	}
-
-	printfcn(&d);
-	output = 1;
-
-	if (f_longform)
-		for (cur = list; cur != NULL; cur = cur->fts_link)
-			free(cur->fts_pointer);
-}
-
-/*
- * Ordering for mastercmp:
- * If ordering the argv (fts_level = FTS_ROOTLEVEL) return non-directories
- * as larger than directories.  Within either group, use the sort function.
- * All other levels use the sort function.  Error entries remain unsorted.
- */
-static int
-mastercmp(const FTSENT **a, const FTSENT **b)
-{
-	int a_info, b_info;
-
-	a_info = (*a)->fts_info;
-	if (a_info == FTS_ERR)
-		return (0);
-	b_info = (*b)->fts_info;
-	if (b_info == FTS_ERR)
-		return (0);
-
-	if (a_info == FTS_NS || b_info == FTS_NS) {
-		if (b_info != FTS_NS)
-			return (1);
-		else if (a_info != FTS_NS)
-			return (-1);
-		else
-			return (namecmp(*a, *b));
-	}
-
-	if (a_info != b_info &&
-	    (*a)->fts_level == FTS_ROOTLEVEL && !f_listdir) {
-		if (a_info == FTS_D)
-			return (1);
-		if (b_info == FTS_D)
-			return (-1);
-	}
-	return (sortfcn(*a, *b));
-}
Index: ls/ls.h
===================================================================
RCS file: ls/ls.h
diff -N ls/ls.h
--- ls/ls.h	30 May 2013 16:34:32 -0000	1.9
+++ /dev/null	1 Jan 1970 00:00:00 -0000
@@ -1,77 +0,0 @@
-/*	$OpenBSD: ls.h,v 1.9 2013/05/30 16:34:32 guenther Exp $	*/
-/*	$NetBSD: ls.h,v 1.7 1995/03/21 09:06:33 cgd Exp $	*/
-
-/*
- * Copyright (c) 1989, 1993
- *	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.
- *
- *	@(#)ls.h	8.1 (Berkeley) 5/31/93
- */
-
-#define NO_PRINT	1
-
-extern long blocksize;		/* block size units */
-
-extern int f_accesstime;	/* use time of last access */
-extern int f_flags;		/* show flags associated with a file */
-extern int f_grouponly;		/* long listing format without owner */
-extern int f_humanval;		/* show human-readable file sizes */
-extern int f_inode;		/* print inode */
-extern int f_longform;		/* long listing format */
-extern int f_nonprint;		/* show unprintables as ? */
-extern int f_sectime;		/* print the real time for all files */
-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_typedir;		/* add type character for directories */
-
-typedef struct {
-	FTSENT *list;
-	unsigned long long btotal;
-	int bcfile;
-	int entries;
-	int maxlen;
-	int s_block;
-	int s_flags;
-	int s_group;
-	int s_inode;
-	int s_nlink;
-	int s_size;
-	int s_user;
-} DISPLAY;
-
-typedef struct {
-	char *user;
-	char *group;
-	char *flags;
-	char data[1];
-} NAMES;
-
-int	ls_main(int, char *[]);
Index: ls/main.c
===================================================================
RCS file: ls/main.c
diff -N ls/main.c
--- ls/main.c	4 Dec 2012 02:27:00 -0000	1.4
+++ /dev/null	1 Jan 1970 00:00:00 -0000
@@ -1,13 +0,0 @@
-/*	$OpenBSD: main.c,v 1.4 2012/12/04 02:27:00 deraadt Exp $	*/
-
-/*
- * Public domain - no warranty.
- */
-
-int ls_main(int argc, char **argv);
-
-int
-main(int argc, char *argv[])
-{
-	return ls_main(argc, argv);
-}
Index: ls/print.c
===================================================================
RCS file: ls/print.c
diff -N ls/print.c
--- ls/print.c	30 May 2013 16:34:32 -0000	1.30
+++ /dev/null	1 Jan 1970 00:00:00 -0000
@@ -1,380 +0,0 @@
-/*	$OpenBSD: print.c,v 1.30 2013/05/30 16:34:32 guenther Exp $	*/
-/*	$NetBSD: print.c,v 1.15 1996/12/11 03:25:39 thorpej 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/param.h>
-#include <sys/stat.h>
-
-#include <err.h>
-#include <errno.h>
-#include <fts.h>
-#include <grp.h>
-#include <pwd.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <time.h>
-#include <tzfile.h>
-#include <unistd.h>
-#include <util.h>
-
-#include "ls.h"
-#include "extern.h"
-
-static int	printaname(FTSENT *, u_long, u_long);
-static void	printlink(FTSENT *);
-static void	printsize(size_t, off_t);
-static void	printtime(time_t);
-static int	printtype(u_int);
-static int	compute_columns(DISPLAY *, int *);
-
-#define	IS_NOPRINT(p)	((p)->fts_number == NO_PRINT)
-
-void
-printscol(DISPLAY *dp)
-{
-	FTSENT *p;
-
-	for (p = dp->list; p; p = p->fts_link) {
-		if (IS_NOPRINT(p))
-			continue;
-		(void)printaname(p, dp->s_inode, dp->s_block);
-		(void)putchar('\n');
-	}
-}
-
-void
-printlong(DISPLAY *dp)
-{
-	struct stat *sp;
-	FTSENT *p;
-	NAMES *np;
-	char buf[20];
-
-	if (dp->list->fts_level != FTS_ROOTLEVEL && (f_longform || f_size))
-		(void)printf("total %llu\n", howmany(dp->btotal, blocksize));
-
-	for (p = dp->list; p; p = p->fts_link) {
-		if (IS_NOPRINT(p))
-			continue;
-		sp = p->fts_statp;
-		if (f_inode)
-			(void)printf("%*llu ", dp->s_inode,
-			    (unsigned long long)sp->st_ino);
-		if (f_size)
-			(void)printf("%*qd ",
-			    dp->s_block, howmany(sp->st_blocks, blocksize));
-		(void)strmode(sp->st_mode, buf);
-		np = p->fts_pointer;
-		(void)printf("%s %*u ", buf, dp->s_nlink, sp->st_nlink);
-		if (!f_grouponly)
-			(void)printf("%-*s  ", dp->s_user, np->user);
-		(void)printf("%-*s  ", dp->s_group, np->group);
-		if (f_flags)
-			(void)printf("%-*s ", dp->s_flags, np->flags);
-		if (S_ISCHR(sp->st_mode) || S_ISBLK(sp->st_mode))
-			(void)printf("%3d, %3d ",
-			    major(sp->st_rdev), minor(sp->st_rdev));
-		else if (dp->bcfile)
-			(void)printf("%*s%*qd ",
-			    8 - dp->s_size, "", dp->s_size, sp->st_size);
-		else
-			printsize(dp->s_size, sp->st_size);
-		if (f_accesstime)
-			printtime(sp->st_atime);
-		else if (f_statustime)
-			printtime(sp->st_ctime);
-		else
-			printtime(sp->st_mtime);
-		(void)putname(p->fts_name);
-		if (f_type || (f_typedir && S_ISDIR(sp->st_mode)))
-			(void)printtype(sp->st_mode);
-		if (S_ISLNK(sp->st_mode))
-			printlink(p);
-		(void)putchar('\n');
-	}
-}
-
-static int
-compute_columns(DISPLAY *dp, int *pnum)
-{
-	int colwidth;
-	extern int termwidth;
-	int mywidth;
-
-	colwidth = dp->maxlen;
-	if (f_inode)
-		colwidth += dp->s_inode + 1;
-	if (f_size)
-		colwidth += dp->s_block + 1;
-	if (f_type || f_typedir)
-		colwidth += 1;
-
-	colwidth += 1;
-	mywidth = termwidth + 1;	/* no extra space for last column */
-
-	if (mywidth < 2 * colwidth) {
-		printscol(dp);
-		return (0);
-	}
-
-	*pnum = mywidth / colwidth;
-	return (mywidth / *pnum);		/* spread out if possible */
-}
-
-void
-printcol(DISPLAY *dp)
-{
-	static FTSENT **array;
-	static int lastentries = -1;
-	FTSENT *p;
-	int base, chcnt, col, colwidth, num;
-	int numcols, numrows, row;
-
-	if ((colwidth = compute_columns(dp, &numcols)) == 0)
-		return;
-	/*
-	 * Have to do random access in the linked list -- build a table
-	 * of pointers.
-	 */
-	if (dp->entries > lastentries) {
-		FTSENT **a;
-
-		if ((a = realloc(array, dp->entries * sizeof(FTSENT *))) ==
-		    NULL) {
-			free(array);
-			array = NULL;
-			dp->entries = 0;
-			lastentries = -1;
-			warn(NULL);
-			printscol(dp);
-			return;
-		}
-		lastentries = dp->entries;
-		array = a;
-	}
-	for (p = dp->list, num = 0; p; p = p->fts_link)
-		if (p->fts_number != NO_PRINT)
-			array[num++] = p;
-
-	numrows = num / numcols;
-	if (num % numcols)
-		++numrows;
-
-	if (dp->list->fts_level != FTS_ROOTLEVEL && (f_longform || f_size))
-		(void)printf("total %llu\n", howmany(dp->btotal, blocksize));
-	for (row = 0; row < numrows; ++row) {
-		for (base = row, col = 0;;) {
-			chcnt = printaname(array[base], dp->s_inode, dp->s_block);
-			if ((base += numrows) >= num)
-				break;
-			if (++col == numcols)
-				break;
-			while (chcnt++ < colwidth)
-				putchar(' ');
-		}
-		(void)putchar('\n');
-	}
-}
-
-/*
- * print [inode] [size] name
- * return # of characters printed, no trailing characters.
- */
-static int
-printaname(FTSENT *p, u_long inodefield, u_long sizefield)
-{
-	struct stat *sp;
-	int chcnt;
-
-	sp = p->fts_statp;
-	chcnt = 0;
-	if (f_inode)
-		chcnt += printf("%*llu ", (int)inodefield,
-		    (unsigned long long)sp->st_ino);
-	if (f_size)
-		chcnt += printf("%*qd ",
-		    (int)sizefield, howmany(sp->st_blocks, blocksize));
-	chcnt += putname(p->fts_name);
-	if (f_type || (f_typedir && S_ISDIR(sp->st_mode)))
-		chcnt += printtype(sp->st_mode);
-	return (chcnt);
-}
-
-static void
-printtime(time_t ftime)
-{
-	int i;
-	char *longstring;
-	static time_t six_months_ago;
-	static int sma_set = 0;
-
-#define	SIXMONTHS	((DAYSPERNYEAR / 2) * SECSPERDAY)
-	if (! sma_set) {
-		six_months_ago = time(NULL) - SIXMONTHS;
-		sma_set = 1;
-	}
-	longstring = ctime(&ftime);
-	for (i = 4; i < 11; ++i)
-		(void)putchar(longstring[i]);
-
-	if (f_sectime)
-		for (i = 11; i < 24; i++)
-			(void)putchar(longstring[i]);
-	else if (ftime > six_months_ago)
-		for (i = 11; i < 16; ++i)
-			(void)putchar(longstring[i]);
-	else {
-		(void)putchar(' ');
-		for (i = 20; i < 24; ++i)
-			(void)putchar(longstring[i]);
-	}
-	(void)putchar(' ');
-}
-
-void
-printacol(DISPLAY *dp)
-{
-	FTSENT *p;
-	int chcnt, col, colwidth;
-	int numcols;
-
-	if ( (colwidth = compute_columns(dp, &numcols)) == 0)
-		return;
-
-	if (dp->list->fts_level != FTS_ROOTLEVEL && (f_longform || f_size))
-		(void)printf("total %llu\n", howmany(dp->btotal, blocksize));
-	col = 0;
-	for (p = dp->list; p; p = p->fts_link) {
-		if (IS_NOPRINT(p))
-			continue;
-		if (col >= numcols) {
-			col = 0;
-			(void)putchar('\n');
-		}
-		chcnt = printaname(p, dp->s_inode, dp->s_block);
-		col++;
-		if (col < numcols)
-			while (chcnt++ < colwidth)
-				(void)putchar(' ');
-	}
-	(void)putchar('\n');
-}
-
-void
-printstream(DISPLAY *dp)
-{
-	extern int termwidth;
-	FTSENT *p;
-	int col;
-	int extwidth;
-
-	extwidth = 0;
-	if (f_inode)
-		extwidth += dp->s_inode + 1;
-	if (f_size)
-		extwidth += dp->s_block + 1;
-	if (f_type)
-		extwidth += 1;
-
-	for (col = 0, p = dp->list; p != NULL; p = p->fts_link) {
-		if (IS_NOPRINT(p))
-			continue;
-		if (col > 0) {
-			(void)putchar(','), col++;
-			if (col + 1 + extwidth + p->fts_namelen >= termwidth)
-				(void)putchar('\n'), col = 0;
-			else
-				(void)putchar(' '), col++;
-		}
-		col += printaname(p, dp->s_inode, dp->s_block);
-	}
-	(void)putchar('\n');
-}
-
-static int
-printtype(u_int mode)
-{
-	switch (mode & S_IFMT) {
-	case S_IFDIR:
-		(void)putchar('/');
-		return (1);
-	case S_IFIFO:
-		(void)putchar('|');
-		return (1);
-	case S_IFLNK:
-		(void)putchar('@');
-		return (1);
-	case S_IFSOCK:
-		(void)putchar('=');
-		return (1);
-	}
-	if (mode & (S_IXUSR | S_IXGRP | S_IXOTH)) {
-		(void)putchar('*');
-		return (1);
-	}
-	return (0);
-}
-
-static void
-printlink(FTSENT *p)
-{
-	int lnklen;
-	char name[MAXPATHLEN], path[MAXPATHLEN];
-
-	if (p->fts_level == FTS_ROOTLEVEL)
-		(void)snprintf(name, sizeof(name), "%s", p->fts_name);
-	else
-		(void)snprintf(name, sizeof(name),
-		    "%s/%s", p->fts_parent->fts_accpath, p->fts_name);
-	if ((lnklen = readlink(name, path, sizeof(path) - 1)) == -1) {
-		(void)fprintf(stderr, "\nls: %s: %s\n", name, strerror(errno));
-		return;
-	}
-	path[lnklen] = '\0';
-	(void)printf(" -> ");
-	(void)putname(path);
-}
-
-static void
-printsize(size_t width, off_t bytes)
-{
-	char ret[FMT_SCALED_STRSIZE];
-
-	if ((f_humanval) && (fmt_scaled(bytes, ret) != -1)) {
-		(void)printf("%*s ", (u_int)width, ret);
-		return;
-	}
-	(void)printf("%*qd ", (u_int)width, bytes);
-}
Index: ls/util.c
===================================================================
RCS file: ls/util.c
diff -N ls/util.c
--- ls/util.c	21 Nov 2013 15:54:45 -0000	1.16
+++ /dev/null	1 Jan 1970 00:00:00 -0000
@@ -1,65 +0,0 @@
-/*	$OpenBSD: util.c,v 1.16 2013/11/21 15:54:45 deraadt Exp $	*/
-/*	$NetBSD: util.c,v 1.12 1995/09/07 06:43:02 jtc 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/types.h>
-#include <sys/stat.h>
-
-#include <ctype.h>
-#include <fts.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "ls.h"
-#include "extern.h"
-
-int
-putname(char *name)
-{
-	int len;
-
-	for (len = 0; *name; len++, name++)
-		putchar((!isprint((unsigned char)*name) && f_nonprint) ? '?' : *name);
-	return len;
-}
-
-void
-usage(void)
-{
-	(void)fprintf(stderr,
-	    "usage: %s [-1AaCcdFfgHhikLlmnopqRrSsTtux] [file ...]\n",
-	    __progname);
-	exit(1);
-}

^ permalink raw reply	[flat|nested] 2+ messages in thread

* Re: [9front] Fwd: Re: Patch to remove "adult" content from spamd(8) man page
  2013-11-22 19:50 Fwd: Re: Patch to remove "adult" content from spamd(8) man page sl
@ 2013-12-01  1:44 ` Ethan Grammatikidis
  0 siblings, 0 replies; 2+ messages in thread
From: Ethan Grammatikidis @ 2013-12-01  1:44 UTC (permalink / raw)
  To: 9front

On Fri, Nov 22, 2013, at 07:50 PM, sl@9front.org wrote:
> 
> Email had 1 attachment:
> + Re: Patch to remove "adult" content from spamd(8) man page
>   57k (message/rfc822)

hahaha patch removes ls?


^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2013-12-01  1:44 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2013-11-22 19:50 Fwd: Re: Patch to remove "adult" content from spamd(8) man page sl
2013-12-01  1:44 ` [9front] " Ethan Grammatikidis

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).