Subject: Re: bug#1523: [Ivan Shmakov] process-send-string apparently mangles \r into \n

From: richardeng <[email-masked]>
Date: Tue, 13 Jan 2009 01:58:56 +0800

Sven Joachim wrote:

I received the following report via the Debian bug tracking system.
It is reproducible in the trunk.

Subject:
Bug#508300: process-send-string apparently mangles \r into \n

From:
Ivan Shmakov <[email-masked]>

Date:
Wed, 10 Dec 2008 01:14:09 +0600

To:
[email-masked]

To:
[email-masked]

CC:
Ivan Shmakov <[email-masked]>

Package: emacs22
Version: 22.2+2-5

After running the following program:

(let* ((coding-system-for-read 'binary)
(coding-system-for-write 'binary)
(p (start-process "foo" "*foo*" "od" "-td1")))
(process-send-string p "\r\n")
(process-send-eof p))
;; => #<process foo>

the `*foo*' buffer contains:

--cut: *foo*--
0000000 10 10
0000002

Process foo finished
--cut: *foo*--

While I'd expect the following instead:

--cut: *foo*--
0000000 13 10
0000002

Process foo finished
--cut: *foo*--

Compare:

(let ((coding-system-for-read 'binary)
(coding-system-for-write 'binary))
(save-excursion
(set-buffer "*foo*")
(let* ((start (point))
(end (progn (insert "\r\n") (point))))
(call-process-region start end "od" t t t "-td1"))))

--cut: *foo*--
0000000 13 10
0000002
--cut: *foo*--

send again, the "plain text only" format has some problem...

(start-process "foo" "*foo*" "od" "-td1")             // pty is used, pty driver will map '\r' <-> '\n'
(call-process-region start end "od" t t t "-td1")    // temp file is used, no such problem

--- process.c.~1.577.~  2009-01-03 07:03:59.000000000 -0800
+++ process.c   2009-01-13 01:18:08.000000000 -0800
@@ -1871,6 +1871,13 @@
forkin = forkout = -1;
#endif /* not USG, or USG_SUBTTY_WORKS */
pty_flag = 1;
+      {
+       struct emacs_tty settings;
+       EMACS_GET_TTY(outchannel, &settings);
+       settings.main.c_iflag &= ~ICRNL;        /* Disable map of CR to NL on input */
+       settings.main.c_iflag &= ~INLCR;        /* Disable map of NL to CR on input */
+       EMACS_SET_TTY(outchannel, &settings, 1);
+      }
}
else
#endif /* HAVE_PTYS */