summaryrefslogtreecommitdiffstats
path: root/tests/echo_srv.c
diff options
context:
space:
mode:
Diffstat (limited to 'tests/echo_srv.c')
-rw-r--r--tests/echo_srv.c58
1 files changed, 35 insertions, 23 deletions
diff --git a/tests/echo_srv.c b/tests/echo_srv.c
index 5b784de..2f877f4 100644
--- a/tests/echo_srv.c
+++ b/tests/echo_srv.c
@@ -497,39 +497,51 @@ static void echo_tcp(int sock)
int client_sock = -1;
int s;
+ pid_t pid;
- s = accept(sock, &addr.sa.s, &addr.sa_socklen);
- if (s == -1) {
- perror("accept");
- goto done;
- }
-
- client_sock = socket_dup(s);
- if (client_sock == -1) {
- perror("socket_dup");
- goto done;
- }
-
- /* Start ping pong */
while (1) {
- bret = recv(client_sock, buf, BUFSIZE, 0);
- if (bret == -1) {
- perror("recv");
+ s = accept(sock, &addr.sa.s, &addr.sa_socklen);
+ if (s == -1) {
+ perror("accept");
goto done;
- } else if (bret == 0) {
- break;
}
- bret = send(client_sock, buf, bret, 0);
- if (bret == -1) {
- perror("send");
- goto done;
+ pid = fork();
+ if (pid == -1) {
+ perror("fork");
+ } else if (pid == 0) {
+ close(sock);
+ client_sock = socket_dup(s);
+ if (client_sock == -1) {
+ perror("socket_dup");
+ goto done;
+ }
+
+ while (1) {
+ bret = recv(client_sock, buf, BUFSIZE, 0);
+ if (bret == -1) {
+ perror("recv");
+ goto done;
+ } else if (bret == 0) {
+ break;
+ }
+
+ bret = send(client_sock, buf, bret, 0);
+ if (bret == -1) {
+ perror("send");
+ goto done;
+ }
+ }
+ close(s);
+ exit(0);
+ } else {
+ close(s);
}
}
done:
if (client_sock != -1) {
- close(client_sock);
+ close(client_sock);
}
}