Sortix cross-volatile manual
This manual documents Sortix cross-volatile. You can instead view this document in the latest official manual.
NAME
tls_read, tls_write, tls_handshake, tls_error, tls_close — use a TLS connectionSYNOPSIS
#include <tls.h>tls_read(struct tls *ctx, void *buf, size_t buflen);
tls_write(struct tls *ctx, const void *buf, size_t buflen);
tls_handshake(struct tls *ctx);
tls_error(struct tls *ctx);
tls_close(struct tls *ctx);
DESCRIPTION
tls_read() reads buflen bytes of data from the socket into buf. It returns the amount of data read.RETURN VALUES
tls_read() and tls_write() return a size on success or -1 on error.- TLS_WANT_POLLIN
- The underlying read file descriptor needs to be readable in order to continue.
- TLS_WANT_POLLOUT
- The underlying write file descriptor needs to be writeable in order to continue.
EXAMPLES
The following example demonstrates how to handle TLS writes on a blocking file descriptor:
... 
while (len > 0) { 
	ssize_t ret; 
 
	ret = tls_write(ctx, buf, len); 
	if (ret == TLS_WANT_POLLIN || ret == TLS_WANT_POLLOUT) 
		continue; 
	if (ret == -1) 
		errx(1, "tls_write: %s", tls_error(ctx)); 
	buf += ret; 
	len -= ret; 
} 
...
... 
pfd[0].fd = fd; 
pfd[0].events = POLLIN|POLLOUT; 
while (len > 0) { 
	nready = poll(pfd, 1, 0); 
	if (nready == -1) 
		err(1, "poll"); 
	if ((pfd[0].revents & (POLLERR|POLLNVAL))) 
		errx(1, "bad fd %d", pfd[0].fd); 
	if ((pfd[0].revents & (pfd[0].events|POLLHUP))) { 
		ssize_t ret; 
 
		ret = tls_write(ctx, buf, len); 
		if (ret == TLS_WANT_POLLIN) 
			pfd[0].events = POLLIN; 
		else if (ret == TLS_WANT_POLLOUT) 
			pfd[0].events = POLLOUT; 
		else if (ret == -1) 
			errx(1, "tls_write: %s", tls_error(ctx)); 
		else { 
			buf += ret; 
			len -= ret; 
		} 
	} 
} 
...
