File:  [Power 6/32 Unix Tahoe 4.2BSD] / cci / usr / src / ucb / talk / ctl_transact.c
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs
Sun Jul 28 12:29:26 2019 UTC (7 years ago) by root
Branches: bsd, MAIN
CVS tags: v121, HEAD
Power 6/32 Unix version 1.21

#include "talk_ctl.h"
#include <sys/time.h>

#define CTL_WAIT 2	/* the amount of time to wait for a 
			   response, in seconds */


int 	tonetmsg();
int	tonetresp();
int	frnetresp();
int	vaxbyteorder;
int	debug;

    /*
     * SOCKDGRAM is unreliable, so we must repeat messages if we have
     * not recieved an acknowledgement within a reasonable amount
     * of time
     */

ctl_transact(target, msg, type, response)
struct in_addr target;
CTL_MSG msg;
int type;
CTL_RESPONSE *response;
{
    struct sockaddr junk;
    int read_mask;
    int ctl_mask;
    int nready;
    int cc;
    int junk_size;
    struct timeval wait;

    NETCTL_MSG netmsg;		/* for conversion to net format */
    NETCTL_RESPONSE netresp;

    wait.tv_sec = CTL_WAIT;
    wait.tv_usec = 0;

    msg.ctlm_type = type;

    daemon_addr.sin_addr = target;
    daemon_addr.sin_port = daemon_port;

    ctl_mask = 1 << ctl_sockt;

    /*
     * keep sending the message until a response of the right
     * type is obtained
     */

    if (debug) {
	printf("send to this daemon" );
	print_addr(daemon_addr);
	print_request(&msg);
    }

    tonetmsg(&msg, &netmsg, vaxbyteorder);
    do {
	    /* keep sending the message until a response is obtained */

	do {

	    cc = sendto(ctl_sockt, (char *)&netmsg, sizeof(netmsg), 0,
			&daemon_addr, sizeof(daemon_addr));

	    if (cc != sizeof(netmsg)) {
		if (errno == EINTR) {
			/* we are returning from an interupt */
		    continue;
		} else {
		    p_error("Error on write to talk daemon");
		}
	    }

	    read_mask = ctl_mask;

	    while ((nready = select(32, &read_mask, 0, 0, &wait)) < 0) {
		if (errno == EINTR) {
			/* we are returning from an interupt */
		    continue;
		} else {
		    p_error("Error on waiting for response from daemon");
		}
	    }
	} while (nready == 0);

	    /* keep reading while there are queued messages 
	       (this is not necessary, it just saves extra
	       request/acknowledgements being sent)
	     */

	do {

	    junk_size = sizeof(junk);
	    cc = recvfrom(ctl_sockt, (char *) &netresp,
			   sizeof(netresp), 0, &junk, &junk_size );
	    if (cc < 0) {
		if (errno == EINTR) {
		    continue;
		}
		if (debug) {
			printf("ctl_sockt %d, cc %d\n", ctl_sockt, cc);
			pause();
		}
		p_error("Error on read from talk daemon");
	    }
	    frnetresp(&netresp, response);
	    if (debug) {
		printf("  ");
		print_response(response);
	    }

	    read_mask = ctl_mask;

		/* an immediate poll */

	    timerclear(&wait);
	    nready = select(32, &read_mask, 0, 0, &wait);

	} while ( nready > 0 && response->ctlr_type != type);

    } while (response->ctlr_type != type);
}

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.