History log of /freebsd-10.1-release/usr.bin/uniq/uniq.c
Revision Date Author Comments
(<<< Hide modified files)
(Show modified files >>>)
# 272461 02-Oct-2014 gjb

Copy stable/10@r272459 to releng/10.1 as part of
the 10.1-RELEASE process.

Approved by: re (implicit)
Sponsored by: The FreeBSD Foundation

# 256281 10-Oct-2013 gjb

Copy head (r256279) to stable/10 as part of the 10.0-RELEASE cycle.

Approved by: re (implicit)
Sponsored by: The FreeBSD Foundation


# 255219 04-Sep-2013 pjd

Change the cap_rights_t type from uint64_t to a structure that we can extend
in the future in a backward compatible (API and ABI) way.

The cap_rights_t represents capability rights. We used to use one bit to
represent one right, but we are running out of spare bits. Currently the new
structure provides place for 114 rights (so 50 more than the previous
cap_rights_t), but it is possible to grow the structure to hold at least 285
rights, although we can make it even larger if 285 rights won't be enough.

The structure definition looks like this:

struct cap_rights {
uint64_t cr_rights[CAP_RIGHTS_VERSION + 2];
};

The initial CAP_RIGHTS_VERSION is 0.

The top two bits in the first element of the cr_rights[] array contain total
number of elements in the array - 2. This means if those two bits are equal to
0, we have 2 array elements.

The top two bits in all remaining array elements should be 0.
The next five bits in all array elements contain array index. Only one bit is
used and bit position in this five-bits range defines array index. This means
there can be at most five array elements in the future.

To define new right the CAPRIGHT() macro must be used. The macro takes two
arguments - an array index and a bit to set, eg.

#define CAP_PDKILL CAPRIGHT(1, 0x0000000000000800ULL)

We still support aliases that combine few rights, but the rights have to belong
to the same array element, eg:

#define CAP_LOOKUP CAPRIGHT(0, 0x0000000000000400ULL)
#define CAP_FCHMOD CAPRIGHT(0, 0x0000000000002000ULL)

#define CAP_FCHMODAT (CAP_FCHMOD | CAP_LOOKUP)

There is new API to manage the new cap_rights_t structure:

cap_rights_t *cap_rights_init(cap_rights_t *rights, ...);
void cap_rights_set(cap_rights_t *rights, ...);
void cap_rights_clear(cap_rights_t *rights, ...);
bool cap_rights_is_set(const cap_rights_t *rights, ...);

bool cap_rights_is_valid(const cap_rights_t *rights);
void cap_rights_merge(cap_rights_t *dst, const cap_rights_t *src);
void cap_rights_remove(cap_rights_t *dst, const cap_rights_t *src);
bool cap_rights_contains(const cap_rights_t *big, const cap_rights_t *little);

Capability rights to the cap_rights_init(), cap_rights_set(),
cap_rights_clear() and cap_rights_is_set() functions are provided by
separating them with commas, eg:

cap_rights_t rights;

cap_rights_init(&rights, CAP_READ, CAP_WRITE, CAP_FSTAT);

There is no need to terminate the list of rights, as those functions are
actually macros that take care of the termination, eg:

#define cap_rights_set(rights, ...) \
__cap_rights_set((rights), __VA_ARGS__, 0ULL)
void __cap_rights_set(cap_rights_t *rights, ...);

Thanks to using one bit as an array index we can assert in those functions that
there are no two rights belonging to different array elements provided
together. For example this is illegal and will be detected, because CAP_LOOKUP
belongs to element 0 and CAP_PDKILL to element 1:

cap_rights_init(&rights, CAP_LOOKUP | CAP_PDKILL);

Providing several rights that belongs to the same array's element this way is
correct, but is not advised. It should only be used for aliases definition.

This commit also breaks compatibility with some existing Capsicum system calls,
but I see no other way to do that. This should be fine as Capsicum is still
experimental and this change is not going to 9.x.

Sponsored by: The FreeBSD Foundation


# 253457 18-Jul-2013 pjd

Close uniq(1) in the capability mode sandbox and limit descriptors using
capability rights.


# 227193 06-Nov-2011 ed

Add missing static keywords to uniq(1)


# 216370 11-Dec-2010 joel

Remove the advertising clause from UCB copyrighted files in usr.bin. This
is in accordance with the information provided at
ftp://ftp.cs.berkeley.edu/pub/4bsd/README.Impt.License.Change

Also add $FreeBSD$ to a few files to keep svn happy.

Discussed with: imp, rwatson


# 204927 09-Mar-2010 ache

Add SIZE_MAX overflow check


# 204876 08-Mar-2010 ache

1) Reimplement (differently) unlimited line length restricted in prev.
commit.

2) Honor missing the very last \n (if absent) on output.


# 204811 06-Mar-2010 ache

Remove vestiges of old %-format which prevents build on amd64


# 204803 06-Mar-2010 ache

