void ssl_getline(const struct vsf_session* p_sess, struct mystr* p_str, char end_char, char* p_buf, unsigned int buflen) { char* p_buf_start = p_buf; p_buf[buflen - 1] = '\0'; buflen--; while (1) { int retval = SSL_read(p_sess->p_control_ssl, p_buf, buflen); if (retval <= 0) { die("SSL_read"); } p_buf[retval] = '\0'; buflen -= retval; if (p_buf[retval - 1] == end_char || buflen == 0) { break; } p_buf += retval; } str_alloc_alt_term(p_str, p_buf_start, end_char); }
void str_netfd_alloc(struct vsf_session* p_sess, struct mystr* p_str, char term, char* p_readbuf, unsigned int maxlen, str_netfd_read_t p_peekfunc, str_netfd_read_t p_readfunc) { int retval; unsigned int bytes_read; unsigned int i; char* p_readpos = p_readbuf; unsigned int left = maxlen; while (1) { if (p_readpos + left != p_readbuf + maxlen) { bug("poor buffer accounting in str_netfd_alloc"); } /* Did we hit the max? */ if (left == 0) { str_empty(p_str); return; } retval = (*p_peekfunc)(p_sess, p_readpos, left); if (vsf_sysutil_retval_is_error(retval)) { die("vsf_sysutil_recv_peek"); } else if (retval == 0) { die("vsf_sysutil_recv_peek: no data"); } bytes_read = (unsigned int) retval; /* Search for the terminator */ for (i=0; i < bytes_read; i++) { if (p_readpos[i] == term) { /* Got it! */ retval = (*p_readfunc)(p_sess, p_readpos, i + 1); if (vsf_sysutil_retval_is_error(retval) || (unsigned int) retval != i + 1) { die("vsf_sysutil_read_loop"); } if (p_readpos[i] != term) { die("missing terminator in str_netfd_alloc"); } str_alloc_alt_term(p_str, p_readbuf, term); return; } } /* Not found in this read chunk, so consume the data and re-loop */ if (bytes_read > left) { bug("bytes_read > left in str_netfd_alloc"); } left -= bytes_read; retval = (*p_readfunc)(p_sess, p_readpos, bytes_read); if (vsf_sysutil_retval_is_error(retval) || (unsigned int) retval != bytes_read) { die("vsf_sysutil_read_loop"); } p_readpos += bytes_read; } /* END: while(1) */ }