| 39 { |
39 { |
| 40 struct sockaddr_in sin; |
40 struct sockaddr_in sin; |
| 41 socklen_t sin_len = sizeof(sin); |
41 socklen_t sin_len = sizeof(sin); |
| 42 int server = -1; |
42 int server = -1; |
| 43 int tmp = 1; |
43 int tmp = 1; |
| |
44 int errno_copy; |
| 44 |
45 |
| 45 server = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); |
46 server = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); |
| 46 |
47 |
| 47 sv[0] = -1; |
48 sv[0] = -1; |
| 48 sv[1] = -1; |
49 sv[1] = -1; |
| 49 |
50 |
| 50 if (server == -1) |
51 if (server == -1) |
| 51 goto fail; |
52 goto fail; |
| 52 |
53 |
| 53 memset(&sin, 0, sizeof(sin)); |
54 memset(&sin, 0, sizeof(sin)); |
| 54 sin.sin_family = AF_INET; |
55 sin.sin_family = AF_INET; |
| 55 sin.sin_addr.s_addr = htonl(INADDR_LOOPBACK); |
56 sin.sin_addr.s_addr = htonl(INADDR_LOOPBACK); |
| 56 sin.sin_port = 0; |
57 sin.sin_port = 0; |
| 57 |
58 |
| 64 if (listen(server, 1) == -1) |
65 if (listen(server, 1) == -1) |
| 65 goto fail; |
66 goto fail; |
| 66 |
67 |
| 67 if (getsockname(server, (struct sockaddr*) &sin, &sin_len) == -1) |
68 if (getsockname(server, (struct sockaddr*) &sin, &sin_len) == -1) |
| 68 goto fail; |
69 goto fail; |
| 69 |
70 |
| 70 sin.sin_family = AF_INET; |
71 sin.sin_family = AF_INET; |
| 71 sin.sin_addr.s_addr = htonl(INADDR_LOOPBACK); |
72 sin.sin_addr.s_addr = htonl(INADDR_LOOPBACK); |
| 72 |
73 |
| 73 sv[0] = socket(AF_INET, SOCK_STREAM, 0); |
74 sv[0] = socket(AF_INET, SOCK_STREAM, 0); |
| 74 |
75 |
| 75 if (sv[0] == -1) |
76 if (sv[0] == -1) |
| 76 goto fail; |
77 goto fail; |
| 77 |
78 |
| 78 if (connect(sv[0], (struct sockaddr*) &sin, sin_len) == -1) |
79 if (connect(sv[0], (struct sockaddr*) &sin, sin_len) == -1) |
| 79 goto fail; |
80 goto fail; |
| 80 |
81 |
| 81 sv[1] = accept(server, NULL, NULL); |
82 sv[1] = accept(server, NULL, NULL); |
| 82 |
83 |