plars | 865695b | 2001-08-27 22:15:12 +0000 | [diff] [blame] | 1 | /* |
| 2 | * |
| 3 | * Copyright (c) International Business Machines Corp., 2001 |
| 4 | * |
| 5 | * This program is free software; you can redistribute it and/or modify |
| 6 | * it under the terms of the GNU General Public License as published by |
| 7 | * the Free Software Foundation; either version 2 of the License, or |
| 8 | * (at your option) any later version. |
| 9 | * |
| 10 | * This program is distributed in the hope that it will be useful, |
| 11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| 12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See |
| 13 | * the GNU General Public License for more details. |
| 14 | * |
| 15 | * You should have received a copy of the GNU General Public License |
| 16 | * along with this program; if not, write to the Free Software |
Wanlong Gao | 4548c6c | 2012-10-19 18:03:36 +0800 | [diff] [blame] | 17 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
plars | 865695b | 2001-08-27 22:15:12 +0000 | [diff] [blame] | 18 | */ |
| 19 | |
| 20 | /* |
| 21 | * Test Name: connect01 |
| 22 | * |
| 23 | * Test Description: |
| 24 | * Verify that connect() returns the proper errno for various failure cases |
| 25 | * |
| 26 | * Usage: <for command-line> |
| 27 | * connect01 [-c n] [-e] [-i n] [-I x] [-P x] [-t] |
| 28 | * where, -c n : Run n copies concurrently. |
| 29 | * -e : Turn on errno logging. |
| 30 | * -i n : Execute test n times. |
| 31 | * -I x : Execute test for x seconds. |
| 32 | * -P x : Pause for x seconds between iterations. |
| 33 | * -t : Turn on syscall timing. |
| 34 | * |
| 35 | * HISTORY |
| 36 | * 07/2001 Ported by Wayne Boyer |
| 37 | * |
| 38 | * RESTRICTIONS: |
| 39 | * None. |
| 40 | * |
| 41 | */ |
| 42 | |
| 43 | #include <stdio.h> |
| 44 | #include <unistd.h> |
| 45 | #include <errno.h> |
plars | a9de613 | 2002-03-26 19:36:37 +0000 | [diff] [blame] | 46 | #include <fcntl.h> |
plars | 865695b | 2001-08-27 22:15:12 +0000 | [diff] [blame] | 47 | |
| 48 | #include <sys/types.h> |
| 49 | #include <sys/socket.h> |
| 50 | #include <sys/signal.h> |
| 51 | #include <sys/un.h> |
| 52 | |
| 53 | #include <netinet/in.h> |
| 54 | |
| 55 | #include "test.h" |
plars | 865695b | 2001-08-27 22:15:12 +0000 | [diff] [blame] | 56 | |
Cyril Hrubis | fdce7d5 | 2013-04-04 18:35:48 +0200 | [diff] [blame] | 57 | char *TCID = "connect01"; |
plars | 865695b | 2001-08-27 22:15:12 +0000 | [diff] [blame] | 58 | int testno; |
| 59 | |
subrata_modak | 56207ce | 2009-03-23 13:35:39 +0000 | [diff] [blame] | 60 | int s, s2; /* socket descriptor */ |
plars | 865695b | 2001-08-27 22:15:12 +0000 | [diff] [blame] | 61 | struct sockaddr_in sin1, sin2, sin3, sin4; |
subrata_modak | 56207ce | 2009-03-23 13:35:39 +0000 | [diff] [blame] | 62 | static int sfd; /* shared between start_server and do_child */ |
plars | 865695b | 2001-08-27 22:15:12 +0000 | [diff] [blame] | 63 | |
| 64 | void setup(void), setup0(void), setup1(void), setup2(void), |
subrata_modak | 56207ce | 2009-03-23 13:35:39 +0000 | [diff] [blame] | 65 | cleanup(void), cleanup0(void), cleanup1(void), do_child(void); |
plars | 865695b | 2001-08-27 22:15:12 +0000 | [diff] [blame] | 66 | |
subrata_modak | 56207ce | 2009-03-23 13:35:39 +0000 | [diff] [blame] | 67 | static pid_t start_server(struct sockaddr_in *); |
robbiew | 2c94524 | 2002-11-11 19:01:25 +0000 | [diff] [blame] | 68 | |
plars | 865695b | 2001-08-27 22:15:12 +0000 | [diff] [blame] | 69 | struct test_case_t { /* test case structure */ |
subrata_modak | 56207ce | 2009-03-23 13:35:39 +0000 | [diff] [blame] | 70 | int domain; /* PF_INET, PF_UNIX, ... */ |
| 71 | int type; /* SOCK_STREAM, SOCK_DGRAM ... */ |
| 72 | int proto; /* protocol number (usually 0 = default) */ |
plars | 865695b | 2001-08-27 22:15:12 +0000 | [diff] [blame] | 73 | struct sockaddr *sockaddr; /* socket address buffer */ |
subrata_modak | 56207ce | 2009-03-23 13:35:39 +0000 | [diff] [blame] | 74 | int salen; /* connect's 3rd argument */ |
| 75 | int retval; /* syscall return value */ |
| 76 | int experrno; /* expected errno */ |
| 77 | void (*setup) (void); |
| 78 | void (*cleanup) (void); |
plars | 865695b | 2001-08-27 22:15:12 +0000 | [diff] [blame] | 79 | char *desc; |
| 80 | } tdat[] = { |
subrata_modak | 56207ce | 2009-03-23 13:35:39 +0000 | [diff] [blame] | 81 | { |
| 82 | PF_INET, SOCK_STREAM, 0, (struct sockaddr *)&sin1, |
| 83 | sizeof(struct sockaddr_in), -1, EBADF, setup0, |
| 84 | cleanup0, "bad file descriptor"}, |
vapier | 7ec19d9 | 2006-02-27 04:38:56 +0000 | [diff] [blame] | 85 | #ifndef UCLINUX |
subrata_modak | 56207ce | 2009-03-23 13:35:39 +0000 | [diff] [blame] | 86 | /* Skip since uClinux does not implement memory protection */ |
| 87 | { |
| 88 | PF_INET, SOCK_STREAM, 0, (struct sockaddr *)-1, |
| 89 | sizeof(struct sockaddr_in), -1, EFAULT, setup1, |
| 90 | cleanup1, "invalid socket buffer"}, |
vapier | 7ec19d9 | 2006-02-27 04:38:56 +0000 | [diff] [blame] | 91 | #endif |
subrata_modak | 56207ce | 2009-03-23 13:35:39 +0000 | [diff] [blame] | 92 | { |
| 93 | PF_INET, SOCK_STREAM, 0, (struct sockaddr *)&sin1, |
| 94 | 3, -1, EINVAL, setup1, cleanup1, "invalid salen"}, { |
| 95 | 0, 0, 0, (struct sockaddr *)&sin1, |
| 96 | sizeof(sin1), -1, ENOTSOCK, setup0, cleanup0, |
| 97 | "invalid socket"} |
| 98 | , { |
| 99 | PF_INET, SOCK_STREAM, 0, (struct sockaddr *)&sin1, |
| 100 | sizeof(sin1), -1, EISCONN, setup2, cleanup1, |
| 101 | "already connected"} |
| 102 | , { |
| 103 | PF_INET, SOCK_STREAM, 0, (struct sockaddr *)&sin2, |
| 104 | sizeof(sin2), -1, ECONNREFUSED, setup1, cleanup1, |
| 105 | "connection refused"} |
| 106 | , { |
| 107 | PF_INET, SOCK_STREAM, 0, (struct sockaddr *)&sin4, |
| 108 | sizeof(sin4), -1, EAFNOSUPPORT, setup1, cleanup1, |
| 109 | "invalid address family"} |
| 110 | ,}; |
| 111 | |
Cyril Hrubis | fdce7d5 | 2013-04-04 18:35:48 +0200 | [diff] [blame] | 112 | int TST_TOTAL = sizeof(tdat) / sizeof(tdat[0]); |
subrata_modak | 56207ce | 2009-03-23 13:35:39 +0000 | [diff] [blame] | 113 | |
robbiew | d34d581 | 2005-07-11 22:28:09 +0000 | [diff] [blame] | 114 | #ifdef UCLINUX |
| 115 | static char *argv0; |
| 116 | #endif |
| 117 | |
subrata_modak | 56207ce | 2009-03-23 13:35:39 +0000 | [diff] [blame] | 118 | int main(int argc, char *argv[]) |
plars | 865695b | 2001-08-27 22:15:12 +0000 | [diff] [blame] | 119 | { |
Cyril Hrubis | 89af32a | 2012-10-24 16:39:11 +0200 | [diff] [blame] | 120 | int lc; |
Cyril Hrubis | 0b9589f | 2014-05-27 17:40:33 +0200 | [diff] [blame] | 121 | const char *msg; |
plars | 865695b | 2001-08-27 22:15:12 +0000 | [diff] [blame] | 122 | |
Garrett Cooper | 45e285d | 2010-11-22 12:19:25 -0800 | [diff] [blame] | 123 | msg = parse_opts(argc, argv, NULL, NULL); |
| 124 | if (msg != NULL) { |
plars | 865695b | 2001-08-27 22:15:12 +0000 | [diff] [blame] | 125 | tst_brkm(TBROK, NULL, "OPTION PARSING ERROR - %s", msg); |
plars | 865695b | 2001-08-27 22:15:12 +0000 | [diff] [blame] | 126 | } |
robbiew | d34d581 | 2005-07-11 22:28:09 +0000 | [diff] [blame] | 127 | #ifdef UCLINUX |
| 128 | argv0 = argv[0]; |
| 129 | maybe_run_child(&do_child, "d", &sfd); |
| 130 | #endif |
| 131 | |
plars | 865695b | 2001-08-27 22:15:12 +0000 | [diff] [blame] | 132 | setup(); |
| 133 | |
plars | 865695b | 2001-08-27 22:15:12 +0000 | [diff] [blame] | 134 | for (lc = 0; TEST_LOOPING(lc); ++lc) { |
Caspar Zhang | d59a659 | 2013-03-07 14:59:12 +0800 | [diff] [blame] | 135 | tst_count = 0; |
subrata_modak | 56207ce | 2009-03-23 13:35:39 +0000 | [diff] [blame] | 136 | for (testno = 0; testno < TST_TOTAL; ++testno) { |
plars | 865695b | 2001-08-27 22:15:12 +0000 | [diff] [blame] | 137 | tdat[testno].setup(); |
| 138 | |
subrata_modak | 56207ce | 2009-03-23 13:35:39 +0000 | [diff] [blame] | 139 | TEST(connect |
| 140 | (s, tdat[testno].sockaddr, tdat[testno].salen)); |
plars | 865695b | 2001-08-27 22:15:12 +0000 | [diff] [blame] | 141 | |
| 142 | if (TEST_RETURN != tdat[testno].retval || |
| 143 | (TEST_RETURN < 0 && |
| 144 | TEST_ERRNO != tdat[testno].experrno)) { |
| 145 | tst_resm(TFAIL, "%s ; returned" |
vapier | 0874e6f | 2009-08-28 12:07:53 +0000 | [diff] [blame] | 146 | " %ld (expected %d), errno %d (expected" |
subrata_modak | 56207ce | 2009-03-23 13:35:39 +0000 | [diff] [blame] | 147 | " %d)", tdat[testno].desc, |
| 148 | TEST_RETURN, tdat[testno].retval, |
| 149 | TEST_ERRNO, tdat[testno].experrno); |
plars | 865695b | 2001-08-27 22:15:12 +0000 | [diff] [blame] | 150 | } else { |
| 151 | tst_resm(TPASS, "%s successful", |
subrata_modak | 56207ce | 2009-03-23 13:35:39 +0000 | [diff] [blame] | 152 | tdat[testno].desc); |
plars | 865695b | 2001-08-27 22:15:12 +0000 | [diff] [blame] | 153 | } |
| 154 | tdat[testno].cleanup(); |
| 155 | } |
| 156 | } |
| 157 | cleanup(); |
robbiew | 2c94524 | 2002-11-11 19:01:25 +0000 | [diff] [blame] | 158 | |
Garrett Cooper | 2c28215 | 2010-12-16 00:55:50 -0800 | [diff] [blame] | 159 | tst_exit(); |
Wanlong Gao | 354ebb4 | 2012-12-07 10:10:04 +0800 | [diff] [blame] | 160 | } |
plars | 865695b | 2001-08-27 22:15:12 +0000 | [diff] [blame] | 161 | |
| 162 | pid_t pid; |
| 163 | |
subrata_modak | 56207ce | 2009-03-23 13:35:39 +0000 | [diff] [blame] | 164 | void setup(void) |
plars | 865695b | 2001-08-27 22:15:12 +0000 | [diff] [blame] | 165 | { |
subrata_modak | 56207ce | 2009-03-23 13:35:39 +0000 | [diff] [blame] | 166 | TEST_PAUSE; /* if -p option specified */ |
plars | 865695b | 2001-08-27 22:15:12 +0000 | [diff] [blame] | 167 | |
plars | 865695b | 2001-08-27 22:15:12 +0000 | [diff] [blame] | 168 | pid = start_server(&sin1); |
| 169 | |
| 170 | sin2.sin_family = AF_INET; |
subrata_modak | 56207ce | 2009-03-23 13:35:39 +0000 | [diff] [blame] | 171 | /* this port must be unused! */ |
Jan Stancek | 6e4e77a | 2014-03-07 11:39:56 +0100 | [diff] [blame] | 172 | sin2.sin_port = tst_get_unused_port(NULL, AF_INET, SOCK_STREAM); |
plars | 865695b | 2001-08-27 22:15:12 +0000 | [diff] [blame] | 173 | sin2.sin_addr.s_addr = INADDR_ANY; |
| 174 | |
| 175 | sin3.sin_family = AF_INET; |
| 176 | sin3.sin_port = 0; |
subrata_modak | 56207ce | 2009-03-23 13:35:39 +0000 | [diff] [blame] | 177 | /* assumes no route to this network! */ |
plars | 865695b | 2001-08-27 22:15:12 +0000 | [diff] [blame] | 178 | sin3.sin_addr.s_addr = htonl(0x0AFFFEFD); |
| 179 | |
| 180 | sin4.sin_family = 47; /* bogus address family */ |
| 181 | sin4.sin_port = 0; |
| 182 | sin4.sin_addr.s_addr = htonl(0x0AFFFEFD); |
| 183 | |
| 184 | } |
| 185 | |
subrata_modak | 56207ce | 2009-03-23 13:35:39 +0000 | [diff] [blame] | 186 | void cleanup(void) |
plars | 865695b | 2001-08-27 22:15:12 +0000 | [diff] [blame] | 187 | { |
Cyril Hrubis | 605fa33 | 2015-02-04 13:11:20 +0100 | [diff] [blame] | 188 | (void)kill(pid, SIGKILL); |
Garrett Cooper | 2c28215 | 2010-12-16 00:55:50 -0800 | [diff] [blame] | 189 | |
plars | 865695b | 2001-08-27 22:15:12 +0000 | [diff] [blame] | 190 | } |
| 191 | |
subrata_modak | 56207ce | 2009-03-23 13:35:39 +0000 | [diff] [blame] | 192 | void setup0(void) |
plars | 865695b | 2001-08-27 22:15:12 +0000 | [diff] [blame] | 193 | { |
| 194 | if (tdat[testno].experrno == EBADF) |
| 195 | s = 400; /* anything not an open file */ |
subrata_modak | 56207ce | 2009-03-23 13:35:39 +0000 | [diff] [blame] | 196 | else if ((s = open("/dev/null", O_WRONLY)) == -1) |
Wanlong Gao | 354ebb4 | 2012-12-07 10:10:04 +0800 | [diff] [blame] | 197 | tst_brkm(TBROK | TERRNO, cleanup, "open(/dev/null) failed"); |
plars | a9de613 | 2002-03-26 19:36:37 +0000 | [diff] [blame] | 198 | |
plars | 865695b | 2001-08-27 22:15:12 +0000 | [diff] [blame] | 199 | } |
| 200 | |
subrata_modak | 56207ce | 2009-03-23 13:35:39 +0000 | [diff] [blame] | 201 | void cleanup0(void) |
plars | 865695b | 2001-08-27 22:15:12 +0000 | [diff] [blame] | 202 | { |
Jan Stancek | b3e86e4 | 2014-03-06 12:10:07 +0100 | [diff] [blame] | 203 | close(s); |
plars | 865695b | 2001-08-27 22:15:12 +0000 | [diff] [blame] | 204 | s = -1; |
| 205 | } |
| 206 | |
subrata_modak | 56207ce | 2009-03-23 13:35:39 +0000 | [diff] [blame] | 207 | void setup1(void) |
plars | 865695b | 2001-08-27 22:15:12 +0000 | [diff] [blame] | 208 | { |
| 209 | s = socket(tdat[testno].domain, tdat[testno].type, tdat[testno].proto); |
vapier | 0874e6f | 2009-08-28 12:07:53 +0000 | [diff] [blame] | 210 | if (s < 0) |
Wanlong Gao | 354ebb4 | 2012-12-07 10:10:04 +0800 | [diff] [blame] | 211 | tst_brkm(TBROK | TERRNO, cleanup, "socket() failed"); |
plars | 865695b | 2001-08-27 22:15:12 +0000 | [diff] [blame] | 212 | } |
| 213 | |
subrata_modak | 56207ce | 2009-03-23 13:35:39 +0000 | [diff] [blame] | 214 | void cleanup1(void) |
plars | 865695b | 2001-08-27 22:15:12 +0000 | [diff] [blame] | 215 | { |
subrata_modak | 56207ce | 2009-03-23 13:35:39 +0000 | [diff] [blame] | 216 | (void)close(s); |
plars | 865695b | 2001-08-27 22:15:12 +0000 | [diff] [blame] | 217 | s = -1; |
| 218 | } |
| 219 | |
subrata_modak | 56207ce | 2009-03-23 13:35:39 +0000 | [diff] [blame] | 220 | void setup2(void) |
plars | 865695b | 2001-08-27 22:15:12 +0000 | [diff] [blame] | 221 | { |
subrata_modak | 56207ce | 2009-03-23 13:35:39 +0000 | [diff] [blame] | 222 | setup1(); /* get a socket in s */ |
vapier | 0874e6f | 2009-08-28 12:07:53 +0000 | [diff] [blame] | 223 | if (connect(s, (const struct sockaddr *)&sin1, sizeof(sin1)) < 0) |
Wanlong Gao | 354ebb4 | 2012-12-07 10:10:04 +0800 | [diff] [blame] | 224 | tst_brkm(TBROK | TERRNO, cleanup, |
| 225 | "socket setup failed connect test %d", testno); |
plars | 865695b | 2001-08-27 22:15:12 +0000 | [diff] [blame] | 226 | } |
| 227 | |
subrata_modak | 56207ce | 2009-03-23 13:35:39 +0000 | [diff] [blame] | 228 | pid_t start_server(struct sockaddr_in *sin0) |
plars | 865695b | 2001-08-27 22:15:12 +0000 | [diff] [blame] | 229 | { |
subrata_modak | 56207ce | 2009-03-23 13:35:39 +0000 | [diff] [blame] | 230 | pid_t pid; |
Jan Stancek | 6e4e77a | 2014-03-07 11:39:56 +0100 | [diff] [blame] | 231 | socklen_t slen = sizeof(*sin0); |
| 232 | |
| 233 | sin0->sin_family = AF_INET; |
| 234 | sin0->sin_port = 0; /* pick random free port */ |
| 235 | sin0->sin_addr.s_addr = INADDR_ANY; |
plars | 865695b | 2001-08-27 22:15:12 +0000 | [diff] [blame] | 236 | |
| 237 | sfd = socket(PF_INET, SOCK_STREAM, 0); |
| 238 | if (sfd < 0) { |
Wanlong Gao | 354ebb4 | 2012-12-07 10:10:04 +0800 | [diff] [blame] | 239 | tst_brkm(TBROK | TERRNO, cleanup, "server socket failed"); |
plars | 865695b | 2001-08-27 22:15:12 +0000 | [diff] [blame] | 240 | return -1; |
| 241 | } |
Jan Stancek | 6e4e77a | 2014-03-07 11:39:56 +0100 | [diff] [blame] | 242 | if (bind(sfd, (struct sockaddr *)sin0, sizeof(*sin0)) < 0) { |
Wanlong Gao | 354ebb4 | 2012-12-07 10:10:04 +0800 | [diff] [blame] | 243 | tst_brkm(TBROK | TERRNO, cleanup, "server bind failed"); |
plars | 865695b | 2001-08-27 22:15:12 +0000 | [diff] [blame] | 244 | return -1; |
| 245 | } |
| 246 | if (listen(sfd, 10) < 0) { |
Wanlong Gao | 354ebb4 | 2012-12-07 10:10:04 +0800 | [diff] [blame] | 247 | tst_brkm(TBROK | TERRNO, cleanup, "server listen failed"); |
plars | 865695b | 2001-08-27 22:15:12 +0000 | [diff] [blame] | 248 | return -1; |
| 249 | } |
Jan Stancek | 6e4e77a | 2014-03-07 11:39:56 +0100 | [diff] [blame] | 250 | if (getsockname(sfd, (struct sockaddr *)sin0, &slen) == -1) |
| 251 | tst_brkm(TBROK | TERRNO, cleanup, "getsockname failed"); |
| 252 | |
robbiew | d34d581 | 2005-07-11 22:28:09 +0000 | [diff] [blame] | 253 | switch ((pid = FORK_OR_VFORK())) { |
subrata_modak | 56207ce | 2009-03-23 13:35:39 +0000 | [diff] [blame] | 254 | case 0: /* child */ |
robbiew | d34d581 | 2005-07-11 22:28:09 +0000 | [diff] [blame] | 255 | #ifdef UCLINUX |
| 256 | self_exec(argv0, "d", sfd); |
| 257 | #else |
| 258 | do_child(); |
| 259 | #endif |
plars | 865695b | 2001-08-27 22:15:12 +0000 | [diff] [blame] | 260 | break; |
| 261 | case -1: |
Wanlong Gao | 354ebb4 | 2012-12-07 10:10:04 +0800 | [diff] [blame] | 262 | tst_brkm(TBROK | TERRNO, cleanup, "server fork failed"); |
plars | 865695b | 2001-08-27 22:15:12 +0000 | [diff] [blame] | 263 | /* fall through */ |
subrata_modak | 56207ce | 2009-03-23 13:35:39 +0000 | [diff] [blame] | 264 | default: /* parent */ |
| 265 | (void)close(sfd); |
plars | 865695b | 2001-08-27 22:15:12 +0000 | [diff] [blame] | 266 | return pid; |
| 267 | } |
| 268 | |
robbiew | d34d581 | 2005-07-11 22:28:09 +0000 | [diff] [blame] | 269 | return -1; |
| 270 | } |
| 271 | |
Jan Stancek | b3e86e4 | 2014-03-06 12:10:07 +0100 | [diff] [blame] | 272 | void do_child(void) |
robbiew | d34d581 | 2005-07-11 22:28:09 +0000 | [diff] [blame] | 273 | { |
| 274 | struct sockaddr_in fsin; |
subrata_modak | 56207ce | 2009-03-23 13:35:39 +0000 | [diff] [blame] | 275 | fd_set afds, rfds; |
| 276 | int nfds, cc, fd; |
| 277 | char c; |
robbiew | d34d581 | 2005-07-11 22:28:09 +0000 | [diff] [blame] | 278 | |
plars | 865695b | 2001-08-27 22:15:12 +0000 | [diff] [blame] | 279 | FD_ZERO(&afds); |
| 280 | FD_SET(sfd, &afds); |
| 281 | |
Cyril Hrubis | 7855d09 | 2014-10-09 16:13:05 +0200 | [diff] [blame] | 282 | nfds = sfd + 1; |
plars | 865695b | 2001-08-27 22:15:12 +0000 | [diff] [blame] | 283 | |
| 284 | /* accept connections until killed */ |
| 285 | while (1) { |
subrata_modak | 56207ce | 2009-03-23 13:35:39 +0000 | [diff] [blame] | 286 | socklen_t fromlen; |
plars | 865695b | 2001-08-27 22:15:12 +0000 | [diff] [blame] | 287 | |
| 288 | memcpy(&rfds, &afds, sizeof(rfds)); |
| 289 | |
Cyril Hrubis | 4e2bab8 | 2014-09-24 16:34:35 +0200 | [diff] [blame] | 290 | if (select(nfds, &rfds, NULL, NULL, |
| 291 | NULL) < 0) |
plars | 865695b | 2001-08-27 22:15:12 +0000 | [diff] [blame] | 292 | if (errno != EINTR) |
| 293 | exit(1); |
| 294 | if (FD_ISSET(sfd, &rfds)) { |
| 295 | int newfd; |
| 296 | |
| 297 | fromlen = sizeof(fsin); |
subrata_modak | 56207ce | 2009-03-23 13:35:39 +0000 | [diff] [blame] | 298 | newfd = accept(sfd, (struct sockaddr *)&fsin, &fromlen); |
Cyril Hrubis | 7855d09 | 2014-10-09 16:13:05 +0200 | [diff] [blame] | 299 | if (newfd >= 0) { |
plars | 865695b | 2001-08-27 22:15:12 +0000 | [diff] [blame] | 300 | FD_SET(newfd, &afds); |
Cyril Hrubis | 7855d09 | 2014-10-09 16:13:05 +0200 | [diff] [blame] | 301 | nfds = MAX(nfds, newfd + 1); |
| 302 | } |
plars | 865695b | 2001-08-27 22:15:12 +0000 | [diff] [blame] | 303 | } |
subrata_modak | 56207ce | 2009-03-23 13:35:39 +0000 | [diff] [blame] | 304 | for (fd = 0; fd < nfds; ++fd) |
plars | 865695b | 2001-08-27 22:15:12 +0000 | [diff] [blame] | 305 | if (fd != sfd && FD_ISSET(fd, &rfds)) { |
subrata_modak | 56207ce | 2009-03-23 13:35:39 +0000 | [diff] [blame] | 306 | if ((cc = read(fd, &c, 1)) == 0) { |
| 307 | (void)close(fd); |
plars | 865695b | 2001-08-27 22:15:12 +0000 | [diff] [blame] | 308 | FD_CLR(fd, &afds); |
| 309 | } |
| 310 | } |
| 311 | } |
Chris Dearman | ec6edca | 2012-10-17 19:54:01 -0700 | [diff] [blame] | 312 | } |