| /* |
| * |
| * Copyright (c) International Business Machines Corp., 2001 |
| * |
| * This program is free software; you can redistribute it and/or modify |
| * it under the terms of the GNU General Public License as published by |
| * the Free Software Foundation; either version 2 of the License, or |
| * (at your option) any later version. |
| * |
| * This program is distributed in the hope that it will be useful, |
| * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See |
| * the GNU General Public License for more details. |
| * |
| * You should have received a copy of the GNU General Public License |
| * along with this program; if not, write to the Free Software |
| * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
| */ |
| |
| /* |
| * Test Name: asapi_07 |
| * |
| * Test Description: |
| * These tests are for the "Advanced Sockets API" (RFC 3542) |
| * Section 20, ancillary data macros and structure definitions |
| * |
| * Usage: <for command-line> |
| * asapi_07 |
| * |
| * HISTORY |
| * 04/2005 written by David L Stevens |
| * |
| * RESTRICTIONS: |
| * None. |
| * |
| */ |
| |
| #include <stdio.h> |
| #include <unistd.h> |
| #include <errno.h> |
| |
| #include <sys/wait.h> |
| |
| #include <netinet/in.h> |
| #include <netinet/ip6.h> |
| #include <netinet/icmp6.h> |
| |
| #include "test.h" |
| #include "runcc.h" |
| |
| char *TCID = "asapi_07"; /* Test program identifier. */ |
| |
| void setup(void); |
| void cleanup(void); |
| |
| void adatet(void); |
| void adatft(void); |
| |
| int main(int argc, char *argv[]) |
| { |
| int lc; |
| const char *msg; |
| |
| /* Parse standard options given to run the test. */ |
| if ((msg = parse_opts(argc, argv, NULL, NULL)) != NULL) |
| tst_brkm(TBROK, NULL, "OPTION PARSING ERROR - %s", msg); |
| |
| setup(); |
| |
| for (lc = 0; TEST_LOOPING(lc); ++lc) { |
| adatet(); |
| } |
| |
| cleanup(); |
| |
| tst_exit(); |
| } |
| |
| enum ttype { EXISTS, ALIAS, VALUE, DEFINED }; |
| |
| struct etent { |
| char *et_tname; /* test name */ |
| int et_type; /* test type */ |
| char *et_incl; /* include file list */ |
| char *et_struct; /* structure name */ |
| char *et_field; /* field name */ |
| char *et_offset; /* field offset */ |
| union { |
| char *fu_value; /* field size or value */ |
| char *fu_dname; /* #define name */ |
| } ftun; |
| #define et_value ftun.fu_value |
| #define et_dname ftun.fu_dname |
| } etab[] = { |
| /* existence checks, RFC 3542 sections 5, 20 */ |
| { |
| "msghdr msg_name", EXISTS, SOCKET_H, "msghdr", "msg_name", NULL, { |
| "sizeof(void *)"}}, { |
| "msghdr msg_namelen", EXISTS, SOCKET_H, "msghdr", |
| "msg_namelen", NULL, { |
| "sizeof(socklen_t)"}}, { |
| "msghdr msg_iov", EXISTS, SOCKET_H, "msghdr", "msg_iov", NULL, { |
| "sizeof(struct iovec *)"}}, { |
| "msghdr msg_iovlen", EXISTS, SOCKET_H, "msghdr", |
| "msg_iovlen", NULL, { |
| "sizeof(size_t)"}}, { |
| "msghdr msg_control", EXISTS, SOCKET_H, "msghdr", |
| "msg_control", NULL, { |
| "sizeof(void *)"}}, { |
| "msghdr msg_controllen", EXISTS, SOCKET_H, "msghdr", |
| "msg_controllen", NULL, { |
| "sizeof(size_t)"}}, { |
| "msghdr msg_flags", EXISTS, SOCKET_H, "msghdr", |
| "msg_flags", NULL, { |
| "sizeof(int)"}}, { |
| "cmsghdr cmsg_len", EXISTS, SOCKET_H, "cmsghdr", |
| "cmsg_len", NULL, { |
| "sizeof(size_t)"}}, { |
| "cmsghdr cmsg_level", EXISTS, SOCKET_H, "cmsghdr", |
| "cmsg_level", NULL, { |
| "sizeof(int)"}}, { |
| "cmsghdr cmsg_type", EXISTS, SOCKET_H, "cmsghdr", |
| "cmsg_type", NULL, { |
| "sizeof(int)"}}, { |
| "CMSG_DATA", DEFINED, SOCKET_H, "CMSG_DATA", NULL, NULL, { |
| 0}}, { |
| "CMSG_NXTHDR", DEFINED, SOCKET_H, "CMSG_NXTHDR", NULL, NULL, { |
| 0}}, { |
| "CMSG_FIRSTHDR", DEFINED, SOCKET_H, "CMSG_FIRSTHDR", NULL, NULL, { |
| 0}}, { |
| "CMSG_SPACE", DEFINED, SOCKET_H, "CMSG_SPACE", NULL, NULL, { |
| 0}}, { |
| "CMSG_LEN", DEFINED, SOCKET_H, "CMSG_LEN", NULL, NULL, { |
| 0}},}; |
| |
| #define ETCOUNT (sizeof(etab)/sizeof(etab[0])) |
| |
| /* existence tests */ |
| void adatet(void) |
| { |
| int i; |
| |
| for (i = 0; i < ETCOUNT; ++i) { |
| switch (etab[i].et_type) { |
| case EXISTS: |
| structcheck(etab[i].et_tname, etab[i].et_incl, |
| etab[i].et_struct, etab[i].et_field, |
| etab[i].et_offset, etab[i].et_value); |
| break; |
| case ALIAS: |
| aliascheck(etab[i].et_tname, etab[i].et_incl, |
| etab[i].et_struct, etab[i].et_field, |
| etab[i].et_dname); |
| break; |
| case VALUE: |
| valuecheck(etab[i].et_tname, etab[i].et_incl, |
| etab[i].et_struct, etab[i].et_dname); |
| break; |
| case DEFINED: |
| funccheck(etab[i].et_tname, etab[i].et_incl, |
| etab[i].et_struct); |
| break; |
| default: |
| tst_resm(TBROK, "invalid type %d", etab[i].et_type); |
| break; |
| } |
| } |
| } |
| |
| void setup(void) |
| { |
| TEST_PAUSE; /* if -P option specified */ |
| } |
| |
| void cleanup(void) |
| { |
| } |
| |
| int TST_TOTAL = ETCOUNT; |