home *** CD-ROM | disk | FTP | other *** search
/ Il CD di internet / CD.iso / SOURCE / N / TCPIP / NETKIT-B.05 / NETKIT-B / NetKit-B-0.05 / talk / look_up.c < prev    next >
Encoding:
C/C++ Source or Header  |  1993-12-17  |  3.8 KB  |  117 lines

  1. /*
  2.  * Copyright (c) 1983 Regents of the University of California.
  3.  * 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[] = "from: @(#)look_up.c    5.7 (Berkeley) 3/1/91";*/
  36. static char rcsid[] = "$Id: look_up.c,v 1.2 1993/08/01 18:07:47 mycroft Exp $";
  37. #endif /* not lint */
  38.  
  39. #include <sys/types.h>
  40. #include <sys/socket.h>
  41. #include <netinet/in.h>
  42. #include <protocols/talkd.h>
  43. #include <errno.h>
  44. #include "talk_ctl.h"
  45. #include "talk.h"
  46.  
  47. /*
  48.  * See if the local daemon has an invitation for us.
  49.  */
  50. check_local()
  51. {
  52.     CTL_RESPONSE response;
  53.     register CTL_RESPONSE *rp = &response;
  54.  
  55.     /* the rest of msg was set up in get_names */
  56. #ifdef MSG_EOR
  57.     /* copy new style sockaddr to old, swap family (short in old) */
  58.     msg.ctl_addr = *(struct osockaddr *)&ctl_addr;
  59.     msg.ctl_addr.sa_family = htons(ctl_addr.sin_family);
  60. #else
  61.     msg.ctl_addr = *(struct sockaddr *)&ctl_addr;
  62. #endif
  63.     /* must be initiating a talk */
  64.     if (!look_for_invite(rp))
  65.         return (0);
  66.     /*
  67.      * There was an invitation waiting for us, 
  68.      * so connect with the other (hopefully waiting) party 
  69.      */
  70.     current_state = "Waiting to connect with caller";
  71.     do {
  72.         if (rp->addr.sa_family != AF_INET)
  73.             p_error("Response uses invalid network address");
  74.         errno = 0;
  75.         if (connect(sockt,
  76.             (struct sockaddr *)&rp->addr, sizeof (rp->addr)) != -1)
  77.             return (1);
  78.     } while (errno == EINTR);
  79.     if (errno == ECONNREFUSED) {
  80.         /*
  81.          * The caller gave up, but his invitation somehow
  82.          * was not cleared. Clear it and initiate an 
  83.          * invitation. (We know there are no newer invitations,
  84.          * the talkd works LIFO.)
  85.          */
  86.         ctl_transact(his_machine_addr, msg, DELETE, rp);
  87.         close(sockt);
  88.         open_sockt();
  89.         return (0);
  90.     }
  91.     p_error("Unable to connect with initiator");
  92.     /*NOTREACHED*/
  93. }
  94.  
  95. /*
  96.  * Look for an invitation on 'machine'
  97.  */
  98. look_for_invite(rp)
  99.     CTL_RESPONSE *rp;
  100. {
  101.     struct in_addr machine_addr;
  102.  
  103.     current_state = "Checking for invitation on caller's machine";
  104.     ctl_transact(his_machine_addr, msg, LOOK_UP, rp);
  105.     /* the switch is for later options, such as multiple invitations */
  106.     switch (rp->answer) {
  107.  
  108.     case SUCCESS:
  109.         msg.id_num = htonl(rp->id_num);
  110.         return (1);
  111.  
  112.     default:
  113.         /* there wasn't an invitation waiting for us */
  114.         return (0);
  115.     }
  116. }
  117.