|
|
1.1 ! root 1: #include "talk_ctl.h" ! 2: #include <sys/time.h> ! 3: ! 4: #define CTL_WAIT 2 /* the amount of time to wait for a ! 5: response, in seconds */ ! 6: ! 7: ! 8: int tonetmsg(); ! 9: int tonetresp(); ! 10: int frnetresp(); ! 11: int vaxbyteorder; ! 12: int debug; ! 13: ! 14: /* ! 15: * SOCKDGRAM is unreliable, so we must repeat messages if we have ! 16: * not recieved an acknowledgement within a reasonable amount ! 17: * of time ! 18: */ ! 19: ! 20: ctl_transact(target, msg, type, response) ! 21: struct in_addr target; ! 22: CTL_MSG msg; ! 23: int type; ! 24: CTL_RESPONSE *response; ! 25: { ! 26: struct sockaddr junk; ! 27: int read_mask; ! 28: int ctl_mask; ! 29: int nready; ! 30: int cc; ! 31: int junk_size; ! 32: struct timeval wait; ! 33: ! 34: NETCTL_MSG netmsg; /* for conversion to net format */ ! 35: NETCTL_RESPONSE netresp; ! 36: ! 37: wait.tv_sec = CTL_WAIT; ! 38: wait.tv_usec = 0; ! 39: ! 40: msg.ctlm_type = type; ! 41: ! 42: daemon_addr.sin_addr = target; ! 43: daemon_addr.sin_port = daemon_port; ! 44: ! 45: ctl_mask = 1 << ctl_sockt; ! 46: ! 47: /* ! 48: * keep sending the message until a response of the right ! 49: * type is obtained ! 50: */ ! 51: ! 52: if (debug) { ! 53: printf("send to this daemon" ); ! 54: print_addr(daemon_addr); ! 55: print_request(&msg); ! 56: } ! 57: ! 58: tonetmsg(&msg, &netmsg, vaxbyteorder); ! 59: do { ! 60: /* keep sending the message until a response is obtained */ ! 61: ! 62: do { ! 63: ! 64: cc = sendto(ctl_sockt, (char *)&netmsg, sizeof(netmsg), 0, ! 65: &daemon_addr, sizeof(daemon_addr)); ! 66: ! 67: if (cc != sizeof(netmsg)) { ! 68: if (errno == EINTR) { ! 69: /* we are returning from an interupt */ ! 70: continue; ! 71: } else { ! 72: p_error("Error on write to talk daemon"); ! 73: } ! 74: } ! 75: ! 76: read_mask = ctl_mask; ! 77: ! 78: while ((nready = select(32, &read_mask, 0, 0, &wait)) < 0) { ! 79: if (errno == EINTR) { ! 80: /* we are returning from an interupt */ ! 81: continue; ! 82: } else { ! 83: p_error("Error on waiting for response from daemon"); ! 84: } ! 85: } ! 86: } while (nready == 0); ! 87: ! 88: /* keep reading while there are queued messages ! 89: (this is not necessary, it just saves extra ! 90: request/acknowledgements being sent) ! 91: */ ! 92: ! 93: do { ! 94: ! 95: junk_size = sizeof(junk); ! 96: cc = recvfrom(ctl_sockt, (char *) &netresp, ! 97: sizeof(netresp), 0, &junk, &junk_size ); ! 98: if (cc < 0) { ! 99: if (errno == EINTR) { ! 100: continue; ! 101: } ! 102: if (debug) { ! 103: printf("ctl_sockt %d, cc %d\n", ctl_sockt, cc); ! 104: pause(); ! 105: } ! 106: p_error("Error on read from talk daemon"); ! 107: } ! 108: frnetresp(&netresp, response); ! 109: if (debug) { ! 110: printf(" "); ! 111: print_response(response); ! 112: } ! 113: ! 114: read_mask = ctl_mask; ! 115: ! 116: /* an immediate poll */ ! 117: ! 118: timerclear(&wait); ! 119: nready = select(32, &read_mask, 0, 0, &wait); ! 120: ! 121: } while ( nready > 0 && response->ctlr_type != type); ! 122: ! 123: } while (response->ctlr_type != type); ! 124: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.