* 4: value of shell in /etc/passwd
  * 5: value of shell in config.h
  */
-char *shell = "/bin/sh";
+static char *shell = "/bin/sh";
 char *utmp = NULL;
 char *stty_args = "stty raw pass8 nl -echo -iexten -cstopb 38400";
 
 
        int narg;              /* nb of args */
 } STREscape;
 
-
-static void execsh(char **);
+static void execsh(char *, char **);
 static void stty(char **);
 static void sigchld(int);
 static void ttywriteraw(const char *, size_t);
 static ssize_t xwrite(int, const char *, size_t);
 
 /* Globals */
-int cmdfd;
-pid_t pid;
-int oldbutton   = 3; /* button event on startup: 3 = release */
-
 static Term term;
 static Selection sel;
 static CSIEscape csiescseq;
 static STREscape strescseq;
 static int iofd = 1;
+static int cmdfd;
+static pid_t pid;
 
 static uchar utfbyte[UTF_SIZ + 1] = {0x80,    0, 0xC0, 0xE0, 0xF0};
 static uchar utfmask[UTF_SIZ + 1] = {0xC0, 0x80, 0xE0, 0xF0, 0xF8};
 }
 
 void
-execsh(char **args)
+execsh(char *cmd, char **args)
 {
        char *sh, *prog;
        const struct passwd *pw;
        }
 
        if ((sh = getenv("SHELL")) == NULL)
-               sh = (pw->pw_shell[0]) ? pw->pw_shell : shell;
+               sh = (pw->pw_shell[0]) ? pw->pw_shell : cmd;
 
        if (args)
                prog = args[0];
            perror("Couldn't call stty");
 }
 
-void
-ttynew(char *line, char *out, char **args)
+int
+ttynew(char *line, char *cmd, char *out, char **args)
 {
        int m, s;
 
                        die("open line failed: %s\n", strerror(errno));
                dup2(cmdfd, 0);
                stty(args);
-               return;
+               return cmdfd;
        }
 
        /* seems to work fine on linux, openbsd and freebsd */
                        die("ioctl TIOCSCTTY failed: %s\n", strerror(errno));
                close(s);
                close(m);
-               execsh(args);
+               execsh(cmd, args);
                break;
        default:
                close(s);
                signal(SIGCHLD, sigchld);
                break;
        }
+       return cmdfd;
 }
 
 size_t
                fprintf(stderr, "Couldn't set window size: %s\n", strerror(errno));
 }
 
+void
+ttyhangup()
+{
+       /* Send SIGHUP to shell */
+       kill(pid, SIGHUP);
+}
+
 int
 tattrset(int attr)
 {
 
 void tnew(int, int);
 void tresize(int, int);
 void tsetdirtattr(int);
-void ttynew(char *, char *, char **);
+void ttyhangup(void);
+int ttynew(char *, char *, char *, char **);
 size_t ttyread(void);
 void ttyresize(int, int);
 void ttywrite(const char *, size_t, int);
 void *xrealloc(void *, size_t);
 char *xstrdup(char *);
 
-/* Globals */
-extern int cmdfd;
-extern pid_t pid;
-extern int oldbutton;
-
 /* config.h globals */
-extern char *shell;
 extern char *utmp;
 extern char *stty_args;
 extern char *vtiden;
 
 static char *opt_name  = NULL;
 static char *opt_title = NULL;
 
+static int oldbutton = 3; /* button event on startup: 3 = release */
+
 void
 clipcopy(const Arg *dummy)
 {
                        win.mode &= ~MODE_FOCUSED;
                }
        } else if (e->xclient.data.l[0] == xw.wmdeletewin) {
-               /* Send SIGHUP to shell */
-               kill(pid, SIGHUP);
+               ttyhangup();
                exit(0);
        }
 }
        int w = win.w, h = win.h;
        fd_set rfd;
        int xfd = XConnectionNumber(xw.dpy), xev, blinkset = 0, dodraw = 0;
+       int ttyfd;
        struct timespec drawtimeout, *tv = NULL, now, last, lastblink;
        long deltatime;
 
                }
        } while (ev.type != MapNotify);
 
-       ttynew(opt_line, opt_io, opt_cmd);
+       ttyfd = ttynew(opt_line, shell, opt_io, opt_cmd);
        cresize(w, h);
 
        clock_gettime(CLOCK_MONOTONIC, &last);
 
        for (xev = actionfps;;) {
                FD_ZERO(&rfd);
-               FD_SET(cmdfd, &rfd);
+               FD_SET(ttyfd, &rfd);
                FD_SET(xfd, &rfd);
 
-               if (pselect(MAX(xfd, cmdfd)+1, &rfd, NULL, NULL, tv, NULL) < 0) {
+               if (pselect(MAX(xfd, ttyfd)+1, &rfd, NULL, NULL, tv, NULL) < 0) {
                        if (errno == EINTR)
                                continue;
                        die("select failed: %s\n", strerror(errno));
                }
-               if (FD_ISSET(cmdfd, &rfd)) {
+               if (FD_ISSET(ttyfd, &rfd)) {
                        ttyread();
                        if (blinktimeout) {
                                blinkset = tattrset(ATTR_BLINK);
 
                        if (xev && !FD_ISSET(xfd, &rfd))
                                xev--;
-                       if (!FD_ISSET(cmdfd, &rfd) && !FD_ISSET(xfd, &rfd)) {
+                       if (!FD_ISSET(ttyfd, &rfd) && !FD_ISSET(xfd, &rfd)) {
                                if (blinkset) {
                                        if (TIMEDIFF(now, lastblink) \
                                                        > blinktimeout) {