X-Git-Url: https://git.cworth.org/git?p=ttt;a=blobdiff_plain;f=src%2Fttt-socket.c;h=20b96e263056103b87752fe6da432b5c8a89b63b;hp=f185d363780af7e5c43cb334f9e7ae42c52a258d;hb=7de44ed398081656115dce6db7d0a04c1a50bb34;hpb=5d56d3cd8b4685e905ed604277ac9cb32c876127 diff --git a/src/ttt-socket.c b/src/ttt-socket.c index f185d36..20b96e2 100644 --- a/src/ttt-socket.c +++ b/src/ttt-socket.c @@ -150,16 +150,67 @@ ttt_socket_accept (int listen_socket, ttt_socket_accept_func_t accept, void *closure) { - pid_t pid; int connected_socket; connected_socket = _wait_for_connection (listen_socket); - pid = xfork(); + (accept) (closure, connected_socket); +} + +/* Exported: see wdo-socket.h for documentation. */ +ttt_status_t +ttt_socket_create_client (const char *host, + const char *port, + int *socket_ret) +{ + ttt_status_t status; + struct sockaddr_in addr; + int socket; + + *socket_ret = -1; + + socket = xsocket (PF_INET, SOCK_STREAM, 0); + + _sockaddr_init (&addr, host, port); + + status = xconnect (socket, (struct sockaddr *) &addr, sizeof (addr)); + if (status) { + shutdown (socket, SHUT_RDWR); + return status; + } + + *socket_ret = socket; + return TTT_STATUS_SUCCESS; +} + +/* Exported: see ttt-socket.h for documentation. */ +void +ttt_socket_read (int socket, + void *buf, + size_t count) +{ + int bytes_read; + char *cbuf = buf; + + while (count) { + bytes_read = xread (socket, cbuf, count); + cbuf += bytes_read; + count -= bytes_read; + } +} + +/* Exported: see ttt-socket.h for documentation. */ +void +ttt_socket_write (int socket, + const void *buf, + size_t count) +{ + int written; + const char *cbuf = buf; - if (pid == 0) { - /* Child process. */ - (accept) (closure, connected_socket); - return; + while (count) { + written = xwrite (socket, cbuf, count); + cbuf += written; + count -= written; } }