|
@@ -136,8 +136,7 @@ typedef struct {
|
|
|
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);
|
|
@@ -201,15 +200,13 @@ static char *base64dec(const char *);
|
|
|
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};
|
|
@@ -659,7 +656,7 @@ die(const char *errstr, ...)
|
|
|
}
|
|
|
|
|
|
void
|
|
|
-execsh(char **args)
|
|
|
+execsh(char *cmd, char **args)
|
|
|
{
|
|
|
char *sh, *prog;
|
|
|
const struct passwd *pw;
|
|
@@ -673,7 +670,7 @@ execsh(char **args)
|
|
|
}
|
|
|
|
|
|
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];
|
|
@@ -745,8 +742,8 @@ stty(char **args)
|
|
|
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;
|
|
|
|
|
@@ -765,7 +762,7 @@ ttynew(char *line, char *out, char **args)
|
|
|
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 */
|
|
@@ -786,7 +783,7 @@ ttynew(char *line, char *out, char **args)
|
|
|
die("ioctl TIOCSCTTY failed: %s\n", strerror(errno));
|
|
|
close(s);
|
|
|
close(m);
|
|
|
- execsh(args);
|
|
|
+ execsh(cmd, args);
|
|
|
break;
|
|
|
default:
|
|
|
close(s);
|
|
@@ -794,6 +791,7 @@ ttynew(char *line, char *out, char **args)
|
|
|
signal(SIGCHLD, sigchld);
|
|
|
break;
|
|
|
}
|
|
|
+ return cmdfd;
|
|
|
}
|
|
|
|
|
|
size_t
|
|
@@ -916,6 +914,13 @@ ttyresize(int tw, int th)
|
|
|
fprintf(stderr, "Couldn't set window size: %s\n", strerror(errno));
|
|
|
}
|
|
|
|
|
|
+void
|
|
|
+ttyhangup()
|
|
|
+{
|
|
|
+ /* Send SIGHUP to shell */
|
|
|
+ kill(pid, SIGHUP);
|
|
|
+}
|
|
|
+
|
|
|
int
|
|
|
tattrset(int attr)
|
|
|
{
|