diff options
author | Wynn Wolf Arbor | 2020-01-21 21:22:49 +0100 |
---|---|---|
committer | Wynn Wolf Arbor | 2020-01-21 21:22:49 +0100 |
commit | 8dbe19222a8cb76a85afdcafd4be2ec3393570ad (patch) | |
tree | be21f3c14f50b3acd1edbd93255531780d8e78ba | |
parent | 956d6f907c8475438b40ee5d0a14d70430bee741 (diff) | |
download | bosun-8dbe19222a8cb76a85afdcafd4be2ec3393570ad.tar.gz |
Make list_active more robust
A couple of small changes to this function should make it more robust in
the long run:
1) We no longer filter the symlinks with find(1), instead combining
filtering and substituting in sed(1)
2) We use the absolute path (as given by readlink -f) such that we can
anchor the regular expression pattern to avoid unwanted substitution.
3) Instead of hard-coding paths we now use STOW_DIR (and STOW_DIR/.. for
the target directory)
4) To avoid unnecessary complexity, we no longer let the user override
STOW_DIR. This tool is supposed to be used with the canonical
/etc/portage/stow location
-rwxr-xr-x | bosun | 11 |
1 files changed, 6 insertions, 5 deletions
@@ -1,7 +1,6 @@ #!/bin/sh -# allow overriding STOW_DIR by the user -export STOW_DIR=${STOW_DIR:-/etc/portage/stow} +export STOW_DIR=/etc/portage/stow need_root() { if test "$(id -u)" -ne 0; then @@ -46,10 +45,12 @@ list() { } list_active() { + # Note: we de not escape any special characters in $STOW_DIR since it is + # assumed we are in full control of its contents. # XXX: -r for xargs is a GNU extension - find /etc/portage/ -lname "*stow/*" -print0 2>/dev/null \ - | xargs -r0 readlink \ - | sed 's:.*stow/\([^/]\+\)/.*:\1:' \ + find "$STOW_DIR/.." -type l -print0 2>/dev/null \ + | xargs -r0 readlink -f \ + | sed -n ":^$STOW_DIR: s:^$STOW_DIR/\([^/]\+\)/.*:\1:p" \ | sort -u } |