summaryrefslogtreecommitdiff
path: root/Src/Modules/zpty.c
diff options
context:
space:
mode:
authorAxel Beckert <abe@deuxchevaux.org>2016-01-24 17:19:53 +0100
committerAxel Beckert <abe@deuxchevaux.org>2016-01-24 17:19:53 +0100
commit86ca06fb4b5a835caac37700952207db4c5073cd (patch)
treec2686e6d126d59052310c6bb7cd8df6d76fa0fca /Src/Modules/zpty.c
parent370659ae9ae918a07a7950bbc2827b2593126f7d (diff)
parentd18ce35d060163ea0d531170b65e1c38311af166 (diff)
downloadzsh-86ca06fb4b5a835caac37700952207db4c5073cd.tar.gz
zsh-86ca06fb4b5a835caac37700952207db4c5073cd.zip
Merge branch 'upstream' at 5.2-dev-1 into debian
Diffstat (limited to 'Src/Modules/zpty.c')
-rw-r--r--Src/Modules/zpty.c26
1 files changed, 19 insertions, 7 deletions
diff --git a/Src/Modules/zpty.c b/Src/Modules/zpty.c
index 3b8366076..63ff7578c 100644
--- a/Src/Modules/zpty.c
+++ b/Src/Modules/zpty.c
@@ -399,7 +399,7 @@ newptycmd(char *nam, char *pname, char **args, int echo, int nblock)
close(master);
close(coprocin);
close(coprocout);
- init_io();
+ init_io(NULL);
setsparam("TTY", ztrdup(ttystrname));
opts[INTERACTIVE] = 0;
@@ -614,14 +614,23 @@ ptyread(char *nam, Ptycmd cmd, char **args, int noblock, int mustmatch)
break;
}
if (cmd->read != -1 || (ret = read(cmd->fd, buf + used, 1)) == 1) {
+ int readchar;
if (cmd->read != -1) {
ret = 1;
- buf[used] = (char) cmd->read;
+ readchar = cmd->read;
cmd->read = -1;
- }
+ } else
+ readchar = STOUC(buf[used]);
+ if (imeta(readchar)) {
+ buf[used++] = Meta;
+ buf[used++] = (char) (readchar ^ 32);
+ } else
+ buf[used++] = (char) readchar;
seen = 1;
- if (++used == blen) {
+ if (used >= blen-1) {
if (!*args) {
+ buf[used] = '\0';
+ unmetafy(buf, &used);
write_loop(1, buf, used);
used = 0;
} else {
@@ -633,7 +642,8 @@ ptyread(char *nam, Ptycmd cmd, char **args, int noblock, int mustmatch)
buf[used] = '\0';
if (!prog) {
- if (ret <= 0 || (*args && buf[used - 1] == '\n'))
+ if (ret <= 0 || (*args && buf[used - 1] == '\n' &&
+ (used < 2 || buf[used-2] != Meta)))
break;
} else {
if (ret < 0
@@ -666,9 +676,11 @@ ptyread(char *nam, Ptycmd cmd, char **args, int noblock, int mustmatch)
return 1;
}
if (*args)
- setsparam(*args, ztrdup(metafy(buf, used, META_HREALLOC)));
- else if (used)
+ setsparam(*args, ztrdup(buf));
+ else if (used) {
+ unmetafy(buf, &used);
write_loop(1, buf, used);
+ }
if (seen && (!prog || matchok || !mustmatch))
return 0;