diff options
author | rsiddharth <s@ricketyspace.net> | 2019-11-28 00:52:52 -0500 |
---|---|---|
committer | rsiddharth <s@ricketyspace.net> | 2020-04-17 20:56:35 -0400 |
commit | 320172385ef318cfe04f7c5f3af3dda40a429a36 (patch) | |
tree | f108862dc6b8a8e298211b1e67afad1f5b3c0af0 /nserver/src/nserve.c | |
parent | 51738cdf6627b6c3d48d7d7002a2af36babc917a (diff) |
nserver: nserve.c: Update nserve.
* nserver/src/nserve.c (nserve): Loop until client sends an empty
command or a command with an invalid size.
Diffstat (limited to 'nserver/src/nserve.c')
-rw-r--r-- | nserver/src/nserve.c | 38 |
1 files changed, 23 insertions, 15 deletions
diff --git a/nserver/src/nserve.c b/nserver/src/nserve.c index 207f226..316fdd1 100644 --- a/nserver/src/nserve.c +++ b/nserver/src/nserve.c @@ -73,21 +73,29 @@ void nserve(int sock) char *cmd = calloc(sizeof(char), cmd_sz); check_mem(cmd); - // Read command from socket. - ssize_t bytes = slurpsock(cmd, cmd_sz, sock); - check(bytes >= 0, "nserve: slurpsock failed"); - - int rc = check_cmd_size(cmd, sock); - check(rc != -1, "command size check failed"); - - // Quit immediately if cmd size is too large. - if (rc == 1) { - goto error; - } - - // Write response to socket. - rc = barfsock(cmd, bytes, sock); - check(rc != -1, "nserve: echo failed"); + int rc = 0; + char *err = NULL; + do { + // clear cmd. + memset(cmd, '\0', cmd_sz); + + // Read command from socket. + ssize_t bytes = slurpsock(cmd, cmd_sz, sock); + check(bytes >= 0, "nserve: slurpsock failed"); + + err = check_cmd(cmd); + if (err != NULL) { + // cmd invalid; quit. + rc = barfsock(err, strlen(err), sock); + check(rc != -1, "barfsock failed"); + + break; + } + + // Write response to socket. + rc = barfsock(cmd, bytes, sock); + check(rc != -1, "nserve: echo failed"); + } while(1); // Close socket. rc = close(sock); |