ports/120061: [Patch] chinese/cxterm: use termios, not sgtty
Ed Schouten
ed at fxq.nl
Sun Jan 27 21:30:01 UTC 2008
>Number: 120061
>Category: ports
>Synopsis: [Patch] chinese/cxterm: use termios, not sgtty
>Confidential: no
>Severity: non-critical
>Priority: medium
>Responsible: freebsd-ports-bugs
>State: open
>Quarter:
>Keywords:
>Date-Required:
>Class: sw-bug
>Submitter-Id: current-users
>Arrival-Date: Sun Jan 27 21:30:00 UTC 2008
>Closed-Date:
>Last-Modified:
>Originator: Ed Schouten
>Release: FreeBSD 6.3-PRERELEASE i386
>Organization:
>Environment:
System: FreeBSD palm.hoeg.nl 6.3-PRERELEASE FreeBSD 6.3-PRERELEASE #0: Wed Dec 19 16:07:46 CET 2007 ed at palm.hoeg.nl:/usr/obj/usr/src/sys/PALM i386
>Description:
The chinese/cxterm port is one of the last ports that still needs
COMPAT_43TTY in the kernel to operate properly. We'd better use termios,
instead of sgtty, because that is more future-proof.
>How-To-Repeat:
>Fix:
The following patch should port the application to termios. I tried it
on my box and the application still works, but I haven't performed a
lot of thorough testing with it. It is basically based on the patch I
wrote for hanterm.
--- chinese/cxterm/files/patch-main.c 2002-10-26 03:25:32.000000000 +0200
+++ chinese/cxterm/files/patch-main.c 2008-01-27 22:20:03.000000000 +0100
@@ -1,12 +1,100 @@
--- cxterm/main.c.orig Fri Oct 25 11:44:46 2002
+++ cxterm/main.c Fri Oct 25 11:47:13 2002
-@@ -223,6 +223,9 @@
- #ifndef linux
- #include <sgtty.h>
+@@ -220,8 +220,13 @@
+ #define HAS_UTMP_UT_HOST
#endif
+ #else /* } !SYSV { */ /* BSD systems */
+-#ifndef linux
+-#include <sgtty.h>
+#ifdef __FreeBSD__
++#include <termios.h>
++#define USE_TERMIOS
++#define USE_TERMINFO
++#define USE_SYSV_TERMIO
++#define termio termios
+#define USE_POSIX_WAIT
-+#endif
+ #endif
#include <sys/resource.h>
#define HAS_UTMP_UT_HOST
- #define HAS_BSD_GROUPS
+@@ -968,7 +973,7 @@
+ ** implementation to implementation).
+ */
+ d_tio.c_iflag = ICRNL|IXON;
+- d_tio.c_oflag = OPOST|ONLCR|TAB3;
++ d_tio.c_oflag = OPOST|ONLCR|OXTABS;
+ #if defined(macII) || defined(ATT) || defined(CRAY) || (defined(sun) && defined(SVR4)) /* { */
+ #ifndef HANZI
+ d_tio.c_cflag = B9600|CS8|CREAD|PARENB|HUPCL;
+@@ -1036,11 +1041,13 @@
+ #ifdef ECHOCTL
+ d_tio.c_lflag |= ECHOCTL|IEXTEN;
+ #endif
++#ifndef __FreeBSD__
+ #ifdef NTTYDISC
+ d_tio.c_line = NTTYDISC;
+ #else
+ d_tio.c_line = 0;
+ #endif
++#endif
+ #ifdef sgi
+ d_tio.c_cflag &= ~(HUPCL|PARENB);
+ d_tio.c_iflag |= BRKINT|ISTRIP|IGNPAR;
+@@ -1090,7 +1097,11 @@
+
+ for (i = 0; i <= 2; i++) {
+ struct termio deftio;
++#ifdef USE_TERMIOS
++ if (tcgetattr(i, &deftio) == 0) {
++#else
+ if (ioctl (i, TCGETA, &deftio) == 0) {
++#endif
+ d_tio.c_cc[VINTR] = deftio.c_cc[VINTR];
+ d_tio.c_cc[VQUIT] = deftio.c_cc[VQUIT];
+ d_tio.c_cc[VERASE] = deftio.c_cc[VERASE];
+@@ -1970,7 +1981,11 @@
+ lmode = d_lmode;
+ #endif /* TIOCLSET */
+ #ifdef USE_SYSV_TERMIO
++#ifdef USE_TERMIOS
++ if(tcgetattr(tty, &tio) == -1)
++#else
+ if(ioctl(tty, TCGETA, &tio) == -1)
++#endif
+ tio = d_tio;
+
+ #else /* not USE_SYSV_TERMIO */
+@@ -2340,19 +2355,17 @@
+ #endif /* ISTRIP */
+ #endif /* HANZI */
+ /* ouput: cr->cr, nl is not return, no delays, ln->cr/nl */
+- tio.c_oflag &=
+- ~(OCRNL|ONLRET|NLDLY|CRDLY|TABDLY|BSDLY|VTDLY|FFDLY);
++ tio.c_oflag &= ~(OCRNL|ONLRET);
+ tio.c_oflag |= ONLCR;
+ #ifdef OPOST
+ tio.c_oflag |= OPOST;
+ #endif /* OPOST */
+ #ifdef BAUD_0
+ /* baud rate is 0 (don't care) */
+- tio.c_cflag &= ~(CBAUD);
++ cfsetspeed(&tio, 0);
+ #else /* !BAUD_0 */
+ /* baud rate is 9600 (nice default) */
+- tio.c_cflag &= ~(CBAUD);
+- tio.c_cflag |= B9600;
++ cfsetspeed(&tio, 9600);
+ #endif /* !BAUD_0 */
+ tio.c_cflag &= ~CSIZE;
+ #ifndef HANZI
+@@ -2476,7 +2489,11 @@
+ if (ioctl (tty, TIOCLSET, (char *)&lmode) == -1)
+ HsSysError(cp_pipe[1], ERROR_TIOCLSET);
+ #endif /* TIOCLSET */
++#ifdef USE_TERMIOS
++ if (tcsetattr(tty, TCSANOW, &tio) == -1)
++#else
+ if (ioctl (tty, TCSETA, &tio) == -1)
++#endif
+ HsSysError(cp_pipe[1], ERROR_TIOCSETP);
+ #else /* USE_SYSV_TERMIO */
+ sg.sg_flags &= ~(ALLDELAY | XTABS | CBREAK | RAW);
--- chinese/cxterm/files/patch-utils_hzimctrl.c 2007-11-22 15:56:44.000000000 +0100
+++ chinese/cxterm/files/patch-utils_hzimctrl.c 2008-01-27 22:20:03.000000000 +0100
@@ -1,6 +1,26 @@
--- utils/hzimctrl.c.orig 2007-11-22 14:25:31.000000000 +0100
+++ utils/hzimctrl.c 2007-11-22 14:25:47.000000000 +0100
-@@ -112,6 +112,11 @@
+@@ -67,12 +67,19 @@
+ #define USE_SYSV_TERMIO
+ #endif /* SYSV */
+
++#ifdef __FreeBSD__
++#define USE_SYSV_TERMIO
++#define USE_TERMIOS
++#include <termios.h>
++#define termio termios
++#else /* !__FreeBSD__ */
+ #include <sys/ioctl.h>
+ #ifdef USE_SYSV_TERMIO
+ #include <sys/termio.h>
+ #else /* else not USE_SYSV_TERMIO */
+ #include <sgtty.h>
+ #endif /* USE_SYSV_TERMIO */
++#endif /* __FreeBSD__ */
+
+ #ifdef SYSV
+ #ifdef USE_USG_PTYS
+@@ -112,6 +119,11 @@
char *setim = "\033]161;%s\007"; /* esc seq for set hz input method */
char *setparam = "\033]162;%s\007"; /* esc seq for set input param */
@@ -12,7 +32,7 @@
/*
set input method
*/
-@@ -127,10 +132,6 @@
+@@ -127,10 +139,6 @@
#endif /* USE_SYSV_TERMIO */
char buf[BUFSIZ];
char *name_of_tty;
@@ -23,3 +43,54 @@
ptr = strrchr(myname = argv[0], '/');
if (ptr)
+@@ -179,9 +187,13 @@
+ tty = fileno(ttyfp);
+
+ #ifdef USE_SYSV_TERMIO
++#ifdef USE_TERMIOS
++ tcgetattr(tty, &tioorig);
++#else
+ ioctl (tty, TCGETA, &tioorig);
++#endif
+ tio = tioorig;
+- tio.c_iflag &= ~(ICRNL | IUCLC);
++ tio.c_iflag &= ~(ICRNL);
+ tio.c_lflag &= ~(ICANON | ECHO);
+ tio.c_cflag |= CS8;
+ tio.c_cc[VMIN] = 6;
+@@ -196,7 +208,11 @@
+ signal(SIGQUIT, onintr);
+ signal(SIGTERM, onintr);
+ #ifdef USE_SYSV_TERMIO
++#ifdef USE_TERMIOS
++ tcsetattr(tty, TCSADRAIN, &tio);
++#else
+ ioctl (tty, TCSETAW, &tio);
++#endif
+ #else /* not USE_SYSV_TERMIO */
+ ioctl (tty, TIOCSETP, &sg);
+ #endif /* USE_SYSV_TERMIO */
+@@ -204,7 +220,11 @@
+ write(tty, buf, strlen(buf));
+
+ #ifdef USE_SYSV_TERMIO
++#ifdef USE_TERMIOS
++ tcsetattr(tty, TCSADRAIN, &tioorig);
++#else
+ ioctl (tty, TCSETAW, &tioorig);
++#endif
+ #else /* not USE_SYSV_TERMIO */
+ ioctl (tty, TIOCSETP, &sgorig);
+ #endif /* USE_SYSV_TERMIO */
+@@ -228,7 +248,11 @@
+ int sig;
+ {
+ #ifdef USE_SYSV_TERMIO
++#ifdef USE_TERMIOS
++ tcsetattr(tty, TCSADRAIN, &tioorig);
++#else
+ ioctl (tty, TCSETAW, &tioorig);
++#endif
+ #else /* not USE_SYSV_TERMIO */
+ ioctl (tty, TIOCSETP, &sgorig);
+ #endif /* USE_SYSV_TERMIO */
>Release-Note:
>Audit-Trail:
>Unformatted:
More information about the freebsd-ports-bugs
mailing list