first cut at new makefile; file reorg, new depend
[unix-history] / usr / src / usr.bin / telnet / sys_bsd.c
index 6adb259..e4b2bbc 100644 (file)
@@ -1,3 +1,24 @@
+/*
+ * Copyright (c) 1988 Regents of the University of California.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms are permitted
+ * provided that the above copyright notice and this paragraph are
+ * duplicated in all such forms and that any documentation,
+ * advertising materials, and other materials related to such
+ * distribution and use acknowledge that the software was developed
+ * by the University of California, Berkeley.  The name of the
+ * University may not be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
+ * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+ */
+
+#ifndef lint
+static char sccsid[] = "@(#)sys_bsd.c  1.17 (Berkeley) %G%";
+#endif /* not lint */
+
 /*
  * The following routines try to encapsulate what is system dependent
  * (at least between 4.x and dos) which is used in telnet.c.
 /*
  * The following routines try to encapsulate what is system dependent
  * (at least between 4.x and dos) which is used in telnet.c.
@@ -5,6 +26,7 @@
 
 #if    defined(unix)
 
 
 #if    defined(unix)
 
+#include <fcntl.h>
 #include <sys/ioctl.h>
 #include <sys/types.h>
 #include <sys/time.h>
 #include <sys/ioctl.h>
 #include <sys/types.h>
 #include <sys/time.h>
 int
        tout,                   /* Output file descriptor */
        tin,                    /* Input file descriptor */
 int
        tout,                   /* Output file descriptor */
        tin,                    /* Input file descriptor */
-       net,
-       HaveInput;              /* There is input available to scan */
-
-#if    defined(TN3270)
-static char    tline[200];
-char   *transcom = 0;  /* transparent mode command (default: none) */
-#endif /* defined(TN3270) */
+       net;
 
 static struct  tchars otc = { 0 }, ntc = { 0 };
 static struct  ltchars oltc = { 0 }, nltc = { 0 };
 
 static struct  tchars otc = { 0 }, ntc = { 0 };
 static struct  ltchars oltc = { 0 }, nltc = { 0 };
@@ -202,7 +218,7 @@ register int f;
                sb.sg_flags |= ECHO|CRMOD;
            }
            sb.sg_erase = sb.sg_kill = -1;
                sb.sg_flags |= ECHO|CRMOD;
            }
            sb.sg_erase = sb.sg_kill = -1;
-           if (f == 6) {
+           if (localflow || (f == 6)) {
                tc = &tc3;
                tc3 = notc;
                    /* get XON, XOFF characters */
                tc = &tc3;
                tc3 = notc;
                    /* get XON, XOFF characters */
@@ -270,7 +286,7 @@ register int f;
     ioctl(tout, FIONBIO, (char *)&onoff);
 #endif /* (!defined(TN3270)) || ((!defined(NOT43)) || defined(PUTCHAR)) */
 #if    defined(TN3270)
     ioctl(tout, FIONBIO, (char *)&onoff);
 #endif /* (!defined(TN3270)) || ((!defined(NOT43)) || defined(PUTCHAR)) */
 #if    defined(TN3270)
-    if (noasynch == 0) {
+    if (noasynchtty == 0) {
        ioctl(tin, FIOASYNC, (char *)&onoff);
     }
 #endif /* defined(TN3270) */
        ioctl(tin, FIOASYNC, (char *)&onoff);
     }
 #endif /* defined(TN3270) */
@@ -278,19 +294,59 @@ register int f;
     if (MODE_LINE(f)) {
        void doescape();
 
     if (MODE_LINE(f)) {
        void doescape();
 
-       signal(SIGTSTP, doescape);
+       (void) signal(SIGTSTP, (int (*)())doescape);
     } else if (MODE_LINE(old)) {
     } else if (MODE_LINE(old)) {
-       signal(SIGTSTP, SIG_DFL);
+       (void) signal(SIGTSTP, SIG_DFL);
        sigsetmask(sigblock(0) & ~(1<<(SIGTSTP-1)));
     }
 }
 
        sigsetmask(sigblock(0) & ~(1<<(SIGTSTP-1)));
     }
 }
 
