plars | 865695b | 2001-08-27 22:15:12 +0000 | [diff] [blame] | 1 | /* |
| 2 | * |
| 3 | * Copyright (c) International Business Machines Corp., 2001 |
Cyril Hrubis | a87dd2a | 2012-10-10 14:54:13 +0200 | [diff] [blame] | 4 | * Copyright (c) Cyril Hrubis <chrubis@suse.cz> 2012 |
plars | 865695b | 2001-08-27 22:15:12 +0000 | [diff] [blame] | 5 | * |
| 6 | * This program is free software; you can redistribute it and/or modify |
| 7 | * it under the terms of the GNU General Public License as published by |
| 8 | * the Free Software Foundation; either version 2 of the License, or |
| 9 | * (at your option) any later version. |
| 10 | * |
| 11 | * This program is distributed in the hope that it will be useful, |
| 12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| 13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See |
| 14 | * the GNU General Public License for more details. |
| 15 | * |
| 16 | * You should have received a copy of the GNU General Public License |
| 17 | * along with this program; if not, write to the Free Software |
Wanlong Gao | 4548c6c | 2012-10-19 18:03:36 +0800 | [diff] [blame] | 18 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
robbiew | bd455c4 | 2003-10-07 21:25:53 +0000 | [diff] [blame] | 19 | * |
plars | 865695b | 2001-08-27 22:15:12 +0000 | [diff] [blame] | 20 | */ |
| 21 | |
| 22 | /* |
| 23 | * Test Name: sendmsg01 |
| 24 | * |
| 25 | * Test Description: |
| 26 | * Verify that sendmsg() returns the proper errno for various failure cases |
| 27 | * |
plars | 865695b | 2001-08-27 22:15:12 +0000 | [diff] [blame] | 28 | * HISTORY |
| 29 | * 07/2001 Ported by Wayne Boyer |
iyermanoj | 7856269 | 2003-05-01 20:50:38 +0000 | [diff] [blame] | 30 | * 05/2003 Modified by Manoj Iyer - Make setup function set up lo device. |
plars | 865695b | 2001-08-27 22:15:12 +0000 | [diff] [blame] | 31 | */ |
| 32 | |
| 33 | #include <stdio.h> |
| 34 | #include <unistd.h> |
| 35 | #include <errno.h> |
vapier | 32cc0ac | 2006-06-22 04:28:32 +0000 | [diff] [blame] | 36 | #include <string.h> |
plars | 13cbed7 | 2002-03-26 20:43:10 +0000 | [diff] [blame] | 37 | #include <fcntl.h> |
robbiew | c9c0b4e | 2003-04-16 20:47:48 +0000 | [diff] [blame] | 38 | #include <time.h> |
iyermanoj | 7856269 | 2003-05-01 20:50:38 +0000 | [diff] [blame] | 39 | #include <stdlib.h> |
plars | 865695b | 2001-08-27 22:15:12 +0000 | [diff] [blame] | 40 | #include <sys/types.h> |
| 41 | #include <sys/socket.h> |
| 42 | #include <sys/signal.h> |
| 43 | #include <sys/uio.h> |
| 44 | #include <sys/un.h> |
| 45 | #include <sys/file.h> |
iyermanoj | 7856269 | 2003-05-01 20:50:38 +0000 | [diff] [blame] | 46 | #include <sys/wait.h> |
| 47 | |
plars | 865695b | 2001-08-27 22:15:12 +0000 | [diff] [blame] | 48 | #include <netinet/in.h> |
| 49 | |
| 50 | #include "test.h" |
Stanislav Kholmanskikh | 9748d55 | 2014-05-13 10:20:22 +0400 | [diff] [blame] | 51 | #include "msg_common.h" |
plars | 865695b | 2001-08-27 22:15:12 +0000 | [diff] [blame] | 52 | |
Cyril Hrubis | a87dd2a | 2012-10-10 14:54:13 +0200 | [diff] [blame] | 53 | char *TCID = "sendmsg01"; |
plars | 865695b | 2001-08-27 22:15:12 +0000 | [diff] [blame] | 54 | int testno; |
| 55 | |
Cyril Hrubis | a87dd2a | 2012-10-10 14:54:13 +0200 | [diff] [blame] | 56 | static char buf[1024], bigbuf[128 * 1024]; |
| 57 | static int s; |
| 58 | static struct sockaddr_in sin1, sin2; |
| 59 | static struct sockaddr_un sun1; |
| 60 | static struct msghdr msgdat; |
| 61 | static char cbuf[4096]; |
| 62 | static struct cmsghdr *control; |
| 63 | static int controllen; |
| 64 | static struct iovec iov[1]; |
subrata_modak | 56207ce | 2009-03-23 13:35:39 +0000 | [diff] [blame] | 65 | static int sfd; /* shared between do_child and start_server */ |
| 66 | static int ufd; /* shared between do_child and start_server */ |
plars | 865695b | 2001-08-27 22:15:12 +0000 | [diff] [blame] | 67 | |
Cyril Hrubis | a87dd2a | 2012-10-10 14:54:13 +0200 | [diff] [blame] | 68 | static void setup(void); |
| 69 | static void setup0(void); |
| 70 | static void setup1(void); |
| 71 | static void setup2(void); |
| 72 | static void setup3(void); |
| 73 | static void setup4(void); |
| 74 | static void setup5(void); |
| 75 | static void setup6(void); |
| 76 | static void setup8(void); |
| 77 | |
| 78 | static void cleanup(void); |
| 79 | static void cleanup0(void); |
| 80 | static void cleanup1(void); |
| 81 | static void cleanup4(void); |
| 82 | |
| 83 | static void do_child(void); |
plars | 865695b | 2001-08-27 22:15:12 +0000 | [diff] [blame] | 84 | |
| 85 | struct test_case_t { /* test case structure */ |
subrata_modak | 56207ce | 2009-03-23 13:35:39 +0000 | [diff] [blame] | 86 | int domain; /* PF_INET, PF_UNIX, ... */ |
| 87 | int type; /* SOCK_STREAM, SOCK_DGRAM ... */ |
| 88 | int proto; /* protocol number (usually 0 = default) */ |
| 89 | struct iovec *iov; |
| 90 | int iovcnt; /* # elements in iovec */ |
| 91 | void *buf; /* send data buffer */ |
| 92 | int buflen; /* send buffer length */ |
plars | 865695b | 2001-08-27 22:15:12 +0000 | [diff] [blame] | 93 | struct msghdr *msg; |
| 94 | unsigned flags; |
| 95 | struct sockaddr *to; /* destination */ |
subrata_modak | 56207ce | 2009-03-23 13:35:39 +0000 | [diff] [blame] | 96 | int tolen; /* length of "to" buffer */ |
| 97 | int retval; /* syscall return value */ |
| 98 | int experrno; /* expected errno */ |
Wanlong Gao | 354ebb4 | 2012-12-07 10:10:04 +0800 | [diff] [blame] | 99 | void (*setup) (void); |
| 100 | void (*cleanup) (void); |
plars | 865695b | 2001-08-27 22:15:12 +0000 | [diff] [blame] | 101 | char *desc; |
Cyril Hrubis | a87dd2a | 2012-10-10 14:54:13 +0200 | [diff] [blame] | 102 | }; |
plars | 865695b | 2001-08-27 22:15:12 +0000 | [diff] [blame] | 103 | |
Cyril Hrubis | a87dd2a | 2012-10-10 14:54:13 +0200 | [diff] [blame] | 104 | struct test_case_t tdat[] = { |
| 105 | {.domain = PF_INET, |
| 106 | .type = SOCK_STREAM, |
| 107 | .proto = 0, |
| 108 | .iov = iov, |
| 109 | .iovcnt = 1, |
| 110 | .buf = buf, |
| 111 | .buflen = sizeof(buf), |
| 112 | .msg = &msgdat, |
| 113 | .flags = 0, |
| 114 | .to = (struct sockaddr *)&sin1, |
| 115 | .tolen = sizeof(sin1), |
| 116 | .retval = -1, |
| 117 | .experrno = EBADF, |
| 118 | .setup = setup0, |
| 119 | .cleanup = cleanup0, |
Wanlong Gao | 354ebb4 | 2012-12-07 10:10:04 +0800 | [diff] [blame] | 120 | .desc = "bad file descriptor"} |
| 121 | , |
Cyril Hrubis | a87dd2a | 2012-10-10 14:54:13 +0200 | [diff] [blame] | 122 | {.domain = 0, |
| 123 | .type = 0, |
| 124 | .proto = 0, |
| 125 | .iov = iov, |
| 126 | .iovcnt = 1, |
| 127 | .buf = buf, |
| 128 | .buflen = sizeof(buf), |
| 129 | .msg = &msgdat, |
| 130 | .flags = 0, |
| 131 | .to = (struct sockaddr *)&sin1, |
| 132 | .tolen = sizeof(sin1), |
| 133 | .retval = -1, |
| 134 | .experrno = ENOTSOCK, |
| 135 | .setup = setup0, |
| 136 | .cleanup = cleanup0, |
Wanlong Gao | 354ebb4 | 2012-12-07 10:10:04 +0800 | [diff] [blame] | 137 | .desc = "invalid socket"} |
| 138 | , |
Cyril Hrubis | a87dd2a | 2012-10-10 14:54:13 +0200 | [diff] [blame] | 139 | {.domain = PF_INET, |
| 140 | .type = SOCK_DGRAM, |
| 141 | .proto = 0, |
| 142 | .iov = iov, |
| 143 | .iovcnt = 1, |
| 144 | .buf = (void *)-1, |
| 145 | .buflen = sizeof(buf), |
| 146 | .msg = &msgdat, |
| 147 | .flags = 0, |
| 148 | .to = (struct sockaddr *)&sin1, |
| 149 | .tolen = sizeof(sin1), |
| 150 | .retval = -1, |
| 151 | .experrno = EFAULT, |
| 152 | .setup = setup1, |
| 153 | .cleanup = cleanup1, |
Wanlong Gao | 354ebb4 | 2012-12-07 10:10:04 +0800 | [diff] [blame] | 154 | .desc = "invalid send buffer"} |
| 155 | , |
Cyril Hrubis | a87dd2a | 2012-10-10 14:54:13 +0200 | [diff] [blame] | 156 | {.domain = PF_INET, |
| 157 | .type = SOCK_STREAM, |
| 158 | .proto = 0, |
| 159 | .iov = iov, |
| 160 | .iovcnt = 1, |
| 161 | .buf = buf, |
| 162 | .buflen = sizeof(buf), |
| 163 | .msg = &msgdat, |
| 164 | .flags = 0, |
| 165 | .to = (struct sockaddr *)&sin2, |
| 166 | .tolen = sizeof(sin2), |
| 167 | .retval = 0, |
| 168 | .experrno = EFAULT, |
| 169 | .setup = setup5, |
| 170 | .cleanup = cleanup1, |
Wanlong Gao | 354ebb4 | 2012-12-07 10:10:04 +0800 | [diff] [blame] | 171 | .desc = "connected TCP"} |
| 172 | , |
Cyril Hrubis | a87dd2a | 2012-10-10 14:54:13 +0200 | [diff] [blame] | 173 | {.domain = PF_INET, |
| 174 | .type = SOCK_STREAM, |
| 175 | .proto = 0, |
| 176 | .iov = iov, |
| 177 | .iovcnt = 1, |
| 178 | .buf = buf, |
| 179 | .buflen = sizeof(buf), |
| 180 | .msg = &msgdat, |
| 181 | .flags = 0, |
| 182 | .to = (struct sockaddr *)&sin1, |
| 183 | .tolen = sizeof(sin1), |
| 184 | .retval = -1, |
| 185 | .experrno = EPIPE, |
| 186 | .setup = setup3, |
| 187 | .cleanup = cleanup1, |
Wanlong Gao | 354ebb4 | 2012-12-07 10:10:04 +0800 | [diff] [blame] | 188 | .desc = "not connected TCP"} |
| 189 | , |
Cyril Hrubis | a87dd2a | 2012-10-10 14:54:13 +0200 | [diff] [blame] | 190 | {.domain = PF_INET, |
| 191 | .type = SOCK_DGRAM, |
| 192 | .proto = 0, |
| 193 | .iov = iov, |
| 194 | .iovcnt = 1, |
| 195 | .buf = buf, |
| 196 | .buflen = sizeof(buf), |
| 197 | .msg = &msgdat, |
| 198 | .flags = 0, |
| 199 | .to = (struct sockaddr *)&sin1, |
Jan Stancek | 9a3e8bc | 2013-12-05 12:23:49 +0100 | [diff] [blame] | 200 | .tolen = 1, |
Cyril Hrubis | a87dd2a | 2012-10-10 14:54:13 +0200 | [diff] [blame] | 201 | .retval = -1, |
| 202 | .experrno = EINVAL, |
| 203 | .setup = setup1, |
| 204 | .cleanup = cleanup1, |
| 205 | .desc = "invalid to buffer length"}, |
| 206 | {.domain = PF_INET, |
| 207 | .type = SOCK_DGRAM, |
| 208 | .proto = 0, |
| 209 | .iov = iov, |
| 210 | .iovcnt = 1, |
| 211 | .buf = buf, |
| 212 | .buflen = sizeof(buf), |
| 213 | .msg = &msgdat, |
| 214 | .flags = 0, |
| 215 | .to = (struct sockaddr *)-1, |
Wanlong Gao | bad6405 | 2013-12-04 10:35:22 +0800 | [diff] [blame] | 216 | .tolen = sizeof(struct sockaddr), |
Cyril Hrubis | a87dd2a | 2012-10-10 14:54:13 +0200 | [diff] [blame] | 217 | .retval = -1, |
Wanlong Gao | bad6405 | 2013-12-04 10:35:22 +0800 | [diff] [blame] | 218 | .experrno = EFAULT, |
Cyril Hrubis | a87dd2a | 2012-10-10 14:54:13 +0200 | [diff] [blame] | 219 | .setup = setup1, |
| 220 | .cleanup = cleanup1, |
| 221 | .desc = "invalid to buffer"}, |
| 222 | {.domain = PF_INET, |
| 223 | .type = SOCK_DGRAM, |
| 224 | .proto = 0, |
| 225 | .iov = iov, |
| 226 | .iovcnt = 1, |
| 227 | .buf = bigbuf, |
| 228 | .buflen = sizeof(bigbuf), |
| 229 | .msg = &msgdat, |
| 230 | .flags = 0, |
| 231 | .to = (struct sockaddr *)&sin1, |
| 232 | .tolen = sizeof(sin1), |
| 233 | .retval = -1, |
| 234 | .experrno = EMSGSIZE, |
| 235 | .setup = setup1, |
| 236 | .cleanup = cleanup1, |
Wanlong Gao | 354ebb4 | 2012-12-07 10:10:04 +0800 | [diff] [blame] | 237 | .desc = "UDP message too big"} |
| 238 | , |
Cyril Hrubis | a87dd2a | 2012-10-10 14:54:13 +0200 | [diff] [blame] | 239 | {.domain = PF_INET, |
| 240 | .type = SOCK_STREAM, |
| 241 | .proto = 0, |
| 242 | .iov = iov, |
| 243 | .iovcnt = 1, |
| 244 | .buf = buf, |
| 245 | .buflen = sizeof(buf), |
| 246 | .msg = &msgdat, |
| 247 | .flags = 0, |
| 248 | .to = (struct sockaddr *)&sin1, |
| 249 | .tolen = sizeof(sin1), |
| 250 | .retval = -1, |
| 251 | .experrno = EPIPE, |
| 252 | .setup = setup2, |
| 253 | .cleanup = cleanup1, |
Wanlong Gao | 354ebb4 | 2012-12-07 10:10:04 +0800 | [diff] [blame] | 254 | .desc = "local endpoint shutdown"} |
| 255 | , |
Cyril Hrubis | a87dd2a | 2012-10-10 14:54:13 +0200 | [diff] [blame] | 256 | {.domain = PF_INET, |
| 257 | .type = SOCK_STREAM, |
| 258 | .proto = 0, |
| 259 | .iov = NULL, |
| 260 | .iovcnt = 1, |
| 261 | .buf = buf, |
| 262 | .buflen = sizeof(buf), |
| 263 | .msg = &msgdat, |
| 264 | .flags = 0, |
| 265 | .to = (struct sockaddr *)&sin1, |
| 266 | .tolen = sizeof(sin1), |
| 267 | .retval = -1, |
| 268 | .experrno = EFAULT, |
| 269 | .setup = setup1, |
| 270 | .cleanup = cleanup1, |
Wanlong Gao | 354ebb4 | 2012-12-07 10:10:04 +0800 | [diff] [blame] | 271 | .desc = "invalid iovec pointer"} |
| 272 | , |
Cyril Hrubis | a87dd2a | 2012-10-10 14:54:13 +0200 | [diff] [blame] | 273 | {.domain = PF_INET, |
| 274 | .type = SOCK_STREAM, |
| 275 | .proto = 0, |
| 276 | .iov = iov, |
| 277 | .iovcnt = 1, |
| 278 | .buf = buf, |
| 279 | .buflen = sizeof(buf), |
| 280 | .msg = NULL, |
| 281 | .flags = 0, |
| 282 | .to = (struct sockaddr *)&sin1, |
| 283 | .tolen = sizeof(sin1), |
| 284 | .retval = -1, |
| 285 | .experrno = EFAULT, |
| 286 | .setup = setup1, |
| 287 | .cleanup = cleanup1, |
Wanlong Gao | 354ebb4 | 2012-12-07 10:10:04 +0800 | [diff] [blame] | 288 | .desc = "invalid msghdr pointer"} |
| 289 | , |
Cyril Hrubis | a87dd2a | 2012-10-10 14:54:13 +0200 | [diff] [blame] | 290 | {.domain = PF_UNIX, |
| 291 | .type = SOCK_DGRAM, |
| 292 | .proto = 0, |
| 293 | .iov = iov, |
| 294 | .iovcnt = 1, |
| 295 | .buf = buf, |
| 296 | .buflen = sizeof(buf), |
| 297 | .msg = &msgdat, |
| 298 | .flags = 0, |
| 299 | .to = (struct sockaddr *)&sun1, |
| 300 | .tolen = sizeof(sun1), |
| 301 | .retval = 0, |
| 302 | .experrno = 0, |
| 303 | .setup = setup4, |
| 304 | .cleanup = cleanup4, |
Wanlong Gao | 354ebb4 | 2012-12-07 10:10:04 +0800 | [diff] [blame] | 305 | .desc = "rights passing"} |
| 306 | , |
Cyril Hrubis | a87dd2a | 2012-10-10 14:54:13 +0200 | [diff] [blame] | 307 | {.domain = PF_UNIX, |
| 308 | .type = SOCK_DGRAM, |
| 309 | .proto = 0, |
| 310 | .iov = iov, |
| 311 | .iovcnt = 1, |
| 312 | .buf = buf, |
| 313 | .buflen = sizeof(buf), |
| 314 | .msg = &msgdat, |
| 315 | .flags = ~MSG_CMSG_COMPAT, |
| 316 | .to = (struct sockaddr *)&sun1, |
| 317 | .tolen = sizeof(sun1), |
| 318 | .retval = -1, |
| 319 | .experrno = EOPNOTSUPP, |
| 320 | .setup = setup4, |
| 321 | .cleanup = cleanup4, |
Wanlong Gao | 354ebb4 | 2012-12-07 10:10:04 +0800 | [diff] [blame] | 322 | .desc = "invalid flags set w/ control"} |
| 323 | , |
Cyril Hrubis | a87dd2a | 2012-10-10 14:54:13 +0200 | [diff] [blame] | 324 | {.domain = PF_INET, |
Jan Stancek | 1c6354e | 2013-11-29 11:39:34 +0100 | [diff] [blame] | 325 | .type = SOCK_DGRAM, |
Cyril Hrubis | a87dd2a | 2012-10-10 14:54:13 +0200 | [diff] [blame] | 326 | .proto = 0, |
| 327 | .iov = iov, |
| 328 | .iovcnt = 1, |
| 329 | .buf = buf, |
| 330 | .buflen = sizeof(buf), |
| 331 | .msg = &msgdat, |
Jan Stancek | 1c6354e | 2013-11-29 11:39:34 +0100 | [diff] [blame] | 332 | .flags = MSG_OOB, |
Cyril Hrubis | a87dd2a | 2012-10-10 14:54:13 +0200 | [diff] [blame] | 333 | .to = (struct sockaddr *)&sin1, |
| 334 | .tolen = sizeof(sin1), |
Jan Stancek | 1c6354e | 2013-11-29 11:39:34 +0100 | [diff] [blame] | 335 | .retval = -1, |
Cyril Hrubis | a87dd2a | 2012-10-10 14:54:13 +0200 | [diff] [blame] | 336 | .experrno = EOPNOTSUPP, |
Jan Stancek | 1c6354e | 2013-11-29 11:39:34 +0100 | [diff] [blame] | 337 | .setup = setup1, |
Cyril Hrubis | a87dd2a | 2012-10-10 14:54:13 +0200 | [diff] [blame] | 338 | .cleanup = cleanup1, |
Wanlong Gao | 354ebb4 | 2012-12-07 10:10:04 +0800 | [diff] [blame] | 339 | .desc = "invalid flags set"} |
| 340 | , |
Cyril Hrubis | a87dd2a | 2012-10-10 14:54:13 +0200 | [diff] [blame] | 341 | {.domain = PF_UNIX, |
| 342 | .type = SOCK_DGRAM, |
| 343 | .proto = 0, |
| 344 | .iov = iov, |
| 345 | .iovcnt = 1, |
| 346 | .buf = buf, |
| 347 | .buflen = sizeof(buf), |
| 348 | .msg = &msgdat, |
| 349 | .flags = 0, |
| 350 | .to = (struct sockaddr *)&sun1, |
| 351 | .tolen = sizeof(sun1), |
| 352 | .retval = 0, |
| 353 | .experrno = EOPNOTSUPP, |
| 354 | .setup = setup6, |
| 355 | .cleanup = cleanup4, |
Wanlong Gao | 354ebb4 | 2012-12-07 10:10:04 +0800 | [diff] [blame] | 356 | .desc = "invalid cmsg length"} |
| 357 | , |
Cyril Hrubis | a87dd2a | 2012-10-10 14:54:13 +0200 | [diff] [blame] | 358 | {.domain = PF_UNIX, |
| 359 | .type = SOCK_DGRAM, |
| 360 | .proto = 0, |
| 361 | .iov = iov, |
| 362 | .iovcnt = 1, |
| 363 | .buf = buf, |
| 364 | .buflen = sizeof(buf), |
| 365 | .msg = &msgdat, |
| 366 | .flags = 0, |
| 367 | .to = (struct sockaddr *)&sun1, |
| 368 | .tolen = sizeof(sun1), |
| 369 | .retval = -1, |
| 370 | .experrno = EFAULT, |
| 371 | .setup = setup8, |
| 372 | .cleanup = cleanup4, |
| 373 | .desc = "invalid cmsg pointer"} |
| 374 | }; |
plars | 865695b | 2001-08-27 22:15:12 +0000 | [diff] [blame] | 375 | |
Cyril Hrubis | a87dd2a | 2012-10-10 14:54:13 +0200 | [diff] [blame] | 376 | int TST_TOTAL = sizeof(tdat) / sizeof(tdat[0]); |
plars | 865695b | 2001-08-27 22:15:12 +0000 | [diff] [blame] | 377 | |
robbiew | d34d581 | 2005-07-11 22:28:09 +0000 | [diff] [blame] | 378 | #ifdef UCLINUX |
| 379 | static char *argv0; |
| 380 | #endif |
| 381 | |
subrata_modak | 56207ce | 2009-03-23 13:35:39 +0000 | [diff] [blame] | 382 | int main(int argc, char *argv[]) |
plars | 865695b | 2001-08-27 22:15:12 +0000 | [diff] [blame] | 383 | { |
Cyril Hrubis | a87dd2a | 2012-10-10 14:54:13 +0200 | [diff] [blame] | 384 | int lc; |
Cyril Hrubis | 0b9589f | 2014-05-27 17:40:33 +0200 | [diff] [blame] | 385 | const char *msg; |
plars | 865695b | 2001-08-27 22:15:12 +0000 | [diff] [blame] | 386 | |
Garrett Cooper | 45e285d | 2010-11-22 12:19:25 -0800 | [diff] [blame] | 387 | msg = parse_opts(argc, argv, NULL, NULL); |
Cyril Hrubis | a87dd2a | 2012-10-10 14:54:13 +0200 | [diff] [blame] | 388 | if (msg != NULL) |
plars | 865695b | 2001-08-27 22:15:12 +0000 | [diff] [blame] | 389 | tst_brkm(TBROK, NULL, "OPTION PARSING ERROR - %s", msg); |
Cyril Hrubis | a87dd2a | 2012-10-10 14:54:13 +0200 | [diff] [blame] | 390 | |
robbiew | d34d581 | 2005-07-11 22:28:09 +0000 | [diff] [blame] | 391 | #ifdef UCLINUX |
| 392 | argv0 = argv[0]; |
| 393 | maybe_run_child(&do_child, "dd", &sfd, &ufd); |
| 394 | #endif |
| 395 | |
plars | 865695b | 2001-08-27 22:15:12 +0000 | [diff] [blame] | 396 | setup(); |
| 397 | |
plars | 865695b | 2001-08-27 22:15:12 +0000 | [diff] [blame] | 398 | for (lc = 0; TEST_LOOPING(lc); ++lc) { |
Caspar Zhang | d59a659 | 2013-03-07 14:59:12 +0800 | [diff] [blame] | 399 | tst_count = 0; |
subrata_modak | 56207ce | 2009-03-23 13:35:39 +0000 | [diff] [blame] | 400 | for (testno = 0; testno < TST_TOTAL; ++testno) { |
plars | 865695b | 2001-08-27 22:15:12 +0000 | [diff] [blame] | 401 | tdat[testno].setup(); |
| 402 | |
| 403 | iov[0].iov_base = tdat[testno].buf; |
| 404 | iov[0].iov_len = tdat[testno].buflen; |
| 405 | if (tdat[testno].type != SOCK_STREAM) { |
| 406 | msgdat.msg_name = tdat[testno].to; |
| 407 | msgdat.msg_namelen = tdat[testno].tolen; |
| 408 | } |
| 409 | msgdat.msg_iov = tdat[testno].iov; |
| 410 | msgdat.msg_iovlen = tdat[testno].iovcnt; |
| 411 | msgdat.msg_control = control; |
| 412 | msgdat.msg_controllen = controllen; |
| 413 | msgdat.msg_flags = 0; |
| 414 | |
| 415 | TEST(sendmsg(s, tdat[testno].msg, tdat[testno].flags)); |
| 416 | |
| 417 | if (TEST_RETURN > 0) |
Cyril Hrubis | 605fa33 | 2015-02-04 13:11:20 +0100 | [diff] [blame] | 418 | TEST_RETURN = 0; |
robbiew | bd455c4 | 2003-10-07 21:25:53 +0000 | [diff] [blame] | 419 | |
plars | 865695b | 2001-08-27 22:15:12 +0000 | [diff] [blame] | 420 | if (TEST_RETURN != tdat[testno].retval || |
| 421 | (TEST_RETURN < 0 && |
robbiew | bd455c4 | 2003-10-07 21:25:53 +0000 | [diff] [blame] | 422 | TEST_ERRNO != tdat[testno].experrno)) { |
plars | 865695b | 2001-08-27 22:15:12 +0000 | [diff] [blame] | 423 | tst_resm(TFAIL, "%s ; returned" |
subrata_modak | 923b23f | 2009-11-02 13:57:16 +0000 | [diff] [blame] | 424 | " %ld (expected %d), errno %d (expected" |
subrata_modak | 56207ce | 2009-03-23 13:35:39 +0000 | [diff] [blame] | 425 | " %d)", tdat[testno].desc, |
| 426 | TEST_RETURN, tdat[testno].retval, |
| 427 | TEST_ERRNO, tdat[testno].experrno); |
plars | 865695b | 2001-08-27 22:15:12 +0000 | [diff] [blame] | 428 | } else { |
| 429 | tst_resm(TPASS, "%s successful", |
subrata_modak | 56207ce | 2009-03-23 13:35:39 +0000 | [diff] [blame] | 430 | tdat[testno].desc); |
plars | 865695b | 2001-08-27 22:15:12 +0000 | [diff] [blame] | 431 | } |
| 432 | tdat[testno].cleanup(); |
| 433 | } |
| 434 | } |
| 435 | cleanup(); |
Garrett Cooper | 2c28215 | 2010-12-16 00:55:50 -0800 | [diff] [blame] | 436 | tst_exit(); |
| 437 | } |
plars | 865695b | 2001-08-27 22:15:12 +0000 | [diff] [blame] | 438 | |
Cyril Hrubis | a87dd2a | 2012-10-10 14:54:13 +0200 | [diff] [blame] | 439 | static pid_t start_server(struct sockaddr_in *sin0, struct sockaddr_un *sun0) |
robbiew | aa01abd | 2003-03-27 18:39:24 +0000 | [diff] [blame] | 440 | { |
subrata_modak | 56207ce | 2009-03-23 13:35:39 +0000 | [diff] [blame] | 441 | pid_t pid; |
Jan Stancek | 6e4e77a | 2014-03-07 11:39:56 +0100 | [diff] [blame] | 442 | socklen_t slen = sizeof(*sin0); |
| 443 | |
| 444 | sin0->sin_family = AF_INET; |
| 445 | sin0->sin_port = 0; /* pick random free port */ |
| 446 | sin0->sin_addr.s_addr = INADDR_ANY; |
robbiew | aa01abd | 2003-03-27 18:39:24 +0000 | [diff] [blame] | 447 | |
| 448 | /* set up inet socket */ |
| 449 | sfd = socket(PF_INET, SOCK_STREAM, 0); |
| 450 | if (sfd < 0) { |
| 451 | tst_brkm(TBROK, cleanup, "server socket failed: %s", |
subrata_modak | 56207ce | 2009-03-23 13:35:39 +0000 | [diff] [blame] | 452 | strerror(errno)); |
robbiew | aa01abd | 2003-03-27 18:39:24 +0000 | [diff] [blame] | 453 | return -1; |
| 454 | } |
Jan Stancek | 6e4e77a | 2014-03-07 11:39:56 +0100 | [diff] [blame] | 455 | if (bind(sfd, (struct sockaddr *)sin0, sizeof(*sin0)) < 0) { |
robbiew | aa01abd | 2003-03-27 18:39:24 +0000 | [diff] [blame] | 456 | tst_brkm(TBROK, cleanup, "server bind failed: %s", |
subrata_modak | 56207ce | 2009-03-23 13:35:39 +0000 | [diff] [blame] | 457 | strerror(errno)); |
robbiew | aa01abd | 2003-03-27 18:39:24 +0000 | [diff] [blame] | 458 | return -1; |
| 459 | } |
| 460 | if (listen(sfd, 10) < 0) { |
| 461 | tst_brkm(TBROK, cleanup, "server listen failed: %s", |
subrata_modak | 56207ce | 2009-03-23 13:35:39 +0000 | [diff] [blame] | 462 | strerror(errno)); |
robbiew | aa01abd | 2003-03-27 18:39:24 +0000 | [diff] [blame] | 463 | return -1; |
| 464 | } |
Jan Stancek | 6e4e77a | 2014-03-07 11:39:56 +0100 | [diff] [blame] | 465 | if (getsockname(sfd, (struct sockaddr *)sin0, &slen) == -1) |
| 466 | tst_brkm(TBROK | TERRNO, cleanup, "getsockname failed"); |
| 467 | |
robbiew | aa01abd | 2003-03-27 18:39:24 +0000 | [diff] [blame] | 468 | /* set up UNIX-domain socket */ |
| 469 | ufd = socket(PF_UNIX, SOCK_DGRAM, 0); |
| 470 | if (ufd < 0) { |
| 471 | tst_brkm(TBROK, cleanup, "server UD socket failed: %s", |
subrata_modak | 56207ce | 2009-03-23 13:35:39 +0000 | [diff] [blame] | 472 | strerror(errno)); |
robbiew | aa01abd | 2003-03-27 18:39:24 +0000 | [diff] [blame] | 473 | return -1; |
| 474 | } |
| 475 | if (bind(ufd, (struct sockaddr *)sun0, sizeof(*sun0))) { |
| 476 | tst_brkm(TBROK, cleanup, "server UD bind failed: %s", |
subrata_modak | 56207ce | 2009-03-23 13:35:39 +0000 | [diff] [blame] | 477 | strerror(errno)); |
robbiew | aa01abd | 2003-03-27 18:39:24 +0000 | [diff] [blame] | 478 | return -1; |
| 479 | } |
| 480 | |
robbiew | d34d581 | 2005-07-11 22:28:09 +0000 | [diff] [blame] | 481 | switch ((pid = FORK_OR_VFORK())) { |
Cyril Hrubis | a87dd2a | 2012-10-10 14:54:13 +0200 | [diff] [blame] | 482 | case 0: |
robbiew | d34d581 | 2005-07-11 22:28:09 +0000 | [diff] [blame] | 483 | #ifdef UCLINUX |
Cyril Hrubis | a87dd2a | 2012-10-10 14:54:13 +0200 | [diff] [blame] | 484 | if (self_exec(argv0, "dd", sfd, ufd) < 0) |
robbiew | d34d581 | 2005-07-11 22:28:09 +0000 | [diff] [blame] | 485 | tst_brkm(TBROK, cleanup, "server self_exec failed"); |
robbiew | d34d581 | 2005-07-11 22:28:09 +0000 | [diff] [blame] | 486 | #else |
| 487 | do_child(); |
| 488 | #endif |
robbiew | aa01abd | 2003-03-27 18:39:24 +0000 | [diff] [blame] | 489 | break; |
| 490 | case -1: |
| 491 | tst_brkm(TBROK, cleanup, "server fork failed: %s", |
subrata_modak | 56207ce | 2009-03-23 13:35:39 +0000 | [diff] [blame] | 492 | strerror(errno)); |
Cyril Hrubis | a87dd2a | 2012-10-10 14:54:13 +0200 | [diff] [blame] | 493 | default: |
| 494 | close(sfd); |
| 495 | close(ufd); |
robbiew | aa01abd | 2003-03-27 18:39:24 +0000 | [diff] [blame] | 496 | return pid; |
| 497 | } |
| 498 | |
Wanlong Gao | 354ebb4 | 2012-12-07 10:10:04 +0800 | [diff] [blame] | 499 | exit(1); |
robbiew | d34d581 | 2005-07-11 22:28:09 +0000 | [diff] [blame] | 500 | } |
| 501 | |
Cyril Hrubis | a87dd2a | 2012-10-10 14:54:13 +0200 | [diff] [blame] | 502 | static void do_child(void) |
robbiew | d34d581 | 2005-07-11 22:28:09 +0000 | [diff] [blame] | 503 | { |
| 504 | struct sockaddr_in fsin; |
| 505 | struct sockaddr_un fsun; |
subrata_modak | 56207ce | 2009-03-23 13:35:39 +0000 | [diff] [blame] | 506 | fd_set afds, rfds; |
| 507 | int nfds, cc, fd; |
robbiew | d34d581 | 2005-07-11 22:28:09 +0000 | [diff] [blame] | 508 | |
robbiew | aa01abd | 2003-03-27 18:39:24 +0000 | [diff] [blame] | 509 | FD_ZERO(&afds); |
| 510 | FD_SET(sfd, &afds); |
| 511 | FD_SET(ufd, &afds); |
| 512 | |
Cyril Hrubis | 7855d09 | 2014-10-09 16:13:05 +0200 | [diff] [blame] | 513 | nfds = MAX(sfd + 1, ufd + 1); |
robbiew | aa01abd | 2003-03-27 18:39:24 +0000 | [diff] [blame] | 514 | |
| 515 | /* accept connections until killed */ |
| 516 | while (1) { |
subrata_modak | 56207ce | 2009-03-23 13:35:39 +0000 | [diff] [blame] | 517 | socklen_t fromlen; |
robbiew | aa01abd | 2003-03-27 18:39:24 +0000 | [diff] [blame] | 518 | |
| 519 | memcpy(&rfds, &afds, sizeof(rfds)); |
| 520 | |
Cyril Hrubis | a87dd2a | 2012-10-10 14:54:13 +0200 | [diff] [blame] | 521 | if (select(nfds, &rfds, NULL, NULL, NULL) < 0) |
robbiew | aa01abd | 2003-03-27 18:39:24 +0000 | [diff] [blame] | 522 | if (errno != EINTR) |
| 523 | exit(1); |
| 524 | if (FD_ISSET(sfd, &rfds)) { |
| 525 | int newfd; |
| 526 | |
| 527 | fromlen = sizeof(fsin); |
subrata_modak | 56207ce | 2009-03-23 13:35:39 +0000 | [diff] [blame] | 528 | newfd = accept(sfd, (struct sockaddr *)&fsin, &fromlen); |
Cyril Hrubis | 7855d09 | 2014-10-09 16:13:05 +0200 | [diff] [blame] | 529 | if (newfd >= 0) { |
robbiew | aa01abd | 2003-03-27 18:39:24 +0000 | [diff] [blame] | 530 | FD_SET(newfd, &afds); |
Cyril Hrubis | 7855d09 | 2014-10-09 16:13:05 +0200 | [diff] [blame] | 531 | nfds = MAX(nfds, newfd + 1); |
| 532 | } |
robbiew | aa01abd | 2003-03-27 18:39:24 +0000 | [diff] [blame] | 533 | } |
| 534 | if (FD_ISSET(ufd, &rfds)) { |
| 535 | int newfd; |
| 536 | |
| 537 | fromlen = sizeof(fsun); |
subrata_modak | 56207ce | 2009-03-23 13:35:39 +0000 | [diff] [blame] | 538 | newfd = accept(ufd, (struct sockaddr *)&fsun, &fromlen); |
robbiew | aa01abd | 2003-03-27 18:39:24 +0000 | [diff] [blame] | 539 | if (newfd >= 0) |
| 540 | FD_SET(newfd, &afds); |
| 541 | } |
subrata_modak | 56207ce | 2009-03-23 13:35:39 +0000 | [diff] [blame] | 542 | for (fd = 0; fd < nfds; ++fd) { |
robbiew | aa01abd | 2003-03-27 18:39:24 +0000 | [diff] [blame] | 543 | if (fd != sfd && fd != ufd && FD_ISSET(fd, &rfds)) { |
| 544 | cc = read(fd, buf, sizeof(buf)); |
| 545 | if (cc == 0 || (cc < 0 && errno != EINTR)) { |
Cyril Hrubis | a87dd2a | 2012-10-10 14:54:13 +0200 | [diff] [blame] | 546 | close(fd); |
robbiew | aa01abd | 2003-03-27 18:39:24 +0000 | [diff] [blame] | 547 | FD_CLR(fd, &afds); |
| 548 | } |
| 549 | } |
| 550 | } |
| 551 | } |
| 552 | } |
| 553 | |
Cyril Hrubis | a87dd2a | 2012-10-10 14:54:13 +0200 | [diff] [blame] | 554 | static pid_t pid; |
| 555 | static char tmpsunpath[1024]; |
plars | 865695b | 2001-08-27 22:15:12 +0000 | [diff] [blame] | 556 | |
Cyril Hrubis | a87dd2a | 2012-10-10 14:54:13 +0200 | [diff] [blame] | 557 | static void setup(void) |
plars | 865695b | 2001-08-27 22:15:12 +0000 | [diff] [blame] | 558 | { |
plars | 865695b | 2001-08-27 22:15:12 +0000 | [diff] [blame] | 559 | |
iyermanoj | 7856269 | 2003-05-01 20:50:38 +0000 | [diff] [blame] | 560 | int ret = 0; |
Zhouping Liu | ed24167 | 2013-01-22 10:00:42 +0800 | [diff] [blame] | 561 | |
| 562 | tst_require_root(NULL); |
| 563 | tst_sig(FORK, DEF_HANDLER, cleanup); |
Cyril Hrubis | a87dd2a | 2012-10-10 14:54:13 +0200 | [diff] [blame] | 564 | TEST_PAUSE; |
plars | 865695b | 2001-08-27 22:15:12 +0000 | [diff] [blame] | 565 | |
plars | 865695b | 2001-08-27 22:15:12 +0000 | [diff] [blame] | 566 | |
robbiew | c9c0b4e | 2003-04-16 20:47:48 +0000 | [diff] [blame] | 567 | tst_tmpdir(); |
subrata_modak | 56207ce | 2009-03-23 13:35:39 +0000 | [diff] [blame] | 568 | snprintf(tmpsunpath, 1024, "udsock%ld", (long)time(NULL)); |
plars | 865695b | 2001-08-27 22:15:12 +0000 | [diff] [blame] | 569 | sun1.sun_family = AF_UNIX; |
robbiew | c9c0b4e | 2003-04-16 20:47:48 +0000 | [diff] [blame] | 570 | strcpy(sun1.sun_path, tmpsunpath); |
plars | 865695b | 2001-08-27 22:15:12 +0000 | [diff] [blame] | 571 | |
iyermanoj | 7856269 | 2003-05-01 20:50:38 +0000 | [diff] [blame] | 572 | /* this test will fail or in some cases hang if no eth or lo is |
Zhouping Liu | ed24167 | 2013-01-22 10:00:42 +0800 | [diff] [blame] | 573 | * configured, so making sure in setup that at least lo is up |
iyermanoj | 7856269 | 2003-05-01 20:50:38 +0000 | [diff] [blame] | 574 | */ |
Zhouping Liu | ed24167 | 2013-01-22 10:00:42 +0800 | [diff] [blame] | 575 | ret = system("ip link set lo up"); |
subrata_modak | 56207ce | 2009-03-23 13:35:39 +0000 | [diff] [blame] | 576 | if (WEXITSTATUS(ret) != 0) { |
Zhouping Liu | ed24167 | 2013-01-22 10:00:42 +0800 | [diff] [blame] | 577 | ret = system("ifconfig lo up 127.0.0.1"); |
| 578 | if (WEXITSTATUS(ret) != 0) { |
| 579 | tst_brkm(TBROK, cleanup, |
| 580 | "ip/ifconfig failed to bring up loop back device"); |
Zhouping Liu | ed24167 | 2013-01-22 10:00:42 +0800 | [diff] [blame] | 581 | } |
iyermanoj | 7856269 | 2003-05-01 20:50:38 +0000 | [diff] [blame] | 582 | } |
| 583 | |
plars | 865695b | 2001-08-27 22:15:12 +0000 | [diff] [blame] | 584 | pid = start_server(&sin1, &sun1); |
| 585 | |
robbiew | c9c0b4e | 2003-04-16 20:47:48 +0000 | [diff] [blame] | 586 | signal(SIGPIPE, SIG_IGN); |
plars | 865695b | 2001-08-27 22:15:12 +0000 | [diff] [blame] | 587 | } |
| 588 | |
Cyril Hrubis | a87dd2a | 2012-10-10 14:54:13 +0200 | [diff] [blame] | 589 | static void cleanup(void) |
plars | 865695b | 2001-08-27 22:15:12 +0000 | [diff] [blame] | 590 | { |
subrata_modak | 56207ce | 2009-03-23 13:35:39 +0000 | [diff] [blame] | 591 | if (pid > 0) |
Cyril Hrubis | a87dd2a | 2012-10-10 14:54:13 +0200 | [diff] [blame] | 592 | kill(pid, SIGKILL); /* kill server, if server exists */ |
plars | 865695b | 2001-08-27 22:15:12 +0000 | [diff] [blame] | 593 | unlink(tmpsunpath); |
subrata_modak | 56207ce | 2009-03-23 13:35:39 +0000 | [diff] [blame] | 594 | tst_rmdir(); |
plars | 865695b | 2001-08-27 22:15:12 +0000 | [diff] [blame] | 595 | } |
| 596 | |
Cyril Hrubis | a87dd2a | 2012-10-10 14:54:13 +0200 | [diff] [blame] | 597 | static void setup0(void) |
plars | 865695b | 2001-08-27 22:15:12 +0000 | [diff] [blame] | 598 | { |
| 599 | if (tdat[testno].experrno == EBADF) |
| 600 | s = 400; /* anything not an open file */ |
subrata_modak | 56207ce | 2009-03-23 13:35:39 +0000 | [diff] [blame] | 601 | else if ((s = open("/dev/null", O_WRONLY)) == -1) |
plars | 13cbed7 | 2002-03-26 20:43:10 +0000 | [diff] [blame] | 602 | tst_brkm(TBROK, cleanup, "error opening /dev/null - " |
subrata_modak | 56207ce | 2009-03-23 13:35:39 +0000 | [diff] [blame] | 603 | "errno: %s", strerror(errno)); |
plars | 865695b | 2001-08-27 22:15:12 +0000 | [diff] [blame] | 604 | } |
| 605 | |
Cyril Hrubis | a87dd2a | 2012-10-10 14:54:13 +0200 | [diff] [blame] | 606 | static void cleanup0(void) |
plars | 865695b | 2001-08-27 22:15:12 +0000 | [diff] [blame] | 607 | { |
| 608 | s = -1; |
| 609 | } |
| 610 | |
Cyril Hrubis | a87dd2a | 2012-10-10 14:54:13 +0200 | [diff] [blame] | 611 | static void setup1(void) |
plars | 865695b | 2001-08-27 22:15:12 +0000 | [diff] [blame] | 612 | { |
| 613 | s = socket(tdat[testno].domain, tdat[testno].type, tdat[testno].proto); |
| 614 | if (s < 0) { |
| 615 | tst_brkm(TBROK, cleanup, "socket setup failed: %s", |
subrata_modak | 56207ce | 2009-03-23 13:35:39 +0000 | [diff] [blame] | 616 | strerror(errno)); |
plars | 865695b | 2001-08-27 22:15:12 +0000 | [diff] [blame] | 617 | } |
| 618 | if (tdat[testno].type == SOCK_STREAM && |
| 619 | connect(s, (struct sockaddr *)tdat[testno].to, |
subrata_modak | 56207ce | 2009-03-23 13:35:39 +0000 | [diff] [blame] | 620 | tdat[testno].tolen) < 0) { |
plars | 865695b | 2001-08-27 22:15:12 +0000 | [diff] [blame] | 621 | tst_brkm(TBROK, cleanup, "connect failed: %s", strerror(errno)); |
| 622 | } |
| 623 | } |
| 624 | |
Cyril Hrubis | a87dd2a | 2012-10-10 14:54:13 +0200 | [diff] [blame] | 625 | static void cleanup1(void) |
plars | 865695b | 2001-08-27 22:15:12 +0000 | [diff] [blame] | 626 | { |
Cyril Hrubis | a87dd2a | 2012-10-10 14:54:13 +0200 | [diff] [blame] | 627 | close(s); |
plars | 865695b | 2001-08-27 22:15:12 +0000 | [diff] [blame] | 628 | s = -1; |
| 629 | } |
| 630 | |
Cyril Hrubis | a87dd2a | 2012-10-10 14:54:13 +0200 | [diff] [blame] | 631 | static void setup2(void) |
plars | 865695b | 2001-08-27 22:15:12 +0000 | [diff] [blame] | 632 | { |
subrata_modak | 56207ce | 2009-03-23 13:35:39 +0000 | [diff] [blame] | 633 | setup1(); /* get a socket in s */ |
plars | 865695b | 2001-08-27 22:15:12 +0000 | [diff] [blame] | 634 | if (shutdown(s, 1) < 0) { |
| 635 | tst_brkm(TBROK, cleanup, "socket setup failed connect " |
subrata_modak | 56207ce | 2009-03-23 13:35:39 +0000 | [diff] [blame] | 636 | "test %d: %s", testno, strerror(errno)); |
plars | 865695b | 2001-08-27 22:15:12 +0000 | [diff] [blame] | 637 | } |
| 638 | } |
Cyril Hrubis | a87dd2a | 2012-10-10 14:54:13 +0200 | [diff] [blame] | 639 | |
| 640 | static void setup3(void) |
plars | 865695b | 2001-08-27 22:15:12 +0000 | [diff] [blame] | 641 | { |
| 642 | s = socket(tdat[testno].domain, tdat[testno].type, tdat[testno].proto); |
| 643 | if (s < 0) { |
| 644 | tst_brkm(TBROK, cleanup, "socket setup failed: %s", |
subrata_modak | 56207ce | 2009-03-23 13:35:39 +0000 | [diff] [blame] | 645 | strerror(errno)); |
plars | 865695b | 2001-08-27 22:15:12 +0000 | [diff] [blame] | 646 | } |
| 647 | } |
| 648 | |
Cyril Hrubis | a87dd2a | 2012-10-10 14:54:13 +0200 | [diff] [blame] | 649 | static char tmpfilename[1024]; |
| 650 | static int tfd; |
plars | 865695b | 2001-08-27 22:15:12 +0000 | [diff] [blame] | 651 | |
Cyril Hrubis | a87dd2a | 2012-10-10 14:54:13 +0200 | [diff] [blame] | 652 | static void setup4(void) |
plars | 865695b | 2001-08-27 22:15:12 +0000 | [diff] [blame] | 653 | { |
plars | 865695b | 2001-08-27 22:15:12 +0000 | [diff] [blame] | 654 | |
subrata_modak | 56207ce | 2009-03-23 13:35:39 +0000 | [diff] [blame] | 655 | setup1(); /* get a socket in s */ |
plars | 865695b | 2001-08-27 22:15:12 +0000 | [diff] [blame] | 656 | |
Cyril Hrubis | a87dd2a | 2012-10-10 14:54:13 +0200 | [diff] [blame] | 657 | strcpy(tmpfilename, "sockXXXXXX"); |
robbiew | c9c0b4e | 2003-04-16 20:47:48 +0000 | [diff] [blame] | 658 | tfd = mkstemp(tmpfilename); |
plars | 865695b | 2001-08-27 22:15:12 +0000 | [diff] [blame] | 659 | if (tfd < 0) { |
| 660 | tst_brkm(TBROK, cleanup4, "socket setup failed: %s", |
subrata_modak | 56207ce | 2009-03-23 13:35:39 +0000 | [diff] [blame] | 661 | strerror(errno)); |
plars | 865695b | 2001-08-27 22:15:12 +0000 | [diff] [blame] | 662 | } |
| 663 | control = (struct cmsghdr *)cbuf; |
vapier | 32cc0ac | 2006-06-22 04:28:32 +0000 | [diff] [blame] | 664 | memset(cbuf, 0x00, sizeof(cbuf)); |
subrata_modak | 56207ce | 2009-03-23 13:35:39 +0000 | [diff] [blame] | 665 | control->cmsg_len = sizeof(struct cmsghdr) + 4; |
plars | 865695b | 2001-08-27 22:15:12 +0000 | [diff] [blame] | 666 | control->cmsg_level = SOL_SOCKET; |
| 667 | control->cmsg_type = SCM_RIGHTS; |
| 668 | *(int *)CMSG_DATA(control) = tfd; |
| 669 | controllen = control->cmsg_len; |
| 670 | } |
| 671 | |
Cyril Hrubis | a87dd2a | 2012-10-10 14:54:13 +0200 | [diff] [blame] | 672 | static void cleanup4(void) |
plars | 865695b | 2001-08-27 22:15:12 +0000 | [diff] [blame] | 673 | { |
| 674 | cleanup1(); |
Cyril Hrubis | a87dd2a | 2012-10-10 14:54:13 +0200 | [diff] [blame] | 675 | close(tfd); |
plars | 865695b | 2001-08-27 22:15:12 +0000 | [diff] [blame] | 676 | tfd = -1; |
plars | 865695b | 2001-08-27 22:15:12 +0000 | [diff] [blame] | 677 | control = 0; |
| 678 | controllen = 0; |
| 679 | } |
| 680 | |
Cyril Hrubis | a87dd2a | 2012-10-10 14:54:13 +0200 | [diff] [blame] | 681 | static void setup5(void) |
plars | 865695b | 2001-08-27 22:15:12 +0000 | [diff] [blame] | 682 | { |
| 683 | s = socket(tdat[testno].domain, tdat[testno].type, tdat[testno].proto); |
| 684 | if (s < 0) { |
| 685 | tst_brkm(TBROK, cleanup, "socket setup failed: %s", |
subrata_modak | 56207ce | 2009-03-23 13:35:39 +0000 | [diff] [blame] | 686 | strerror(errno)); |
plars | 865695b | 2001-08-27 22:15:12 +0000 | [diff] [blame] | 687 | } |
Cyril Hrubis | a87dd2a | 2012-10-10 14:54:13 +0200 | [diff] [blame] | 688 | |
| 689 | if (connect(s, (struct sockaddr *)&sin1, sizeof(sin1)) < 0) |
plars | 865695b | 2001-08-27 22:15:12 +0000 | [diff] [blame] | 690 | tst_brkm(TBROK, cleanup, "connect failed: %s", strerror(errno)); |
Cyril Hrubis | a87dd2a | 2012-10-10 14:54:13 +0200 | [diff] [blame] | 691 | |
plars | 865695b | 2001-08-27 22:15:12 +0000 | [diff] [blame] | 692 | /* slight change destination (port) so connect() is to different |
| 693 | * 5-tuple than already connected |
| 694 | */ |
| 695 | sin2 = sin1; |
Jan Stancek | 6e4e77a | 2014-03-07 11:39:56 +0100 | [diff] [blame] | 696 | sin2.sin_port = tst_get_unused_port(cleanup, AF_INET, SOCK_STREAM); |
plars | 865695b | 2001-08-27 22:15:12 +0000 | [diff] [blame] | 697 | } |
| 698 | |
Cyril Hrubis | a87dd2a | 2012-10-10 14:54:13 +0200 | [diff] [blame] | 699 | static void setup6(void) |
plars | 865695b | 2001-08-27 22:15:12 +0000 | [diff] [blame] | 700 | { |
| 701 | setup4(); |
plars | 805e285 | 2002-03-26 20:41:42 +0000 | [diff] [blame] | 702 | /* |
plars | 865695b | 2001-08-27 22:15:12 +0000 | [diff] [blame] | 703 | controllen = control->cmsg_len = sizeof(struct cmsghdr) - 4; |
plars | 805e285 | 2002-03-26 20:41:42 +0000 | [diff] [blame] | 704 | */ |
| 705 | controllen = control->cmsg_len = 0; |
plars | 865695b | 2001-08-27 22:15:12 +0000 | [diff] [blame] | 706 | } |
| 707 | |
Cyril Hrubis | a87dd2a | 2012-10-10 14:54:13 +0200 | [diff] [blame] | 708 | static void setup8(void) |
plars | 865695b | 2001-08-27 22:15:12 +0000 | [diff] [blame] | 709 | { |
| 710 | setup4(); |
| 711 | control = (struct cmsghdr *)-1; |
Cyril Hrubis | a87dd2a | 2012-10-10 14:54:13 +0200 | [diff] [blame] | 712 | } |