|
|
1.1 ! root 1: /* ! 2: * Copyright (c) 1983 Regents of the University of California. ! 3: * All rights reserved. The Berkeley software License Agreement ! 4: * specifies the terms and conditions for redistribution. ! 5: */ ! 6: ! 7: #ifndef lint ! 8: static char sccsid[] = "@(#)look_up.c 5.2 (Berkeley) 3/13/86"; ! 9: #endif not lint ! 10: ! 11: #include "talk_ctl.h" ! 12: ! 13: /* ! 14: * See if the local daemon has an invitation for us. ! 15: */ ! 16: check_local() ! 17: { ! 18: CTL_RESPONSE response; ! 19: register CTL_RESPONSE *rp = &response; ! 20: ! 21: /* the rest of msg was set up in get_names */ ! 22: msg.ctl_addr = *(struct sockaddr *)&ctl_addr; ! 23: msg.ctl_addr.sa_family = htons(msg.ctl_addr.sa_family); ! 24: /* must be initiating a talk */ ! 25: if (!look_for_invite(rp)) ! 26: return (0); ! 27: /* ! 28: * There was an invitation waiting for us, ! 29: * so connect with the other (hopefully waiting) party ! 30: */ ! 31: current_state = "Waiting to connect with caller"; ! 32: do { ! 33: if (rp->addr.sa_family != AF_INET) ! 34: p_error("Response uses invalid network address"); ! 35: errno = 0; ! 36: if (connect(sockt, &rp->addr, sizeof (rp->addr)) != -1) ! 37: return (1); ! 38: } while (errno == EINTR); ! 39: if (errno == ECONNREFUSED) { ! 40: /* ! 41: * The caller gave up, but his invitation somehow ! 42: * was not cleared. Clear it and initiate an ! 43: * invitation. (We know there are no newer invitations, ! 44: * the talkd works LIFO.) ! 45: */ ! 46: ctl_transact(his_machine_addr, msg, DELETE, rp); ! 47: close(sockt); ! 48: open_sockt(); ! 49: return (0); ! 50: } ! 51: p_error("Unable to connect with initiator"); ! 52: /*NOTREACHED*/ ! 53: } ! 54: ! 55: /* ! 56: * Look for an invitation on 'machine' ! 57: */ ! 58: look_for_invite(rp) ! 59: CTL_RESPONSE *rp; ! 60: { ! 61: struct in_addr machine_addr; ! 62: ! 63: current_state = "Checking for invitation on caller's machine"; ! 64: ctl_transact(his_machine_addr, msg, LOOK_UP, rp); ! 65: /* the switch is for later options, such as multiple invitations */ ! 66: switch (rp->answer) { ! 67: ! 68: case SUCCESS: ! 69: msg.id_num = htonl(rp->id_num); ! 70: return (1); ! 71: ! 72: default: ! 73: /* there wasn't an invitation waiting for us */ ! 74: return (0); ! 75: } ! 76: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.