do i = write(sock, buffer, strlen(buffer)); while (i == -1 && errno == EINTR); if (i == -1) {
i = 0; while(i < strlen(buffer)) { int j; j = write(sock, buffer+i, (strlen(buffer+i))); if (j < 0 && errno != EINTR) {
get_rfc1413(int sock, const struct sockaddr_in *our_sin,	  const struct sockaddr_in *rmt_sin, char user[256], server_rec *srv){    struct sockaddr_in rmt_query_sin, our_query_sin;    unsigned int rmt_port, our_port;    int i;    char *cp;    char buffer[RFC1413_MAXDATA+1];    /*     * Bind the local and remote ends of the query socket to the same     * IP addresses as the connection under investigation. We go     * through all this trouble because the local or remote system     * might have more than one network address. The RFC1413 etc.     * client sends only port numbers; the server takes the IP     * addresses from the query socket.     */    our_query_sin = *our_sin;    our_query_sin.sin_port = htons(ANY_PORT);    rmt_query_sin = *rmt_sin;    rmt_query_sin.sin_port = htons(RFC1413_PORT);    if (bind(sock, (struct sockaddr *)&our_query_sin,	     sizeof(struct sockaddr_in)) < 0)    {	log_unixerr("bind", NULL, "rfc1413: Error binding to local port", srv);	return -1;    }/* * errors from connect usually imply the remote machine doesn't support * the service */    if (connect(sock, (struct sockaddr *)&rmt_query_sin,		sizeof(struct sockaddr_in)) < 0)	return -1;/* send the data */    ap_snprintf(buffer, sizeof(buffer), "%u,%u\r\n", ntohs(rmt_sin->sin_port),	    ntohs(our_sin->sin_port));    do i = write(sock, buffer, strlen(buffer));    while (i == -1 && errno == EINTR);    if (i == -1)    {	log_unixerr("write", NULL, "rfc1413: error sending request", srv);	return -1;    }    /*     * Read response from server. We assume that all the data     * comes in a single packet.     */        do i = read(sock, buffer, RFC1413_MAXDATA);    while (i == -1 && errno == EINTR);    if (i == -1)    {	log_unixerr("read", NULL, "rfc1413: error reading response", srv);	return -1;    }    buffer[i] = '\0';/* RFC1413_USERLEN = 512 */    if (sscanf(buffer, "%u , %u : USERID :%*[^:]:%512s", &rmt_port, &our_port,	       user) != 3 || ntohs(rmt_sin->sin_port) != rmt_port	|| ntohs(our_sin->sin_port) != our_port) return -1;    /*     * Strip trailing carriage return. It is part of the     * protocol, not part of the data.     */        if ((cp = strchr(user, '\r'))) *cp = '\0';    return 0;}