static int do_ssl_write(SSL *s, const unsigned char *buf, unsigned int len)
	{
	unsigned int j,k,olen,p,mac_size,bs;
	register unsigned char *pp;

	olen=len;

	/* first check if there is data from an encryption waiting to
	 * be sent - it must be sent because the other end is waiting.
	 * This will happen with non-blocking IO.  We print it and then
	 * return.
	 */
	if (s->s2->wpend_len != 0) return(write_pending(s,buf,len));

	/* set mac_size to mac size */
	if (s->s2->clear_text)
		mac_size=0;
	else
		mac_size=EVP_MD_size(s->write_hash);

	/* lets set the pad p */
	if (s->s2->clear_text)
		{
		if (len > SSL2_MAX_RECORD_LENGTH_2_BYTE_HEADER)
			len=SSL2_MAX_RECORD_LENGTH_2_BYTE_HEADER;
		p=0;
		s->s2->three_byte_header=0;
		/* len=len; */
		}
	else
		{
		bs=EVP_CIPHER_CTX_block_size(s->enc_read_ctx);
		j=len+mac_size;
		/* Two-byte headers allow for a larger record length than
		 * three-byte headers, but we can't use them if we need
		 * padding or if we have to set the escape bit. */
		if ((j > SSL2_MAX_RECORD_LENGTH_3_BYTE_HEADER) &&
			(!s->s2->escape))
			{
			if (j > SSL2_MAX_RECORD_LENGTH_2_BYTE_HEADER)
				j=SSL2_MAX_RECORD_LENGTH_2_BYTE_HEADER;
			/* set k to the max number of bytes with 2
			 * byte header */
			k=j-(j%bs);
			/* how many data bytes? */
			len=k-mac_size; 
			s->s2->three_byte_header=0;
			p=0;
			}
		else if ((bs <= 1) && (!s->s2->escape))
			{
			/* j <= SSL2_MAX_RECORD_LENGTH_3_BYTE_HEADER, thus
			 * j < SSL2_MAX_RECORD_LENGTH_2_BYTE_HEADER */
			s->s2->three_byte_header=0;
			p=0;
			}
		else /* we may have to use a 3 byte header */
			{
			/* If s->s2->escape is not set, then
			 * j <= SSL2_MAX_RECORD_LENGTH_3_BYTE_HEADER, and thus
			 * j < SSL2_MAX_RECORD_LENGTH_2_BYTE_HEADER. */
			p=(j%bs);
			p=(p == 0)?0:(bs-p);
			if (s->s2->escape)
				{
				s->s2->three_byte_header=1;
				if (j > SSL2_MAX_RECORD_LENGTH_3_BYTE_HEADER)
					j=SSL2_MAX_RECORD_LENGTH_3_BYTE_HEADER;
				}
			else
				s->s2->three_byte_header=(p == 0)?0:1;
			}
		}

	/* Now
	 *      j <= SSL2_MAX_RECORD_LENGTH_2_BYTE_HEADER
	 * holds, and if s->s2->three_byte_header is set, then even
	 *      j <= SSL2_MAX_RECORD_LENGTH_3_BYTE_HEADER.
	 */

	/* mac_size is the number of MAC bytes
	 * len is the number of data bytes we are going to send
	 * p is the number of padding bytes
	 * (if it is a two-byte header, then p == 0) */

	s->s2->wlength=len;
	s->s2->padding=p;
	s->s2->mac_data= &(s->s2->wbuf[3]);
	s->s2->wact_data= &(s->s2->wbuf[3+mac_size]);
	/* we copy the data into s->s2->wbuf */
	memcpy(s->s2->wact_data,buf,len);
	if (p)
		memset(&(s->s2->wact_data[len]),0,p); /* arbitrary padding */

	if (!s->s2->clear_text)
		{
		s->s2->wact_data_length=len+p;
		ssl2_mac(s,s->s2->mac_data,1);
		s->s2->wlength+=p+mac_size;
		ssl2_enc(s,1);
		}

	/* package up the header */
	s->s2->wpend_len=s->s2->wlength;
	if (s->s2->three_byte_header) /* 3 byte header */
		{
		pp=s->s2->mac_data;
		pp-=3;
		pp[0]=(s->s2->wlength>>8)&(THREE_BYTE_MASK>>8);
		if (s->s2->escape) pp[0]|=SEC_ESC_BIT;
		pp[1]=s->s2->wlength&0xff;
		pp[2]=s->s2->padding;
		s->s2->wpend_len+=3;
		}
	else
		{
		pp=s->s2->mac_data;
		pp-=2;
		pp[0]=((s->s2->wlength>>8)&(TWO_BYTE_MASK>>8))|TWO_BYTE_BIT;
		pp[1]=s->s2->wlength&0xff;
		s->s2->wpend_len+=2;
		}
	s->s2->write_ptr=pp;
	
	INC32(s->s2->write_sequence); /* expect next number */

	/* lets try to actually write the data */
	s->s2->wpend_tot=olen;
	s->s2->wpend_buf=buf;

	s->s2->wpend_ret=len;

	s->s2->wpend_off=0;
	return(write_pending(s,buf,olen));
	}
static int do_ssl_write(SSL *s, const unsigned char *buf, unsigned int len)
	{
	unsigned int j,k,olen,p,mac_size,bs;
	register unsigned char *pp;

	olen=len;

	 
	if (s->s2->wpend_len != 0) return(write_pending(s,buf,len));

	 
	if (s->s2->clear_text)
		mac_size=0;
	else
		mac_size=EVP_MD_size(s->write_hash);

	 
	if (s->s2->clear_text)
		{
		if (len > SSL2_MAX_RECORD_LENGTH_2_BYTE_HEADER)
			len=SSL2_MAX_RECORD_LENGTH_2_BYTE_HEADER;
		p=0;
		s->s2->three_byte_header=0;
		 
		}
	else
		{
		bs=EVP_CIPHER_CTX_block_size(s->enc_read_ctx);
		j=len+mac_size;
		 
		if ((j > SSL2_MAX_RECORD_LENGTH_3_BYTE_HEADER) &&
			(!s->s2->escape))
			{
			if (j > SSL2_MAX_RECORD_LENGTH_2_BYTE_HEADER)
				j=SSL2_MAX_RECORD_LENGTH_2_BYTE_HEADER;
			 
			k=j-(j%bs);
			 
			len=k-mac_size; 
			s->s2->three_byte_header=0;
			p=0;
			}
		else if ((bs <= 1) && (!s->s2->escape))
			{
			 
			s->s2->three_byte_header=0;
			p=0;
			}
		else  
			{
			 
			p=(j%bs);
			p=(p == 0)?0:(bs-p);
			if (s->s2->escape)
				{
				s->s2->three_byte_header=1;
				if (j > SSL2_MAX_RECORD_LENGTH_3_BYTE_HEADER)
					j=SSL2_MAX_RECORD_LENGTH_3_BYTE_HEADER;
				}
			else
				s->s2->three_byte_header=(p == 0)?0:1;
			}
		}

	 

	 

	s->s2->wlength=len;
	s->s2->padding=p;
	s->s2->mac_data= &(s->s2->wbuf[3]);
	s->s2->wact_data= &(s->s2->wbuf[3+mac_size]);
	 
	memcpy(s->s2->wact_data,buf,len);
	if (p)
		memset(&(s->s2->wact_data[len]),0,p);  

	if (!s->s2->clear_text)
		{
		s->s2->wact_data_length=len+p;
		ssl2_mac(s,s->s2->mac_data,1);
		s->s2->wlength+=p+mac_size;
		ssl2_enc(s,1);
		}

	 
	s->s2->wpend_len=s->s2->wlength;
	if (s->s2->three_byte_header)  
		{
		pp=s->s2->mac_data;
		pp-=3;
		pp[0]=(s->s2->wlength>>8)&(THREE_BYTE_MASK>>8);
		if (s->s2->escape) pp[0]|=SEC_ESC_BIT;
		pp[1]=s->s2->wlength&0xff;
		pp[2]=s->s2->padding;
		s->s2->wpend_len+=3;
		}
	else
		{
		pp=s->s2->mac_data;
		pp-=2;
		pp[0]=((s->s2->wlength>>8)&(TWO_BYTE_MASK>>8))|TWO_BYTE_BIT;
		pp[1]=s->s2->wlength&0xff;
		s->s2->wpend_len+=2;
		}
	s->s2->write_ptr=pp;
	
	INC32(s->s2->write_sequence);  

	 
	s->s2->wpend_tot=olen;
	s->s2->wpend_buf=buf;

	s->s2->wpend_ret=len;

	s->s2->wpend_off=0;
	return(write_pending(s,buf,olen));
	}