$NetBSD: patch-af,v 1.1.1.1 2002/01/12 18:34:56 bouyer Exp $

--- modem.c.orig	Tue Feb 13 10:39:23 2001
+++ modem.c	Sat Jan 12 19:27:52 2002
@@ -32,7 +32,6 @@
 #include <sgtty.h>
 #else
 #ifdef USE_TERMIOS
-#include <sys/ioctl.h>
 #include <termios.h>
 #else
 #include <termio.h>
@@ -44,6 +43,11 @@
 #ifdef USE_SYSLOG
 #include <syslog.h>
 #endif /* USE_SYSLOG */
+#ifdef __STDC__
+#include <stdarg.h>
+#else
+#include <varargs.h>
+#endif
 
 #include "demon.h"
 #include "globald.h"
@@ -87,55 +91,56 @@
 #endif
 }
 
-/* Syslog or not syslog ? */
-#ifdef USE_SYSLOG
-void log_debug (fmt, p1, p2, p3, p4, p5, p6, p7)
-char *fmt;
-int  p1, p2, p3, p4, p5, p6, p7;
-{
-    char msg[256];
-
-    sprintf (msg, fmt, p1, p2, p3, p4, p5, p6, p7);
-    syslog (LOG_INFO, msg);
-}
-
-void log_err (s)
-char *s;
-{
-    syslog (LOG_ERR, s);
-}
+#ifdef __STDC__
+void log_debug(const char *fmt, ...)
 #else
-void log_debug (fmt, p1, p2, p3, p4, p5, p6, p7)
-char *fmt;
-int  p1, p2, p3, p4, p5, p6, p7;
+void log_debug(va_alist)
+    va_dcl
+#endif
 {
+    va_list ap;
+#ifdef __STDC__
+    va_start(ap, fmt);
+#else
+    const char *fmt;
+    va_start(ap);
+    fmt = va_arg(ap, const char *);
+#endif
+#ifdef USE_SYSLOG
+    vsyslog(LOG_INFO, fmt, ap);
+#else
     fprintf (fp_console, "%s[%d] ", prefix, getpid());
-    fprintf (fp_console, fmt, p1, p2, p3, p4, p5, p6, p7);
+    vfprintf (fp_console, fmt, ap);
     fprintf (fp_console, "\n\r");
+#endif
+    va_end(ap);
 }
 
-void log_err (s)
-char *s;
+#ifdef __STDC__
+void log_err(const char *fmt, ...)
+#else
+void log_err(va_alist)
+    va_dcl
+#endif
 {
+    va_list ap;
+#ifdef __STDC__
+    va_start(ap, fmt);
+#else
+    const char *fmt;
+    va_start(ap);
+    fmt = va_arg(ap, const char *);
+#endif
+#ifdef USE_SYSLOG
+    vsyslog(LOG_ERR, fmt, ap);
+#else
     fprintf (fp_console, "%s[%d] ", prefix, getpid());
-
-    while (*s) {
-      if (*s != '%')
-	fputc (*s, fp_console);
-      else if (*(s+1) == 'm') {
-	fprintf (fp_console, "%s", sys_errlist[errno]);
-	s++;
-      }
-
-      s++;
-    }
-
+    vfprintf (fp_console, fmt, ap);
     fprintf (fp_console, "\n\r");
+#endif
+    va_end(ap);
 }
 
-#endif /* USE_SYSLOG */
-
-
 /*  Envoi d'une commande MODEM */
 static void writemodem (fd, buf, n)
 int fd;
@@ -165,8 +170,10 @@
 #else
 
 #ifdef USE_TERMIOS
-  ioctl (fd, TIOCGETA, &term);
-  memcpy ((char *)&term_sauve, (char *)&term, sizeof(struct termios));
+  if (tcgetattr(fd, &term) < 0) {
+	log_err("tcgetattr: %s", strerror(errno));
+	exit(1);
+  }
 #else
   ioctl (fd, TCGETA, &term);
   memcpy ((char *)&term_sauve, (char *)&term, sizeof(struct termio));
@@ -174,11 +181,21 @@
 	
   /* Parametrage de la ligne */
   term.c_cc[VMIN] = 1;
+#ifdef __NetBSD__
+  term.c_cc[VTIME] = term.c_cc[VKILL] = term.c_cc[VERASE] = 0;
+  term.c_iflag = IGNBRK | IGNPAR;
+  term.c_oflag = term.c_lflag = 0;
+#else
   term.c_cc[VTIME] = 0;
   term.c_iflag &= ~(IXON|IXOFF|ICRNL);
   term.c_lflag &= ~(ICANON|ISIG|ECHO|IEXTEN);
