]> git.sev.monster Git - dotfiles.git/blob - base/.zshenv
zshenv: don't create redundant var
[dotfiles.git] / base / .zshenv
1 ### unset unwanted options that could be set in /etc/zshenv
2 unsetopt SH_WORD_SPLIT KSH_ARRAYS
3
4 ### check if su
5 if [[ -v _sev_olduser && $_sev_olduser != $USERNAME ]] _sev_reset_shell=
6 export _sev_olduser=$USERNAME
7
8 ### exports for all new shells
9 if [[ -v _sev_reset_shell || $SHLVL == 1 ]] {
10     ## lang
11     export CHARSET=UTF-8
12     export LANG=en_US.UTF-8
13     export LC_CTYPE=$LANG
14
15     ## path
16     typeset -U path fpath
17     if [[ $SHLVL  == 1 ]] {
18         # take a backup before any customizations
19         export _sev_sys_PATH=$PATH
20         export _sev_sys_FPATH=$FPATH
21     }
22     # /usr/{pkg,local,games} are unix/bsdisms
23     path=({~/,/,/usr/}sbin {~/,/,/usr/}bin /usr/pkg/{s,}bin /usr/X11R{7,6}/bin
24           /usr/local/{s,}bin /usr/games)
25     PATH=$PATH:$_sev_sys_PATH
26     fpath=(${ZDOTDIR:-$HOME/.zsh}/functions/{*,Completions/*}(N))
27     #fpath is not exported by default
28     export FPATH=$FPATH:$_sev_sys_FPATH
29     # take another backup, explained in .zprofile
30     typeset -U _backup_path
31     _backup_path=("${path[@]}")
32
33     ## xdg
34     export XDG_CONFIG_HOME=~/etc
35     export XDG_CONFIG_DIRS=~/.config:/usr/pkg/etc/xdg:/usr/local/etc/xdg:/etc/xdg
36     export XDG_DATA_HOME=~/share
37     export XDG_DATA_DIRS=~/.local/share:/usr/pkg/share:/usr/local/share:/usr/share
38     export XDG_CACHE_HOME=~/tmp
39     export XDG_RUNTIME_DIR=~/tmp
40
41     ## create tmp link
42     t=${TMPDIR:-/tmp}/home-$LOGNAME
43     if [[ ! -e $t ]] {
44         mkdir -m 700 $t >/dev/null 2>&1
45         # TODO: check if dir exists after mkdir
46     }
47     # allow opaque entries to override link creation
48     if [[ ! -e $XDG_RUNTIME_DIR ]] {
49         ln -sf $t $XDG_RUNTIME_DIR >/dev/null 2>&1
50     }
51     unset t
52
53     ## ssh agents
54     # NOTE: preferred order of agents to check: okcagent, gnupg, openssh
55     #       first block takes care of okcagent and openssh, second gnupg
56     [[ -o interactive ]] && print -nP "%F{blue}>>>%f SSH: %F{green}"
57     if [[ ! -v SSH_AUTH_SOCK && ( -v commands[okc-ssh-agent] ||
58           ( -v commands[ssh-agent] && ! -v commands[gpg] ) ) ]] {
59         okc=${commands[okc-ssh-agent]:+okc-}
60         agentfile=~/tmp/${okc}ssh-agent-exports
61         typeset sock=
62         typeset -i pid=
63         if [[ -f $agentfile ]] {
64             IFS=$'\0' read -r sock pid <$agentfile
65         }
66         if [[ -S $sock && $pid > 0 ]] && kill -0 $pid; then
67             [[ -o interactive ]] && echo "Reusing agent pid $pid"
68             export SSH_AUTH_SOCK=$sock
69             export SSH_AGENT_PID=$pid
70         else
71             # TODO: ensure ssh-agent path looks legit
72             #       to avoid unsafe eval?
73             # NOTE: no way around doing redirection like this I think
74             e=${okc}ssh-agent
75             if [[ -o interactive ]] {
76                 eval `$e`
77             } else {
78                 eval `$e` >/dev/null 2>&1
79             }
80             echo -n $SSH_AUTH_SOCK$'\0'$SSH_AGENT_PID >!$agentfile
81         fi
82         unset okc agentfile sock pid
83     } elif [[ -v commands[gpg] && ! -S $_GNUPG_SOCK_DEST && \
84               ( ! -v SSH_AUTH_SOCK || -v DISPLAY ) ]] {
85         export GPG_TTY=$(tty)
86         export PINENTRY_USER_DATA=USE_TTY=$((!${+DISPLAY}))
87         gpg-connect-agent UPDATESTARTUPTTY /bye >/dev/null 2>&1
88         [[ -o interactive ]] && gpg-connect-agent /subst /serverpid \
89             '/echo GPG agent pid ${get serverpid}' /bye
90         [[ ! -v SSH_AUTH_SOCK ]] && \
91             export SSH_AUTH_SOCK=$(gpgconf --list-dirs agent-ssh-socket)
92     } else {
93         [[ -o interactive ]] && echo "Pre-existing or remote agent"
94     }
95
96     ## gpg ssh forwarding
97     # ssh automatically tunnels SSH_AUTH_SOCK with the right config, but GPG
98     # doesn't—we use a RemoteForward rule in ~/.ssh/config that uses these env
99     # vars to push the gpg extra socket through when connecting via ssh
100     # HACK: this entire thing sucks but there is no other easy way that works
101     #       out of the box with other systems
102     if [[ -v commands[gpgconf] ]] {
103         # if already connected over SSH, reuse forwarded socket for future
104         # connections; else use extra socket
105         sock=${SSH_CLIENT:+agent-socket}
106         export _GNUPG_SOCK_SRC=$(gpgconf --list-dirs ${sock:-agent-extra-socket})
107         unset sock
108         # XXX: multiple SSH sessions to the same host will overwrite this
109         #      socket, no way to send unique paths without configuring explicit
110         #      SendEnv and AcceptEnv exclusions on client and host respectively
111         export _GNUPG_SOCK_DEST=/tmp/.gpg-agent-forward
112         # if socket exists already, we are on a RemoteForwarded client, so copy
113         # it over so that GPG sees it
114         # XXX: race condition if connecting multiple terminals at once
115         if [[ -S $_GNUPG_SOCK_DEST ]] {
116             unlink $_GNUPG_SOCK_SRC >/dev/null 2>&1
117             mv $_GNUPG_SOCK_DEST $_GNUPG_SOCK_SRC >/dev/null
118         }
119     }
120 }
121
122 ### load site-specific
123 if [[ -f ~/.zshenv.local ]] { source ~/.zshenv.local }
124
125 ### source .zprofile
126 # if we used su, without --login, let's run zprofile ourselves
127 # XXX: system zprofile is not run
128 if [[ -v _sev_reset_shell || $SHLVL == 1 ]] source ~/.zprofile
129
130 # vim: set et sts=4 sw=4 ts=8 tw=79 :
This page took 0.03773 seconds and 4 git commands to generate.