home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 22 gnu / 22-gnu.zip / gnunet10.zip / source / telnet / network.c < prev    next >
C/C++ Source or Header  |  1995-12-08  |  5KB  |  178 lines

  1. /*
  2.  * Copyright (c) 1988, 1993
  3.  *    The Regents of the University of California.  All rights reserved.
  4.  *
  5.  * Redistribution and use in source and binary forms, with or without
  6.  * modification, are permitted provided that the following conditions
  7.  * are met:
  8.  * 1. Redistributions of source code must retain the above copyright
  9.  *    notice, this list of conditions and the following disclaimer.
  10.  * 2. Redistributions in binary form must reproduce the above copyright
  11.  *    notice, this list of conditions and the following disclaimer in the
  12.  *    documentation and/or other materials provided with the distribution.
  13.  * 3. All advertising materials mentioning features or use of this software
  14.  *    must display the following acknowledgement:
  15.  *    This product includes software developed by the University of
  16.  *    California, Berkeley and its contributors.
  17.  * 4. Neither the name of the University nor the names of its contributors
  18.  *    may be used to endorse or promote products derived from this software
  19.  *    without specific prior written permission.
  20.  *
  21.  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  22.  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  23.  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  24.  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  25.  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  26.  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  27.  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  28.  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  29.  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  30.  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  31.  * SUCH DAMAGE.
  32.  */
  33.  
  34. #ifndef lint
  35. static char sccsid[] = "@(#)network.c    8.2 (Berkeley) 12/15/93";
  36. #endif /* not lint */
  37.  
  38. #include <sys/types.h>
  39. #include <sys/socket.h>
  40. #include <sys/time.h>
  41.  
  42. #include <errno.h>
  43.  
  44. #include <arpa/telnet.h>
  45.  
  46. #include "ring.h"
  47.  
  48. #include "defines.h"
  49. #include "externs.h"
  50. #include "fdset.h"
  51.  
  52. Ring        netoring, netiring;
  53. unsigned char    netobuf[2*BUFSIZ], netibuf[BUFSIZ];
  54.  
  55. /*
  56.  * Initialize internal network data structures.
  57.  */
  58.  
  59.     void
  60. init_network()
  61. {
  62.     if (ring_init(&netoring, netobuf, sizeof netobuf) != 1) {
  63.     exit(1);
  64.     }
  65.     if (ring_init(&netiring, netibuf, sizeof netibuf) != 1) {
  66.     exit(1);
  67.     }
  68.     NetTrace = stdout;
  69. }
  70.  
  71.  
  72. /*
  73.  * Check to see if any out-of-band data exists on a socket (for
  74.  * Telnet "synch" processing).
  75.  */
  76.  
  77.     int
  78. stilloob()
  79. {
  80.     static struct timeval timeout = { 0 };
  81.     fd_set    excepts;
  82.     int value;
  83.  
  84.     do {
  85.     FD_ZERO(&excepts);
  86.     FD_SET(net, &excepts);
  87.     value = select(net+1, (fd_set *)0, (fd_set *)0, &excepts, &timeout);
  88.     } while ((value == -1) && (errno == EINTR));
  89.  
  90.     if (value < 0) {
  91.     perror("select");
  92.     (void) quit();
  93.     /* NOTREACHED */
  94.     }
  95.     if (FD_ISSET(net, &excepts)) {
  96.     return 1;
  97.     } else {
  98.     return 0;
  99.     }
  100. }
  101.  
  102.  
  103. /*
  104.  *  setneturg()
  105.  *
  106.  *    Sets "neturg" to the current location.
  107.  */
  108.  
  109.     void
  110. setneturg()
  111. {
  112.     ring_mark(&netoring);
  113. }
  114.  
  115.  
  116. /*
  117.  *  netflush
  118.  *        Send as much data as possible to the network,
  119.  *    handling requests for urgent data.
  120.  *
  121.  *        The return value indicates whether we did any
  122.  *    useful work.
  123.  */
  124.  
  125.  
  126.     int
  127. netflush()
  128. {
  129.     register int n, n1;
  130.  
  131. #ifdef    ENCRYPTION
  132.     if (encrypt_output)
  133.     ring_encrypt(&netoring, encrypt_output);
  134. #endif    /* ENCRYPTION */
  135.     if ((n1 = n = ring_full_consecutive(&netoring)) > 0) {
  136.     if (!ring_at_mark(&netoring)) {
  137.         n = send(net, (char *)netoring.consume, n, 0); /* normal write */
  138.     } else {
  139.         /*
  140.          * In 4.2 (and 4.3) systems, there is some question about
  141.          * what byte in a sendOOB operation is the "OOB" data.
  142.          * To make ourselves compatible, we only send ONE byte
  143.          * out of band, the one WE THINK should be OOB (though
  144.          * we really have more the TCP philosophy of urgent data
  145.          * rather than the Unix philosophy of OOB data).
  146.          */
  147.         n = send(net, (char *)netoring.consume, 1, MSG_OOB);/* URGENT data */
  148.     }
  149.     }
  150.     if (n < 0) {
  151.     if (errno != ENOBUFS && errno != EWOULDBLOCK) {
  152.         setcommandmode();
  153.         perror(hostname);
  154.         (void)NetClose(net);
  155.         ring_clear_mark(&netoring);
  156.         longjmp(peerdied, -1);
  157.         /*NOTREACHED*/
  158.     }
  159.     n = 0;
  160.     }
  161.     if (netdata && n) {
  162.     Dump('>', netoring.consume, n);
  163.     }
  164.     if (n) {
  165.     ring_consumed(&netoring, n);
  166.     /*
  167.      * If we sent all, and more to send, then recurse to pick
  168.      * up the other half.
  169.      */
  170.     if ((n1 == n) && ring_full_consecutive(&netoring)) {
  171.         (void) netflush();
  172.     }
  173.     return 1;
  174.     } else {
  175.     return 0;
  176.     }
  177. }
  178.