diff options
author | rsiddharth <s@ricketyspace.net> | 2019-11-21 20:51:23 -0500 |
---|---|---|
committer | rsiddharth <s@ricketyspace.net> | 2020-04-17 20:56:35 -0400 |
commit | 607ff82970a2f289e0529d778c9f634178283569 (patch) | |
tree | 60b381c60c895c5a89ebf4f7927bdc0d460b4cdf /nserver/src/nserve.c | |
parent | a3d98fc2ed142ec92af337578acbc4940b08ea07 (diff) |
nserve: necho.h -> nserve.h
* nserver/src/necho.c: Remove file.
* nserver/src/nserve.c: New file.
* nserver/src/necho.h: Rename to...
* nserver/src/nserve.h: ...this. Remove functions `echo` and
`echoserve`. Add function `nserve`.
Diffstat (limited to 'nserver/src/nserve.c')
-rw-r--r-- | nserver/src/nserve.c | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/nserver/src/nserve.c b/nserver/src/nserve.c new file mode 100644 index 0000000..3d27c19 --- /dev/null +++ b/nserver/src/nserve.c @@ -0,0 +1,59 @@ +#include <nserve.h> + +int slurpsock(char *buf, size_t buf_sz, int sock) +{ + ssize_t bytes; + + bytes = recv(sock, buf, buf_sz, 0); + check(bytes >= 0, "Failed to read from socket: %d", sock); + + return bytes; + + error: + return -1; +} + +int barfsock(char *buf, size_t buf_sz, int sock) +{ + ssize_t bytes = 0; + + bytes = send(sock, buf, buf_sz, 0); + check(bytes >= 0, "barfsock: send failed"); + + return bytes; + error: + return -1; +} + +void nserve(int sock) +{ + size_t buf_sz = 200; + char *buf = calloc(sizeof(char), buf_sz); + check_mem(buf); + + // Read command from socket. + ssize_t bytes = slurpsock(buf, buf_sz, sock); + check(bytes >= 0, "nserve: slurpsock failed"); + + // Write response to socket. + int rc = barfsock(buf, bytes, sock); + check(rc != -1, "nserve: echo failed"); + + // Close socket. + rc = close(sock); + check(rc == 0, "nserve: close failed"); + + // Cleanup. + free(buf) + + exit(0); + error: + rc = close(sock); + check(rc == 0, "nserve: close failed"); + + // Cleanup if needed. + if (buf) + free(buf); + + exit(1); +} |