Dear Mònica Ramírez Arceda, söndag den 20 mars 2011 klockan 20:52 skrev Mònica Ramírez Arceda detta: > > [...] > > It seems "-DCOMPAT_43TTY" solution could be a good one but if it is > removed... What happens with sys/ioctl_compat.h? > > Also, I can try the first solution and port to POSIX <termios.h>, > altough there are quite a lot of ioctl calls. Well, not too much work. Implementing Gnutls or IPv6 in servers is much harder, not only an evenings work. I have now implemented support for Termios. It is your duty and your pleasure to verify that it works. My checking of a clean build was done on kfreebsd-amd64 and linux-i386. Time structure handling needed patching for 64-bit systems. You have a rewarding, but sometimes labour-heavy career in front of you, if you decide to adapt halfway forgotten packages and decide to bring them to contemporary standards. I certainly would like to encourage you to keep going. Best regards, Mats Erik Andersson, DM
Description: Implement support for Termios.
Adding termios handling is a straight path
into support for GNU/kFreeBSD. Fairly standard.
.
The non-standard configuration tool is convinced
to recognise the presence of "<termios.h>", thus
defining HAVE_TERMIOS_H. Conditioning on __GLIBC__
avoids falling into the ioctl-compat trap!
.
On 64-bit systems, using time compatibility mode,
the Utmp code needs some fine tuning.
Author: Mats Erik Andersson <debian@gisladisker.se>
Forwarded: no
Last-Update: 2011-03-21
diff -Naurp splitvt-1.6.6.debian/config.c splitvt-1.6.6/config.c
--- splitvt-1.6.6.debian/config.c 2011-03-21 17:31:37.000000000 +0100
+++ splitvt-1.6.6/config.c 2011-03-21 19:04:06.000000000 +0100
@@ -93,7 +93,12 @@ char *argv[];
VERBOSE_PRINT("\tI see you are running Solaris.\n");
}
else
+#if defined(__GLIBC__)
+ VERBOSE_PRINT("\tA bold user of GNU/kFreeBSD or GNU/Hurd.\n");
+ strcat(cflags, " -O2");
+#else /* !__GLIBC__ */
strcat(cflags, " -O");
+#endif
/* Check for IRIX */
if ( grep("/usr/include", "unistd.h", "_getpty") )
@@ -118,8 +123,11 @@ char *argv[];
VERBOSE_PRINT("\tYour utmp file uses the host field.\n");
}
- /* Check for termio.h */
- if ( exists(INCLUDE, "termio.h") ) {
+ /* Check for termio[s].h */
+ if ( exists(INCLUDE, "termios.h") ) {
+ strcat(cflags, " -DHAVE_TERMIOS_H");
+ VERBOSE_PRINT("\tI will use termios tty structures.\n");
+ } else if ( exists(INCLUDE, "termio.h") ) {
strcat(cflags, " -DHAVE_TERMIO_H");
VERBOSE_PRINT("\tI will use termio tty structures.\n");
} else
@@ -136,12 +144,14 @@ char *argv[];
VERBOSE_PRINT("\tI see you have BSD tty support.\n");
}
+#if !__GLIBC__ /* False positive for GNU/kFreeBSD */
/* Check for ioctl compatibility. (FreeBSD) */
if ( exists(INCLUDE, "sys/ioctl_compat.h") ) {
strcat(cflags, " -DNEED_COMPAT_H");
VERBOSE_PRINT(
"\tI will use your ioctl compatibility header.\n");
}
+#endif
/* Check for BSD socket library header (AT&T) */
if ( exists(INCLUDE, "sys/inet.h") ) {
diff -Naurp splitvt-1.6.6.debian/misc.c splitvt-1.6.6/misc.c
--- splitvt-1.6.6.debian/misc.c 2011-03-21 17:31:37.000000000 +0100
+++ splitvt-1.6.6/misc.c 2011-03-21 21:50:15.000000000 +0100
@@ -17,10 +17,16 @@
#ifdef HAVE_TERMIO_H
-#include <termio.h>
-#else
-#include <sys/ioctl.h>
-#endif /* HAVE_TERMIO_H */
+# include <termio.h>
+#elif defined(HAVE_TERMIOS_H)
+# include <termios.h>
+# include <sys/ioctl.h>
+# ifndef termio
+# define termio termios
+# endif /* !termio */
+#else /* !HAVE_TERMIO_H && !HAVE_TERMIOS_H */
+# include <sys/ioctl.h>
+#endif
#ifdef HAVE_BSDTTY_H
#include <sys/bsdtty.h>
@@ -33,6 +39,10 @@
/*#define STTY_HACK*/
#endif
+#ifndef OLCUC
+# define OLCUC 0 /* Missing in FreeBSD, GNU/kFreeBSD */
+#endif /* !OLCUC */
+
int tty_reset(int fd);
/*
@@ -454,7 +464,7 @@ void dropctty()
}
-#ifdef HAVE_TERMIO_H
+#if defined(HAVE_TERMIO_H) || defined(HAVE_TERMIOS_H)
/* Get the modes of the controlling tty and save them. Saves
ttymodes in tty_mode and returns -1 if ioctl fails. */
@@ -475,7 +485,11 @@ int fd;
fprintf(stderr, "Getting tty modes for tty_mode.\r\n");
#endif
+#ifdef HAVE_TERMIOS_H
+ if (tcgetattr(fd, &tty_mode) < 0)
+#else /* HAVE_TERMIO_H */
if (ioctl(fd, TCGETA, (char *) &tty_mode) < 0)
+#endif
{
#ifdef DEBUG
perror("tty_getmode(): ioctl error");
@@ -499,7 +513,11 @@ int fd;
if ( ! tty_init )
{
+#ifdef HAVE_TERMIOS_H
+ if (tcgetattr(fd, &tty_mode) < 0)
+#else /* HAVE_TERMIO_H */
if (ioctl(fd, TCGETA, (char *) &tty_mode) < 0)
+#endif
return(-1);
}
@@ -518,8 +536,12 @@ int fd;
temp_mode.c_cc[VINTR]=('C'^64);
temp_mode.c_cc[VEOF]=('D'^64);
- /* TCSETAW is important for letting tty input drain. */
+ /* TCSADRAIN/TCSETAW is important for letting tty input drain. */
+#ifdef HAVE_TERMIOS_H
+ if ( tcsetattr(fd, TCSADRAIN, &temp_mode) < 0 )
+#else /* HAVE_TERMIO_H */
if ( ioctl(fd, TCSETAW, (char *)&temp_mode) < 0 )
+#endif
{
#ifdef DEBUG
perror("Can't set tty modes");
@@ -544,7 +566,11 @@ int fd; /* of tty device */
if ( ! isatty(fd) )
return(0);
+#ifdef HAVE_TERMIOS_H
+ if ( tcgetattr(fd, &temp_mode) < 0 )
+#else /* HAVE_TERMIO_H */
if ( ioctl(fd, TCGETA, (char *)&temp_mode) < 0 )
+#endif
return(-1);
#ifdef SEVEN_BIT
@@ -558,8 +584,12 @@ int fd; /* of tty device */
temp_mode.c_cc[VMIN]=1; /* 1 or more chars satisfy read */
temp_mode.c_cc[VTIME]=0; /* 10'ths of seconds between chars */
- /* TCSETAW is important for letting tty input drain. */
+ /* TCSADRAIN/TCSETAW is important for letting tty input drain. */
+#ifdef HAVE_TERMIOS_H
+ if (tcsetattr(fd, TCSADRAIN, &temp_mode) < 0)
+#else /* HAVE_TERMIO_H */
if (ioctl(fd, TCSETAW, (char *) &temp_mode) < 0)
+#endif
return(-1);
return(0);
}
@@ -577,13 +607,17 @@ int fd;
if ( ! isatty(fd) )
return(0);
- /* TCSETAW is important for letting tty input drain. */
+ /* TCSADRAIN/TCSETAW is important for letting tty input drain. */
+#ifdef HAVE_TERMIOS_H
+ if (tcsetattr(fd, TCSADRAIN, &tty_mode) < 0)
+#else /* HAVE_TERMIO_H */
if (ioctl(fd, TCSETAW, (char *) &tty_mode) < 0)
+#endif
return(-1);
return(0);
}
-#else /* no /usr/include/termio.h */
+#else /* no /usr/include/termio{,s}.h */
#ifdef NEED_COMPAT_H /* FreeBSD needs this */
#include <sys/ioctl_compat.h>
#endif /* NEED_COMPAT_H */
diff -Naurp splitvt-1.6.6.debian/utmp.c splitvt-1.6.6/utmp.c
--- splitvt-1.6.6.debian/utmp.c 2011-03-21 17:31:37.000000000 +0100
+++ splitvt-1.6.6/utmp.c 2011-03-21 21:56:08.000000000 +0100
@@ -201,7 +201,18 @@ char *tty; /* /dev/ttyxx */
ut.ut_host[sizeof(ut.ut_host)-1]='\0';
}
#endif
+#if __WORDSIZE == 64 && __WORDSIZE_COMPAT32
+ /* 'time_t' is 64-bit, 'ut.ut_time' is 32-bit. */
+ {
+ time_t now;
+
+ (void) time(&now);
+ ut.ut_time = now & 0xffffffff; /* Discard upper bits. */
+ }
+#else /* Equal size time representation. */
(void) time(&ut.ut_time);
+#endif
+
#if !defined(SOLARIS) && !defined(IRIX) && !defined(__GLIBC__)
/* Solaris and Irix and GLIBC machines do this automatically */
@@ -237,7 +248,17 @@ char *tty; /* /dev/ttyxx */
#if defined(HAVE_UTHOST)
ut.ut_host[0]='\0';
#endif
+#if __WORDSIZE == 64 && __WORDSIZE_COMPAT32
+ /* 'time_t' is 64-bit, 'ut.ut_time' is 32-bit. */
+ {
+ time_t now;
+
+ (void) time(&now);
+ ut.ut_time = now & 0xffffffff; /* Discard bits. */
+ }
+#else /* Equal size time representation. */
(void) time(&ut.ut_time);
+#endif
retval=set_utmp(tty, &ut);
}
diff -Naurp splitvt-1.6.6.debian/vt100.c splitvt-1.6.6/vt100.c
--- splitvt-1.6.6.debian/vt100.c 2011-03-21 17:31:37.000000000 +0100
+++ splitvt-1.6.6/vt100.c 2011-03-21 21:44:18.000000000 +0100
@@ -14,7 +14,9 @@
#include <sys/types.h>
#ifdef HAVE_TERMIO_H
#include <termio.h> /* Used only for TIOCGWINSZ */
-#else
+#elif defined(HAVE_TERMIOS_H)
+#include <termios.h>
+#else /* !HAVE_TERMIO_H && !HAVE_TERMIOS_H */
#include <sys/ioctl.h> /* Used only for TIOCGWINSZ */
#endif
#include <errno.h>
@@ -141,7 +143,7 @@ window *win;
unsigned char on=NORMAL;
vt_resetattr();
- (void) check_attr(0, win->textattr, (int)&on);
+ (void) check_attr(0, win->textattr, (int)on);
}
/* Process the ^[[X;Xm escape. Made into a separate routine to support
diff -Naurp splitvt-1.6.6.debian/vttest.c splitvt-1.6.6/vttest.c
--- splitvt-1.6.6.debian/vttest.c 2011-03-21 17:31:37.000000000 +0100
+++ splitvt-1.6.6/vttest.c 2011-03-21 21:47:43.000000000 +0100
@@ -18,7 +18,13 @@
#include <fcntl.h>
#ifdef HAVE_TERMIO_H
#include <termio.h>
-#else
+#elif defined HAVE_TERMIOS_H
+# include <termios.h>
+# include <sys/ioctl.h>
+# ifndef termio
+# define termio termios
+# endif
+#else /* !HAVE_TERMIO_H && !HAVE_TERMIOS_H */
#include <setjmp.h>
#include <signal.h>
#include <sys/ioctl.h>
@@ -35,13 +41,17 @@
#include <sys/bsdtty.h>
#endif /* HAVE_BSDTTY_H */
+#ifndef OLCUC
+# define OLCUC 0 /* Missing inf FreeBSD and GNU/kFreeBSD. */
+#endif
+
#ifdef MAIN
int main() { if ( vttest() ) printf("vt100\n"); }
#endif
/* Register that we are alarmed. (called by SIG_ALRM on BSD) */
static int alarmed;
-#ifndef HAVE_TERMIO_H
+#if !defined(HAVE_TERMIO_H) && !defined(HAVE_TERMIOS_H)
static jmp_buf alarm_buf;
static void alrm_trap() { alarmed=1; longjmp(alarm_buf, 1); }
#endif /* No termio.h */
@@ -59,11 +69,17 @@ int vttest()
if ( (fd=open("/dev/tty", O_RDWR, 0666)) < 0 )
return(0);
+#ifdef HAVE_TERMIOS_H
+ if ( tcgetattr(fd, &ttold) < 0 )
+ return(0);
+ (void) tcgetattr(fd, &ttraw);
+#else /* !HAVE_TERMIOS_H */
if ( ioctl(fd, TCGETA, (char *)&ttold) < 0 )
return(0);
(void) ioctl(fd, TCGETA, (char *)&ttraw);
+#endif
-#ifdef HAVE_TERMIO_H
+#if defined(HAVE_TERMIO_H) || defined(HAVE_TERMIOS_H)
#ifdef SEVEN_BIT
ttraw.c_iflag=(IGNBRK | ISTRIP); /* turn off all input control */
#else
@@ -74,17 +90,22 @@ int vttest()
ttraw.c_lflag = 0;
ttraw.c_cc[VMIN]=0; /* 1 or more chars satisfy read */
ttraw.c_cc[VTIME]=10; /* 10'ths of seconds between chars */
-#else
+#else /* !HAVE_TERMIO_H && !HAVE_TERMIOS_H */
ttraw.sg_flags |= RAW; /* turn RAW mode on */
ttraw.sg_flags &= ~ECHO; /* turn ECHO off */
#endif /* HAVE_TERMIO_H */
+#ifdef HAVE_TERMIOS_H
+ if (tcsetattr(fd, TCSADRAIN, &ttraw) < 0)
+#else /* !HAVE_TERMIOS_H */
if (ioctl(fd, TCSETAW, (char *)&ttraw) < 0)
+#endif
return(0);
write(fd,"\033[c", 3); /* Vt100 test: ESC [ c */
-#ifndef HAVE_TERMIO_H /* We need to set an alarm */
+#if !defined(HAVE_TERMIO_H) && !defined(HAVE_TERMIOS_H)
+ /* We need to set an alarm */
signal(SIGALRM, alrm_trap);
alarmed=0;
alarm(1);
@@ -98,11 +119,15 @@ int vttest()
if ( buff[0] == '\033' ) /* An escape sequence? :) */
rc=1;
-#ifndef HAVE_TERMIO_H
+#if !defined(HAVE_TERMIO_H) && !defined(HAVE_TERMIOS_H)
alarm(0);
signal(SIGALRM, SIG_DFL);
#endif
+#if HAVE_TERMIOS_H
+ (void) tcsetattr(fd, TCSADRAIN, &ttold);
+#else /* !HAVE_TERMIOS_H */
(void) ioctl(fd, TCSETAW, (char *)&ttold);
+#endif
(void) close(fd);
#ifdef not_defined /* Print out the response for debugging */
Attachment:
signature.asc
Description: Digital signature