Commit | Line | Data |
---|---|---|
285a1386 MW |
1 | #! /bin/sh |
2 | ||
3 | set -e | |
4 | usage="Usage: $0 [-bc] [COMMAND [ARGS...]]" | |
5 | ||
6 | ### Parse options | |
7 | case "${SHELL-/bin/sh}" in | |
8 | *csh*) style=csh;; | |
9 | *) style=sh;; | |
10 | esac | |
af254ca9 | 11 | force=nil chosen= commands= |
285a1386 MW |
12 | while [ $# -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 | |
23 | done | |
24 | [ $# -gt 0 ] && style=commands | |
25 | case $chosen,$style in | |
26 | t,commands) | |
27 | echo >&2 "$0: output style and commands? you're odd" | |
28 | exit 1 | |
29 | ;; | |
30 | esac | |
31 | ||
b46a2fb2 MW |
32 | ## Some useful variables. |
33 | hostname=${HOST-$(hostname)} | |
34 | user=${USER-${LOGNAME-$(id -un)}} | |
35 | dir=$TMPDIR/.ssh-agent.$hostname.$user | |
36 | socket=$dir/sock; pid=$dir/pid | |
37 | ||
285a1386 MW |
38 | ### Should I start a new agent? |
39 | case "$force,$SSH_AUTH_SOCK" in | |
af254ca9 MW |
40 | t,* | nil,) |
41 | foundp=nil | |
285a1386 MW |
42 | ;; |
43 | *) | |
af254ca9 | 44 | foundp=t |
b52d5e17 | 45 | set +e; ssh-add -l >/dev/null 2>&1; rc=$?; set -e |
af254ca9 | 46 | [ $rc -ge 2 ] && foundp=nil |
285a1386 MW |
47 | ;; |
48 | esac | |
49 | ||
50 | ### If so, do that | |
af254ca9 MW |
51 | case $foundp in |
52 | nil) | |
af254ca9 | 53 | mkdir -p -m700 "$dir" |
285a1386 | 54 | SSH_AUTH_SOCK=$socket; export SSH_AUTH_SOCK |
af254ca9 MW |
55 | set +e; ssh-add -l >/dev/null 2>&1; rc=$?; set -e |
56 | if [ $rc -ge 2 ]; then | |
57 | if [ -f "$pid" ]; then | |
58 | kill $(cat "$pid") >/dev/null 2>&1 || : | |
59 | fi | |
60 | rm -f "$socket" "$pid" | |
61 | (cd /; exec ssh-agent -d -a "$socket" >/dev/null 2>&1)& | |
62 | echo $! >"$pid" | |
63 | SSH_AUTH_SOCK=$socket; export SSH_AUTH_SOCK | |
64 | fi | |
65 | ;; | |
66 | esac | |
285a1386 MW |
67 | |
68 | ### Run a program, or export the details | |
69 | case $style in | |
c388de2b MW |
70 | sh) echo "SSH_AUTH_SOCK='$SSH_AUTH_SOCK'; export SSH_AUTH_SOCK" ;; |
71 | csh) echo "setenv SSH_AUTH_SOCK '$SSH_AUTH_SOCK'" ;; | |
72 | commands) exec "$@" ;; | |
285a1386 | 73 | esac |