1) Rewrite input processing to not exit with error on the first EILSEQ found
in the input data but fallback to "binary equal" check instead.

POSIX says: "The input file shall be a text file", nothing more,
so the text file with illegal sequence is valid input.
BTW, GNU sort does not fails on EILSEQ too.

2) Speedup input processing a bit in complex cases like skipping fields,
chars or ignore case.

3) Enforce the implied LINE_MAX limit (from POSIX definition of "text file"
and POSIX uniq(1) description).


# 200633 17-Dec-2009 jh

Sync getline() with comm(1):

- Prevent overflowing of the buffer length variable in getline() by
limiting its maximum value.
- Exit if reallocf(3) fails in getline(). Failure was silently
considered as end-of-file.

Reviewed by: ghelmer
Approved by: trasz (mentor)


# 176119 08-Feb-2008 ghelmer

Fix truncation of lines at LINE_MAX characters by dynamically
extending line buffers.

PR: bin/76578


# 169639 16-May-2007 jmallett

Fix typo.


# 169638 16-May-2007 jmallett

o) Correct for missing whitespace.
o) We don't need to check if ifp == stdin to give the filename, since we already
know that ifn will be "stdin" if it is.


# 169636 16-May-2007 jmallett

Fix confusing misindentation of a closing-brace. (It goes with the switch, not
with the while.)


# 135214 14-Sep-2004 tjr

Remove a bogus check that caused empty lines not to be counted when the
-c option was given.

Noticed by: sf


# 131502 02-Jul-2004 tjr

Add support for multibyte characters.


# 102944 04-Sep-2002 dwmalone

ANSIify function definitions.
Add some constness to avoid some warnings.
Remove use register keyword.
Deal with missing/unneeded extern/prototypes.
Some minor type changes/casts to avoid warnings.

Reviewed by: md5


# 99433 05-Jul-2002 tjr

Use err instead of errx when malloc fails. "malloc" is not a helpful
error message.


# 98547 21-Jun-2002 tjr

Skip fields in the manner required by POSIX, and the way V7 did it.

MFC after: 1 week


# 98545 21-Jun-2002 tjr

Newline characters should not participate in line comparisons. Only apparent
when -s is used or the last line of the file is missing a newline.
Noticed by the textutils test suite.

MFC after: 1 week


# 97929 06-Jun-2002 ache

Back out rev 1.19 because

1) It breaks uniq for real life languages when "substitute" directive used in
the collating table.
2) It breaks uniq usage in tool chain with other localized utilities which
use collate.
3) To follow LC_COLLATE it is directly allowed for uniq
by POSIX P1003.1 Draft7 (7.3.2). It means that rev 1.19 gains no additional
POSIX conformance.


# 97906 06-Jun-2002 tjr

Compare lines with strcmp(), not strcoll(). We are interested only in
equality, not ordering.


# 97905 06-Jun-2002 tjr

Sync usage() with manual page synopsis.


# 97529 29-May-2002 tjr

Accept an input file name of "-" to mean standard input, as required by
P1003.2.


# 97528 29-May-2002 tjr

Fields should be separated by <blank>s, not <space>s according to P1003.2.


# 97527 29-May-2002 tjr

Don't bother trying to handle "-" arguments ourselves, getopt(3) already
does this for us.


# 95030 19-Apr-2002 ache

Use LC_ALL to pick collate

Noticed by: tjr


# 92922 21-Mar-2002 imp

remove __P


# 87303 03-Dec-2001 dwmalone

Warns cleanups. Add FreeBSD ID to Makefile.


# 54401 10-Dec-1999 ache

fix fatal typo


# 52616 29-Oct-1999 ache

toupper -> tolower to match changed behaviour of new grep case fold


# 52459 24-Oct-1999 ache

Cosmetique: use standard prototypes scheme
Back out prev. change: toupper is more compatible with sort -f


# 52457 24-Oct-1999 ache

toupper->tolower to match what strcasecmp does


# 52455 24-Oct-1999 ache

Use strcoll to provide the same results as sort and comm
Use LINE_MAX for max line size (as comm does)


# 50477 27-Aug-1999 peter

$Id$ -> $FreeBSD$


# 34323 08-Mar-1998 ache

Localize it


# 29207 07-Sep-1997 joerg

Teach comm(1) and uniq(1) about an option for case-insensitive work.

PR: 3042
Submitted by: graphix@iastate.edu (Kent Vander Velden)


# 28503 21-Aug-1997 charnier

Use err(3) instead of local redefinition.


# 24360 29-Mar-1997 imp

compare return value from getopt against -1 rather than EOF, per the final
posix standard on the topic.


# 23691 11-Mar-1997 peter

This commit was generated by cvs2svn to compensate for changes in r23690,
which included commits to RCS files with non-trunk default branches.


# 23690 11-Mar-1997 peter

Import some parts of CSRG 4.4BSD-Lite2 usr.bin sources to fix tree build.


# 1590 27-May-1994 rgrimes

BSD 4.4 Lite Usr.bin Sources