summaryrefslogtreecommitdiffstats
Commit message (Collapse)AuthorAgeFilesLines
...
* Handle ENOTDIR the same as ENOENTTavian Barnes2017-07-0911-3/+21
| | | | | | For a/b/c, ENOTDIR is returned instead of ENOENT if a or b are not directories. Handle this uniformly when detecting broken symlinks, readdir races, etc.
* bftw: Rename and refactor the internalsTavian Barnes2017-07-091-235/+257
|
* bftw: Fix ENAMETOOLONG handling when the root is closedTavian Barnes2017-07-084-12/+33
| | | | | The root has depth == 0, but we still need to include it in the components array.
* exec: Clear errno when a multi-exec doesn't failTavian Barnes2017-07-081-1/+6
| | | | | | | This fixes strange "Inappropriate ioctl for device" errors when using -exec ... + with output redirection. errno was set to ENOTTY by the isatty() call during startup for color auto-detection, and never cleared before eval_exec() wants to check if anything went wrong.
* bftw: Recover from ENAMETOOLONGTavian Barnes2017-07-083-23/+137
| | | | | | | | | | | | | | | | | | | | | | | | It is always possible to force a breadth-first traversal to encounter ENAMETOOLONG, regardless of the dircache eviction policy. As a concrete example, consider this directory structure: ./1/{NAME_MAX}/{NAME_MAX}/{NAME_MAX}/... (longer than {PATH_MAX}) ./2/{NAME_MAX}/{NAME_MAX}/{NAME_MAX}/... ./3/{NAME_MAX}/{NAME_MAX}/{NAME_MAX}/... ... (more than RLIMIT_NOFILE directories under .) Eventually, the next file to be processed will not have any parents in the cache, as the cache can only hold RLIMIT_NOFILE entries. Then the whole path must be traversed from ., which will exceed {PATH_MAX} bytes. Work around this by performing a component-by-component traversal manually when we see ENAMETOOLONG. This is required by POSIX: > The find utility shall be able to descend to arbitrary depths in a file > hierarchy and shall not fail due to path length limitations (unless a > path operand specified by the application exceeds {PATH_MAX} > requirements).
* Revert "bftw: Don't store the terminating '\0' in dircache_entry names."Tavian Barnes2017-07-081-1/+2
| | | | | | | This reverts commit 20860becb5a0e89ee2aaaddbb0ba1eb248552640. The terminating NUL will be useful for the upcoming per-component traversal to handle ENAMETOOLONG.
* Release 1.0.21.0.2Tavian Barnes2017-06-153-2/+13
|
* -perm: Handle permcopy (e.g. u=rw,g=u) correctlyTavian Barnes2017-06-153-5/+22
|
* tests: Fix test_printf_nul with non-GNU sortTavian Barnes2017-06-112-1/+7
| | | | | Other UNIX sort implementations seem to truncate at the nul bytes, so open-code it without the sort.
* printf: Fix embedded nul bytesTavian Barnes2017-06-105-11/+37
| | | | Fixes #26.
* parse: Make some error messages redTavian Barnes2017-06-031-2/+4
|
* Add Homebrew installation instructionsPeter Brunner2017-06-031-0/+2
|
* Release 1.0.11.0.1Tavian Barnes2017-05-173-2/+14
|
* parse: Set always_true for some actions that never return falseTavian Barnes2017-05-171-3/+25
|
* bftw: Remove unused parameter to dircache_entry_base()Tavian Barnes2017-05-171-5/+3
|
* Add colors to -D treeTavian Barnes2017-05-153-37/+51
|
* Optimize based on reachability due to -quitTavian Barnes2017-05-152-43/+85
|
* Don't make -quit disable the implicit -printTavian Barnes2017-05-113-3/+9
|
* Implement -D execTavian Barnes2017-05-094-13/+63
|
* main: Fix error checking of redirect()Tavian Barnes2017-05-061-1/+3
|
* exec: Treat -1 from _SC_ARG_MAX as "unlimited"Tavian Barnes2017-04-301-1/+1
|
* mtab: Check __GLIBC__ instead of __linux__ for getmntent()Tavian Barnes2017-04-301-2/+2
|
* Pass AT_EACCESS to faccessat()Tavian Barnes2017-04-302-2/+2
| | | | | That's the form that actually answers the expected question ("can I open() this"), and the only form Hurd supports.
* Don't forget an access mode to openat() in -emptyTavian Barnes2017-04-301-1/+1
|
* Don't parse the mount table until it's neededTavian Barnes2017-04-293-12/+14
|
* mtab: Don't hardcode /etc/mtabTavian Barnes2017-04-291-1/+1
|
* Add Debian installation instructions.Chris Lamb2017-04-291-0/+2
|
* Release 1.01.0Tavian Barnes2017-04-2412-11/+42
|
* Implement -fstypeTavian Barnes2017-04-2310-7/+319
| | | | Fixes #6!
* Make -help output prettier and more completeTavian Barnes2017-04-162-50/+260
|
* tests.sh: Allow individual tests to be specified on the command lineTavian Barnes2017-04-161-10/+16
|
* Implement -XTavian Barnes2017-04-167-0/+51
|
* tests: Add tests for bfs extensions to -exec ... +Tavian Barnes2017-04-163-0/+22
|
* exec: Interpret ARG_MAX corretly.Tavian Barnes2017-04-152-34/+117
| | | | Thanks to https://www.in-ulm.de/~mascheck/various/argmax/
* exec: close() the working directory even if !ftwbufTavian Barnes2017-04-151-1/+1
|
* Implement -exec/-execdir ... +Tavian Barnes2017-04-1510-227/+618
|
* util.h: Don't use a forward reference to enum bftw_typeflagTavian Barnes2017-04-131-0/+1
| | | | Apparently that's not allowed in standard C.
* tests.sh: Use eval instead of declare -gTavian Barnes2017-04-081-1/+1
| | | | Turns out declare -g is from Bash 4 too.
* Move bftw_typeflag converters to util.cTavian Barnes2017-04-086-116/+112
|
* bftw: Only rebuild the part of the path that changesTavian Barnes2017-03-221-37/+50
| | | | | | | | | | | | | | Quadratic complexity is still possible for directory structures like root -- a -- a -- a -- a ... | +- b -- b -- b -- b ... But for most realistic directory structures, bfs should now spend less time building paths. (Of course if you print every path, overall complexity is quadratic anyway.)
* bftw: Fix quadratic reference counting complexityTavian Barnes2017-03-201-8/+15
| | | | | | | | | | | | | dircache_entry refcounts used to count every single descendant, resulting in n refcount updates to create/delete an entry at depth n, and thus O(n^2) complexity overall for deep directory structures. Fix it by only counting direct children instead. The cache eviction policy is changed to prefer shallower entries in all cases, attempting to save at least some of the benefit of the previous accounting scheme. Unfortunately, the average number of traversed components for openat() calls still went up by ~20%, but the performance in practice is roughly unchanged in my tests.
* Respect -nocolor for -fprint /dev/stdoutTavian Barnes2017-03-161-2/+16
|
* Color link targets for -lsTavian Barnes2017-03-166-26/+60
| | | | Fixes #18.
* Give struct expr a CFILE* instead of just a FILE*Tavian Barnes2017-03-165-58/+90
| | | | This unifies the behaviour of -print and -fprint /dev/stdout.
* Release 0.960.96Tavian Barnes2017-03-113-2/+20
|
* Implement -ls and -flsTavian Barnes2017-03-116-102/+291
|
* tests: Run everything in UTCTavian Barnes2017-03-112-4/+5
|
* Add a test for colored outputTavian Barnes2017-03-112-0/+15
|
* Make a printf()-style API for colored messagesTavian Barnes2017-03-118-322/+306
|
* Implement -printf %Ak, %Ck, and %TkTavian Barnes2017-03-113-90/+240
|