*csh*) style=csh;;
*) style=sh;;
esac
-force= chosen= commands=
+force=nil chosen= commands=
while [ $# -gt 0 ]; do
case "$1" in
- -h | --help) echo "$usage"; exit 0;;
- -c | --cshell | --tcsh) style=csh chosen=t;;
- -b | --bourne | --bash | --zsh) style=sh chosen=t;;
- -f | --force) force=t;;
- --) shift; break;;
- -*) echo >&2 "$usage"; exit 1;;
- *) break;;
+ -h | --help) echo "$usage"; exit 0 ;;
+ -c | --cshell | --tcsh) style=csh chosen=t ;;
+ -b | --bourne | --bash | --zsh) style=sh chosen=t ;;
+ -f | --force) force=t ;;
+ --) shift; break ;;
+ -*) echo >&2 "$usage"; exit 1 ;;
+ *) break ;;
esac
shift
done
;;
esac
-### Should I start a new agent?
-case "$force,$SSH_AUTH_SOCK" in
- t,* | ,)
- start=t
- ;;
- *)
- start=
- set +e; ssh-add -l >/dev/null 2>&1; rc=$?; set -e
- [ $rc -ge 2 ] && start=t
+## Some useful variables.
+hostname=${HOST-$(hostname)}
+user=${USER-${LOGNAME-$(id -un)}} uid=${UID-$(id -u)}
+dir=$TMPDIR/.ssh-agent.$hostname.$user
+socket=$dir/sock; pid=$dir/pid
+export SSH_AUTH_SOCK
+
+## Should I start a new agent?
+foundp=nil
+case $force in
+ nil)
+ case ${SSH_AUTH_SOCK+t} in
+ t)
+ set +e; ssh-add -l >/dev/null 2>&1; rc=$?; set -e
+ if [ $rc -lt 2 ]; then foundp=t; fi
+ ;;
+ esac
+ case $foundp in
+ t) ;;
+ *)
+ for i in \
+ "$HOME/.cache/keyring-"*"/ssh" \
+ "/run/user/$uid/keyring/ssh" \
+ "$socket"
+ do
+ SSH_AUTH_SOCK=$i
+ set +e; ssh-add -l >/dev/null 2>&1; rc=$?; set -e
+ if [ $rc -lt 2 ]; then foundp=t; break; fi
+ done
+ ;;
+ esac
;;
esac
### If so, do that
-if [ "$start" ]; then
- hostname=${HOST-$(hostname)}
- user=${USER-${LOGNAME-$(whoami)}}
- dir=$TMPDIR/.ssh-agent.$hostname.$user; socket=$dir/sock; pid=$dir/pid
- mkdir -p -m700 "$dir"
- SSH_AUTH_SOCK=$socket; export SSH_AUTH_SOCK
- set +e; ssh-add -l >/dev/null 2>&1; rc=$?; set -e
- if [ $rc -ge 2 ]; then
- if [ -f "$pid" ]; then
- kill $(cat "$pid") >/dev/null 2>&1 || :
+case $foundp in
+ nil)
+ mkdir -p -m700 "$dir"
+ SSH_AUTH_SOCK=$socket
+ p=$PATH
+ runes=
+ while :; do
+ case $p in *:*) d=${p%%:*} p=${p#*:} ;; *) d=$p p= ;; esac
+ if [ -x "${d+$d/}setsid" ]; then runes="$runes setsid"; break; fi
+ case $p in "") break ;; esac
+ done
+ set +e; ssh-add -l >/dev/null 2>&1; rc=$?; set -e
+ if [ $rc -ge 2 ]; then
+ if [ -f "$pid" ]; then
+ kill $(cat "$pid") >/dev/null 2>&1 || :
+ fi
+ rm -f "$socket" "$pid"
+ (cd /; exec $runes ssh-agent -d -a "$socket" </dev/null >/dev/null 2>&1)&
+ echo $! >"$pid"
+ SSH_AUTH_SOCK=$socket
fi
- rm -f "$socket" "$pid"
- (cd /; exec ssh-agent -d -a "$socket" >/dev/null 2>&1)&
- echo $! >"$pid"
- SSH_AUTH_SOCK=$socket; export SSH_AUTH_SOCK
- fi
-fi
+ ;;
+esac
### Run a program, or export the details
case $style in
- sh)
- echo "SSH_AUTH_SOCK='$SSH_AUTH_SOCK'; export SSH_AUTH_SOCK"
- ;;
- csh)
- echo "setenv SSH_AUTH_SOCK '$SSH_AUTH_SOCK'"
- ;;
- commands)
- exec "$@"
- ;;
+ sh) echo "SSH_AUTH_SOCK='$SSH_AUTH_SOCK'; export SSH_AUTH_SOCK" ;;
+ csh) echo "setenv SSH_AUTH_SOCK '$SSH_AUTH_SOCK'" ;;
+ commands) exec "$@" ;;
esac