diff options
Diffstat (limited to 'lib/libc_r/TEST/test_sock_2.c')
-rw-r--r-- | lib/libc_r/TEST/test_sock_2.c | 128 |
1 files changed, 85 insertions, 43 deletions
diff --git a/lib/libc_r/TEST/test_sock_2.c b/lib/libc_r/TEST/test_sock_2.c index a81fd0a3f69..59c240e6ac6 100644 --- a/lib/libc_r/TEST/test_sock_2.c +++ b/lib/libc_r/TEST/test_sock_2.c @@ -8,9 +8,11 @@ */ #include <pthread.h> +#include <pthread_np.h> #include <errno.h> #include <stdio.h> #include <sys/types.h> +#include <sys/wait.h> #include <sys/socket.h> #include <netinet/in.h> #include <unistd.h> @@ -22,62 +24,116 @@ struct sockaddr_in a_sout; #define MESSAGE5 "This should be message #5" #define MESSAGE6 "This should be message #6" -void * sock_write(void* arg) +void * +sock_write(arg) + void *arg; { int fd = *(int *)arg; - write(fd, MESSAGE5, sizeof(MESSAGE5)); + pthread_set_name_np(pthread_self(), "writer"); + CHECKe(write(fd, MESSAGE5, sizeof(MESSAGE5))); return(NULL); } -void * sock_accept(void* arg) +static pthread_mutex_t waiter_mutex = PTHREAD_MUTEX_INITIALIZER; + +void* +waiter(sig) { - pthread_t thread; + int status; + pid_t pid; + + pthread_set_name_np(pthread_self(), "waiter"); + CHECKr(pthread_mutex_lock(&waiter_mutex)); + printf("waiting for child\n"); + CHECKe(pid = wait(&status)); + ASSERT(WIFEXITED(status)); + ASSERT(WEXITSTATUS(status) == 0); + printf("child exited\n"); + CHECKr(pthread_mutex_unlock(&waiter_mutex)); + return (NULL); +} + +void * +sock_accept(arg) + void *arg; +{ + pthread_t thread, wthread; struct sockaddr a_sin; - int a_sin_size, a_fd, fd, tmp; - short port; + int a_sin_size, a_fd, fd; + u_int16_t port; char buf[1024]; + pid_t pid; port = 3276; a_sout.sin_family = AF_INET; a_sout.sin_port = htons(port); a_sout.sin_addr.s_addr = INADDR_ANY; - if ((a_fd = socket(AF_INET, SOCK_STREAM, 0)) < 0) - DIE(errno, "sock_accept:socket()"); + CHECKe(a_fd = socket(AF_INET, SOCK_STREAM, 0)); - while (bind(a_fd, (struct sockaddr *) &a_sout, sizeof(a_sout)) < 0) { + while(1) { + if (bind(a_fd, (struct sockaddr *)&a_sout, sizeof(a_sout))==0) + break; if (errno == EADDRINUSE) { a_sout.sin_port = htons((++port)); continue; } - DIE(errno, "sock_accept:bind()"); + DIE(errno, "bind"); } - if (listen(a_fd, 2)) - DIE(errno, "sock_accept:listen()"); + printf("listening on port %d\n", port); + + CHECKe(listen(a_fd, 2)); + printf("%d: This should be message #1\n", getpid()); + + CHECKr(pthread_mutex_init(&waiter_mutex, NULL)); + CHECKr(pthread_mutex_lock(&waiter_mutex)); + CHECKr(pthread_create(&wthread, NULL, waiter, NULL)); + + CHECKe(pid = fork()); + switch(pid) { + case 0: + execl("test_sock_2a", "test_sock_2a", "fork okay", NULL); + DIE(errno, "execl"); + default: + break; + } + CHECKr(pthread_mutex_unlock(&waiter_mutex)); + pthread_yield(); + a_sin_size = sizeof(a_sin); - printf("This should be message #1\n"); - if ((fd = accept(a_fd, &a_sin, &a_sin_size)) < 0) - DIE(errno, "Error: sock_accept:accept()"); - close(fd); + CHECKe(fd = accept(a_fd, &a_sin, &a_sin_size)); + CHECKe(close(fd)); + sleep(1); + printf("%d: This should be message #4\n", getpid()); + a_sin_size = sizeof(a_sin); memset(&a_sin, 0, sizeof(a_sin)); - printf("This should be message #4\n"); - if ((fd = accept(a_fd, &a_sin, &a_sin_size)) < 0) - DIE(errno, "sock_accept:accept()"); + CHECKe(fd = accept(a_fd, &a_sin, &a_sin_size)); /* Setup a write thread */ - if (pthread_create(&thread, NULL, sock_write, &fd)) - DIE(errno, "sock_accept:pthread_create(sock_write)"); - if ((tmp = read(fd, buf, 1024)) <= 0) - DIE(errno, "Error: sock_accept:read() == %d", tmp); - printf("%s\n", buf); - close(fd); + CHECKr(pthread_create(&thread, NULL, sock_write, &fd)); + CHECKe(read(fd, buf, 1024)); + + printf("%d: %s\n", getpid(), buf); /* message 6 */ + + CHECKe(close(fd)); + + if (pthread_mutex_trylock(&waiter_mutex) == EBUSY) { + sleep(2); + if (pthread_mutex_trylock(&waiter_mutex) == EBUSY) { + /* forcibly kill child */ + CHECKe(kill(pid, SIGKILL)); + PANIC("child %d took too long to exit", pid); + } + } + CHECKr(pthread_join(wthread, NULL)); + return(NULL); } @@ -85,28 +141,14 @@ int main() { pthread_t thread; - int ret; - - switch(fork()) { - case -1: - DIE(errno, "main:fork()"); - - case 0: - execl("test_sock_2a", "test_sock_2a", "fork okay", NULL); - DIE(errno, "execl"); - default: - break; - } setbuf(stdout, NULL); setbuf(stderr, NULL); - if ((ret = pthread_create(&thread, NULL, sock_accept, - (void *)0xdeadbeaf))) - DIE(ret, "main:pthread_create(sock_accept)"); + CHECKr(pthread_create(&thread, NULL, sock_accept, + (void *)0xdeadbeaf)); - if ((ret = pthread_join(thread, NULL))) - DIE(ret, "main:pthread_join()"); + CHECKr(pthread_join(thread, NULL)); - return (0); + SUCCEED; } |