BSD 4_3_Reno release
[unix-history] / usr / src / usr.bin / telnet / network.c
index 92cf5d8..204f3ee 100644 (file)
@@ -1,3 +1,26 @@
+/*
+ * Copyright (c) 1988 Regents of the University of California.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms are permitted provided
+ * that: (1) source distributions retain this entire copyright notice and
+ * comment, and (2) distributions including binaries display the following
+ * acknowledgement:  ``This product includes software developed by the
+ * University of California, Berkeley and its contributors'' in the
+ * documentation or other materials provided with the distribution and in
+ * all advertising materials mentioning features or use of this software.
+ * Neither the name of the University nor the names of its contributors may
+ * 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
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+ */
+
+#ifndef lint
+static char sccsid[] = "@(#)network.c  1.15 (Berkeley) 6/28/90";
+#endif /* not lint */
+
 #include <sys/types.h>
 #include <sys/socket.h>
 #include <sys/time.h>
 #include <sys/types.h>
 #include <sys/socket.h>
 #include <sys/time.h>
@@ -10,6 +33,7 @@
 
 #include "defines.h"
 #include "externs.h"
 
 #include "defines.h"
 #include "externs.h"
+#include "fdset.h"
 
 Ring   netoring, netiring;
 char   netobuf[2*BUFSIZ], netibuf[BUFSIZ];
 
 Ring   netoring, netiring;
 char   netobuf[2*BUFSIZ], netibuf[BUFSIZ];
@@ -20,8 +44,12 @@ char netobuf[2*BUFSIZ], netibuf[BUFSIZ];
 
 init_network()
 {
 
 init_network()
 {
-    ring_init(&netoring, netobuf, sizeof netobuf);
-    ring_init(&netiring, netibuf, sizeof netibuf);
+    if (ring_init(&netoring, netobuf, sizeof netobuf) != 1) {
+       exit(1);
+    }
+    if (ring_init(&netiring, netibuf, sizeof netibuf) != 1) {
+       exit(1);
+    }
     NetTrace = stdout;
 }
 
     NetTrace = stdout;
 }
 
@@ -46,7 +74,8 @@ stilloob()
 
     if (value < 0) {
        perror("select");
 
     if (value < 0) {
        perror("select");
-       quit();
+       (void) quit();
+       /* NOTREACHED */
     }
     if (FD_ISSET(net, &excepts)) {
        return 1;
     }
     if (FD_ISSET(net, &excepts)) {
        return 1;
@@ -82,9 +111,9 @@ setneturg()
 int
 netflush()
 {
 int
 netflush()
 {
-    int n;
+    register int n, n1;
 
 
-    if ((n = ring_full_consecutive(&netoring)) > 0) {
+    if ((n1 = n = ring_full_consecutive(&netoring)) > 0) {
        if (!ring_at_mark(&netoring)) {
            n = send(net, netoring.consume, n, 0);      /* normal write */
        } else {
        if (!ring_at_mark(&netoring)) {
            n = send(net, netoring.consume, n, 0);      /* normal write */
        } else {
@@ -103,7 +132,7 @@ netflush()
        if (errno != ENOBUFS && errno != EWOULDBLOCK) {
            setcommandmode();
            perror(hostname);
        if (errno != ENOBUFS && errno != EWOULDBLOCK) {
            setcommandmode();
            perror(hostname);
-           NetClose(net);
+           (void)NetClose(net);
            ring_clear_mark(&netoring);
            longjmp(peerdied, -1);
            /*NOTREACHED*/
            ring_clear_mark(&netoring);
            longjmp(peerdied, -1);
            /*NOTREACHED*/
@@ -113,6 +142,17 @@ netflush()
     if (netdata && n) {
        Dump('>', netoring.consume, n);
     }
     if (netdata && n) {
        Dump('>', netoring.consume, n);
     }
-    ring_consumed(&netoring, n);
-    return n > 0;
+    if (n) {
+       ring_consumed(&netoring, n);
+       /*
+        * If we sent all, and more to send, then recurse to pick
+        * up the other half.
+        */
+       if ((n1 == n) && ring_full_consecutive(&netoring)) {
+           (void) netflush();
+       }
+       return 1;
+    } else {
+       return 0;
+    }
 }
 }