+#endif
 
 #ifdef USE_TERMIOS
+#ifdef __NetBSD__
+  term.c_cflag = (CREAD | HUPCL | CRTSCTS);
+  cfsetspeed( &term, speed);
+#else
   /*
    * FreeBSD 1.1 (Beta) n'a pas l'air d'apprecier qu'on mette clocal
    * a 0... (blocage au premier write sur /dev/cua01)
@@ -186,6 +203,7 @@
   term.c_cflag &= ~(CSIZE|CSTOPB);
   term.c_cflag |= (CREAD|HUPCL);
   term.c_ispeed = term.c_ospeed = speed;
+#endif /*  __NetBSD__ */
 #else
   term.c_cflag &= ~(CSIZE|CBAUD|CLOCAL);
 
@@ -223,10 +241,12 @@
 #endif /* sun */
 
 #ifdef USE_TERMIOS
+#ifndef __NetBSD__
   term.c_iflag &= ~(IGNCR|ICRNL|INLCR|IMAXBEL);
   term.c_iflag |= (ISTRIP|INPCK);
   term.c_lflag &= ~(ECHOCTL|IEXTEN);
   term.c_oflag &= ~OPOST;
+#endif /* __NetBSD__ */
 #endif /* USE_TERMIOS */
 
   /* Cas du Minitel 1/2 */
@@ -235,7 +255,10 @@
 
   /* Affectation des parametres */
 #ifdef USE_TERMIOS
-  ioctl (fd, TIOCSETA, &term);
+  if (tcsetattr (fd, TCSANOW, &term) < 0) {
+	log_err("tcsetattr(1):%s", strerror(errno));
+	exit(1);
+  }
 #else
   ioctl (fd, TCSETA, &term);
 #endif /* USE_TERMIOS */
@@ -256,10 +279,11 @@
   ioctl (fd, TIOCSETP, &term_sauve);
 #else
 #ifdef USE_TERMIOS
-  term.c_ispeed = B0;
-  term.c_ospeed = B0;
-  ioctl (fd, TIOCSETAW, &term);
-  ioctl (fd, TIOCSETA, &term_sauve);
+  cfsetspeed(&term_sauve, B0);
+  if (tcsetattr (fd, TCSADRAIN, &term_sauve) < 0) {
+	log_err("tcsetattr(2):%s", strerror(errno));
+	exit(1);
+  }
 #else
   term.c_cflag &= ~CBAUD;
   term.c_cflag |= B0;
@@ -285,7 +309,7 @@
 int reply_size;
 {
     fd_set a_lire, t_a_lire;
-    int i, erreur, fin, nbread, cmodem;
+    int i, erreur, fin, nbread, cmodem = 0;
     char *pt_chat, c, *q;
 
     delai_maxi.tv_sec = tmax;
@@ -307,14 +331,20 @@
      *  (comme le Hayes Optima par exemple)...
      */
 #ifdef USE_TERMIOS
-    ioctl (fd, TCIOCGETA, &term);
+    if (tcgetattr(fd, &term) < 0) {
+	log_err("tcgetattr: %s", strerror(errno));
+	exit(1);
+    }
 #else
     ioctl (fd, TCGETA, &term);
 #endif /* USE_TERMIOS */
-    if ((term.c_cflag | CLOCAL) == 0) {
+    if ((term.c_cflag & CLOCAL) == 0) {
 	term.c_cflag |= CLOCAL;
 #ifdef USE_TERMIOS
-	ioctl (fd, TCIOCSETA, &term);
+	if (tcsetattr (fd, TCSANOW, &term) < 0) {
+		log_err("tcsetattr(3):%s", strerror(errno));
+		exit(1);
+	}
 #else
 	ioctl (fd, TCSETA, &term);
 #endif /* USE_TERMIOS */
@@ -586,13 +616,17 @@
 	fin = ((erreur != 0 || *(pt_chat-1) == 0) ? 1 : 0);
 	usleep (30000);
     }
+    sleep(3);
 
 #ifndef NO_TERMIO
     /* Repasse en controle modem */
     if (cmodem) {
 	term.c_cflag &= ~CLOCAL;
 #ifdef USE_TERMIOS
-	ioctl (fd, TCIOCSETA, &term);
+	if (tcsetattr (fd, TCSANOW, &term) < 0) {
+		log_err("tcsetattr(4):%s", strerror(errno));
+		exit(1);
+	}
 #else
 	ioctl (fd, TCSETA, &term);
 #endif /* USE_TERMIOS */