+void
+TerminalSpeeds(ispeed, ospeed)
+long *ispeed;
+long *ospeed;
+{
+    /*
+     * The order here is important.  The index of each speed needs to
+     * correspond with the sgtty structure value for that speed.
+     *
+     * Additionally, the search algorithm assumes the table is in
+     * ascending sequence.
+     */
+    static int ttyspeeds[] = {
+           0, 50, 75, 110, 134, 150, 200, 300,
+           600, 1200, 1800, 2400, 4800, 9600, 19200, 38400 };
+#define NUMSPEEDS sizeof ttyspeeds/sizeof ttyspeeds[0]
+
+    if ((ottyb.sg_ospeed < 0) || (ottyb.sg_ospeed > NUMSPEEDS) ||
+       (ottyb.sg_ispeed < 0) || (ottyb.sg_ispeed > NUMSPEEDS)) {
+       ExitString("Invalid terminal speed.");
+       /*NOTREACHED*/
+    } else {
+       *ispeed = ttyspeeds[ottyb.sg_ispeed];
+       *ospeed = ttyspeeds[ottyb.sg_ospeed];
+    }
+}
 
 int
 
 int
-NetClose(net)
-int    net;
+TerminalWindowSize(rows, cols)
+long *rows, *cols;
 {
 {
-    return close(net);
+    struct winsize ws;
+
+    if (ioctl(fileno(stdin), TIOCGWINSZ, (char *)&ws) < 0) {
+       return 0;
+    }
+    *rows = ws.ws_row;
+    *cols = ws.ws_col;
+    return 1;
+}
+
+int
+NetClose(fd)
+int    fd;
+{
+    return close(fd);
 }
 
 
 }
 
 
@@ -303,6 +359,7 @@ int
     ioctl(fd, FIONBIO, (char *)&onoff);
 }
 
     ioctl(fd, FIONBIO, (char *)&onoff);
 }
 
+#if    defined(TN3270)
 void
 NetSigIO(fd, onoff)
 int
 void
 NetSigIO(fd, onoff)
 int
@@ -319,11 +376,9 @@ int fd;
     int myPid;
 
     myPid = getpid();
     int myPid;
 
     myPid = getpid();
-#if    defined(NOT43)
-    myPid = -myPid;
-#endif /* defined(NOT43) */
-    ioctl(fd, SIOCSPGRP, (char *)&myPid);      /* set my pid */
+    fcntl(fd, F_SETOWN, myPid);
 }
 }
+#endif /*defined(TN3270)*/
 \f
 /*
  * Various signal handling routines.
 \f
 /*
  * Various signal handling routines.
@@ -356,6 +411,14 @@ intr2()
     }
 }
 
     }
 }
 
+static void
+sendwin()
+{
+    if (connected) {
+       sendnaws();
+    }
+}
+
 static void
 doescape()
 {
 static void
 doescape()
 {
@@ -365,27 +428,26 @@ doescape()
 void
 sys_telnet_init()
 {
 void
 sys_telnet_init()
 {
-#if    defined(TN3270)
-    int myPid;
-#endif /* defined(TN3270) */
-
-    signal(SIGINT, intr);
-    signal(SIGQUIT, intr2);
-    signal(SIGPIPE, deadpeer);
+    (void) signal(SIGINT, (int (*)())intr);
+    (void) signal(SIGQUIT, (int (*)())intr2);
+    (void) signal(SIGPIPE, (int (*)())deadpeer);
+    (void) signal(SIGWINCH, (int (*)())sendwin);
 
     setconnmode();
 
     NetNonblockingIO(net, 1);
 
 #if    defined(TN3270)
 
     setconnmode();
 
     NetNonblockingIO(net, 1);
 
 #if    defined(TN3270)
-    if (noasynch == 0) {                       /* DBX can't handle! */
+    if (noasynchnet == 0) {                    /* DBX can't handle! */
        NetSigIO(net, 1);
        NetSetPgrp(net);
     }
 #endif /* defined(TN3270) */
 
 #if    defined(SO_OOBINLINE)
        NetSigIO(net, 1);
        NetSetPgrp(net);
     }
 #endif /* defined(TN3270) */
 
 #if    defined(SO_OOBINLINE)
-    SetSockOpt(net, SOL_SOCKET, SO_OOBINLINE, 1);
+    if (SetSockOpt(net, SOL_SOCKET, SO_OOBINLINE, 1) == -1) {
+       perror("SetSockOpt");
+    }
 #endif /* defined(SO_OOBINLINE) */
 }
 
 #endif /* defined(SO_OOBINLINE) */
 }