|
|
1.1 ! root 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 are permitted ! 6: * provided that: (1) source distributions retain this entire copyright ! 7: * notice and comment, and (2) distributions including binaries display ! 8: * the following acknowledgement: ``This product includes software ! 9: * developed by the University of California, Berkeley and its contributors'' ! 10: * in the documentation or other materials provided with the distribution ! 11: * and in all advertising materials mentioning features or use of this ! 12: * software. Neither the name of the University nor the names of its ! 13: * contributors may be used to endorse or promote products derived ! 14: * from this software without specific prior written permission. ! 15: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR ! 16: * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED ! 17: * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. ! 18: */ ! 19: ! 20: #ifndef lint ! 21: static char sccsid[] = "@(#)look_up.c 5.6 (Berkeley) 6/1/90"; ! 22: #endif /* not lint */ ! 23: ! 24: #include "talk_ctl.h" ! 25: ! 26: /* ! 27: * See if the local daemon has an invitation for us. ! 28: */ ! 29: check_local() ! 30: { ! 31: CTL_RESPONSE response; ! 32: register CTL_RESPONSE *rp = &response; ! 33: ! 34: /* the rest of msg was set up in get_names */ ! 35: #ifdef MSG_EOR ! 36: /* copy new style sockaddr to old, swap family (short in old) */ ! 37: msg.ctl_addr = *(struct osockaddr *)&ctl_addr; ! 38: msg.ctl_addr.sa_family = htons(ctl_addr.sin_family); ! 39: #else ! 40: msg.ctl_addr = *(struct sockaddr *)&ctl_addr; ! 41: #endif ! 42: /* must be initiating a talk */ ! 43: if (!look_for_invite(rp)) ! 44: return (0); ! 45: /* ! 46: * There was an invitation waiting for us, ! 47: * so connect with the other (hopefully waiting) party ! 48: */ ! 49: current_state = "Waiting to connect with caller"; ! 50: do { ! 51: if (rp->addr.sa_family != AF_INET) ! 52: p_error("Response uses invalid network address"); ! 53: errno = 0; ! 54: if (connect(sockt, &rp->addr, sizeof (rp->addr)) != -1) ! 55: return (1); ! 56: } while (errno == EINTR); ! 57: if (errno == ECONNREFUSED) { ! 58: /* ! 59: * The caller gave up, but his invitation somehow ! 60: * was not cleared. Clear it and initiate an ! 61: * invitation. (We know there are no newer invitations, ! 62: * the talkd works LIFO.) ! 63: */ ! 64: ctl_transact(his_machine_addr, msg, DELETE, rp); ! 65: close(sockt); ! 66: open_sockt(); ! 67: return (0); ! 68: } ! 69: p_error("Unable to connect with initiator"); ! 70: /*NOTREACHED*/ ! 71: } ! 72: ! 73: /* ! 74: * Look for an invitation on 'machine' ! 75: */ ! 76: look_for_invite(rp) ! 77: CTL_RESPONSE *rp; ! 78: { ! 79: struct in_addr machine_addr; ! 80: ! 81: current_state = "Checking for invitation on caller's machine"; ! 82: ctl_transact(his_machine_addr, msg, LOOK_UP, rp); ! 83: /* the switch is for later options, such as multiple invitations */ ! 84: switch (rp->answer) { ! 85: ! 86: case SUCCESS: ! 87: msg.id_num = htonl(rp->id_num); ! 88: return (1); ! 89: ! 90: default: ! 91: /* there wasn't an invitation waiting for us */ ! 92: return (0); ! 93: } ! 94: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.