bin/start-ssh-agent: Fiddle the startup logic a bit.
[profile] / bin / start-ssh-agent
CommitLineData
285a1386
MW
1#! /bin/sh
2
3set -e
4usage="Usage: $0 [-bc] [COMMAND [ARGS...]]"
5
6### Parse options
7case "${SHELL-/bin/sh}" in
8 *csh*) style=csh;;
9 *) style=sh;;
10esac
af254ca9 11force=nil chosen= commands=
285a1386
MW
12while [ $# -gt 0 ]; do
13 case "$1" in
c388de2b
MW
14 -h | --help) echo "$usage"; exit 0 ;;
15 -c | --cshell | --tcsh) style=csh chosen=t ;;
16 -b | --bourne | --bash | --zsh) style=sh chosen=t ;;
17 -f | --force) force=t ;;
18 --) shift; break ;;
19 -*) echo >&2 "$usage"; exit 1 ;;
20 *) break ;;
285a1386
MW
21 esac
22 shift
23done
24[ $# -gt 0 ] && style=commands
25case $chosen,$style in
26 t,commands)
27 echo >&2 "$0: output style and commands? you're odd"
28 exit 1
29 ;;
30esac
31
32### Should I start a new agent?
33case "$force,$SSH_AUTH_SOCK" in
af254ca9
MW
34 t,* | nil,)
35 foundp=nil
285a1386
MW
36 ;;
37 *)
af254ca9 38 foundp=t
b52d5e17 39 set +e; ssh-add -l >/dev/null 2>&1; rc=$?; set -e
af254ca9 40 [ $rc -ge 2 ] && foundp=nil
285a1386
MW
41 ;;
42esac
43
44### If so, do that
af254ca9
MW
45case $foundp in
46 nil)
47 hostname=${HOST-$(hostname)}
48 user=${USER-${LOGNAME-$(whoami)}}
49 dir=$TMPDIR/.ssh-agent.$hostname.$user; socket=$dir/sock; pid=$dir/pid
50 mkdir -p -m700 "$dir"
285a1386 51 SSH_AUTH_SOCK=$socket; export SSH_AUTH_SOCK
af254ca9
MW
52 set +e; ssh-add -l >/dev/null 2>&1; rc=$?; set -e
53 if [ $rc -ge 2 ]; then
54 if [ -f "$pid" ]; then
55 kill $(cat "$pid") >/dev/null 2>&1 || :
56 fi
57 rm -f "$socket" "$pid"
58 (cd /; exec ssh-agent -d -a "$socket" >/dev/null 2>&1)&
59 echo $! >"$pid"
60 SSH_AUTH_SOCK=$socket; export SSH_AUTH_SOCK
61 fi
62 ;;
63esac
285a1386
MW
64
65### Run a program, or export the details
66case $style in
c388de2b
MW
67 sh) echo "SSH_AUTH_SOCK='$SSH_AUTH_SOCK'; export SSH_AUTH_SOCK" ;;
68 csh) echo "setenv SSH_AUTH_SOCK '$SSH_AUTH_SOCK'" ;;
69 commands) exec "$@" ;;
285a1386 70esac