[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

yafc: Resolved FTBFS/porting for GNU/kFreeBSD.



The building of Yafc for GNU/kFreeBSD fails due to missing
<termio.h> in FreeBSD and GNU/kFreeBSD. The following patch
suggests a migration away from the obsolete <termio.h> also
on GNU/Linux, and it also implements the necessary adaptions
for GNU/kFreeBSD, due to differing ioctl-calls.

Observe also that the manpage termios(3) is inaccurate
on GNU/kFreeBSD, since it mentions the invalid constants
OLCUC and IUCLC, of which the latter has to be covered
for in the present package.

I have tested the executable 'yafc' with 'kfreebsd-i386'
and 'amd64'. It works for FTP as well as for SSH. 


Best regards,

Mats Erik Andersson, fil. dr

2459 41E9 C420 3F6D F68B  2E88 F768 4541 F25B 5D41
Description: Use termios for terminal settings.
 A migration to <termios.h> will prepare adaptions
 for GNU/kFreeBSD. The old <termio.h> is obsolete.
 .
 The ioctl-calls have different names in GNU/Linux
 and GNU/kFreeBSD, so they must be redefined.
 .
 The implementation in FreeBSD and GNU/kFreeBSD lacks
 IUCLC and OLCUC, as they are not POSIX specified.
Author: Mats Erik Andersson <debian@gisladisker.se>
Forwarded: no
Last-Update: 2010-10-29

--- yafc-1.1.1.dfsg.1/src/input.c.orig
+++ yafc-1.1.1.dfsg.1/src/input.c
@@ -76,7 +76,20 @@
 
 # include <fcntl.h> 
 # include <sys/ioctl.h> 
-# include <termio.h> 
+# include <termios.h> 
+
+# if __FreeBSD_kernel__
+#  ifndef IUCLC
+    /* Not implemented in FreeBSD 8.0!  */
+#   define IUCLC 0
+#  endif
+#  ifndef TCGETS
+#   define TCGETS TIOCGETA
+#  endif
+#  ifndef TCSETS
+#   define TCSETS TIOCGETA
+#  endif
+# endif /* __FreBSD_kernel__ */
 
 char *getpass_hook(const char *prompt)
 {
@@ -89,14 +102,14 @@
 #else
 	int c, n = 0;
 	char tmp[1024];
-	struct termio tbuf, tbufsave;
+	struct termios tbuf, tbufsave;
 	FILE *fd;
 
 	if((fd = fopen("/dev/tty", "rb")) == NULL) {
 		perror("fopen /dev/tty");
 		return NULL;
 	}
-	if (ioctl(fileno(fd), TCGETA, &tbuf) < 0) {
+	if (ioctl(fileno(fd), TCGETS, &tbuf) < 0) {
 		perror("ioctl get");
 		fclose(fd);
 		return NULL;
@@ -105,7 +118,7 @@
 	tbuf.c_iflag &= ~(IUCLC | ISTRIP | IXON | IXOFF);
 	tbuf.c_lflag &= ~(ICANON | ISIG | ECHO);
 	tbuf.c_cc[4] = 1; /* MIN */
-	if (ioctl(fileno(fd), TCSETA, &tbuf) < 0) {
+	if (ioctl(fileno(fd), TCSETS, &tbuf) < 0) {
 		perror("ioctl set");
 		fclose(fd);
 		return NULL;
@@ -132,7 +145,7 @@
 		fflush(stderr);
 	}
 	tmp[n] = '\0';
-	if (ioctl(fileno(fd), TCSETA, &tbufsave) < 0) {
+	if (ioctl(fileno(fd), TCSETS, &tbufsave) < 0) {
 		perror("ioctl restore");
 		fclose(fd);
 		return NULL;

Attachment: signature.asc
Description: Digital signature


Reply to: