* if p == 0, it is a 2 byte header */
* (if it is a two-byte header, then p == 0) */
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;		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))			{			/* len=len; */			s->s2->three_byte_header=0;			p=0;			}		else /* 3 byte header */			{			/*len=len; */			p=(j%bs);			p=(p == 0)?0:(bs-p);			if (s->s2->escape)				s->s2->three_byte_header=1;			else				s->s2->three_byte_header=(p == 0)?0:1;			}		}	/* 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 p == 0, it is a 2 byte header */	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);#ifdef PURIFY	if (p)		memset(&(s->s2->wact_data[len]),0,p);#endif	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));	}